11package org .testcontainers .containers ;
22
33import com .github .dockerjava .api .command .InspectContainerResponse ;
4- import io .tarantool .driver .exceptions .TarantoolConnectionException ;
54
65import org .testcontainers .containers .exceptions .CartridgeTopologyException ;
76import org .testcontainers .images .builder .ImageFromDockerfile ;
1312import java .util .HashMap ;
1413import java .util .List ;
1514import java .util .Map ;
16- import java .util .concurrent .CompletableFuture ;
1715import java .util .concurrent .ExecutionException ;
1816import java .util .concurrent .TimeoutException ;
1917import java .util .function .Supplier ;
8381 * specified in the http_port options, will be exposed.
8482 *
8583 * @author Alexey Kuzin
84+ * @author Artyom Dubinin
85+ * @author Ivan Dneprov
86+ *
8687 */
8788public class TarantoolCartridgeContainer extends GenericContainer <TarantoolCartridgeContainer >
8889 implements TarantoolContainerOperations <TarantoolCartridgeContainer > {
@@ -120,6 +121,7 @@ public class TarantoolCartridgeContainer extends GenericContainer<TarantoolCartr
120121 private String directoryResourcePath = SCRIPT_RESOURCE_DIRECTORY ;
121122 private String instanceDir = INSTANCE_DIR ;
122123 private String topologyConfigurationFile ;
124+ private SslContext sslContext ;
123125
124126 /**
125127 * Create a container with default image and specified instances file from the classpath resources. Assumes that
@@ -344,6 +346,11 @@ public String getInstanceDir() {
344346 return instanceDir ;
345347 }
346348
349+ @ Override
350+ public int getInternalPort () {
351+ return routerPort ;
352+ }
353+
347354 /**
348355 * Get Cartridge router HTTP API hostname
349356 *
@@ -491,7 +498,7 @@ private boolean setupTopology() {
491498 .substring (topologyConfigurationFile .lastIndexOf ('/' ) + 1 );
492499
493500 try {
494- Container . ExecResult result = execInContainer ("cartridge" ,
501+ ExecResult result = execInContainer ("cartridge" ,
495502 "replicasets" ,
496503 "--run-dir=" + TARANTOOL_RUN_DIR ,
497504 "--file=" + replicasetsFileName , "setup" , "--bootstrap-vshard" );
@@ -505,7 +512,7 @@ private boolean setupTopology() {
505512
506513 } else {
507514 try {
508- List <?> res = executeScript (topologyConfigurationFile ). get ( );
515+ List <?> res = executeScriptDecoded (topologyConfigurationFile );
509516 if (res .size () >= 2 && res .get (1 ) != null && res .get (1 ) instanceof Map ) {
510517 HashMap <?, ?> error = ((HashMap <?, ?>) res .get (1 ));
511518 // that means topology already exists
@@ -517,10 +524,6 @@ private boolean setupTopology() {
517524 if (e .getCause () instanceof TimeoutException ) {
518525 return true ;
519526 // Do nothing, the cluster is reloading
520- } else if (e .getCause () instanceof TarantoolConnectionException ) {
521- // Probably cluster is not ready
522- logger ().error ("Failed to setup topology: {}" , e .getMessage ());
523- return false ;
524527 }
525528 } else {
526529 throw new CartridgeTopologyException (e );
@@ -546,7 +549,7 @@ private void retryingSetupTopology() {
546549
547550 private void bootstrapVshard () {
548551 try {
549- executeCommand (VSHARD_BOOTSTRAP_COMMAND ). get () ;
552+ executeCommand (VSHARD_BOOTSTRAP_COMMAND );
550553 } catch (Exception e ) {
551554 logger ().error ("Failed to bootstrap vshard cluster" , e );
552555 throw new RuntimeException (e );
@@ -594,10 +597,10 @@ private void waitUntilTrue(int secondsToWait, Supplier<Boolean> waitFunc) {
594597
595598 private boolean routerIsUp () {
596599 String healthyCmd = " local cartridge = package.loaded['cartridge']" +
597- " return assert( cartridge ~= nil) " ;
600+ " return cartridge ~= nil" ;
598601 try {
599- List <?> result = executeCommand (healthyCmd ). get ( );
600- return (Boolean ) result .get (0 );
602+ List <?> result = executeCommandDecoded (healthyCmd );
603+ return result . get ( 0 ). getClass () == Boolean . class && (Boolean ) result .get (0 );
601604 } catch (Exception e ) {
602605 logger ().warn ("Error while waiting for router instance to be up: " + e .getMessage ());
603606 return false ;
@@ -606,23 +609,33 @@ private boolean routerIsUp() {
606609
607610 private boolean isCartridgeHealthy () {
608611 String healthyCmd = " local cartridge = package.loaded['cartridge']" +
609- " return assert( cartridge) and assert( cartridge.is_healthy() )" ;
612+ " return cartridge ~= nil and cartridge.is_healthy()" ;
610613 try {
611- List <?> result = executeCommand (healthyCmd ). get ( );
612- return (Boolean ) result .get (0 );
614+ List <?> result = executeCommandDecoded (healthyCmd );
615+ return result . get ( 0 ). getClass () == Boolean . class && (Boolean ) result .get (0 );
613616 } catch (Exception e ) {
614617 logger ().warn ("Error while waiting for cartridge healthy state: " + e .getMessage ());
615618 return false ;
616619 }
617620 }
618621
619622 @ Override
620- public CompletableFuture <List <?>> executeScript (String scriptResourcePath ) throws Exception {
621- return clientHelper .executeScript (scriptResourcePath );
623+ public ExecResult executeScript (String scriptResourcePath ) throws Exception {
624+ return clientHelper .executeScript (scriptResourcePath , this .sslContext );
625+ }
626+
627+ @ Override
628+ public <T > T executeScriptDecoded (String scriptResourcePath ) throws Exception {
629+ return clientHelper .executeScriptDecoded (scriptResourcePath , this .sslContext );
630+ }
631+
632+ @ Override
633+ public ExecResult executeCommand (String command ) throws Exception {
634+ return clientHelper .executeCommand (command , this .sslContext );
622635 }
623636
624637 @ Override
625- public CompletableFuture < List <?>> executeCommand (String command , Object ... arguments ) throws Exception {
626- return clientHelper .executeCommand (command , arguments );
638+ public < T > T executeCommandDecoded (String command ) throws Exception {
639+ return clientHelper .executeCommandDecoded (command , this . sslContext );
627640 }
628641}
0 commit comments