WIP:test: HandoverIT-POC - splitted up code into smaller classes -- ALIGN
[demos/kafka/chat] / src / test / java / de / juplo / kafka / chat / backend / HandoverITContainers.java
index 1a48e27..96f521f 100644 (file)
@@ -1,6 +1,9 @@
 package de.juplo.kafka.chat.backend;
 
 import lombok.extern.slf4j.Slf4j;
+import org.awaitility.Awaitility;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.reactive.function.client.WebClient;
 import org.testcontainers.containers.BindMode;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.Network;
@@ -8,20 +11,104 @@ import org.testcontainers.containers.output.Slf4jLogConsumer;
 import org.testcontainers.containers.wait.strategy.Wait;
 import org.testcontainers.images.ImagePullPolicy;
 import org.testcontainers.utility.DockerImageName;
+import reactor.core.publisher.Mono;
 
+import java.time.Duration;
 import java.util.Arrays;
 
 
 @Slf4j
-public abstract class ContainerTemplates
+public abstract class AbstractContainerTemplates
 {
   static final ImagePullPolicy NEVER_PULL = imageName -> false;
-  static final Network NETWORK = Network.newNetwork();
 
-  static GenericContainer createHaproxyContainer()
+
+  final Network network = Network.newNetwork();
+  final GenericContainer haproxy, backend1, backend2, backend3;
+
+
+  AbstractContainerTemplates()
+  {
+    haproxy = createHaproxyContainer();
+    backend1 = createBackendContainer("1");
+    backend2 = createBackendContainer("2");
+    backend3 = createBackendContainer("3");
+  }
+
+
+  void setUpExtra() throws Exception
+  {
+    log.info("This setup does not need any extra containers");
+  }
+
+  void setUp() throws Exception
+  {
+    setUpExtra();
+    haproxy.start();
+    backend1.start();
+    // backend2.start();
+    // backend3.start();
+
+    Awaitility
+        .await()
+        .atMost(Duration.ofMinutes(10))
+        .until(() -> WebClient
+            .create("http://localhost:" + backend1.getMappedPort(8080))
+            .get()
+            .uri("/actuator/health")
+            .exchangeToMono(response ->
+            {
+              if (response.statusCode().equals(HttpStatus.OK))
+              {
+                return response
+                    .bodyToMono(StatusTO.class)
+                    .map(StatusTO::getStatus)
+                    .map(status -> status.equalsIgnoreCase("UP"));
+              }
+              else
+              {
+                return Mono.just(false);
+              }
+            })
+            .block());
+
+    haproxy
+        .getDockerClient()
+        .killContainerCmd(haproxy.getContainerId())
+        .withSignal("HUP")
+        .exec();
+
+
+    Awaitility
+        .await()
+        .atMost(Duration.ofMinutes(10))
+        .until(() -> WebClient
+            .create("http://localhost:" + haproxy.getMappedPort(8400))
+            .get()
+            .uri("/actuator/health")
+            .exchangeToMono(response ->
+            {
+              if (response.statusCode().equals(HttpStatus.OK))
+              {
+                return response
+                    .bodyToMono(StatusTO.class)
+                    .map(StatusTO::getStatus)
+                    .map(status -> status.equalsIgnoreCase("UP"));
+              }
+              else
+              {
+                return Mono.just(false);
+              }
+            })
+            .block());
+  }
+
+  abstract String[] getBackendCommand();
+
+  final GenericContainer createHaproxyContainer()
   {
     return new GenericContainer(DockerImageName.parse("haproxytech/haproxy-debian:2.8"))
-        .withNetwork(NETWORK)
+        .withNetwork(network)
         .withNetworkAliases("haproxy")
         .withClasspathResourceMapping(
             "haproxy.cfg",
@@ -35,13 +122,13 @@ public abstract class ContainerTemplates
         .withLogConsumer(new Slf4jLogConsumer(log, true).withPrefix("HAPROXY"));
   }
 
-  static GenericContainer createBackendContainer(String id, String[] command)
+  final GenericContainer createBackendContainer(String id)
   {
     return new GenericContainer(DockerImageName.parse("juplo/chat-backend:0.0.1-SNAPSHOT"))
       .withImagePullPolicy(NEVER_PULL)
-      .withNetwork(NETWORK)
+      .withNetwork(network)
       .withNetworkAliases("backend-ID".replaceAll("ID", id))
-      .withCommand(Arrays.stream(command)
+      .withCommand(Arrays.stream(getBackendCommand())
           .map(commandPart -> commandPart.replaceAll("ID", id))
           .toArray(size -> new String[size]))
       .withExposedPorts(8080)