Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 11 additions & 9 deletions .buildkite/default-pipeline.yml
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}

// ---------------------------------------------------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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() {
Expand All @@ -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");
Expand All @@ -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<String, ZipEntry> zipFileContents(File result) throws IOException {
try (ZipFile zipFile = new ZipFile(result, ZipFile.OPEN_READ)) {
HashMap<String, ZipEntry> contents = new HashMap<>();
Expand All @@ -134,21 +133,21 @@ public HashMap<String, ZipEntry> 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);
}
}

return contents;
}
}

public void checkResult(File result, Boolean withLogFile) {
public void checkResult(File result, boolean withLogFile) {
assertTrue(result.toString().matches(".*\\.zip$"), result.toString());
try {
Map<String, ZipEntry> 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) {
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -208,22 +205,19 @@ public void testWithoutExtraHeaders() {
public void testConcurrentExecutions() {
setupResponse(false);

ConcurrentHashMap<Integer, File> results = new ConcurrentHashMap<Integer, File>();
ConcurrentHashMap<Integer, File> results = new ConcurrentHashMap<>();

Function<Integer, Runnable> task = (Integer i) -> new Runnable() {
@Override
public void run() {
DiagnosticService diag = new DiagnosticService();
Function<Integer, Runnable> 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);
}
};

Expand Down
Loading