You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2026/03/02 10:36:36 UTC

(camel-quarkus) 02/04: fix: Add ES cluster health check before running test fixes #8321

This is an automated email from the ASF dual-hosted git repository.

jamesnetherton pushed a commit to branch 3.27.x
in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git

commit 3de02caf365cd24581e3ff99b393926f098418a4
Author: Gaƫlle Fournier <ga...@gmail.com>
AuthorDate: Mon Feb 23 08:24:37 2026 +0100

    fix: Add ES cluster health check before running test fixes #8321
    
    Co-authored-by: Jiri Ondrusek <on...@gmail.com>
---
 .../elasticsearch/it/ElasticsearchTest.java        | 81 ++++++++++++++++++++++
 1 file changed, 81 insertions(+)

diff --git a/integration-tests-jvm/elasticsearch/src/test/java/org/apache/camel/quarkus/component/elasticsearch/it/ElasticsearchTest.java b/integration-tests-jvm/elasticsearch/src/test/java/org/apache/camel/quarkus/component/elasticsearch/it/ElasticsearchTest.java
index 59559b8e88..9d3f4c23eb 100644
--- a/integration-tests-jvm/elasticsearch/src/test/java/org/apache/camel/quarkus/component/elasticsearch/it/ElasticsearchTest.java
+++ b/integration-tests-jvm/elasticsearch/src/test/java/org/apache/camel/quarkus/component/elasticsearch/it/ElasticsearchTest.java
@@ -16,6 +16,13 @@
  */
 package org.apache.camel.quarkus.component.elasticsearch.it;
 
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.Objects;
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
@@ -24,7 +31,11 @@ import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
 import io.restassured.http.ContentType;
 import org.awaitility.Awaitility;
+import org.awaitility.core.ConditionTimeoutException;
+import org.eclipse.microprofile.config.ConfigProvider;
+import org.jboss.logging.Logger;
 import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
 
@@ -33,6 +44,13 @@ import static org.hamcrest.Matchers.is;
 @QuarkusTest
 @QuarkusTestResource(ElasticsearchTestResource.class)
 class ElasticsearchTest {
+    private static final Logger LOG = Logger.getLogger(ElasticsearchTest.class);
+
+    @BeforeEach
+    public void beforeEach() throws ConditionTimeoutException {
+        // Ensure the Elasticsearch cluster is ready before each test
+        waitClusterReady();
+    }
 
     @AfterEach
     public void afterEach() {
@@ -352,6 +370,69 @@ class ElasticsearchTest {
         });
     }
 
+    /**
+     * Queries the Elasticsearch cluster health status and waits until it's green or yellow.
+     * Retries with Awaitility until the cluster is ready.
+     *
+     * @throws ConditionTimeoutException if the request fails after all retries
+     */
+    private void waitClusterReady() throws ConditionTimeoutException {
+        String hostAddresses = ConfigProvider.getConfig().getValue("camel.component.elasticsearch.host-addresses",
+                String.class);
+        String username = ConfigProvider.getConfig().getValue("camel.component.elasticsearch.user", String.class);
+        String password = ConfigProvider.getConfig().getValue("camel.component.elasticsearch.password", String.class);
+
+        Awaitility.await()
+                .pollInterval(500, TimeUnit.MILLISECONDS)
+                .atMost(10, TimeUnit.SECONDS)
+                .until(() -> {
+                    try {
+                        URL url = new URL(String.format("http://%s/_cluster/health", hostAddresses));
+                        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+
+                        // Set up Basic Authentication
+                        String auth = String.format("%s:%s", username, password);
+                        String encodedAuth = Base64.getEncoder().encodeToString(auth.getBytes(StandardCharsets.UTF_8));
+                        connection.setRequestProperty("Authorization", "Basic " + encodedAuth);
+                        connection.setRequestMethod("GET");
+                        connection.setConnectTimeout(5000);
+                        connection.setReadTimeout(5000);
+
+                        int responseCode = connection.getResponseCode();
+                        if (responseCode == HttpURLConnection.HTTP_OK) {
+                            try (BufferedReader reader = new BufferedReader(
+                                    new InputStreamReader(connection.getInputStream()))) {
+                                StringBuilder response = new StringBuilder();
+                                String line;
+                                while ((line = reader.readLine()) != null) {
+                                    response.append(line);
+                                }
+                                String healthJson = response.toString();
+
+                                // Check if cluster status is green or yellow
+                                if (healthJson.contains("\"status\":\"green\"")
+                                        || healthJson.contains("\"status\":\"yellow\"")) {
+                                    LOG.info("Cluster health is ready: " + healthJson);
+                                    return healthJson;
+                                } else {
+                                    LOG.info("Cluster not ready yet, current status: "
+                                            + healthJson);
+                                    return null;
+                                }
+                            }
+                        } else {
+                            LOG.info("Cluster health check returned code: " + responseCode
+                                    + ", retrying...");
+                            return null;
+                        }
+                    } catch (Exception e) {
+                        LOG.info("Failed to query cluster health: " + e.getMessage()
+                                + ", retrying...");
+                        return null;
+                    }
+                }, Objects::nonNull);
+    }
+
     /**
      * This method returns array of component names used in test routes.
      * It can be handy e.g. for testing quarkus managed elasticsearch client.