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;
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",
.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)