diff options
author | Håkon Hallingstad <hakon@verizonmedia.com> | 2020-02-17 17:36:37 +0100 |
---|---|---|
committer | Håkon Hallingstad <hakon@verizonmedia.com> | 2020-02-17 17:36:37 +0100 |
commit | 42a095573cc800a163d1d0c4337b5ef8a4e38b36 (patch) | |
tree | c679c2e66f80f4c5a4bccd2bf7bf2418e3e20548 /orchestrator/src/main | |
parent | 3cf5d3624f8b16351c74c64df6822aa12250163b (diff) |
Add host info to orchestrator REST API
Diffstat (limited to 'orchestrator/src/main')
5 files changed, 50 insertions, 22 deletions
diff --git a/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/Host.java b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/Host.java index bda9505d72b..8f5f00af7a0 100644 --- a/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/Host.java +++ b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/Host.java @@ -4,23 +4,23 @@ package com.yahoo.vespa.orchestrator; import com.yahoo.vespa.applicationmodel.ApplicationInstanceReference; import com.yahoo.vespa.applicationmodel.HostName; import com.yahoo.vespa.applicationmodel.ServiceInstance; -import com.yahoo.vespa.orchestrator.status.HostStatus; +import com.yahoo.vespa.orchestrator.status.HostInfo; import java.util.List; public class Host { private final HostName hostName; - private final HostStatus hostStatus; + private final HostInfo hostInfo; private final ApplicationInstanceReference applicationInstanceReference; private final List<ServiceInstance> serviceInstances; public Host(HostName hostName, - HostStatus hostStatus, + HostInfo hostInfo, ApplicationInstanceReference applicationInstanceReference, List<ServiceInstance> serviceInstances) { this.hostName = hostName; - this.hostStatus = hostStatus; + this.hostInfo = hostInfo; this.applicationInstanceReference = applicationInstanceReference; this.serviceInstances = serviceInstances; } @@ -29,8 +29,8 @@ public class Host { return hostName; } - public HostStatus getHostStatus() { - return hostStatus; + public HostInfo getHostInfo() { + return hostInfo; } public ApplicationInstanceReference getApplicationInstanceReference() { diff --git a/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/OrchestratorImpl.java b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/OrchestratorImpl.java index 414548f8bdc..fbe6864274c 100644 --- a/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/OrchestratorImpl.java +++ b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/OrchestratorImpl.java @@ -114,9 +114,10 @@ public class OrchestratorImpl implements Orchestrator { .filter(serviceInstance -> hostName.equals(serviceInstance.hostName())) .collect(Collectors.toList()); + HostInfo hostInfo = statusService.getHostInfo(applicationInstance.reference(), hostName); HostStatus hostStatus = getNodeStatus(applicationInstance.reference(), hostName); - return new Host(hostName, hostStatus, applicationInstance.reference(), serviceInstances); + return new Host(hostName, hostInfo, applicationInstance.reference(), serviceInstances); } @Override diff --git a/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/HostResource.java b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/HostResource.java index 4bb93ffa3cb..fc5c5eb5004 100644 --- a/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/HostResource.java +++ b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/HostResource.java @@ -31,6 +31,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import java.net.URI; +import java.time.Instant; import java.util.List; import java.util.logging.Logger; import java.util.stream.Collectors; @@ -72,7 +73,8 @@ public class HostResource implements HostApi { return new GetHostResponse( host.getHostName().s(), - host.getHostStatus().name(), + host.getHostInfo().status().name(), + host.getHostInfo().suspendedSince().map(Instant::toString).orElse(null), applicationUri.toString(), hostServices); } catch (UncheckedTimeoutException e) { 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 7b8a74d7fe2..fbb8f445db0 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 @@ -14,6 +14,8 @@ import com.yahoo.vespa.applicationmodel.ServiceType; import com.yahoo.vespa.orchestrator.InstanceLookupService; import com.yahoo.vespa.orchestrator.OrchestratorUtil; import com.yahoo.vespa.orchestrator.restapi.wire.SlobrokEntryResponse; +import com.yahoo.vespa.orchestrator.restapi.wire.WireHostInfo; +import com.yahoo.vespa.orchestrator.status.HostInfo; import com.yahoo.vespa.orchestrator.status.HostInfos; import com.yahoo.vespa.orchestrator.status.StatusService; import com.yahoo.vespa.service.manager.MonitorManager; @@ -29,9 +31,10 @@ import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import java.time.Instant; import java.util.List; -import java.util.Map; import java.util.Set; +import java.util.TreeMap; import java.util.stream.Collectors; import static com.yahoo.vespa.orchestrator.OrchestratorUtil.getHostsUsedByApplicationInstance; @@ -82,13 +85,23 @@ public class InstanceResource { .orElseThrow(() -> new WebApplicationException(Response.status(Response.Status.NOT_FOUND).build())); HostInfos hostInfos = statusService.getHostInfosByApplicationResolver().apply(applicationInstance.reference()); - Map<HostName, String> hostStatusMap = getHostsUsedByApplicationInstance(applicationInstance) - .stream() - .collect(Collectors.toMap(hostName -> hostName, - hostName -> hostInfos.getOrNoRemarks(hostName).status().asString())); + TreeMap<HostName, WireHostInfo> hostStatusMap = + getHostsUsedByApplicationInstance(applicationInstance) + .stream() + .collect(Collectors.toMap( + hostName -> hostName, + hostName -> hostInfoToWire(hostInfos.getOrNoRemarks(hostName)), + (u, v) -> { throw new IllegalStateException(); }, + TreeMap::new)); return InstanceStatusResponse.create(applicationInstance, hostStatusMap); } + private WireHostInfo hostInfoToWire(HostInfo hostInfo) { + String hostStatusString = hostInfo.status().asString(); + String suspendedSinceUtcOrNull = hostInfo.suspendedSince().map(Instant::toString).orElse(null); + return new WireHostInfo(hostStatusString, suspendedSinceUtcOrNull); + } + @GET @Path("/{instanceId}/slobrok") @Produces(MediaType.APPLICATION_JSON) diff --git a/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/InstanceStatusResponse.java b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/InstanceStatusResponse.java index 068423f7d24..313c73e5c68 100644 --- a/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/InstanceStatusResponse.java +++ b/orchestrator/src/main/java/com/yahoo/vespa/orchestrator/resources/InstanceStatusResponse.java @@ -4,10 +4,12 @@ package com.yahoo.vespa.orchestrator.resources; import com.fasterxml.jackson.annotation.JsonProperty; import com.yahoo.vespa.applicationmodel.ApplicationInstance; import com.yahoo.vespa.applicationmodel.HostName; -import com.yahoo.vespa.orchestrator.status.HostInfo; +import com.yahoo.vespa.orchestrator.restapi.wire.WireHostInfo; import java.util.Map; import java.util.Objects; +import java.util.TreeMap; +import java.util.stream.Collectors; /* * @author andreer @@ -15,16 +17,16 @@ import java.util.Objects; public class InstanceStatusResponse { private final ApplicationInstance applicationInstance; - private final Map<HostName, String> hostStates; + private final TreeMap<HostName, WireHostInfo> hostInfos; - private InstanceStatusResponse(ApplicationInstance applicationInstance, Map<HostName, String> hostStates) { + private InstanceStatusResponse(ApplicationInstance applicationInstance, TreeMap<HostName, WireHostInfo> hostInfos) { this.applicationInstance = applicationInstance; - this.hostStates = hostStates; + this.hostInfos = hostInfos; } public static InstanceStatusResponse create( ApplicationInstance applicationInstance, - Map<HostName, String> hostStates) { + TreeMap<HostName, WireHostInfo> hostStates) { return new InstanceStatusResponse(applicationInstance, hostStates); } @@ -35,14 +37,24 @@ public class InstanceStatusResponse { @JsonProperty("hostStates") public Map<HostName, String> hostStates() { - return hostStates; + // TODO: Remove this once all clients have been moved to hostStatus. + return hostInfos.entrySet().stream() + .collect(Collectors.toMap( + entry -> entry.getKey(), + entry -> entry.getValue().hostStatus() + )); + } + + @JsonProperty("hostInfos") + public TreeMap<HostName, WireHostInfo> hostInfos() { + return hostInfos; } @Override public String toString() { return "InstanceStatusResponse{" + "applicationInstance=" + applicationInstance + - ", hostStates=" + hostStates + + ", hostInfos=" + hostInfos + '}'; } @@ -52,11 +64,11 @@ public class InstanceStatusResponse { if (o == null || getClass() != o.getClass()) return false; InstanceStatusResponse that = (InstanceStatusResponse) o; return Objects.equals(applicationInstance, that.applicationInstance) && - Objects.equals(hostStates, that.hostStates); + Objects.equals(hostInfos, that.hostInfos); } @Override public int hashCode() { - return Objects.hash(applicationInstance, hostStates); + return Objects.hash(applicationInstance, hostInfos); } } |