From 82996cf1958982be86b9cbf1d79b8256fcfb8eec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20R=C5=BCysko?= Date: Fri, 5 Apr 2024 10:14:03 +0200 Subject: [PATCH] Fix setting readiness status for the first time (#1839) --- .../domain/readiness/ReadinessService.java | 5 ++- .../client/integration/HermesTestClient.java | 4 +++ .../integration/ManagementTestClient.java | 10 ++++++ .../integrationtests/ReadinessCheckTest.java | 4 +-- .../management/ReadinessManagementTest.java | 31 +++++++++++++++++++ 5 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 integration-tests/src/integrationTest/java/pl/allegro/tech/hermes/integrationtests/management/ReadinessManagementTest.java diff --git a/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/readiness/ReadinessService.java b/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/readiness/ReadinessService.java index 21dc0cde7b..30d144ac7a 100644 --- a/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/readiness/ReadinessService.java +++ b/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/readiness/ReadinessService.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; @@ -32,7 +33,9 @@ public void setReady(DatacenterReadiness datacenterReadiness) { toSave.put(datacenter, current.get(datacenter)); } toSave.put(datacenterReadiness.getDatacenter(), datacenterReadiness); - List readiness = toSave.values().stream().toList(); + List readiness = toSave.values().stream() + .filter(Objects::nonNull) + .toList(); commandExecutor.execute(new SetReadinessCommand(readiness)); } diff --git a/hermes-test-helper/src/main/java/pl/allegro/tech/hermes/test/helper/client/integration/HermesTestClient.java b/hermes-test-helper/src/main/java/pl/allegro/tech/hermes/test/helper/client/integration/HermesTestClient.java index 2d7b6cb0bf..fd2654e8d0 100644 --- a/hermes-test-helper/src/main/java/pl/allegro/tech/hermes/test/helper/client/integration/HermesTestClient.java +++ b/hermes-test-helper/src/main/java/pl/allegro/tech/hermes/test/helper/client/integration/HermesTestClient.java @@ -283,6 +283,10 @@ public WebTestClient.ResponseSpec setReadiness(String dc, boolean state) { } public WebTestClient.ResponseSpec getReadiness() { + return managementTestClient.getReadiness(); + } + + public WebTestClient.ResponseSpec getFrontendReadiness() { return frontendTestClient.getStatusReady(); } diff --git a/hermes-test-helper/src/main/java/pl/allegro/tech/hermes/test/helper/client/integration/ManagementTestClient.java b/hermes-test-helper/src/main/java/pl/allegro/tech/hermes/test/helper/client/integration/ManagementTestClient.java index 87c337c74a..d3dfcc5e5c 100644 --- a/hermes-test-helper/src/main/java/pl/allegro/tech/hermes/test/helper/client/integration/ManagementTestClient.java +++ b/hermes-test-helper/src/main/java/pl/allegro/tech/hermes/test/helper/client/integration/ManagementTestClient.java @@ -58,6 +58,8 @@ public class ManagementTestClient { private static final String SET_READINESS = "/readiness/datacenters/{dc}"; + private static final String GET_READINESS = "/readiness/datacenters"; + private static final String TOPIC_SCHEMA = "/topics/{topicName}/schema"; private static final String ALL_TOPIC_CLIENTS = "/topics/{topicName}/clients"; @@ -337,6 +339,14 @@ public WebTestClient.ResponseSpec setReadiness(String dc, boolean state) { .exchange(); } + public WebTestClient.ResponseSpec getReadiness() { + return webTestClient.get().uri(UriBuilder + .fromUri(managementContainerUrl) + .path(GET_READINESS) + .build()) + .exchange(); + } + public WebTestClient.ResponseSpec saveSchema(String qualifiedTopicName, boolean validate, String schema) { return webTestClient.post().uri(UriBuilder .fromUri(managementContainerUrl) diff --git a/integration-tests/src/integrationTest/java/pl/allegro/tech/hermes/integrationtests/ReadinessCheckTest.java b/integration-tests/src/integrationTest/java/pl/allegro/tech/hermes/integrationtests/ReadinessCheckTest.java index 90176dd5be..bb3a914cea 100644 --- a/integration-tests/src/integrationTest/java/pl/allegro/tech/hermes/integrationtests/ReadinessCheckTest.java +++ b/integration-tests/src/integrationTest/java/pl/allegro/tech/hermes/integrationtests/ReadinessCheckTest.java @@ -21,7 +21,7 @@ public void shouldRespectReadinessStatusSetByAdmin() { // then waitAtMost(Duration.FIVE_SECONDS).until(() -> hermes.api() - .getReadiness() + .getFrontendReadiness() .expectStatus().is5xxServerError() .expectBody(String.class).isEqualTo("NOT_READY") ); @@ -32,7 +32,7 @@ public void shouldRespectReadinessStatusSetByAdmin() { // then waitAtMost(Duration.FIVE_SECONDS).until(() -> hermes.api() - .getReadiness() + .getFrontendReadiness() .expectStatus().isOk() .expectBody(String.class).isEqualTo("READY") ); diff --git a/integration-tests/src/integrationTest/java/pl/allegro/tech/hermes/integrationtests/management/ReadinessManagementTest.java b/integration-tests/src/integrationTest/java/pl/allegro/tech/hermes/integrationtests/management/ReadinessManagementTest.java new file mode 100644 index 0000000000..133f7ff0fb --- /dev/null +++ b/integration-tests/src/integrationTest/java/pl/allegro/tech/hermes/integrationtests/management/ReadinessManagementTest.java @@ -0,0 +1,31 @@ +package pl.allegro.tech.hermes.integrationtests.management; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; +import pl.allegro.tech.hermes.api.DatacenterReadiness; +import pl.allegro.tech.hermes.integrationtests.setup.HermesExtension; + +import static pl.allegro.tech.hermes.api.DatacenterReadiness.ReadinessStatus.READY; +import static pl.allegro.tech.hermes.infrastructure.dc.DefaultDatacenterNameProvider.DEFAULT_DC_NAME; + +public class ReadinessManagementTest { + + @RegisterExtension + public static final HermesExtension hermes = new HermesExtension(); + + @Test + public void shouldNotFailWhileSettingReadinessStatusForTheFirstTime() { + //when + hermes.api().setReadiness("unhealthy-dc", false); + + //then + hermes.api().getReadiness() + .expectStatus() + .isOk() + .expectBodyList(DatacenterReadiness.class) + // 'unhealthy-dc' should not be returned here, since it doesn't exist in management configuration + // In this test, we are just verifying if setting readiness status for the first time doesn't break anything. + .hasSize(1) + .contains(new DatacenterReadiness(DEFAULT_DC_NAME, READY)); + } +}