diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2020-04-09 15:48:14 +0200 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2020-04-09 15:48:14 +0200 |
commit | a5b22190b5b3617d626e2c9425ae32131bfbafcf (patch) | |
tree | aa08e50fa6fc824e5c6b93af15815cc3e8891f48 /controller-server | |
parent | af1a26a9030cd50ed849475fe796b4d5e5305a4d (diff) |
Add some more job data in deployment API
Diffstat (limited to 'controller-server')
2 files changed, 107 insertions, 29 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java index ec1ff1ebc99..f17b61ed01a 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java @@ -18,7 +18,9 @@ import com.yahoo.slime.Slime; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType; import com.yahoo.vespa.hosted.controller.application.ApplicationList; +import com.yahoo.vespa.hosted.controller.application.Change; import com.yahoo.vespa.hosted.controller.application.TenantAndApplicationId; +import com.yahoo.vespa.hosted.controller.deployment.DeploymentStatus; import com.yahoo.vespa.hosted.controller.deployment.Run; import com.yahoo.vespa.hosted.controller.restapi.application.EmptyResponse; import com.yahoo.vespa.hosted.controller.versions.DeploymentStatistics; @@ -26,7 +28,8 @@ import com.yahoo.vespa.hosted.controller.versions.VespaVersion; import com.yahoo.yolean.Exceptions; import java.util.LinkedHashMap; -import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -121,9 +124,13 @@ public class DeploymentApiHandler extends LoggingRequestHandler { applicationObject.setString("status", run.status().name()); } - var jobsByInstance = deploymentStatuses.asList().stream() - .flatMap(status -> status.instanceJobs().entrySet().stream()) - .collect(toUnmodifiableMap(jobs -> jobs.getKey(), jobs -> jobs.getValue())); + var statusByInstance = deploymentStatuses.asList().stream() + .flatMap(status -> status.instanceJobs().keySet().stream() + .map(instance -> Map.entry(instance, status))) + .collect(toUnmodifiableMap(entry -> entry.getKey(), entry -> entry.getValue())); + var jobsByInstance = statusByInstance.entrySet().stream() + .collect(toUnmodifiableMap(entry -> entry.getKey(), + entry -> entry.getValue().instanceJobs().get(entry.getKey()))); Cursor productionArray = versionObject.setArray("productionApplications"); statistics.productionSuccesses().stream() .collect(groupingBy(run -> run.id().application())) @@ -160,22 +167,33 @@ public class DeploymentApiHandler extends LoggingRequestHandler { LinkedHashMap::new, toList()))) .forEach((instance, runs) -> { + var status = statusByInstance.get(instance); Cursor instanceObject = instancesArray.addObject(); instanceObject.setString("tenant", instance.tenant().value()); instanceObject.setString("application", instance.application().value()); instanceObject.setString("instance", instance.instance().value()); - instanceObject.setLong("productionJobCount", jobsByInstance.get(instance).production().size()); - instanceObject.setString("upgradePolicy", toString(deploymentStatuses.matching(status -> status.application().id().equals(TenantAndApplicationId.from(instance))) - .first().map(status -> status.application().deploymentSpec()) - .flatMap(spec -> spec.instance(instance.instance()).map(DeploymentInstanceSpec::upgradePolicy)) - .orElse(DeploymentSpec.UpgradePolicy.defaultPolicy))); - Cursor allJobsObject = instanceObject.setObject("allJobs"); - Cursor upgradeJobsObject = instanceObject.setObject("upgradeJobs"); + instanceObject.setBool("upgrading", status.application().require(instance.instance()).change().platform().equals(Optional.of(statistics.version()))); + status.instanceSteps().get(instance.instance()).blockedUntil(Change.of(statistics.version())) + .ifPresent(until -> instanceObject.setLong("blockedUntil", until.toEpochMilli())); + instanceObject.setString("upgradePolicy", toString(status.application().deploymentSpec().instance(instance.instance()) + .map(DeploymentInstanceSpec::upgradePolicy) + .orElse(DeploymentSpec.UpgradePolicy.defaultPolicy))); + Cursor jobsArray = instanceObject.setArray("jobs"); + status.jobSteps().forEach((job, jobStatus) -> { + if ( ! job.application().equals(instance)) return; + Cursor jobObject = jobsArray.addObject(); + jobObject.setString("name", job.type().jobName()); + jobStatus.pausedUntil().ifPresent(until -> jobObject.setLong("pausedUntil", until.toEpochMilli())); + jobStatus.coolingDownUntil(status.application().require(instance.instance()).change()) + .ifPresent(until -> jobObject.setLong("coolingDownUntil", until.toEpochMilli())); + }); + Cursor allRunsObject = instanceObject.setObject("allRuns"); + Cursor upgradeRunsObject = instanceObject.setObject("upgradeRuns"); runs.forEach((type, rs) -> { - Cursor jobObject = allJobsObject.setObject(type.jobName()); - Cursor upgradeObject = upgradeJobsObject.setObject(type.jobName()); + Cursor runObject = allRunsObject.setObject(type.jobName()); + Cursor upgradeObject = upgradeRunsObject.setObject(type.jobName()); for (RunInfo run : rs) { - toSlime(jobObject, run.run); + toSlime(runObject, run.run); if (run.upgrade) toSlime(upgradeObject, run.run); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/root.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/root.json index f44c3bce8a8..8a455dc6e78 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/root.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/root.json @@ -35,9 +35,22 @@ "tenant": "tenant1", "application": "application1", "instance": "default", - "productionJobCount": 1, + "upgrading": false, "upgradePolicy": "default", - "allJobs": { + "jobs": [ + { + "name": "system-test", + "coolingDownUntil": "(ignore)" + }, + { + "name": "staging-test", + "coolingDownUntil": "(ignore)" + }, + { + "name": "production-us-west-1" + } + ], + "allRuns": { "production-us-west-1": { "success": { "number": 1, @@ -47,7 +60,7 @@ } } }, - "upgradeJobs": { + "upgradeRuns": { "production-us-west-1": { "success": { "number": 1, @@ -62,9 +75,20 @@ "tenant": "tenant2", "application": "application2", "instance": "i2", - "productionJobCount": 1, + "upgrading": false, "upgradePolicy": "default", - "allJobs": { + "jobs": [ + { + "name": "system-test" + }, + { + "name": "staging-test" + }, + { + "name": "production-us-west-1" + } + ], + "allRuns": { "production-us-west-1": { "success": { "number": 1, @@ -74,7 +98,7 @@ } } }, - "upgradeJobs": { + "upgradeRuns": { "production-us-west-1": { "success": { "number": 1, @@ -164,9 +188,22 @@ "tenant": "tenant1", "application": "application1", "instance": "default", - "productionJobCount": 1, + "upgrading": true, "upgradePolicy": "default", - "allJobs": { + "jobs": [ + { + "name": "system-test", + "coolingDownUntil": "(ignore)" + }, + { + "name": "staging-test", + "coolingDownUntil": "(ignore)" + }, + { + "name": "production-us-west-1" + } + ], + "allRuns": { "system-test": { "failing": { "number": 2, @@ -194,7 +231,7 @@ } } }, - "upgradeJobs": { + "upgradeRuns": { "system-test": { "failing": { "number": 2, @@ -227,9 +264,21 @@ "tenant": "tenant2", "application": "application2", "instance": "i1", - "productionJobCount": 1, + "upgrading": false, "upgradePolicy": "default", - "allJobs": { + "jobs": [ + { + "name": "system-test", + "coolingDownUntil": "(ignore)" + }, + { + "name": "staging-test" + }, + { + "name": "production-us-west-1" + } + ], + "allRuns": { "system-test": { "failing": { "number": 3, @@ -254,7 +303,7 @@ } } }, - "upgradeJobs": { + "upgradeRuns": { "system-test": {}, "staging-test": {}, "production-us-west-1": { @@ -271,9 +320,20 @@ "tenant": "tenant2", "application": "application2", "instance": "i2", - "productionJobCount": 1, + "upgrading": true, "upgradePolicy": "default", - "allJobs": { + "jobs": [ + { + "name": "system-test" + }, + { + "name": "staging-test" + }, + { + "name": "production-us-west-1" + } + ], + "allRuns": { "production-us-west-1": { "running": { "number": 2, @@ -296,7 +356,7 @@ } } }, - "upgradeJobs": { + "upgradeRuns": { "production-us-west-1": { "running": { "number": 2, |