1 package de.juplo.kafka.chat.backend;
3 import lombok.extern.slf4j.Slf4j;
4 import org.awaitility.Awaitility;
5 import org.springframework.http.HttpStatus;
6 import org.springframework.web.reactive.function.client.WebClient;
7 import org.testcontainers.containers.BindMode;
8 import org.testcontainers.containers.GenericContainer;
9 import org.testcontainers.containers.Network;
10 import org.testcontainers.containers.output.Slf4jLogConsumer;
11 import org.testcontainers.containers.wait.strategy.Wait;
12 import org.testcontainers.images.ImagePullPolicy;
13 import org.testcontainers.utility.DockerImageName;
14 import reactor.core.publisher.Mono;
16 import java.time.Duration;
17 import java.util.Arrays;
21 public abstract class AbstractContainerTemplates
23 static final ImagePullPolicy NEVER_PULL = imageName -> false;
26 final Network network = Network.newNetwork();
28 final GenericContainer haproxy, backend1, backend2, backend3;
31 void setUpExtra() throws Exception
33 log.info("This setup does not need any extra containers");
36 void setUp() throws Exception
46 .atMost(Duration.ofMinutes(10))
47 .until(() -> WebClient
48 .create("http://localhost:" + backend1.getMappedPort(8080))
50 .uri("/actuator/health")
51 .exchangeToMono(response ->
53 if (response.statusCode().equals(HttpStatus.OK))
56 .bodyToMono(StatusTO.class)
57 .map(StatusTO::getStatus)
58 .map(status -> status.equalsIgnoreCase("UP"));
62 return Mono.just(false);
69 .killContainerCmd(haproxy.getContainerId())
76 .atMost(Duration.ofMinutes(10))
77 .until(() -> WebClient
78 .create("http://localhost:" + haproxy.getMappedPort(8400))
80 .uri("/actuator/health")
81 .exchangeToMono(response ->
83 if (response.statusCode().equals(HttpStatus.OK))
86 .bodyToMono(StatusTO.class)
87 .map(StatusTO::getStatus)
88 .map(status -> status.equalsIgnoreCase("UP"));
92 return Mono.just(false);
98 abstract String[] getBackendCommand();
100 final GenericContainer createHaproxyContainer()
102 return new GenericContainer(DockerImageName.parse("haproxytech/haproxy-debian:2.8"))
103 .withNetwork(network)
104 .withNetworkAliases("haproxy")
105 .withClasspathResourceMapping(
107 "/usr/local/etc/haproxy/haproxy.cfg",
109 .withClasspathResourceMapping(
111 "/usr/local/etc/haproxy/sharding.map",
113 .withExposedPorts(8400, 8401, 8404)
114 .withLogConsumer(new Slf4jLogConsumer(log, true).withPrefix("HAPROXY"));
117 final GenericContainer createBackendContainer(String id)
119 return new GenericContainer(DockerImageName.parse("juplo/chat-backend:0.0.1-SNAPSHOT"))
120 .withImagePullPolicy(NEVER_PULL)
121 .withNetwork(network)
122 .withNetworkAliases("backend-ID".replaceAll("ID", id))
123 .withCommand(Arrays.stream(getBackendCommand())
124 .map(commandPart -> commandPart.replaceAll("ID", id))
125 .toArray(size -> new String[size]))
126 .withExposedPorts(8080)
127 .waitingFor(Wait.forLogMessage(".*Started\\ ChatBackendApplication.*\\n", 1))
128 .withLogConsumer(new Slf4jLogConsumer(
132 .withPrefix("BACKEND-ID".replaceAll("ID", id)));