aboutsummaryrefslogtreecommitdiffstats
path: root/orchestrator
diff options
context:
space:
mode:
authorHarald Musum <musum@yahooinc.com>2023-06-18 20:56:52 +0200
committerHarald Musum <musum@yahooinc.com>2023-06-18 20:56:52 +0200
commit6f12901db6b9e4936a0931e232dfd23868c80d63 (patch)
tree800a3d99a98ac2e6f61868ad8849d42295d0a076 /orchestrator
parent820c2b910f964e195217535f5356cce47aa1a9ef (diff)
Handle application id strings with both 3 and 5 parts
Trying to migrate to using application ids serialized to a string with 3 parts only, support both formats for now
Diffstat (limited to 'orchestrator')
-rw-r--r--orchestrator/pom.xml5
-rw-r--r--orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/InstanceRequestHandler.java33
-rw-r--r--orchestrator/src/test/java/com/yahoo/vespa/orchestrator/resources/InstanceRequestHandlerTest.java30
3 files changed, 50 insertions, 18 deletions
diff --git a/orchestrator/pom.xml b/orchestrator/pom.xml
index bd9c7ed977a..6ae24d2782e 100644
--- a/orchestrator/pom.xml
+++ b/orchestrator/pom.xml
@@ -138,6 +138,11 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>org.junit.jupiter</groupId>
+ <artifactId>junit-jupiter-params</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
diff --git a/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/InstanceRequestHandler.java b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/InstanceRequestHandler.java
index 67899849def..3b3e3ce7eea 100644
--- a/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/InstanceRequestHandler.java
+++ b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/InstanceRequestHandler.java
@@ -7,6 +7,7 @@ import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.yahoo.component.annotation.Inject;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.Zone;
import com.yahoo.container.jdisc.ThreadedHttpRequestHandler;
import com.yahoo.jrt.slobrok.api.Mirror;
import com.yahoo.restapi.RestApi;
@@ -27,6 +28,7 @@ import com.yahoo.vespa.orchestrator.status.HostInfos;
import com.yahoo.vespa.orchestrator.status.StatusService;
import com.yahoo.vespa.service.manager.MonitorManager;
import com.yahoo.vespa.service.manager.UnionMonitorManager;
+import com.yahoo.vespa.service.model.ApplicationInstanceGenerator;
import com.yahoo.vespa.service.monitor.ServiceMonitor;
import com.yahoo.vespa.service.monitor.SlobrokApi;
@@ -54,18 +56,21 @@ public class InstanceRequestHandler extends RestApiRequestHandler<InstanceReques
private final SlobrokApi slobrokApi;
private final MonitorManager rootManager;
private final ServiceMonitor serviceMonitor;
+ private final Zone zone;
@Inject
public InstanceRequestHandler(ThreadedHttpRequestHandler.Context context,
ServiceMonitor serviceMonitor,
StatusService statusService,
SlobrokApi slobrokApi,
- UnionMonitorManager rootManager) {
+ UnionMonitorManager rootManager,
+ Zone zone) {
super(context, InstanceRequestHandler::createRestApiDefinition);
this.statusService = statusService;
this.slobrokApi = slobrokApi;
this.rootManager = rootManager;
this.serviceMonitor = serviceMonitor;
+ this.zone = zone;
}
private static RestApi createRestApiDefinition(InstanceRequestHandler self) {
@@ -89,13 +94,16 @@ public class InstanceRequestHandler extends RestApiRequestHandler<InstanceReques
.build();
}
- private List<ApplicationInstanceReference> getAllInstances(RestApi.RequestContext context) {
- return serviceMonitor.getAllApplicationInstanceReferences().stream().sorted().toList();
+ private List<ApplicationId> getAllInstances(RestApi.RequestContext context) {
+ return serviceMonitor.getAllApplicationInstanceReferences().stream()
+ .map(OrchestratorUtil::toApplicationId)
+ .sorted()
+ .toList();
}
private InstanceStatusResponse getInstance(RestApi.RequestContext context) {
String instanceIdString = context.pathParameters().getStringOrThrow("instanceId");
- ApplicationInstanceReference instanceId = parseInstanceId(instanceIdString);
+ ApplicationInstanceReference instanceId = getApplicationInstanceReference(instanceIdString);
ApplicationInstance applicationInstance
= serviceMonitor.getApplication(OrchestratorUtil.toApplicationId(instanceId))
@@ -113,6 +121,19 @@ public class InstanceRequestHandler extends RestApiRequestHandler<InstanceReques
return InstanceStatusResponse.create(applicationInstance, hostStatusMap);
}
+ // Gets ApplicationInstanceReference when string might be an ApplicationId (tenant:application:instance) or
+ // an ApplicationInstanceReference (tenant:application:instance:environment:region:instance).
+ // TODO: Accept only strings on the form tenant:application:instance when all users have been
+ // updated and return ApplicationId instead of ApplicationInstanceReference.
+ private ApplicationInstanceReference getApplicationInstanceReference(String instanceIdString) {
+ try {
+ ApplicationId applicationId = ApplicationId.fromSerializedForm(instanceIdString);
+ return ApplicationInstanceGenerator.toApplicationInstanceReference(applicationId, zone);
+ } catch (IllegalArgumentException e) {
+ return parseInstanceId(instanceIdString);
+ }
+ }
+
private WireHostInfo hostInfoToWire(HostInfo hostInfo) {
String hostStatusString = hostInfo.status().asString();
String suspendedSinceUtcOrNull = hostInfo.suspendedSince().map(Instant::toString).orElse(null);
@@ -122,7 +143,7 @@ public class InstanceRequestHandler extends RestApiRequestHandler<InstanceReques
private List<SlobrokEntryResponse> getSlobrokEntries(RestApi.RequestContext context) {
String instanceId = context.pathParameters().getStringOrThrow("instanceId");
String pattern = context.queryParameters().getString("pattern").orElse(null);
- ApplicationInstanceReference reference = parseInstanceId(instanceId);
+ ApplicationInstanceReference reference = getApplicationInstanceReference(instanceId);
ApplicationId applicationId = OrchestratorUtil.toApplicationId(reference);
if (pattern == null) {
@@ -140,7 +161,7 @@ public class InstanceRequestHandler extends RestApiRequestHandler<InstanceReques
String clusterIdString = context.queryParameters().getStringOrThrow("clusterId");
String serviceTypeString = context.queryParameters().getStringOrThrow("serviceType");
String configIdString = context.queryParameters().getStringOrThrow("configId");
- ApplicationInstanceReference reference = parseInstanceId(instanceId);
+ ApplicationInstanceReference reference = getApplicationInstanceReference(instanceId);
ApplicationId applicationId = OrchestratorUtil.toApplicationId(reference);
ClusterId clusterId = new ClusterId(clusterIdString);
diff --git a/orchestrator/src/test/java/com/yahoo/vespa/orchestrator/resources/InstanceRequestHandlerTest.java b/orchestrator/src/test/java/com/yahoo/vespa/orchestrator/resources/InstanceRequestHandlerTest.java
index a72afe8ba46..a120b2c2500 100644
--- a/orchestrator/src/test/java/com/yahoo/vespa/orchestrator/resources/InstanceRequestHandlerTest.java
+++ b/orchestrator/src/test/java/com/yahoo/vespa/orchestrator/resources/InstanceRequestHandlerTest.java
@@ -3,6 +3,7 @@ package com.yahoo.vespa.orchestrator.resources;
import com.fasterxml.jackson.core.type.TypeReference;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.Zone;
import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.container.jdisc.HttpRequestBuilder;
import com.yahoo.container.jdisc.HttpResponse;
@@ -17,6 +18,9 @@ import com.yahoo.vespa.orchestrator.restapi.wire.SlobrokEntryResponse;
import com.yahoo.vespa.service.manager.UnionMonitorManager;
import com.yahoo.vespa.service.monitor.SlobrokApi;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
import java.util.Arrays;
import java.util.List;
@@ -31,18 +35,20 @@ import static org.mockito.Mockito.when;
*/
class InstanceRequestHandlerTest {
- private static final String APPLICATION_INSTANCE_REFERENCE = "tenant:app:prod:us-west-1:instance";
+ private static final String APPLICATION_INSTANCE_REFERENCE_LONG = "tenant:app:prod:us-west-1:instance";
+ private static final String APPLICATION_INSTANCE_REFERENCE = "tenant:app:instance";
private static final ApplicationId APPLICATION_ID = ApplicationId.from(
"tenant", "app", "instance");
private static final List<Mirror.Entry> ENTRIES = Arrays.asList(
new Mirror.Entry("name1", "tcp/spec:1"),
new Mirror.Entry("name2", "tcp/spec:2"));
private static final ClusterId CLUSTER_ID = new ClusterId("cluster-id");
+ private static final Zone zone = Zone.defaultZone();
private final SlobrokApi slobrokApi = mock(SlobrokApi.class);
private final UnionMonitorManager rootManager = mock(UnionMonitorManager.class);
private final RestApiTestDriver testDriver =
- RestApiTestDriver.newBuilder(ctx -> new InstanceRequestHandler(ctx, null, null, slobrokApi, rootManager))
+ RestApiTestDriver.newBuilder(ctx -> new InstanceRequestHandler(ctx, null, null, slobrokApi, rootManager, zone))
.build();
@Test
@@ -55,16 +61,16 @@ class InstanceRequestHandlerTest {
testGetSlobrokEntriesWith(null, InstanceRequestHandler.DEFAULT_SLOBROK_PATTERN);
}
- @Test
- void testGetServiceStatusInfo() {
+ @ParameterizedTest
+ @ValueSource(strings = { APPLICATION_INSTANCE_REFERENCE, APPLICATION_INSTANCE_REFERENCE_LONG })
+ void testGetServiceStatusInfo(String reference) {
ServiceType serviceType = new ServiceType("serviceType");
ConfigId configId = new ConfigId("configId");
ServiceStatus serviceStatus = ServiceStatus.UP;
when(rootManager.getStatus(APPLICATION_ID, CLUSTER_ID, serviceType, configId))
.thenReturn(new ServiceStatusInfo(serviceStatus));
-
- String uriPath = String.format("/orchestrator/v1/instances/%s/serviceStatusInfo", APPLICATION_INSTANCE_REFERENCE);
+ String uriPath = String.format("/orchestrator/v1/instances/%s/serviceStatusInfo", reference);
HttpRequest request = HttpRequestBuilder.create(GET, uriPath)
.withQueryParameter("clusterId", CLUSTER_ID.s())
.withQueryParameter("serviceType", serviceType.s())
@@ -79,9 +85,10 @@ class InstanceRequestHandlerTest {
assertEquals(serviceStatus, actualServiceStatus);
}
- @Test
- void testBadRequest() {
- String uriPath = String.format("/orchestrator/v1/instances/%s/serviceStatusInfo", APPLICATION_INSTANCE_REFERENCE);
+ @ParameterizedTest
+ @ValueSource(strings = { APPLICATION_INSTANCE_REFERENCE, APPLICATION_INSTANCE_REFERENCE_LONG })
+ void testBadRequest(String reference) {
+ String uriPath = String.format("/orchestrator/v1/instances/%s/serviceStatusInfo", reference);
HttpRequest request = HttpRequestBuilder.create(GET, uriPath)
.withQueryParameter("clusterId", CLUSTER_ID.s())
.build();
@@ -89,12 +96,11 @@ class InstanceRequestHandlerTest {
assertEquals(400, response.getStatus());
}
- private void testGetSlobrokEntriesWith(String pattern, String expectedLookupPattern)
- throws Exception{
+ private void testGetSlobrokEntriesWith(String pattern, String expectedLookupPattern) throws Exception {
when(slobrokApi.lookup(APPLICATION_ID, expectedLookupPattern))
.thenReturn(ENTRIES);
- String uriPath = String.format("/orchestrator/v1/instances/%s/slobrok", APPLICATION_INSTANCE_REFERENCE);
+ String uriPath = String.format("/orchestrator/v1/instances/%s/slobrok", APPLICATION_INSTANCE_REFERENCE_LONG);
var builder = HttpRequestBuilder.create(GET, uriPath);
if (pattern != null) {
builder.withQueryParameter("pattern", pattern);