diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2019-12-30 12:39:30 +0100 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2019-12-30 12:39:30 +0100 |
commit | 1f34c55482a91ce129c72c9014ab081acb79a018 (patch) | |
tree | 8a0133ca406f649d62549d3059d3b343afd7dfd0 /controller-server | |
parent | cef1ea2774e76b515b0118befa4328ebb6040abc (diff) |
Add runs to step nodes in deployment graph
Diffstat (limited to 'controller-server')
3 files changed, 1486 insertions, 277 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java index a3923e4c1d7..6413be181c3 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java @@ -508,7 +508,7 @@ class JobControllerApiHandlerHelper { /** * @return Response with all job types that have recorded runs for the application _and_ the status for the last run of that type */ - static HttpResponse overviewResponse(Controller controller, TenantAndApplicationId id, URI baseUriForJobs) { + static HttpResponse overviewResponse(Controller controller, TenantAndApplicationId id, URI baseUriForDeployments) { Application application = controller.applications().requireApplication(id); DeploymentStatus status = controller.jobController().deploymentStatus(application); @@ -531,6 +531,10 @@ class JobControllerApiHandlerHelper { stepStatus.job().ifPresent(job -> { stepObject.setString("jobName", job.type().jobName()); + String baseUriForJob = baseUriForDeployments.resolve(baseUriForDeployments.getPath() + + "/../instance/" + job.application().instance().value() + + "/job/" + job.type().jobName()).normalize().toString(); + stepObject.setString("url", baseUriForJob); stepObject.setString("environment", job.type().environment().value()); stepObject.setString("region", job.type().zone(controller.system()).value()); @@ -542,37 +546,47 @@ class JobControllerApiHandlerHelper { } JobStatus jobStatus = status.jobs().get(job).get(); - Cursor jobsArray = stepObject.setArray("jobs"); + Cursor toRunArray = stepObject.setArray("toRun"); for (Versions versions : jobsToRun.getOrDefault(job, List.of())) { - Cursor jobObject = jobsArray.addObject(); - toSlime(jobObject.setObject("versions"), versions); - stepStatus.readyAt(change, versions).ifPresent(ready -> jobObject.setLong("readyAt", ready.toEpochMilli())); - stepStatus.readyAt(change, versions) - .filter(controller.clock().instant()::isBefore) - .ifPresent(until -> jobObject.setLong("delayedUntil", until.toEpochMilli())); - stepStatus.pausedUntil().ifPresent(until -> jobObject.setLong("pausedUntil", until.toEpochMilli())); - stepStatus.coolingDownUntil(versions).ifPresent(until -> jobObject.setLong("coolingDownUntil", until.toEpochMilli())); - stepStatus.blockedUntil(change).ifPresent(until -> jobObject.setLong("blockedUntil", until.toEpochMilli())); - boolean running = jobStatus.lastTriggered() .map(run -> jobStatus.isRunning() && versions.targetsMatch(run.versions()) && (job.type().isProduction() || versions.sourcesMatchIfPresent(run.versions()))) .orElse(false); - jobObject.setBool("running", running); + if (running) + continue; // Run will be contained in the "runs" array. + + Cursor runObject = toRunArray.addObject(); + toSlime(runObject.setObject("versions"), versions); + stepStatus.readyAt(change, versions).ifPresent(ready -> runObject.setLong("readyAt", ready.toEpochMilli())); + stepStatus.readyAt(change, versions) + .filter(controller.clock().instant()::isBefore) + .ifPresent(until -> runObject.setLong("delayedUntil", until.toEpochMilli())); + stepStatus.pausedUntil().ifPresent(until -> runObject.setLong("pausedUntil", until.toEpochMilli())); + stepStatus.coolingDownUntil(versions).ifPresent(until -> runObject.setLong("coolingDownUntil", until.toEpochMilli())); + stepStatus.blockedUntil(change).ifPresent(until -> runObject.setLong("blockedUntil", until.toEpochMilli())); } - jobStatus.lastTriggered().ifPresent(run -> { - Cursor runObject = stepObject.setObject("lastRun"); + Cursor runsArray = stepObject.setArray("runs"); + jobStatus.runs().descendingMap().values().stream().limit(10).forEach(run -> { + Cursor runObject = runsArray.addObject(); + runObject.setLong("id", run.id().number()); + runObject.setString("url", baseUriForJob + "/run/" + run.id()); runObject.setLong("start", run.start().toEpochMilli()); run.end().ifPresent(end -> runObject.setLong("end", end.toEpochMilli())); runObject.setString("status", run.status().name()); toSlime(runObject.setObject("versions"), run.versions()); + Cursor runStepsArray = runObject.setArray("steps"); + run.steps().forEach((step, info) -> { + Cursor runStepObject = runStepsArray.addObject(); + runStepObject.setString("name", step.name()); + runStepObject.setString("status", info.status().name()); + }); }); }); } - // TODO jonmv: Add latest platform and application status, and lists of runs for each of the jobs. + // TODO jonmv: Add latest platform and application status. return new SlimeJsonResponse(slime); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview-2.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview-2.json index 3406ad47a33..59b200753fe 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview-2.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview-2.json @@ -1,299 +1,1174 @@ { - "tenant": "tenant", "application": "application", "steps": [ { - "type": "test", - "dependencies": [], "declared": true, - "instance": "default", "jobName": "staging-test", "environment": "staging", - "region": "staging.us-east-3", - "jobs": [ + "instance": "default", + "toRun": [ { + "readyAt": 752000, + "coolingDownUntil": 752000, "versions": { + "targetApplication": { + "commit": "commit1", + "id": 3, + "source": "repository1/tree/commit1" + }, + "sourcePlatform": "6.1.0", "targetPlatform": "6.1.0", + "sourceApplication": { + "commit": "commit1", + "id": 1, + "source": "repository1/tree/commit1" + } + }, + "delayedUntil": 752000 + } + ], + "type": "test", + "region": "staging.us-east-3", + "runs": [ + { + "versions": { "targetApplication": { + "commit": "commit1", "id": 3, + "source": "repository1/tree/commit1" + }, + "sourcePlatform": "6.1.0", + "targetPlatform": "6.1.0", + "sourceApplication": { "commit": "commit1", + "id": 1, + "source": "repository1/tree/commit1" + } + }, + "start": 102000, + "end": 102000, + "id": 5, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployInitialReal", + "status": "succeeded" + }, + { + "name": "installInitialReal", + "status": "failed" + }, + { + "name": "deployReal", + "status": "unfinished" + }, + { + "name": "installTester", + "status": "unfinished" + }, + { + "name": "installReal", + "status": "unfinished" + }, + { + "name": "startTests", + "status": "unfinished" + }, + { + "name": "endTests", + "status": "unfinished" + }, + { + "name": "copyVespaLogs", + "status": "succeeded" + }, + { + "name": "deactivateReal", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/staging-test/run/run 5 of staging-test for tenant.application", + "status": "installationFailed" + }, + { + "versions": { + "targetApplication": { + "commit": "commit1", + "id": 3, "source": "repository1/tree/commit1" }, "sourcePlatform": "6.1.0", + "targetPlatform": "6.1.0", "sourceApplication": { + "commit": "commit1", "id": 1, + "source": "repository1/tree/commit1" + } + }, + "start": 2000, + "end": 2000, + "id": 4, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployInitialReal", + "status": "succeeded" + }, + { + "name": "installInitialReal", + "status": "failed" + }, + { + "name": "deployReal", + "status": "unfinished" + }, + { + "name": "installTester", + "status": "unfinished" + }, + { + "name": "installReal", + "status": "unfinished" + }, + { + "name": "startTests", + "status": "unfinished" + }, + { + "name": "endTests", + "status": "unfinished" + }, + { + "name": "copyVespaLogs", + "status": "succeeded" + }, + { + "name": "deactivateReal", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/staging-test/run/run 4 of staging-test for tenant.application", + "status": "installationFailed" + }, + { + "versions": { + "targetApplication": { + "commit": "commit1", + "id": 3, + "source": "repository1/tree/commit1" + }, + "sourcePlatform": "6.1.0", + "targetPlatform": "6.1.0", + "sourceApplication": { "commit": "commit1", + "id": 2, "source": "repository1/tree/commit1" } }, - "readyAt": 752000, - "delayedUntil": 752000, - "coolingDownUntil": 752000, - "running": false - } - ], - "lastRun": { - "start": 102000, - "end": 102000, - "status": "installationFailed", - "versions": { - "targetPlatform": "6.1.0", - "targetApplication": { - "id": 3, - "commit": "commit1", - "source": "repository1/tree/commit1" + "start": 2000, + "end": 2000, + "id": 3, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployInitialReal", + "status": "succeeded" + }, + { + "name": "installInitialReal", + "status": "succeeded" + }, + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "installReal", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "succeeded" + }, + { + "name": "copyVespaLogs", + "status": "succeeded" + }, + { + "name": "deactivateReal", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/staging-test/run/run 3 of staging-test for tenant.application", + "status": "success" + }, + { + "versions": { + "targetApplication": { + "commit": "commit1", + "id": 2, + "source": "repository1/tree/commit1" + }, + "sourcePlatform": "6.1.0", + "targetPlatform": "6.1.0", + "sourceApplication": { + "commit": "commit1", + "id": 1, + "source": "repository1/tree/commit1" + } }, - "sourcePlatform": "6.1.0", - "sourceApplication": { - "id": 1, - "commit": "commit1", - "source": "repository1/tree/commit1" - } + "start": 1000, + "end": 1000, + "id": 2, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployInitialReal", + "status": "succeeded" + }, + { + "name": "installInitialReal", + "status": "succeeded" + }, + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "installReal", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "succeeded" + }, + { + "name": "copyVespaLogs", + "status": "succeeded" + }, + { + "name": "deactivateReal", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/staging-test/run/run 2 of staging-test for tenant.application", + "status": "success" + }, + { + "versions": { + "targetApplication": { + "commit": "commit1", + "id": 1, + "source": "repository1/tree/commit1" + }, + "targetPlatform": "6.1.0" + }, + "start": 0, + "end": 0, + "id": 1, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployInitialReal", + "status": "succeeded" + }, + { + "name": "installInitialReal", + "status": "succeeded" + }, + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "installReal", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "succeeded" + }, + { + "name": "copyVespaLogs", + "status": "succeeded" + }, + { + "name": "deactivateReal", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/staging-test/run/run 1 of staging-test for tenant.application", + "status": "success" } - } + ], + "url": "https://some.url:43/instance/default/job/staging-test", + "dependencies": [] }, { - "type": "test", - "dependencies": [], "declared": false, - "instance": "default", "jobName": "system-test", "environment": "test", + "instance": "default", + "toRun": [], + "type": "test", "region": "test.us-east-1", - "jobs": [], - "lastRun": { - "start": 2000, - "end": 2000, - "status": "success", - "versions": { - "targetPlatform": "6.1.0", - "targetApplication": { - "id": 3, - "commit": "commit1", - "source": "repository1/tree/commit1" + "runs": [ + { + "versions": { + "targetApplication": { + "commit": "commit1", + "id": 3, + "source": "repository1/tree/commit1" + }, + "sourcePlatform": "6.1.0", + "targetPlatform": "6.1.0", + "sourceApplication": { + "commit": "commit1", + "id": 2, + "source": "repository1/tree/commit1" + } }, - "sourcePlatform": "6.1.0", - "sourceApplication": { - "id": 2, - "commit": "commit1", - "source": "repository1/tree/commit1" - } + "start": 2000, + "end": 2000, + "id": 3, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "installReal", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "succeeded" + }, + { + "name": "copyVespaLogs", + "status": "succeeded" + }, + { + "name": "deactivateReal", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/system-test/run/run 3 of system-test for tenant.application", + "status": "success" + }, + { + "versions": { + "targetApplication": { + "commit": "commit1", + "id": 2, + "source": "repository1/tree/commit1" + }, + "sourcePlatform": "6.1.0", + "targetPlatform": "6.1.0", + "sourceApplication": { + "commit": "commit1", + "id": 1, + "source": "repository1/tree/commit1" + } + }, + "start": 1000, + "end": 1000, + "id": 2, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "installReal", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "succeeded" + }, + { + "name": "copyVespaLogs", + "status": "succeeded" + }, + { + "name": "deactivateReal", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/system-test/run/run 2 of system-test for tenant.application", + "status": "success" + }, + { + "versions": { + "targetApplication": { + "commit": "commit1", + "id": 1, + "source": "repository1/tree/commit1" + }, + "targetPlatform": "6.1.0" + }, + "start": 0, + "end": 0, + "id": 1, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "installReal", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "succeeded" + }, + { + "name": "copyVespaLogs", + "status": "succeeded" + }, + { + "name": "deactivateReal", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/system-test/run/run 1 of system-test for tenant.application", + "status": "success" } - } + ], + "url": "https://some.url:43/instance/default/job/system-test", + "dependencies": [] }, { - "type": "deployment", - "dependencies": [ - 0 - ], "declared": true, - "instance": "default", "jobName": "production-us-central-1", "environment": "prod", - "region": "prod.us-central-1", + "instance": "default", "currentPlatform": "6.1.0", + "toRun": [], "currentApplication": { - "id": 3, "commit": "commit1", + "id": 3, "source": "repository1/tree/commit1" }, - "jobs": [ + "type": "deployment", + "region": "prod.us-central-1", + "runs": [ { "versions": { - "targetPlatform": "6.1.0", "targetApplication": { + "commit": "commit1", "id": 3, + "source": "repository1/tree/commit1" + }, + "sourcePlatform": "6.1.0", + "targetPlatform": "6.1.0", + "sourceApplication": { "commit": "commit1", + "id": 2, + "source": "repository1/tree/commit1" + } + }, + "start": 2000, + "id": 3, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "unfinished" + }, + { + "name": "installReal", + "status": "unfinished" + }, + { + "name": "startTests", + "status": "unfinished" + }, + { + "name": "endTests", + "status": "unfinished" + }, + { + "name": "deactivateTester", + "status": "unfinished" + }, + { + "name": "report", + "status": "unfinished" + } + ], + "url": "https://some.url:43/instance/default/job/production-us-central-1/run/run 3 of production-us-central-1 for tenant.application", + "status": "running" + }, + { + "versions": { + "targetApplication": { + "commit": "commit1", + "id": 2, "source": "repository1/tree/commit1" }, "sourcePlatform": "6.1.0", + "targetPlatform": "6.1.0", "sourceApplication": { - "id": 3, "commit": "commit1", + "id": 1, "source": "repository1/tree/commit1" } }, - "readyAt": 2000, - "running": true - } - ], - "lastRun": { - "start": 2000, - "status": "running", - "versions": { - "targetPlatform": "6.1.0", - "targetApplication": { - "id": 3, - "commit": "commit1", - "source": "repository1/tree/commit1" + "start": 1000, + "end": 1000, + "id": 2, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "installReal", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/production-us-central-1/run/run 2 of production-us-central-1 for tenant.application", + "status": "success" + }, + { + "versions": { + "targetApplication": { + "commit": "commit1", + "id": 1, + "source": "repository1/tree/commit1" + }, + "targetPlatform": "6.1.0" }, - "sourcePlatform": "6.1.0", - "sourceApplication": { - "id": 2, - "commit": "commit1", - "source": "repository1/tree/commit1" - } + "start": 0, + "end": 0, + "id": 1, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "installReal", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/production-us-central-1/run/run 1 of production-us-central-1 for tenant.application", + "status": "success" } - } + ], + "url": "https://some.url:43/instance/default/job/production-us-central-1", + "dependencies": [ + 0 + ] }, { - "type": "test", - "dependencies": [ - 2 - ], "declared": true, - "instance": "default", "jobName": "test-us-central-1", "environment": "prod", + "instance": "default", + "toRun": [ + { + "versions": { + "targetApplication": { + "commit": "commit1", + "id": 3, + "source": "repository1/tree/commit1" + }, + "sourcePlatform": "6.1.0", + "targetPlatform": "6.1.0", + "sourceApplication": { + "commit": "commit1", + "id": 3, + "source": "repository1/tree/commit1" + } + } + } + ], + "type": "test", "region": "prod.us-central-1", - "jobs": [ + "runs": [ { "versions": { + "targetApplication": { + "commit": "commit1", + "id": 2, + "source": "repository1/tree/commit1" + }, + "sourcePlatform": "6.1.0", "targetPlatform": "6.1.0", + "sourceApplication": { + "commit": "commit1", + "id": 2, + "source": "repository1/tree/commit1" + } + }, + "start": 1000, + "end": 1000, + "id": 2, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/test-us-central-1/run/run 2 of test-us-central-1 for tenant.application", + "status": "success" + }, + { + "versions": { "targetApplication": { - "id": 3, "commit": "commit1", + "id": 1, "source": "repository1/tree/commit1" }, "sourcePlatform": "6.1.0", + "targetPlatform": "6.1.0", "sourceApplication": { - "id": 3, "commit": "commit1", + "id": 1, "source": "repository1/tree/commit1" } }, - "running": false + "start": 0, + "end": 0, + "id": 1, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/test-us-central-1/run/run 1 of test-us-central-1 for tenant.application", + "status": "success" } ], - "lastRun": { - "start": 1000, - "end": 1000, - "status": "success", - "versions": { - "targetPlatform": "6.1.0", - "targetApplication": { - "id": 2, - "commit": "commit1", - "source": "repository1/tree/commit1" - }, - "sourcePlatform": "6.1.0", - "sourceApplication": { - "id": 2, - "commit": "commit1", - "source": "repository1/tree/commit1" - } - } - } + "url": "https://some.url:43/instance/default/job/test-us-central-1", + "dependencies": [ + 2 + ] }, { - "type": "deployment", - "dependencies": [ - 3 - ], "declared": true, - "instance": "default", "jobName": "production-us-west-1", "environment": "prod", - "region": "prod.us-west-1", + "instance": "default", "currentPlatform": "6.1.0", + "toRun": [ + { + "versions": { + "targetApplication": { + "commit": "commit1", + "id": 3, + "source": "repository1/tree/commit1" + }, + "sourcePlatform": "6.1.0", + "targetPlatform": "6.1.0", + "sourceApplication": { + "commit": "commit1", + "id": 2, + "source": "repository1/tree/commit1" + } + } + } + ], "currentApplication": { - "id": 2, "commit": "commit1", + "id": 2, "source": "repository1/tree/commit1" }, - "jobs": [ + "type": "deployment", + "region": "prod.us-west-1", + "runs": [ { "versions": { - "targetPlatform": "6.1.0", "targetApplication": { - "id": 3, "commit": "commit1", + "id": 2, "source": "repository1/tree/commit1" }, "sourcePlatform": "6.1.0", + "targetPlatform": "6.1.0", "sourceApplication": { - "id": 2, "commit": "commit1", + "id": 1, "source": "repository1/tree/commit1" } }, - "running": false - } - ], - "lastRun": { - "start": 1000, - "end": 1000, - "status": "testFailure", - "versions": { - "targetPlatform": "6.1.0", - "targetApplication": { - "id": 2, - "commit": "commit1", - "source": "repository1/tree/commit1" + "start": 1000, + "end": 1000, + "id": 2, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "installReal", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "failed" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/production-us-west-1/run/run 2 of production-us-west-1 for tenant.application", + "status": "testFailure" + }, + { + "versions": { + "targetApplication": { + "commit": "commit1", + "id": 1, + "source": "repository1/tree/commit1" + }, + "targetPlatform": "6.1.0" }, - "sourcePlatform": "6.1.0", - "sourceApplication": { - "id": 1, - "commit": "commit1", - "source": "repository1/tree/commit1" - } + "start": 0, + "end": 0, + "id": 1, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "installReal", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/production-us-west-1/run/run 1 of production-us-west-1 for tenant.application", + "status": "success" } - } - }, - { - "type": "deployment", + ], + "url": "https://some.url:43/instance/default/job/production-us-west-1", "dependencies": [ 3 - ], + ] + }, + { "declared": true, - "instance": "default", "jobName": "production-us-east-3", "environment": "prod", - "region": "prod.us-east-3", + "instance": "default", "currentPlatform": "6.1.0", + "toRun": [ + { + "versions": { + "targetApplication": { + "commit": "commit1", + "id": 3, + "source": "repository1/tree/commit1" + }, + "sourcePlatform": "6.1.0", + "targetPlatform": "6.1.0", + "sourceApplication": { + "commit": "commit1", + "id": 1, + "source": "repository1/tree/commit1" + } + } + } + ], "currentApplication": { - "id": 1, "commit": "commit1", + "id": 1, "source": "repository1/tree/commit1" }, - "jobs": [ + "type": "deployment", + "region": "prod.us-east-3", + "runs": [ { "versions": { - "targetPlatform": "6.1.0", "targetApplication": { - "id": 3, "commit": "commit1", + "id": 2, "source": "repository1/tree/commit1" }, "sourcePlatform": "6.1.0", + "targetPlatform": "6.1.0", "sourceApplication": { - "id": 1, "commit": "commit1", + "id": 1, "source": "repository1/tree/commit1" } }, - "running": false - } - ], - "lastRun": { - "start": 1000, - "end": 1000, - "status": "deploymentFailed", - "versions": { - "targetPlatform": "6.1.0", - "targetApplication": { - "id": 2, - "commit": "commit1", - "source": "repository1/tree/commit1" + "start": 1000, + "end": 1000, + "id": 2, + "steps": [ + { + "name": "deployTester", + "status": "failed" + }, + { + "name": "deployReal", + "status": "unfinished" + }, + { + "name": "installTester", + "status": "unfinished" + }, + { + "name": "installReal", + "status": "unfinished" + }, + { + "name": "startTests", + "status": "unfinished" + }, + { + "name": "endTests", + "status": "unfinished" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/production-us-east-3/run/run 2 of production-us-east-3 for tenant.application", + "status": "deploymentFailed" + }, + { + "versions": { + "targetApplication": { + "commit": "commit1", + "id": 1, + "source": "repository1/tree/commit1" + }, + "targetPlatform": "6.1.0" }, - "sourcePlatform": "6.1.0", - "sourceApplication": { - "id": 1, - "commit": "commit1", - "source": "repository1/tree/commit1" - } + "start": 0, + "end": 0, + "id": 1, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "installReal", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ], + "url": "https://some.url:43/instance/default/job/production-us-east-3/run/run 1 of production-us-east-3 for tenant.application", + "status": "success" } - } + ], + "url": "https://some.url:43/instance/default/job/production-us-east-3", + "dependencies": [ + 3 + ] } - ] -}
\ No newline at end of file + ], + "tenant": "tenant" +} + diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview.json index f4fdac81b0c..df04b2a165a 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-overview.json @@ -8,10 +8,16 @@ "declared": false, "instance": "instance1", "jobName": "system-test", + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance1/job/system-test", "environment": "test", "region": "test.us-east-1", - "jobs": [ + "toRun": [], + "runs": [ { + "id": 2, + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance1/job/system-test/run/run 2 of system-test for tenant1.application1.instance1", + "start": "(ignore)", + "status": "running", "versions": { "targetPlatform": "6.1.0", "targetApplication": { @@ -20,22 +26,107 @@ "source": "repository1/tree/commit1" } }, - "readyAt": 0, - "running": true - } - ], - "lastRun": { - "start": "(ignore)", - "status": "running", - "versions": { - "targetPlatform": "6.1.0", - "targetApplication": { - "id": 4, - "commit": "commit1", - "source": "repository1/tree/commit1" - } + "steps": [ + { + "name": "deployTester", + "status": "unfinished" + }, + { + "name": "deployReal", + "status": "unfinished" + }, + { + "name": "installTester", + "status": "unfinished" + }, + { + "name": "installReal", + "status": "unfinished" + }, + { + "name": "startTests", + "status": "unfinished" + }, + { + "name": "endTests", + "status": "unfinished" + }, + { + "name": "copyVespaLogs", + "status": "unfinished" + }, + { + "name": "deactivateReal", + "status": "unfinished" + }, + { + "name": "deactivateTester", + "status": "unfinished" + }, + { + "name": "report", + "status": "unfinished" + } + ] + }, + { + "id": 1, + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance1/job/system-test/run/run 1 of system-test for tenant1.application1.instance1", + "start": "(ignore)", + "end": "(ignore)", + "status": "success", + "versions": { + "targetPlatform": "6.1.0", + "targetApplication": { + "id": 1, + "commit": "commit1", + "source": "repository1/tree/commit1" + } + }, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "installReal", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "succeeded" + }, + { + "name": "copyVespaLogs", + "status": "succeeded" + }, + { + "name": "deactivateReal", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ] } - } + ] }, { "type": "test", @@ -43,10 +134,16 @@ "declared": false, "instance": "instance1", "jobName": "staging-test", + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance1/job/staging-test", "environment": "staging", "region": "staging.us-east-3", - "jobs": [ + "toRun": [], + "runs": [ { + "id": 2, + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance1/job/staging-test/run/run 2 of staging-test for tenant1.application1.instance1", + "start": "(ignore)", + "status": "running", "versions": { "targetPlatform": "6.1.0", "targetApplication": { @@ -55,22 +152,123 @@ "source": "repository1/tree/commit1" } }, - "readyAt": 0, - "running": true - } - ], - "lastRun": { - "start": "(ignore)", - "status": "running", - "versions": { - "targetPlatform": "6.1.0", - "targetApplication": { - "id": 4, - "commit": "commit1", - "source": "repository1/tree/commit1" - } + "steps": [ + { + "name": "deployTester", + "status": "unfinished" + }, + { + "name": "deployInitialReal", + "status": "unfinished" + }, + { + "name": "installInitialReal", + "status": "unfinished" + }, + { + "name": "deployReal", + "status": "unfinished" + }, + { + "name": "installTester", + "status": "unfinished" + }, + { + "name": "installReal", + "status": "unfinished" + }, + { + "name": "startTests", + "status": "unfinished" + }, + { + "name": "endTests", + "status": "unfinished" + }, + { + "name": "copyVespaLogs", + "status": "unfinished" + }, + { + "name": "deactivateReal", + "status": "unfinished" + }, + { + "name": "deactivateTester", + "status": "unfinished" + }, + { + "name": "report", + "status": "unfinished" + } + ] + }, + { + "id": 1, + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance1/job/staging-test/run/run 1 of staging-test for tenant1.application1.instance1", + "start": "(ignore)", + "end": "(ignore)", + "status": "success", + "versions": { + "targetPlatform": "6.1.0", + "targetApplication": { + "id": 1, + "commit": "commit1", + "source": "repository1/tree/commit1" + } + }, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployInitialReal", + "status": "succeeded" + }, + { + "name": "installInitialReal", + "status": "succeeded" + }, + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "installReal", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "succeeded" + }, + { + "name": "copyVespaLogs", + "status": "succeeded" + }, + { + "name": "deactivateReal", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ] } - } + ] }, { "type": "deployment", @@ -78,9 +276,10 @@ "declared": true, "instance": "instance1", "jobName": "production-us-central-1", + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance1/job/production-us-central-1", "environment": "prod", "region": "prod.us-central-1", - "jobs": [ + "toRun": [ { "versions": { "targetPlatform": "6.1.0", @@ -89,23 +288,60 @@ "commit": "commit1", "source": "repository1/tree/commit1" } - }, - "running": false + } } ], - "lastRun": { - "start": "(ignore)", - "end": "(ignore)", - "status": "success", - "versions": { - "targetPlatform": "6.1.0", - "targetApplication": { - "id": 1, - "commit": "commit1", - "source": "repository1/tree/commit1" - } + "runs": [ + { + "id": 1, + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance1/job/production-us-central-1/run/run 1 of production-us-central-1 for tenant1.application1.instance1", + "start": "(ignore)", + "end": "(ignore)", + "status": "success", + "versions": { + "targetPlatform": "6.1.0", + "targetApplication": { + "id": 1, + "commit": "commit1", + "source": "repository1/tree/commit1" + } + }, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "installReal", + "status": "succeeded" + }, + { + "name": "startTests", + "status": "succeeded" + }, + { + "name": "endTests", + "status": "succeeded" + }, + { + "name": "deactivateTester", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ] } - } + ] }, { "type": "deployment", @@ -115,9 +351,10 @@ "declared": true, "instance": "instance1", "jobName": "production-us-west-1", + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance1/job/production-us-west-1", "environment": "prod", "region": "prod.us-west-1", - "jobs": [ + "toRun": [ { "versions": { "targetPlatform": "6.1.0", @@ -126,22 +363,59 @@ "commit": "commit1", "source": "repository1/tree/commit1" } - }, - "running": false + } } ], - "lastRun": { - "start": "(ignore)", - "status": "aborted", - "versions": { - "targetPlatform": "6.1.0", - "targetApplication": { - "id": 1, - "commit": "commit1", - "source": "repository1/tree/commit1" - } + "runs": [ + { + "id": 1, + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance1/job/production-us-west-1/run/run 1 of production-us-west-1 for tenant1.application1.instance1", + "start": "(ignore)", + "status": "aborted", + "versions": { + "targetPlatform": "6.1.0", + "targetApplication": { + "id": 1, + "commit": "commit1", + "source": "repository1/tree/commit1" + } + }, + "steps": [ + { + "name": "deployTester", + "status": "unfinished" + }, + { + "name": "deployReal", + "status": "unfinished" + }, + { + "name": "installTester", + "status": "unfinished" + }, + { + "name": "installReal", + "status": "unfinished" + }, + { + "name": "startTests", + "status": "unfinished" + }, + { + "name": "endTests", + "status": "unfinished" + }, + { + "name": "deactivateTester", + "status": "unfinished" + }, + { + "name": "report", + "status": "unfinished" + } + ] } - } + ] }, { "type": "deployment", @@ -151,9 +425,10 @@ "declared": true, "instance": "instance1", "jobName": "production-us-east-3", + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance1/job/production-us-east-3", "environment": "prod", "region": "prod.us-east-3", - "jobs": [ + "toRun": [ { "versions": { "targetPlatform": "6.1.0", @@ -162,22 +437,59 @@ "commit": "commit1", "source": "repository1/tree/commit1" } - }, - "running": false + } } ], - "lastRun": { - "start": "(ignore)", - "status": "aborted", - "versions": { - "targetPlatform": "6.1.0", - "targetApplication": { - "id": 1, - "commit": "commit1", - "source": "repository1/tree/commit1" - } + "runs": [ + { + "id": 1, + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance1/job/production-us-east-3/run/run 1 of production-us-east-3 for tenant1.application1.instance1", + "start": "(ignore)", + "status": "aborted", + "versions": { + "targetPlatform": "6.1.0", + "targetApplication": { + "id": 1, + "commit": "commit1", + "source": "repository1/tree/commit1" + } + }, + "steps": [ + { + "name": "deployTester", + "status": "unfinished" + }, + { + "name": "deployReal", + "status": "unfinished" + }, + { + "name": "installTester", + "status": "unfinished" + }, + { + "name": "installReal", + "status": "unfinished" + }, + { + "name": "startTests", + "status": "unfinished" + }, + { + "name": "endTests", + "status": "unfinished" + }, + { + "name": "deactivateTester", + "status": "unfinished" + }, + { + "name": "report", + "status": "unfinished" + } + ] } - } + ] }, { "type": "test", @@ -185,9 +497,11 @@ "declared": false, "instance": "instance2", "jobName": "system-test", + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance2/job/system-test", "environment": "test", "region": "test.us-east-1", - "jobs": [] + "toRun": [], + "runs": [] }, { "type": "test", @@ -195,9 +509,11 @@ "declared": false, "instance": "instance2", "jobName": "staging-test", + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance2/job/staging-test", "environment": "staging", "region": "staging.us-east-3", - "jobs": [] + "toRun": [], + "runs": [] }, { "type": "deployment", @@ -208,9 +524,10 @@ "declared": true, "instance": "instance2", "jobName": "production-us-central-1", + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance2/job/production-us-central-1", "environment": "prod", "region": "prod.us-central-1", - "jobs": [ + "toRun": [ { "versions": { "targetPlatform": "6.1.0", @@ -219,10 +536,10 @@ "commit": "commit1", "source": "repository1/tree/commit1" } - }, - "running": false + } } - ] + ], + "runs": [] }, { "type": "deployment", @@ -232,9 +549,10 @@ "declared": true, "instance": "instance2", "jobName": "production-us-west-1", + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance2/job/production-us-west-1", "environment": "prod", "region": "prod.us-west-1", - "jobs": [ + "toRun": [ { "versions": { "targetPlatform": "6.1.0", @@ -243,10 +561,10 @@ "commit": "commit1", "source": "repository1/tree/commit1" } - }, - "running": false + } } - ] + ], + "runs": [] }, { "type": "deployment", @@ -256,9 +574,10 @@ "declared": true, "instance": "instance2", "jobName": "production-us-east-3", + "url": "http://localhost:8080/application/v4/tenant/tenant1/application/application1/instance/instance2/job/production-us-east-3", "environment": "prod", "region": "prod.us-east-3", - "jobs": [ + "toRun": [ { "versions": { "targetPlatform": "6.1.0", @@ -267,10 +586,11 @@ "commit": "commit1", "source": "repository1/tree/commit1" } - }, - "running": false + } } - ] + ], + "runs": [] } ] } + |