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 |
public CouchbaseContainer() { super("couchbase:4.5.0"); } @Override protected Integer getLivenessCheckPort() { return 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 |
@Override protected void configure() { addExposedPorts(8091, 8092, 8093, 8094, 11207, 11210, 11211, 18091, 18092, 18093); setWaitStrategy(new HttpWaitStrategy().forPath("/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 |
curl -v -X POST https://192.168.99.100:8091/pools/default -d memoryQuota=300 -d indexMemoryQuota=300 curl -v https://192.168.99.100:8091/node/controller/setupServices -d 'services=kv%2Cn1ql%2Cindex' curl -v -X POST curl -v -X POST https://192.168.99.100:8091/settings/web -d port=8091 -d username=Administrator -d password=password |
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 |
public void callCouchbaseRestAPI(String url, String payload, String username, String password) throws IOException { HttpURLConnection httpConnection = (HttpURLConnection) ((new URL(url).openConnection())); httpConnection.setDoOutput(true); httpConnection.setDoInput(true); httpConnection.setRequestMethod("POST"); httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); if (username != null) { String encoded = Base64.encode((username + ":" + password).getBytes("UTF-8")); httpConnection.setRequestProperty("Authorization", "Basic "+encoded); } DataOutputStream out = new DataOutputStream(httpConnection.getOutputStream()); out.writeBytes(payload); out.flush(); out.close(); httpConnection.getResponseCode(); httpConnection.disconnect(); } |
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 |
@ClassRule public static CouchbaseContainer couchbase = new CouchbaseContainer(); @Test public void testSimple() throws Exception { CouchbaseCluster cc = couchbase.geCouchbaseCluster(); ClusterManager cm = cc.clusterManager("Administrator","password"); BucketSettings settings = DefaultBucketSettings.builder() .enableFlush(true).name("default").quota(100).replicas(0).type(BucketType.COUCHBASE).build(); settings = cm.insertBucket(settings); CouchbaseWaitStrategy s = new CouchbaseWaitStrategy(); s.withBasicCredentials("Administrator", "password"); s.waitUntilReady(couchbase); Bucket bucket = cc.openBucket("default"); Assert.assertNotNull(bucket); } |
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 |
public class CouchbaseDriverTest { @ClassRule public static CouchbaseContainer couchbase = new CouchbaseContainer() .withBeerSample(true) .withGamesIMSample(true) .withTravelSample(true) .withFTS(false) .withIndex(false) .withQuery(false); @Test public void testSimple() throws Exception { CouchbaseCluster cc = couchbase.geCouchbaseCluster(); ClusterManager cm = cc.clusterManager("Administrator","password"); List buckets = cm.getBuckets(); Assert.assertNotNull(buckets); Assert.assertTrue(buckets.size() == 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.