diff --git a/.buildkite/default-pipeline.yml b/.buildkite/default-pipeline.yml index 05048f31..8ea91e6a 100644 --- a/.buildkite/default-pipeline.yml +++ b/.buildkite/default-pipeline.yml @@ -1,15 +1,17 @@ --- # $yaml-language-server: $schema=https://raw.githubusercontent.com/buildkite/pipeline-schema/main/schema.json steps: - - label: ":docker: Build and Push Dockerfile" - commands: - - "vault kv get -field=password kv/ci-shared/opex/oci-registry-creds-prod | docker login -u $(vault kv get -field=username kv/ci-shared/opex/oci-registry-creds-prod) --password-stdin docker.elastic.co" - - "docker buildx create --use" - - "docker buildx build --platform linux/amd64,linux/arm64 --push -t docker.elastic.co/opex/diagnostics:latest ." - agents: - provider: "gcp" - imagePrefix: "core-ubuntu-2204" - machineType: "n2-standard-2" + - label: "Build" + command: "true" +# - label: ":docker: Build and Push Dockerfile" +# commands: +# - "vault kv get -field=password kv/ci-shared/opex/oci-registry-creds-prod | docker login -u $(vault kv get -field=username kv/ci-shared/opex/oci-registry-creds-prod) --password-stdin docker.elastic.co" +# - "docker buildx create --use" +# - "docker buildx build --platform linux/amd64,linux/arm64 --push -t docker.elastic.co/opex/diagnostics:latest ." +# agents: +# provider: "gcp" +# imagePrefix: "core-ubuntu-2204" +# machineType: "n2-standard-2" - label: "Test" command: "true" diff --git a/build.gradle.kts b/build.gradle.kts index d26db6cc..e539ab34 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -79,7 +79,7 @@ dependencies { testImplementation("org.junit.jupiter:junit-jupiter-engine:6.0.3") testImplementation("org.junit.platform:junit-platform-launcher:1.14.1") testRuntimeOnly("org.junit.platform:junit-platform-surefire-provider:1.3.2") - testImplementation("org.mock-server:mockserver-netty:5.15.0") + testImplementation("org.wiremock:wiremock:3.13.2") } // --------------------------------------------------------------------------- diff --git a/src/test/java/co/elastic/support/diagnostics/TestDiagnosticService.java b/src/test/java/co/elastic/support/diagnostics/TestDiagnosticService.java index 79913277..4416d128 100644 --- a/src/test/java/co/elastic/support/diagnostics/TestDiagnosticService.java +++ b/src/test/java/co/elastic/support/diagnostics/TestDiagnosticService.java @@ -10,21 +10,17 @@ import co.elastic.support.diagnostics.chain.DiagnosticContext; import co.elastic.support.util.JsonYamlUtils; import co.elastic.support.util.ResourceCache; +import com.github.tomakehurst.wiremock.WireMockServer; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.io.TempDir; -import org.mockserver.configuration.ConfigurationProperties; -import org.mockserver.integration.ClientAndServer; -import org.mockserver.model.Header; -import org.mockserver.model.HttpRequest; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Arrays; import java.util.Enumeration; import java.util.HashMap; import java.util.List; @@ -35,14 +31,20 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockserver.integration.ClientAndServer.startClientAndServer; -import static org.mockserver.model.HttpRequest.request; -import static org.mockserver.model.HttpResponse.response; +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.any; +import static com.github.tomakehurst.wiremock.client.WireMock.anyUrl; +import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; @TestInstance(TestInstance.Lifecycle.PER_CLASS) class TestDiagnosticService { - private ClientAndServer mockServer; + private WireMockServer wireMockServer; @TempDir private Path folder; @@ -54,16 +56,13 @@ class TestDiagnosticService { @BeforeAll public void globalSetup() { - mockServer = startClientAndServer(9880); - // mockserver by default is in verbose mode (useful when creating new test), - // move it to warning. - ConfigurationProperties.disableSystemOut(true); - ConfigurationProperties.logLevel("WARN"); + wireMockServer = new WireMockServer(wireMockConfig().port(9880)); + wireMockServer.start(); } @AfterAll public void globalTeardown() { - mockServer.stop(); + wireMockServer.stop(); } private DiagConfig newDiagConfig() { @@ -79,6 +78,7 @@ private DiagConfig newDiagConfig() { private DiagnosticInputs newDiagnosticInputs() { DiagnosticInputs diagnosticInputs = new DiagnosticInputs(); diagnosticInputs.port = 9880; + diagnosticInputs.scheme = "http"; diagnosticInputs.diagType = Constants.api; try { Path outputDir = Files.createTempDirectory(folder, "diag"); @@ -89,39 +89,38 @@ private DiagnosticInputs newDiagnosticInputs() { return diagnosticInputs; } - private HttpRequest myRequest(Boolean withHeaders) { + private void setupResponse(boolean withHeaders) { if (withHeaders) { - return request().withHeaders( - new Header(headerKey1, headerVal1), - new Header(headerKey2, headerVal2)); + wireMockServer.stubFor(any(urlEqualTo("/")) + .withHeader(headerKey1, equalTo(headerVal1)) + .withHeader(headerKey2, equalTo(headerVal2)) + .willReturn(aResponse() + .withBody("{\"version\": {\"number\": \"7.14.0\"}}"))); + wireMockServer.stubFor(any(urlEqualTo("/_nodes/os,process,settings,transport,http")) + .withHeader(headerKey1, equalTo(headerVal1)) + .withHeader(headerKey2, equalTo(headerVal2)) + .willReturn(aResponse() + .withBody("{}"))); + wireMockServer.stubFor(any(anyUrl()) + .withHeader(headerKey1, equalTo(headerVal1)) + .withHeader(headerKey2, equalTo(headerVal2)) + .atPriority(10) + .willReturn(aResponse() + .withBody("some_response_body"))); } else { - return request(); + wireMockServer.stubFor(any(urlEqualTo("/")) + .willReturn(aResponse() + .withBody("{\"version\": {\"number\": \"7.14.0\"}}"))); + wireMockServer.stubFor(any(urlEqualTo("/_nodes/os,process,settings,transport,http")) + .willReturn(aResponse() + .withBody("{}"))); + wireMockServer.stubFor(any(anyUrl()) + .atPriority(10) + .willReturn(aResponse() + .withBody("some_response_body"))); } } - private void setupResponse(Boolean withHeaders) { - mockServer - .when( - myRequest(withHeaders) - .withPath("/")) - .respond( - response() - .withBody("{\"version\": {\"number\": \"7.14.0\"}}")); - mockServer - .when( - myRequest(withHeaders) - .withPath("/_nodes/os,process,settings,transport,http")) - .respond( - response() - .withBody("{}")); - mockServer - .when( - myRequest(withHeaders)) - .respond( - response() - .withBody("some_response_body")); - } - public HashMap zipFileContents(File result) throws IOException { try (ZipFile zipFile = new ZipFile(result, ZipFile.OPEN_READ)) { HashMap contents = new HashMap<>(); @@ -134,7 +133,7 @@ public HashMap zipFileContents(File result) throws IOException if (!entry.isDirectory()) { // Add file path without leading directory - contents.put(entry.getName().replaceFirst("^(.+\\/)(.+)", "$2"), entry); + contents.put(entry.getName().replaceFirst("^(.+/)(.+)", "$2"), entry); } } @@ -142,13 +141,13 @@ public HashMap zipFileContents(File result) throws IOException } } - public void checkResult(File result, Boolean withLogFile) { + public void checkResult(File result, boolean withLogFile) { assertTrue(result.toString().matches(".*\\.zip$"), result.toString()); try { Map contents = zipFileContents(result); assertTrue(contents.containsKey("diagnostic_manifest.json"), - () -> contents.keySet().stream().collect(Collectors.joining(", "))); + () -> String.join(", ", contents.keySet())); assertTrue(contents.containsKey("manifest.json")); if (withLogFile) { @@ -177,8 +176,7 @@ public void testWithExtraHeaders() { diagConfig.extraHeaders = extraHeaders; DiagnosticService diag = new DiagnosticService(); - try ( - ResourceCache resourceCache = new ResourceCache();) { + try (ResourceCache resourceCache = new ResourceCache()) { DiagnosticContext context = new DiagnosticContext(diagConfig, newDiagnosticInputs(), resourceCache, true); File result = diag.exec(context); checkResult(result, true); @@ -193,8 +191,7 @@ public void testWithoutExtraHeaders() { DiagnosticService diag = new DiagnosticService(); - try ( - ResourceCache resourceCache = new ResourceCache();) { + try (ResourceCache resourceCache = new ResourceCache()) { DiagnosticContext context = new DiagnosticContext(newDiagConfig(), newDiagnosticInputs(), resourceCache, true); File result = diag.exec(context); @@ -208,22 +205,19 @@ public void testWithoutExtraHeaders() { public void testConcurrentExecutions() { setupResponse(false); - ConcurrentHashMap results = new ConcurrentHashMap(); + ConcurrentHashMap results = new ConcurrentHashMap<>(); - Function task = (Integer i) -> new Runnable() { - @Override - public void run() { - DiagnosticService diag = new DiagnosticService(); + Function task = (Integer i) -> () -> { + DiagnosticService diag = new DiagnosticService(); - try (ResourceCache resourceCache = new ResourceCache()) { - DiagnosticContext context = new DiagnosticContext(newDiagConfig(), newDiagnosticInputs(), - resourceCache, false); - File result = diag.exec(context); - results.put(i, result); - } catch (DiagnosticException e) { - System.out.println(e.getStackTrace()); - fail(e); - } + try (ResourceCache resourceCache = new ResourceCache()) { + DiagnosticContext context = new DiagnosticContext(newDiagConfig(), newDiagnosticInputs(), + resourceCache, false); + File result = diag.exec(context); + results.put(i, result); + } catch (DiagnosticException e) { + System.out.println(e.getStackTrace()); + fail(e); } }; diff --git a/src/test/java/co/elastic/support/diagnostics/commands/TestCheckKibanaVersion.java b/src/test/java/co/elastic/support/diagnostics/commands/TestCheckKibanaVersion.java index 10e26492..a6e62a64 100644 --- a/src/test/java/co/elastic/support/diagnostics/commands/TestCheckKibanaVersion.java +++ b/src/test/java/co/elastic/support/diagnostics/commands/TestCheckKibanaVersion.java @@ -7,37 +7,43 @@ package co.elastic.support.diagnostics.commands; import co.elastic.support.diagnostics.DiagnosticException; -import org.junit.jupiter.api.Test; -import org.mockserver.integration.ClientAndServer; -import org.junit.jupiter.api.*; import co.elastic.support.rest.RestClient; +import com.github.tomakehurst.wiremock.WireMockServer; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.semver4j.Semver; -import java.util.Collections; +import java.util.Map; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockserver.integration.ClientAndServer.startClientAndServer; -import static org.mockserver.model.HttpRequest.request; -import static org.mockserver.model.HttpResponse.response; +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; @TestInstance(TestInstance.Lifecycle.PER_CLASS) public class TestCheckKibanaVersion { - private ClientAndServer mockServer; - private RestClient httpRestClient, httpsRestClient; + private WireMockServer wireMockServer; + private RestClient httpRestClient; @BeforeAll public void globalSetup() { - mockServer = startClientAndServer(9880); + wireMockServer = new WireMockServer(wireMockConfig().port(9880)); + wireMockServer.start(); } @AfterAll - public void globalTeardoown() { - mockServer.stop(); + public void globalTeardown() { + wireMockServer.stop(); } @BeforeEach public void setup() { - httpRestClient = RestClient.getClient( "localhost", 9880, @@ -51,49 +57,30 @@ public void setup() { "", "", true, - Collections.emptyMap(), - 3000, - 3000, - 3000); + Map.of(), + 3000, + 3000, + 3000 + ); } @AfterEach public void tearDown() { - mockServer.reset(); + wireMockServer.resetAll(); } private void initializeKibanaSettings(String version) { - mockServer - .when( - request() - .withMethod("GET") - .withPath("/api/settings") - ) - .respond( - response() - .withBody("{\"cluster_uuid\":\"RLtzkhfBRUadN4WZ8fnnog\",\"settings\":{\"xpack\":{\"default_admin_email\":null},\"kibana\":{\"uuid\":\"a4f369ef-fecd-46b7-8b16-c6c3f885d9ec\",\"name\":\"13d5e793ea51\",\"index\":\".kibana\",\"host\":\"0.0.0.0\",\"port\":18648,\"locale\":\"en\",\"transport_address\":\"0.0.0.0:18648\",\"version\":\"" + version + "\",\"snapshot\":false,\"status\":\"green\"}}}") - .withStatusCode(200) - ); - - + wireMockServer.stubFor(get(urlEqualTo("/api/settings")).willReturn(aResponse().withBody( + "{\"cluster_uuid\":\"RLtzkhfBRUadN4WZ8fnnog\",\"settings\":{\"xpack\":{\"default_admin_email\":null},\"kibana\":{\"uuid\":\"a4f369ef-fecd-46b7-8b16-c6c3f885d9ec\",\"name\":\"13d5e793ea51\",\"index\":\".kibana\",\"host\":\"0.0.0.0\",\"port\":18648,\"locale\":\"en\",\"transport_address\":\"0.0.0.0:18648\",\"version\":\"" + + version + "\",\"snapshot\":false,\"status\":\"green\"}}}").withStatus(200))); } private void initializeKibanaStats(String version) { - mockServer - .when( - request() - .withMethod("GET") - .withPath("/api/stats") - ) - .respond( - response() - .withBody("{\"kibana\":{\"uuid\":\"669ae985-31f7-493b-9910-522cac4d5479\",\"name\":\"6f5485cce678\",\"index\":\".kibana\",\"host\":\"0.0.0.0\",\"locale\":\"en\",\"transport_address\":\"0.0.0.0:18117\",\"version\":\"" + version + "\",\"snapshot\":false,\"status\":\"green\"}}") - .withStatusCode(200) - ); - - + wireMockServer.stubFor(get(urlEqualTo("/api/stats")).willReturn(aResponse().withBody( + "{\"kibana\":{\"uuid\":\"669ae985-31f7-493b-9910-522cac4d5479\",\"name\":\"6f5485cce678\",\"index\":\".kibana\",\"host\":\"0.0.0.0\",\"locale\":\"en\",\"transport_address\":\"0.0.0.0:18117\",\"version\":\"" + + version + "\",\"snapshot\":false,\"status\":\"green\"}}").withStatus(200))); } @Test @@ -124,21 +111,11 @@ public void testQueriesForKibanaWhenStatsAndSettings() throws DiagnosticExceptio @Test public void testQueriesForKibanaEmptyVersion() { // The response body contains no version - mockServer - .when( - request() - .withMethod("GET") - .withPath("/api/stats") - ) - .respond( - response() - .withBody("{\"kibana\": {}}") - .withStatusCode(200) - ); + wireMockServer.stubFor(get(urlEqualTo("/api/stats")).willReturn(aResponse().withBody("{\"kibana\": {}}").withStatus(200))); try { - Semver version = new CheckKibanaVersion().getKibanaVersion(httpRestClient); - assertTrue(false); + new CheckKibanaVersion().getKibanaVersion(httpRestClient); + fail("Expected to fail"); } catch (DiagnosticException e) { assertEquals(e.getMessage(), "Kibana version format is wrong - unable to continue. ()"); } @@ -152,9 +129,9 @@ public void testQueriesForKibanaEmptyVersion() { public void testQueriesForKibanaCorruptedVersion() { initializeKibanaStats("a.v.c"); try { - Semver version = new CheckKibanaVersion().getKibanaVersion(httpRestClient); + new CheckKibanaVersion().getKibanaVersion(httpRestClient); // if they are more than one node in Kibana we need to throw an Exception - assertTrue(false); + fail("Expected to fail"); } catch (DiagnosticException e) { assertEquals(e.getMessage(), "Kibana version format is wrong - unable to continue. (a.v.c)"); } @@ -167,22 +144,11 @@ public void testQueriesForKibanaCorruptedVersion() { @Test public void testQueriesForKibanaTextWithVersion() { initializeKibanaStats("test-6.5.1"); - mockServer - .when( - request() - .withMethod("GET") - .withPath("/api/stats") - ) - .respond( - response() - .withBody("{\"cluster_uuid\":\"RLtzkhfBRUadN4WZ8fnnog\",\"settings\":{\"xpack\":{\"default_admin_email\":null},\"kibana\":{\"uuid\":\"a4f369ef-fecd-46b7-8b16-c6c3f885d9ec\",\"name\":\"13d5e793ea51\",\"index\":\".kibana\",\"host\":\"0.0.0.0\",\"port\":18648,\"locale\":\"en\",\"transport_address\":\"0.0.0.0:18648\",\"version\":\"test-6.5.1\",\"snapshot\":false,\"status\":\"green\"}}}") - .withStatusCode(200) - ); try { - Semver version = new CheckKibanaVersion().getKibanaVersion(httpRestClient); + new CheckKibanaVersion().getKibanaVersion(httpRestClient); // if they are more than one node in Kibana we need to throw an Exception - assertTrue(false); + fail("Expected to fail"); } catch (DiagnosticException e) { assertEquals(e.getMessage(), "Kibana version format is wrong - unable to continue. (test-6.5.1)"); } diff --git a/src/test/java/co/elastic/support/diagnostics/commands/TestCheckLogstashVersionTest.java b/src/test/java/co/elastic/support/diagnostics/commands/TestCheckLogstashVersionTest.java index 410e8342..2a0a5ec9 100644 --- a/src/test/java/co/elastic/support/diagnostics/commands/TestCheckLogstashVersionTest.java +++ b/src/test/java/co/elastic/support/diagnostics/commands/TestCheckLogstashVersionTest.java @@ -1,29 +1,39 @@ package co.elastic.support.diagnostics.commands; import co.elastic.support.diagnostics.DiagnosticException; -import org.junit.jupiter.api.*; -import org.mockserver.integration.ClientAndServer; import co.elastic.support.rest.RestClient; +import com.github.tomakehurst.wiremock.WireMockServer; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.semver4j.Semver; + import java.util.Collections; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockserver.integration.ClientAndServer.startClientAndServer; -import static org.mockserver.model.HttpRequest.request; -import static org.mockserver.model.HttpResponse.response; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; @TestInstance(TestInstance.Lifecycle.PER_CLASS) public class TestCheckLogstashVersionTest { - private ClientAndServer mockServer; + private WireMockServer wireMockServer; private RestClient httpRestClient; @BeforeAll public void globalSetup() { - mockServer = startClientAndServer(9881); + wireMockServer = new WireMockServer(wireMockConfig().port(9881)); + wireMockServer.start(); } @AfterAll public void globalTeardown() { - mockServer.stop(); + wireMockServer.stop(); } @BeforeEach @@ -50,21 +60,13 @@ public void setup() { @AfterEach public void tearDown() { - mockServer.reset(); + wireMockServer.resetAll(); } private void initializeLogstashMainHandler(String version) { - mockServer - .when( - request() - .withMethod("GET") - .withPath("/") - ) - .respond( - response() - .withBody("{\"host\":\"Test\",\"version\":\"" + version + "\",\"http_address\":\"127.0.0.1:9600\",\"id\":\"9ac54ae7-377e-4352-9727-15db6344332a\",\"name\":\"LucaMBP\",\"ephemeral_id\":\"3f1d87db-07c0-4015-941a-4005bbf908fc\",\"snapshot\":false,\"status\":\"yellow\",\"pipeline\":{\"workers\":11,\"batch_size\":125,\"batch_delay\":50},\"build_date\":\"2025-06-17T14:07:37+00:00\",\"build_sha\":\"01b7a2d93e4cf143d4964c71259655cf4575b709\",\"build_snapshot\":false}") - .withStatusCode(200) - ); + wireMockServer.stubFor(get(urlEqualTo("/")).willReturn(aResponse().withBody("{\"host\":\"Test\",\"version\":\"" + version + + "\",\"http_address\":\"127.0.0.1:9600\",\"id\":\"9ac54ae7-377e-4352-9727-15db6344332a\",\"name\":\"LucaMBP\",\"ephemeral_id\":\"3f1d87db-07c0-4015-941a-4005bbf908fc\",\"snapshot\":false,\"status\":\"yellow\",\"pipeline\":{\"workers\":11,\"batch_size\":125,\"batch_delay\":50},\"build_date\":\"2025-06-17T14:07:37+00:00\",\"build_sha\":\"01b7a2d93e4cf143d4964c71259655cf4575b709\",\"build_snapshot\":false}") + .withStatus(200))); } @Test @@ -83,21 +85,11 @@ public void testQueriesForLogstashVersionWithRC() throws DiagnosticException { @Test public void testQueriesForLogstashEmptyVersion() { - mockServer - .when( - request() - .withMethod("GET") - .withPath("/") - ) - .respond( - response() - .withBody("{}") - .withStatusCode(200) - ); + wireMockServer.stubFor(get(urlEqualTo("/")).willReturn(aResponse().withBody("{}").withStatus(200))); try { - Semver version = new CheckLogstashVersion().getLogstashVersion(httpRestClient); - assertTrue(false); + new CheckLogstashVersion().getLogstashVersion(httpRestClient); + fail("Expected to fail"); } catch (DiagnosticException e) { assertEquals("Logstash version format is wrong - unable to continue. ()", e.getMessage()); } @@ -107,8 +99,8 @@ public void testQueriesForLogstashEmptyVersion() { public void testQueriesForLogstashCorruptedVersion() { initializeLogstashMainHandler("a.v.c"); try { - Semver version = new CheckLogstashVersion().getLogstashVersion(httpRestClient); - assertTrue(false); + new CheckLogstashVersion().getLogstashVersion(httpRestClient); + fail("Expected to fail"); } catch (DiagnosticException e) { assertEquals("Logstash version format is wrong - unable to continue. (a.v.c)", e.getMessage()); } @@ -117,23 +109,12 @@ public void testQueriesForLogstashCorruptedVersion() { @Test public void testQueriesForLogstashTextWithVersion() { initializeLogstashMainHandler("test-6.5.1"); - mockServer - .when( - request() - .withMethod("GET") - .withPath("/") - ) - .respond( - response() - .withBody("{\"version\":\"test-6.5.1\"}") - .withStatusCode(200) - ); try { - Semver version = new CheckLogstashVersion().getLogstashVersion(httpRestClient); - assertTrue(false); + new CheckLogstashVersion().getLogstashVersion(httpRestClient); + fail("Expected to fail"); } catch (DiagnosticException e) { assertEquals("Logstash version format is wrong - unable to continue. (test-6.5.1)", e.getMessage()); } } -} \ No newline at end of file +} diff --git a/src/test/java/co/elastic/support/diagnostics/commands/TestKibanaGetDetails.java b/src/test/java/co/elastic/support/diagnostics/commands/TestKibanaGetDetails.java index ff22b58c..55ab9263 100644 --- a/src/test/java/co/elastic/support/diagnostics/commands/TestKibanaGetDetails.java +++ b/src/test/java/co/elastic/support/diagnostics/commands/TestKibanaGetDetails.java @@ -6,47 +6,53 @@ */ package co.elastic.support.diagnostics.commands; -import co.elastic.support.diagnostics.DiagConfig; -import co.elastic.support.diagnostics.DiagnosticInputs; -import co.elastic.support.util.JsonYamlUtils; -import co.elastic.support.util.ResourceCache; import co.elastic.support.Constants; +import co.elastic.support.diagnostics.DiagConfig; import co.elastic.support.diagnostics.DiagnosticException; +import co.elastic.support.diagnostics.DiagnosticInputs; import co.elastic.support.diagnostics.ProcessProfile; -import org.junit.jupiter.api.Test; import co.elastic.support.diagnostics.chain.DiagnosticContext; -import co.elastic.support.rest.RestEntryConfig; -import org.mockserver.integration.ClientAndServer; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Map; -import org.junit.jupiter.api.*; import co.elastic.support.rest.RestClient; import co.elastic.support.rest.RestEntry; +import co.elastic.support.rest.RestEntryConfig; +import co.elastic.support.util.JsonYamlUtils; +import co.elastic.support.util.ResourceCache; import com.fasterxml.jackson.databind.JsonNode; +import com.github.tomakehurst.wiremock.WireMockServer; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Map; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockserver.integration.ClientAndServer.startClientAndServer; -import static org.mockserver.model.HttpRequest.request; -import static org.mockserver.model.HttpResponse.response; +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; @TestInstance(TestInstance.Lifecycle.PER_CLASS) public class TestKibanaGetDetails { - private ClientAndServer mockServer; + private WireMockServer wireMockServer; private RestClient httpRestClient; @BeforeAll public void globalSetup() { - mockServer = startClientAndServer(9880); + wireMockServer = new WireMockServer(wireMockConfig().port(9880)); + wireMockServer.start(); } @AfterAll - public void globalTeardoown() { - mockServer.stop(); + public void globalTeardown() { + wireMockServer.stop(); } @BeforeEach @@ -73,7 +79,7 @@ public void setup() { @AfterEach public void tearDown() { - mockServer.reset(); + wireMockServer.resetAll(); } @Test @@ -143,19 +149,14 @@ public void testClusterFindTargetNode() { @Test public void testFunctionGetStats() throws DiagnosticException { - mockServer - .when( - request() - .withMethod("GET") - .withPath("/api/stats")) - .respond( - response() - .withBody( - "{\"process\":{\"memory\":{\"heap\":{\"total_bytes\":470466560,\"used_bytes\":343398224,\"size_limit\":1740165498},\"resident_set_size_bytes\":587878400},\"pid\":32,\"event_loop_delay\":0.280181884765625,\"uptime_ms\":97230924},\"os\":{\"platform\":\"linux\",\"platform_release\":\"linux-4.15.0-1032-gcp\",\"load\":{\"1m\":1.37451171875,\"5m\":1.43408203125,\"15m\":1.34375},\"memory\":{\"total_bytes\":147879931904,\"free_bytes\":45620334592,\"used_bytes\":102259597312},\"uptime_ms\":18093713000,\"distro\":\"Centos\",\"distro_release\":\"Centos-7.8.2003\"},\"requests\":{\"disconnects\":0,\"total\":1,\"status_codes\":{\"302\":1}},\"concurrent_connections\":8,\"timestamp\":\"2021-01-06T01:35:11.324Z\",\"kibana\":{\"uuid\":\"a4f369ef-fecd-46b7-8b16-c6c3f885d9ec\",\"name\":\"13d5e793ea51\",\"index\":\".kibana\",\"host\":\"0.0.0.0\",\"locale\":\"en\",\"transport_address\":\"0.0.0.0:18648\",\"version\":\"7.9.0\",\"snapshot\":false,\"status\":\"green\"},\"last_updated\":\"2021-01-06T01:35:15.911Z\",\"collection_interval_ms\":5000,\"cluster_uuid\":\"RfBRUssssadN4WZssnnog\"}") - .withStatusCode(401)); - - Map diagMap = JsonYamlUtils.readYamlFromClasspath(Constants.DIAG_CONFIG, true); - Map restCalls = JsonYamlUtils.readYamlFromClasspath(Constants.KIBANA_REST, true); + wireMockServer.stubFor(get(urlEqualTo("/api/stats")) + .willReturn(aResponse() + .withBody( + "{\"process\":{\"memory\":{\"heap\":{\"total_bytes\":470466560,\"used_bytes\":343398224,\"size_limit\":1740165498},\"resident_set_size_bytes\":587878400},\"pid\":32,\"event_loop_delay\":0.280181884765625,\"uptime_ms\":97230924},\"os\":{\"platform\":\"linux\",\"platform_release\":\"linux-4.15.0-1032-gcp\",\"load\":{\"1m\":1.37451171875,\"5m\":1.43408203125,\"15m\":1.34375},\"memory\":{\"total_bytes\":147879931904,\"free_bytes\":45620334592,\"used_bytes\":102259597312},\"uptime_ms\":18093713000,\"distro\":\"Centos\",\"distro_release\":\"Centos-7.8.2003\"},\"requests\":{\"disconnects\":0,\"total\":1,\"status_codes\":{\"302\":1}},\"concurrent_connections\":8,\"timestamp\":\"2021-01-06T01:35:11.324Z\",\"kibana\":{\"uuid\":\"a4f369ef-fecd-46b7-8b16-c6c3f885d9ec\",\"name\":\"13d5e793ea51\",\"index\":\".kibana\",\"host\":\"0.0.0.0\",\"locale\":\"en\",\"transport_address\":\"0.0.0.0:18648\",\"version\":\"7.9.0\",\"snapshot\":false,\"status\":\"green\"},\"last_updated\":\"2021-01-06T01:35:15.911Z\",\"collection_interval_ms\":5000,\"cluster_uuid\":\"RfBRUssssadN4WZssnnog\"}") + .withStatus(401))); + + Map diagMap = JsonYamlUtils.readYamlFromClasspath(Constants.DIAG_CONFIG, true); + Map restCalls = JsonYamlUtils.readYamlFromClasspath(Constants.KIBANA_REST, true); RestEntryConfig builder = new RestEntryConfig("7.10.0"); Map entries = builder.buildEntryMap(restCalls); diff --git a/src/test/java/co/elastic/support/rest/TestRestExecCalls.java b/src/test/java/co/elastic/support/rest/TestRestExecCalls.java index 9ac843f3..1c7a545b 100644 --- a/src/test/java/co/elastic/support/rest/TestRestExecCalls.java +++ b/src/test/java/co/elastic/support/rest/TestRestExecCalls.java @@ -8,12 +8,16 @@ import co.elastic.support.diagnostics.commands.RunClusterQueries; import co.elastic.support.util.SystemProperties; +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.stubbing.Scenario; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.FileUtils; -import org.junit.jupiter.api.*; -import org.mockserver.integration.ClientAndServer; -import org.mockserver.matchers.Times; -import org.mockserver.model.Header; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import java.io.File; import java.io.IOException; @@ -21,247 +25,180 @@ import java.util.Collections; import java.util.List; -import org.mockserver.configuration.ConfigurationProperties; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockserver.integration.ClientAndServer.startClientAndServer; -import static org.mockserver.model.HttpRequest.request; -import static org.mockserver.model.HttpResponse.response; +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; +import static com.github.tomakehurst.wiremock.client.WireMock.get; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; @TestInstance(TestInstance.Lifecycle.PER_CLASS) public class TestRestExecCalls { - - private ClientAndServer mockServer; - private RestClient httpRestClient, httpsRestClient; - private String temp = SystemProperties.userDir + SystemProperties.fileSeparator + "temp"; - private File tempDir = new File(temp); - private String authStringEnc = new String(Base64.encodeBase64("elastic:elastic".getBytes())); - - @BeforeAll - public void globalSetup() { - mockServer = startClientAndServer(9880); - // mockserver by default is in verboce mode (useful when creating new test), - // move it to warning. - ConfigurationProperties.disableSystemOut(true); - ConfigurationProperties.logLevel("WARN"); - - } - - @AfterAll - public void globalTeardown() { - mockServer.stop(); - } - - @BeforeEach - public void setup() { - - httpRestClient = RestClient.getClient( - "localhost", - 9880, - "http", - "elastic", - "elastic", - "", - 0, - "", - "", - "", - "", - true, - Collections.emptyMap(), - 3000, - 3000, - 3000); - httpsRestClient = RestClient.getClient( - "localhost", - 9880, - "https", - "elastic", - "elastic", - "", - 0, - "", - "", - "", - "", - true, - Collections.emptyMap(), - 3000, - 3000, - 3000); - - tempDir.mkdir(); - - } - - @AfterEach - public void tearDown() { - - mockServer.reset(); - FileUtils.deleteQuietly(tempDir); - - } - - @Test - public void testSimpleQuery() { - - mockServer - .when( - request() - .withMethod("GET") - .withPath("/") - .withHeader(new Header("Authorization", - "Basic " + authStringEnc))) - .respond( - response() - .withBody("some_response_body")); - - RestResult result = httpRestClient.execQuery("/"); - assertEquals(200, result.getStatus()); - assertEquals("some_response_body", result.toString()); - } - - @Test - public void testSecuredQuery() { - - String url = "/"; - - mockServer - .when( - request() - .withMethod("GET") - .withPath("/") - .withHeader(new Header("Authorization", - "Basic " + authStringEnc))) - .respond( - response() - .withBody("some_response_body")); - - RestResult result = httpRestClient.execQuery(url); - assertEquals(200, result.getStatus()); - assertEquals("some_response_body", result.toString()); - - } - - @Test - public void testHttpsQuery() { - - String url = "/_nodes"; - mockServer - .when( - request() - .withMethod("GET") - .withPath("/_nodes") - .withSecure(true) - .withHeader(new Header("Authorization", - "Basic " + authStringEnc))) - .respond( - response() - .withBody("some_response_body")); - - RestResult result = httpsRestClient.execQuery(url); - assertEquals(200, result.getStatus()); - assertEquals("some_response_body", result.toString()); - - } - - @Test - public void testFailThenSucceed() { - - RunClusterQueries cmd = new RunClusterQueries(); - List entries = new ArrayList<>(); - entries.add(new RestEntry("nodes", "", ".json", true, "/_nodes", false)); - mockServer - .when( - request() - .withMethod("GET") - .withPath("/_nodes"), - Times.exactly(2)) - .respond( - response() - .withBody("error_response_body") - .withStatusCode(502)); - - mockServer - .when( - request() - .withMethod("GET") - .withPath("/_nodes"), - Times.exactly(1)) - .respond( - response() - .withBody("node_response_body") - .withStatusCode(200)); - - String targetFilename = temp + SystemProperties.fileSeparator + "nodes.json"; - int totalRetries = cmd.runQueries(httpRestClient, entries, temp, 3, 500); - assertEquals(2, totalRetries); - assertTrue(fileExistsWithText(targetFilename, "node_response_body")); - - } - - @Test - public void testRetryAllFail() { - - RunClusterQueries cmd = new RunClusterQueries(); - List entries = new ArrayList<>(); - entries.add(new RestEntry("nodes", "", ".json", true, "/_nodes", false)); - mockServer - .when( - request() - .withMethod("GET") - .withPath("/_nodes"), - Times.exactly(4)) - .respond( - response() - .withBody("error_response_body") - .withStatusCode(502)); - - String targetFilename = temp + SystemProperties.fileSeparator + "nodes.json"; - - int totalRetries = cmd.runQueries(httpRestClient, entries, temp, 3, 500); - assertEquals(4, totalRetries); - assertTrue(fileExistsWithText(targetFilename, "error_response_body")); - - } - - @Test - public void testAuthFailure() { - - RunClusterQueries cmd = new RunClusterQueries(); - List entries = new ArrayList<>(); - entries.add(new RestEntry("nodes", "", ".json", true, "/_nodes", false)); - - mockServer - .when( - request() - .withMethod("GET") - .withPath("/_nodes"), - Times.exactly(1)) - .respond( - response() - .withBody("autherror_response_body") - .withStatusCode(401)); - - int totalRetries = cmd.runQueries(httpRestClient, entries, temp, 3, 500); - assertEquals(0, totalRetries); - - String targetFilename = temp + SystemProperties.fileSeparator + "nodes.json"; - assertTrue(fileExistsWithText(targetFilename, "autherror_response_body")); - - } - - private boolean fileExistsWithText(String filename, String compare) { - try { - String fileContents = FileUtils.readFileToString(new File(filename), "UTF8"); - if (!fileContents.contains(compare)) { - return false; - } - } catch (IOException e) { - return false; - } - - return true; + private WireMockServer wireMockServer; + private RestClient httpRestClient, httpsRestClient; + private String temp = SystemProperties.userDir + SystemProperties.fileSeparator + "temp"; + private File tempDir = new File(temp); + private String authStringEnc = new String(Base64.encodeBase64("elastic:elastic".getBytes())); + + @BeforeAll + public void globalSetup() { + wireMockServer = new WireMockServer(wireMockConfig().port(9880).httpsPort(9443)); + wireMockServer.start(); + } + + @AfterAll + public void globalTeardown() { + wireMockServer.stop(); + } + + @BeforeEach + public void setup() { + + httpRestClient = RestClient.getClient( + "localhost", + 9880, + "http", + "elastic", + "elastic", + "", + 0, + "", + "", + "", + "", + true, + Collections.emptyMap(), + 3000, + 3000, + 3000 + ); + httpsRestClient = RestClient.getClient( + "localhost", + 9443, + "https", + "elastic", + "elastic", + "", + 0, + "", + "", + "", + "", + true, + Collections.emptyMap(), + 3000, + 3000, + 3000 + ); + + tempDir.mkdir(); + } + + @AfterEach + public void tearDown() { + wireMockServer.resetAll(); + FileUtils.deleteQuietly(tempDir); + } + + @Test + public void testSimpleQuery() { + wireMockServer.stubFor(get(urlEqualTo("/")).withHeader("Authorization", equalTo("Basic " + authStringEnc)) + .willReturn(aResponse().withBody("some_response_body"))); + + RestResult result = httpRestClient.execQuery("/"); + assertEquals(200, result.getStatus()); + assertEquals("some_response_body", result.toString()); + } + + @Test + public void testSecuredQuery() { + String url = "/"; + + wireMockServer.stubFor(get(urlEqualTo("/")).withHeader("Authorization", equalTo("Basic " + authStringEnc)) + .willReturn(aResponse().withBody("some_response_body"))); + + RestResult result = httpRestClient.execQuery(url); + assertEquals(200, result.getStatus()); + assertEquals("some_response_body", result.toString()); + } + + @Test + public void testHttpsQuery() { + String url = "/_nodes"; + wireMockServer.stubFor(get(urlEqualTo("/_nodes")).withHeader("Authorization", equalTo("Basic " + authStringEnc)) + .willReturn(aResponse().withBody("some_response_body"))); + + RestResult result = httpsRestClient.execQuery(url); + assertEquals(200, result.getStatus()); + assertEquals("some_response_body", result.toString()); + } + + @Test + public void testFailThenSucceed() { + RunClusterQueries cmd = new RunClusterQueries(); + List entries = new ArrayList<>(); + entries.add(new RestEntry("nodes", "", ".json", true, "/_nodes", false)); + + wireMockServer.stubFor(get(urlEqualTo("/_nodes")).inScenario("retry") + .whenScenarioStateIs(Scenario.STARTED) + .willReturn(aResponse().withBody("error_response_body").withStatus(502)) + .willSetStateTo("failed-once")); + + wireMockServer.stubFor(get(urlEqualTo("/_nodes")).inScenario("retry") + .whenScenarioStateIs("failed-once") + .willReturn(aResponse().withBody("error_response_body").withStatus(502)) + .willSetStateTo("failed-twice")); + + wireMockServer.stubFor(get(urlEqualTo("/_nodes")).inScenario("retry") + .whenScenarioStateIs("failed-twice") + .willReturn(aResponse().withBody("node_response_body").withStatus(200))); + + String targetFilename = temp + SystemProperties.fileSeparator + "nodes.json"; + int totalRetries = cmd.runQueries(httpRestClient, entries, temp, 3, 500); + assertEquals(2, totalRetries); + assertTrue(fileExistsWithText(targetFilename, "node_response_body")); + } + + @Test + public void testRetryAllFail() { + RunClusterQueries cmd = new RunClusterQueries(); + List entries = new ArrayList<>(); + entries.add(new RestEntry("nodes", "", ".json", true, "/_nodes", false)); + wireMockServer.stubFor(get(urlEqualTo("/_nodes")).willReturn(aResponse().withBody("error_response_body").withStatus(502))); + + String targetFilename = temp + SystemProperties.fileSeparator + "nodes.json"; + + int totalRetries = cmd.runQueries(httpRestClient, entries, temp, 3, 500); + assertEquals(4, totalRetries); + assertTrue(fileExistsWithText(targetFilename, "error_response_body")); + } + + @Test + public void testAuthFailure() { + RunClusterQueries cmd = new RunClusterQueries(); + List entries = new ArrayList<>(); + entries.add(new RestEntry("nodes", "", ".json", true, "/_nodes", false)); + + wireMockServer.stubFor(get(urlEqualTo("/_nodes")).willReturn(aResponse().withBody("autherror_response_body").withStatus(401))); + + int totalRetries = cmd.runQueries(httpRestClient, entries, temp, 3, 500); + assertEquals(0, totalRetries); + + String targetFilename = temp + SystemProperties.fileSeparator + "nodes.json"; + assertTrue(fileExistsWithText(targetFilename, "autherror_response_body")); + } + + private boolean fileExistsWithText(String filename, String compare) { + try { + String fileContents = FileUtils.readFileToString(new File(filename), "UTF8"); + if (!fileContents.contains(compare)) { + return false; + } + } catch (IOException e) { + return false; } + return true; + } }