summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHåkon Hallingstad <hakon@oath.com>2017-10-27 10:22:22 +0200
committerHåkon Hallingstad <hakon@oath.com>2017-10-27 10:22:22 +0200
commitf2ce7c10ec7d32a8d5f8db75cc45dda994abc9fb (patch)
tree650d88777282296ca14f00c3f3aa45bca47a86cf
parent8e3174722f05a2ca0e5fb3acd08d7df786b2cee2 (diff)
Add REST API to query Slobrok
-rw-r--r--orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/InstanceResource.java53
-rw-r--r--orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/SlobrokEntryResponse.java22
-rw-r--r--orchestrator/src/test/java/com/yahoo/vespa/orchestrator/resources/InstanceResourceTest.java48
3 files changed, 112 insertions, 11 deletions
diff --git a/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/InstanceResource.java b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/InstanceResource.java
index 58ab583849a..4b24c17381e 100644
--- a/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/InstanceResource.java
+++ b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/InstanceResource.java
@@ -1,26 +1,31 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.orchestrator.resources;
+import com.yahoo.config.provision.ApplicationId;
import com.yahoo.container.jaxrs.annotation.Component;
+import com.yahoo.jrt.slobrok.api.Mirror;
+import com.yahoo.vespa.applicationmodel.ApplicationInstance;
+import com.yahoo.vespa.applicationmodel.ApplicationInstanceReference;
+import com.yahoo.vespa.applicationmodel.HostName;
import com.yahoo.vespa.orchestrator.InstanceLookupService;
import com.yahoo.vespa.orchestrator.OrchestratorUtil;
import com.yahoo.vespa.orchestrator.status.HostStatus;
import com.yahoo.vespa.orchestrator.status.StatusService;
-import com.yahoo.vespa.applicationmodel.ApplicationInstance;
-import com.yahoo.vespa.applicationmodel.ApplicationInstanceReference;
-import com.yahoo.vespa.applicationmodel.HostName;
+import com.yahoo.vespa.service.monitor.SlobrokMonitorManager;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-
+import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.stream.Collectors;
import static com.yahoo.vespa.orchestrator.OrchestratorUtil.getHostStatusMap;
import static com.yahoo.vespa.orchestrator.OrchestratorUtil.getHostsUsedByApplicationInstance;
@@ -37,13 +42,16 @@ import static com.yahoo.vespa.orchestrator.OrchestratorUtil.parseAppInstanceRefe
public class InstanceResource {
private final StatusService statusService;
+ private final SlobrokMonitorManager slobrokMonitorManager;
private final InstanceLookupService instanceLookupService;
@Inject
public InstanceResource(@Component InstanceLookupService instanceLookupService,
- @Component StatusService statusService) {
+ @Component StatusService statusService,
+ @Component SlobrokMonitorManager slobrokMonitorManager) {
this.instanceLookupService = instanceLookupService;
this.statusService = statusService;
+ this.slobrokMonitorManager = slobrokMonitorManager;
}
@GET
@@ -56,12 +64,7 @@ public class InstanceResource {
@Path("/{instanceId}")
@Produces(MediaType.APPLICATION_JSON)
public InstanceStatusResponse getInstance(@PathParam("instanceId") String instanceIdString) {
- ApplicationInstanceReference instanceId;
- try {
- instanceId = parseAppInstanceReference(instanceIdString);
- } catch (IllegalArgumentException e) {
- throw new WebApplicationException(Response.status(Response.Status.BAD_REQUEST).build());
- }
+ ApplicationInstanceReference instanceId = parseInstanceId(instanceIdString);
ApplicationInstance applicationInstance
= instanceLookupService.findInstanceById(instanceId)
@@ -73,4 +76,32 @@ public class InstanceResource {
Map<HostName, String> hostStatusStringMap = OrchestratorUtil.mapValues(hostStatusMap, HostStatus::name);
return InstanceStatusResponse.create(applicationInstance, hostStatusStringMap);
}
+
+ @GET
+ @Path("/{instanceId}/slobrok")
+ @Produces(MediaType.APPLICATION_JSON)
+ public List<SlobrokEntryResponse> getSlobrokEntries(
+ @PathParam("instanceId") String instanceId,
+ @QueryParam("pattern") String pattern) {
+ ApplicationInstanceReference reference = parseInstanceId(instanceId);
+ ApplicationId applicationId = OrchestratorUtil.toApplicationId(reference);
+
+ if (pattern == null) {
+ pattern = "**";
+ }
+
+ List<Mirror.Entry> entries = slobrokMonitorManager.lookup(applicationId, pattern);
+ return entries.stream().map(SlobrokEntryResponse::fromMirrorEntry)
+ .collect(Collectors.toList());
+ }
+
+ private ApplicationInstanceReference parseInstanceId(@PathParam("instanceId") String instanceIdString) {
+ ApplicationInstanceReference instanceId;
+ try {
+ instanceId = parseAppInstanceReference(instanceIdString);
+ } catch (IllegalArgumentException e) {
+ throw new WebApplicationException(Response.status(Response.Status.BAD_REQUEST).build());
+ }
+ return instanceId;
+ }
}
diff --git a/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/SlobrokEntryResponse.java b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/SlobrokEntryResponse.java
new file mode 100644
index 00000000000..685f1fa1a8a
--- /dev/null
+++ b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/SlobrokEntryResponse.java
@@ -0,0 +1,22 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.orchestrator.resources;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.yahoo.jrt.slobrok.api.Mirror;
+
+public class SlobrokEntryResponse {
+ @JsonProperty("name")
+ public final String name;
+
+ @JsonProperty("spec")
+ public final String spec;
+
+ static SlobrokEntryResponse fromMirrorEntry(Mirror.Entry entry) {
+ return new SlobrokEntryResponse(entry.getName(), entry.getSpec());
+ }
+
+ private SlobrokEntryResponse(String name, String spec) {
+ this.name = name;
+ this.spec = spec;
+ }
+}
diff --git a/orchestrator/src/test/java/com/yahoo/vespa/orchestrator/resources/InstanceResourceTest.java b/orchestrator/src/test/java/com/yahoo/vespa/orchestrator/resources/InstanceResourceTest.java
new file mode 100644
index 00000000000..1d9ec2bccd1
--- /dev/null
+++ b/orchestrator/src/test/java/com/yahoo/vespa/orchestrator/resources/InstanceResourceTest.java
@@ -0,0 +1,48 @@
+// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.orchestrator.resources;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.jrt.slobrok.api.Mirror;
+import com.yahoo.vespa.service.monitor.SlobrokMonitorManager;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+public class InstanceResourceTest {
+ @Test
+ public void testGetSlobrokEntries() throws Exception {
+ SlobrokMonitorManager slobrokMonitorManager = mock(SlobrokMonitorManager.class);
+ InstanceResource resource = new InstanceResource(
+ null,
+ null,
+ slobrokMonitorManager);
+
+ ApplicationId applicationId = ApplicationId.from("tenant", "app", "instance");
+ String pattern = "foo";
+
+ List<Mirror.Entry> entries = Arrays.asList(
+ new Mirror.Entry("name1", "spec1"),
+ new Mirror.Entry("name2", "spec2"));
+
+ when(slobrokMonitorManager.lookup(applicationId, pattern)).thenReturn(entries);
+
+ List<SlobrokEntryResponse> response = resource.getSlobrokEntries(
+ "tenant:app:prod:us-west-1:instance",
+ pattern);
+
+ verify(slobrokMonitorManager).lookup(applicationId, pattern);
+
+ ObjectMapper mapper = new ObjectMapper();
+ String actualJson = mapper.writeValueAsString(response);
+ assertEquals(
+ "[{\"name\":\"name1\",\"spec\":\"spec1\"},{\"name\":\"name2\",\"spec\":\"spec2\"}]",
+ actualJson);
+ }
+} \ No newline at end of file