diff options
Diffstat (limited to 'controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java')
-rw-r--r-- | controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java index 547e53acb77..b48c8723d44 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java @@ -44,6 +44,7 @@ import com.yahoo.vespa.hosted.controller.api.identifiers.TenantId; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerException; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Log; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Logs; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; import com.yahoo.vespa.hosted.controller.api.integration.deployment.ApplicationVersion; import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType; import com.yahoo.vespa.hosted.controller.api.integration.deployment.RunId; @@ -173,6 +174,7 @@ public class ApplicationApiHandler extends LoggingRequestHandler { if (path.matches("/application/v4/tenant/{tenant}/application/{application}")) return application(path.get("tenant"), path.get("application"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/deploying")) return deploying(path.get("tenant"), path.get("application"), request); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/deploying/pin")) return deploying(path.get("tenant"), path.get("application"), request); + if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/nodes")) return nodes(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region")); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/environment/{environment}/region/{region}/instance/{instance}/logs")) return logs(path.get("tenant"), path.get("application"), path.get("instance"), path.get("environment"), path.get("region"), request.propertyMap()); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/job")) return JobControllerApiHandlerHelper.jobTypeResponse(controller, appIdFromPath(path), request.getUri()); if (path.matches("/application/v4/tenant/{tenant}/application/{application}/instance/{instance}/job/{jobtype}")) return JobControllerApiHandlerHelper.runResponse(controller.jobController().runs(appIdFromPath(path), jobTypeFromPath(path)), request.getUri()); @@ -324,6 +326,58 @@ public class ApplicationApiHandler extends LoggingRequestHandler { .orElseThrow(() -> new NotExistsException(applicationId + " not found")); } + private HttpResponse nodes(String tenantName, String applicationName, String instanceName, String environment, String region) { + ApplicationId id = ApplicationId.from(tenantName, applicationName, instanceName); + ZoneId zone = ZoneId.from(environment, region); + List<Node> nodes = controller.configServer().nodeRepository().list(zone, id); + + Slime slime = new Slime(); + Cursor nodesArray = slime.setObject().setArray("nodes"); + for (Node node : nodes) { + Cursor nodeObject = nodesArray.addObject(); + nodeObject.setString("hostname", node.hostname().value()); + nodeObject.setString("state", valueOf(node.state())); + nodeObject.setString("orchestration", valueOf(node.serviceState())); + nodeObject.setString("version", node.currentVersion().toString()); + nodeObject.setString("flavor", node.canonicalFlavor()); + nodeObject.setString("clusterId", node.clusterId()); + nodeObject.setString("clusterType", valueOf(node.clusterType())); + } + return new SlimeJsonResponse(slime); + } + + private static String valueOf(Node.State state) { + switch (state) { + case failed: return "failed"; + case parked: return "parked"; + case dirty: return "dirty"; + case ready: return "ready"; + case active: return "active"; + case inactive: return "inactive"; + case reserved: return "reserved"; + case provisioned: return "provisioned"; + default: throw new IllegalArgumentException("Unexpected node state '" + state + "'."); + } + } + + private static String valueOf(Node.ServiceState state) { + switch (state) { + case expectedUp: return "expectedUp"; + case allowedDown: return "allowedDown"; + case unorchestrated: return "unorchestrated"; + default: throw new IllegalArgumentException("Unexpected node state '" + state + "'."); + } + } + + private static String valueOf(Node.ClusterType type) { + switch (type) { + case admin: return "admin"; + case content: return "content"; + case container: return "container"; + default: throw new IllegalArgumentException("Unexpected node cluster type '" + type + "'."); + } + } + private HttpResponse logs(String tenantName, String applicationName, String instanceName, String environment, String region, Map<String, String> queryParameters) { ApplicationId application = ApplicationId.from(tenantName, applicationName, instanceName); ZoneId zone = ZoneId.from(environment, region); |