WIP:test: HandoverIT-POC - splitted up code into smaller classes -- ALIGN
[demos/kafka/chat] / src / test / java / de / juplo / kafka / chat / backend / HandoverITContainers.java
1 package de.juplo.kafka.chat.backend;
2
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;
15
16 import java.time.Duration;
17 import java.util.Arrays;
18
19
20 @Slf4j
21 public abstract class AbstractContainerTemplates
22 {
23   static final ImagePullPolicy NEVER_PULL = imageName -> false;
24
25
26   final Network network = Network.newNetwork();
27
28   final GenericContainer haproxy, backend1, backend2, backend3;
29
30
31   void setUpExtra() throws Exception
32   {
33     log.info("This setup does not need any extra containers");
34   }
35
36   void setUp() throws Exception
37   {
38     setUpExtra();
39     haproxy.start();
40     backend1.start();
41     // backend2.start();
42     // backend3.start();
43
44     Awaitility
45         .await()
46         .atMost(Duration.ofMinutes(10))
47         .until(() -> WebClient
48             .create("http://localhost:" + backend1.getMappedPort(8080))
49             .get()
50             .uri("/actuator/health")
51             .exchangeToMono(response ->
52             {
53               if (response.statusCode().equals(HttpStatus.OK))
54               {
55                 return response
56                     .bodyToMono(StatusTO.class)
57                     .map(StatusTO::getStatus)
58                     .map(status -> status.equalsIgnoreCase("UP"));
59               }
60               else
61               {
62                 return Mono.just(false);
63               }
64             })
65             .block());
66
67     haproxy
68         .getDockerClient()
69         .killContainerCmd(haproxy.getContainerId())
70         .withSignal("HUP")
71         .exec();
72
73
74     Awaitility
75         .await()
76         .atMost(Duration.ofMinutes(10))
77         .until(() -> WebClient
78             .create("http://localhost:" + haproxy.getMappedPort(8400))
79             .get()
80             .uri("/actuator/health")
81             .exchangeToMono(response ->
82             {
83               if (response.statusCode().equals(HttpStatus.OK))
84               {
85                 return response
86                     .bodyToMono(StatusTO.class)
87                     .map(StatusTO::getStatus)
88                     .map(status -> status.equalsIgnoreCase("UP"));
89               }
90               else
91               {
92                 return Mono.just(false);
93               }
94             })
95             .block());
96   }
97
98   abstract String[] getBackendCommand();
99
100   final GenericContainer createHaproxyContainer()
101   {
102     return new GenericContainer(DockerImageName.parse("haproxytech/haproxy-debian:2.8"))
103         .withNetwork(network)
104         .withNetworkAliases("haproxy")
105         .withClasspathResourceMapping(
106             "haproxy.cfg",
107             "/usr/local/etc/haproxy/haproxy.cfg",
108             BindMode.READ_ONLY)
109         .withClasspathResourceMapping(
110             "sharding.map",
111             "/usr/local/etc/haproxy/sharding.map",
112             BindMode.READ_WRITE)
113         .withExposedPorts(8400, 8401, 8404)
114         .withLogConsumer(new Slf4jLogConsumer(log, true).withPrefix("HAPROXY"));
115   }
116
117   final GenericContainer createBackendContainer(String id)
118   {
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(
129           log,
130           true
131           )
132           .withPrefix("BACKEND-ID".replaceAll("ID", id)));
133   }
134 }