diff options
author | jonmv <venstad@gmail.com> | 2023-09-28 15:31:08 +0200 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2023-09-28 15:39:53 +0200 |
commit | d10c4a0aebadf5ffb73218b8444d489a79b159ae (patch) | |
tree | b912f7966b0ad7e30197f33db71ccf5eef350271 /configserver/src/test/java/com | |
parent | 71bfc352333411f0a3bdebdb7cde032fdb2ff96a (diff) |
Fetch active tokens for an application, through /application/v2/
Diffstat (limited to 'configserver/src/test/java/com')
2 files changed, 136 insertions, 0 deletions
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/application/ActiveTokenFingerprintsClientTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/application/ActiveTokenFingerprintsClientTest.java new file mode 100644 index 00000000000..dea224d2e9b --- /dev/null +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/application/ActiveTokenFingerprintsClientTest.java @@ -0,0 +1,121 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.config.server.application;// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +import com.github.tomakehurst.wiremock.junit.WireMockRule; +import com.yahoo.config.ConfigInstance.Builder; +import com.yahoo.config.FileReference; +import com.yahoo.config.model.api.ApplicationClusterEndpoint; +import com.yahoo.config.model.api.ApplicationClusterEndpoint.AuthMethod; +import com.yahoo.config.model.api.ApplicationClusterEndpoint.DnsName; +import com.yahoo.config.model.api.ApplicationClusterEndpoint.RoutingMethod; +import com.yahoo.config.model.api.ApplicationClusterEndpoint.Scope; +import com.yahoo.config.model.api.ApplicationClusterInfo; +import com.yahoo.config.model.api.HostInfo; +import com.yahoo.config.model.api.Model; +import com.yahoo.config.model.api.PortInfo; +import com.yahoo.config.model.api.ServiceInfo; +import com.yahoo.config.provision.AllocatedHosts; +import com.yahoo.vespa.config.ConfigKey; +import com.yahoo.vespa.config.buildergen.ConfigDefinition; +import com.yahoo.vespa.config.server.modelfactory.ModelResult; +import org.junit.Rule; +import org.junit.Test; + +import java.io.IOException; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; + +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.okJson; +import static com.github.tomakehurst.wiremock.client.WireMock.serverError; +import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options; +import static com.yahoo.config.model.api.container.ContainerServiceType.CONTAINER; +import static com.yahoo.config.model.api.container.ContainerServiceType.LOGSERVER_CONTAINER; +import static org.junit.Assert.assertEquals; + +/** + * @author jonmv + */ +public class ActiveTokenFingerprintsClientTest { + + @Rule public final WireMockRule server1 = new WireMockRule(options().dynamicPort(), true); + @Rule public final WireMockRule server2 = new WireMockRule(options().dynamicPort(), true); + @Rule public final WireMockRule server3 = new WireMockRule(options().dynamicPort(), true); + @Rule public final WireMockRule server4 = new WireMockRule(options().dynamicPort(), true); + + @Test + public void verifyMultipleResponsesCombine() throws Exception { + try (ActiveTokenFingerprintsClient client = new ActiveTokenFingerprintsClient()) { + ModelResult app = MockModel::new; + String uriPath = "/data-plane-tokens/v1"; + server1.stubFor(get(urlEqualTo(uriPath)).willReturn(serverError())); + server2.stubFor(get(urlEqualTo(uriPath)).willReturn(okJson(""" + { "fingerprints": [ "foo", "bar", "baz" ] } + """))); + server3.stubFor(get(urlEqualTo(uriPath)).willReturn(aResponse().withStatus(503))); + server4.stubFor(get(urlEqualTo(uriPath)).willReturn(okJson(""" + { "fingerprints": [ "quu", "qux", "fez" ] } + """))); + Map<String, List<String>> expected = Map.of("localhost", List.of("foo", "bar", "baz")); + assertEquals(expected, client.get(app)); + } + } + + private class MockModel implements Model { + + @Override + public Collection<HostInfo> getHosts() { + return List.of(host(server1.port(), "localhost"), + host(server2.port(), "localhost"), + host(server3.port(), "localhost"), + host(server4.port(), "127.0.0.1")); // Should not be included, see application cluster info below. + + } + + private HostInfo host(int port, String host) { + return new HostInfo(host, + List.of(new ServiceInfo("container", + CONTAINER.serviceName, + List.of(new PortInfo(port, List.of("http"))), + Map.of(), + "myconfigId", + host), + new ServiceInfo("logserver", + LOGSERVER_CONTAINER.serviceName, + List.of(new PortInfo(port, List.of("http"))), + Map.of(), + "myconfigId", + "127.0.0.1"))); // Don't hit this. + } + + @Override + public Set<ApplicationClusterInfo> applicationClusterInfo() { + return Set.of(new ApplicationClusterInfo() { + @Override public List<ApplicationClusterEndpoint> endpoints() { + return List.of(ApplicationClusterEndpoint.builder() + .dnsName(DnsName.from("foo")) + .routingMethod(RoutingMethod.exclusive) + .authMethod(AuthMethod.token) + .scope(Scope.zone) + .clusterId("bar") + .hosts(List.of("localhost")) + .build()); + } + @Override public boolean getDeferChangesUntilRestart() { throw new UnsupportedOperationException(); } + @Override public String name() { throw new UnsupportedOperationException(); } + }); + } + + @Override public Builder getConfigInstance(ConfigKey<?> configKey, ConfigDefinition configDefinition) { throw new UnsupportedOperationException(); } + @Override public Set<ConfigKey<?>> allConfigsProduced() { throw new UnsupportedOperationException(); } + @Override public Set<String> allConfigIds() { throw new UnsupportedOperationException(); } + @Override public Set<FileReference> fileReferences() { throw new UnsupportedOperationException(); } + @Override public AllocatedHosts allocatedHosts() { throw new UnsupportedOperationException(); } + + } + +} diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java index 951ef9df2f4..5b2d5d491a1 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java @@ -117,6 +117,7 @@ public class ApplicationHandlerTest { private ManualClock clock; private List<Endpoint> expectedEndpoints; private Availability availability; + private Map<String, List<String>> activeTokenFingerprints; @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); @@ -140,6 +141,7 @@ public class ApplicationHandlerTest { .build(); tenantRepository.addTenant(mytenantName); orchestrator = new OrchestratorMock(); + activeTokenFingerprints = new HashMap<>(); applicationRepository = new ApplicationRepository.Builder() .withTenantRepository(tenantRepository) .withOrchestrator(orchestrator) @@ -149,6 +151,7 @@ public class ApplicationHandlerTest { .withConfigserverConfig(configserverConfig) .withSecretStoreValidator(secretStoreValidator) .withEndpointsChecker(endpoints -> { assertEquals(expectedEndpoints, endpoints); return availability; }) + .withActiveTokens(activeTokenFingerprints) .build(); } @@ -238,6 +241,18 @@ public class ApplicationHandlerTest { } @Test + public void testGetTokenFingerprints() throws IOException { + applicationRepository.deploy(testApp, prepareParams(applicationId)); + activeTokenFingerprints.putAll(Map.of("host", List.of("fingers", "toes"), + "toast", List.of())); + HttpResponse response = createApplicationHandler().handleGET(createTestRequest(toUrlPath(applicationId, Zone.defaultZone(), true) + "/active-token-fingerprints", GET)); + assertEquals(200, response.getStatus()); + assertEquals(""" + {"hosts":[{"host":"host","fingerprints":["fingers","toes"]},{"host":"toast","fingerprints":[]}]}""", + getRenderedString(response)); + } + + @Test public void testReindex() throws Exception { ApplicationCuratorDatabase database = applicationRepository.getTenant(applicationId).getApplicationRepo().database(); reindexing(applicationId, GET, "{\"error-code\": \"NOT_FOUND\", \"message\": \"Application 'default.default' not found\"}", 404); |