diff options
author | Bjørn Christian Seime <bjorn.christian@seime.no> | 2017-10-27 13:09:37 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-27 13:09:37 +0200 |
commit | 9cdfac9530b95bb1164e3e14f878aba494dd3e8b (patch) | |
tree | 553656c8ad95cf86b50871207526339f4e6930b2 /orchestrator | |
parent | 8e0ed0a6ee22cd0d5d11f56f4ae11fdee848d19d (diff) | |
parent | f2ce7c10ec7d32a8d5f8db75cc45dda994abc9fb (diff) |
Merge pull request #3917 from vespa-engine/hakonhall/add-rest-api-to-query-slobrok
Add REST API to query Slobrok
Diffstat (limited to 'orchestrator')
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 |