En el anterior blog posts expliqué cómo utilizar Docker contenedores ejecutando Couchbase durante tus pruebas. Ambos post tenían como requisito que tuvieras que construir tu propia imagen Docker de Couchbase con el cluster y los datos ya configurados. En este post te contaré cómo puedes usar nuestra imagen Docker oficial y configurar el Cluster a tu gusto durante la fase de configuración de tu test.
Un Couchbase TestContainer personalizado
TestContainers ya soporta varios tipos específicos de contenedores, especialmente en el mundo relacional como se puede ver en su documentación. Ofrecen algunas características avanzadas como una conexión JDBC que te permite usar la base de datos subyacente directamente. Con el mismo espíritu podemos crear un CouchbaseContainer personalizado que te permitirá configurar el cluster y los buckets durante tus pruebas.
Se encargará de arrancar la imagen docker y devuelve una instancia de CouchbaseCluster configurada. Primero definimos el identificador por defecto de la imagen docker y el puerto Liveness como puerto 8091. Este es el que será testeado por la estrategia de espera HTTP por defecto para la ruta '/ui/index.html#/'. Una vez que podamos llegar a esta página podemos empezar a configurar el cluster.
1 2 3 4 5 6 7 8 9 |
público CouchbaseContainer() { super("couchbase:4.5.0"); } @Anular protegido Entero getLivenessCheckPort() { devolver getMappedPort(8091); } |
El segundo paso es sobrescribir el método configure para asegurarnos de que exponemos todos los puertos necesarios y establecemos la estrategia de espera HTTP,
1 2 3 4 5 6 |
@Anular protegido void configure() { addExposedPorts(8091, 8092, 8093, 8094, 11207, 11210, 11211, 18091, 18092, 18093); setWaitStrategy(nuevo HttpWaitStrategy().paraRuta("/ui/index.html#/")); } |
En este punto puedes probar ese contenedor genérico. Tendrías la imagen funcionando en un estado en el que necesitas configurar Couchbase. Necesitas seguir todos los pasos del asistente. Estos pasos se pueden automatizar a través de las herramientas CLI o la API REST. Vamos a utilizar la API para configurar el clúster.
Hay tres llamadas obligatorias que tenemos que hacer. Una para configurar las cuotas de ram, otra para configurar el nombre de usuario y la contraseña del usuario admin y otra para configurar los servicios disponibles en el cluster (key/value, index, query y fts).
Usando curl esas llamadas se verían así:
1 2 3 4 |
rizo -v -X POST http://192.168.99.100:8091/pools/default -d memoryQuota=300 -d indexMemoryQuota=300 rizo -v http://192.168.99.100:8091/node/controller/setupServices -d 'services=kv%2Cn1ql%2Cindex' rizo -v -X POST rizo -v -X POST http://192.168.99.100:8091/settings/web -d port=8091 -d username=Administrador -d password=contraseña |
Hay múltiples maneras de hacer un POST en Java, aquí hay un ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
público void callCouchbaseRestAPI(Cadena url, Cadena carga útil, Cadena nombre de usuario, Cadena contraseña) lanza IOException { HttpURLConnection httpConnection = (HttpURLConnection) ((nuevo URL(url).openConnection())); httpConnection.setDoOutput(verdadero); httpConnection.setDoInput(verdadero); httpConnection.setRequestMethod("POST"); httpConnection.setRequestProperty("Tipo de contenido", "application/x-www-form-urlencoded"); si (nombre de usuario != null) { Cadena codificado = Base64.codificar((nombre de usuario + ":" + contraseña).getBytes("UTF-8")); httpConnection.setRequestProperty("Autorización", "Básico"+codificado); } DataOutputStream fuera = nuevo DataOutputStream(httpConnection.getOutputStream()); fuera.writeBytes(carga útil); fuera.descarga(); fuera.cerrar(); httpConnection.getResponseCode(); httpConnection.desconectar(); } |
Todas estas llamadas se realizarán desde el initCluster
método. El contenido de esas llamadas dependerá de la configuración proporcionada al contenedor. Podemos añadir algunos métodos para definir qué servicios están habilitados, cuáles son el nombre de usuario y la contraseña, las cuotas de ram o los buckets de muestra a instalar.
Después de implementar ese método, vamos a exponer un CouchbaseEnvironnement y un CouchbaseCluster. El getter del entorno es responsable de ejecutar initCluster
si aún no se ha inicializado. Este método también requiere el método estrategia de espera personalizada escribió en el post anterior. Básicamente sondea en '/pools/default' hasta que el primer nodo presenta un estado saludable.
Aquí está el código de la clase completa:
Utilización
Para usar el CouchbaseContainer puedes simplemente hacer algo como:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@Regla de clase público estático CouchbaseContainer couchbase = nuevo CouchbaseContainer(); @Prueba público void testSimple() lanza Excepción { CouchbaseCluster cc = couchbase.geCouchbaseCluster(); ClusterManager cm = cc.clusterManager("Administrador","contraseña"); BucketSettings ajustes = DefaultBucketSettings.constructor() .enableFlush(verdadero).nombre("por defecto").cuota(100).réplicas(0).tipo(Tipo de cubo.SOPORTE).construya(); ajustes = cm.insertarCubo(ajustes); CouchbaseWaitStrategy s = nuevo CouchbaseWaitStrategy(); s.withBasicCredentials("Administrador", "contraseña"); s.waitUntilReady(couchbase); Cubo cubo = cc.openBucket("por defecto"); Afirme.assertNotNull(cubo); } |
Si desea que sólo se ejecute el servicio k/v con todas las muestras de datos importadas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
público clase CouchbaseDriverTest { @Regla de clase público estático CouchbaseContainer couchbase = nuevo CouchbaseContainer() .conMuestraCerveza(verdadero) .conJuegosIMMuestra(verdadero) .withTravelSample(verdadero) .conFTS(falso) .withIndex(falso) .conQuery(falso); @Prueba público void testSimple() lanza Excepción { CouchbaseCluster cc = couchbase.geCouchbaseCluster(); ClusterManager cm = cc.clusterManager("Administrador","contraseña"); Lista cubos = cm.getBuckets(); Afirme.assertNotNull(cubos); Afirme.assertTrue(cubos.talla() == 3); } } |
Como puedes ver esto es muy simple y permite a cualquiera ejecutar pruebas contra Couchbase siempre y cuando tengan Docker instalado.
Conclusión
Dinos en los comentarios si te gusta esto y quieres que te proporcionemos configuraciones adicionales y atajos para configurar tu Cluster Couchbase durante las pruebas.