diff options
author | Øyvind Grønnesby <oyving@yahooinc.com> | 2023-06-13 11:02:11 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-13 11:02:11 +0200 |
commit | a044917d2e2353886f3c707252d406cad4da166f (patch) | |
tree | d5e1ed478cb2f9fcda3b28377a2862daac3bd065 | |
parent | 3092b0045dfb7e701f8a2a4b7a359acc696d9fc3 (diff) | |
parent | b1f6112e00aac573fa5f5dbaffc6dfae639c4494 (diff) |
Merge pull request #27373 from vespa-engine/ogronnesby/enclave-in-deployment
Return if a deployment job is in enclave
4 files changed, 316 insertions, 1 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 d1d0fb54eef..544863b708e 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 @@ -361,7 +361,15 @@ class JobControllerApiHandlerHelper { "/job/" + job.type().jobName()).normalize(); stepObject.setString("url", baseUriForJob.toString()); stepObject.setString("environment", job.type().environment().value()); - if ( ! job.type().environment().isTest()) stepObject.setString("region", job.type().zone().value()); + if ( ! job.type().environment().isTest()) { + stepObject.setString("region", job.type().zone().value()); + var deployment = application.require(job.application().instance()).deployments().get(job.type().zone()); + var cloudAccount = deployment == null ? null : deployment.cloudAccount(); + if (cloudAccount != null && controller.zoneRegistry().isExternal(cloudAccount)) { + var enclaveObject = stepObject.setObject("enclave"); + enclaveObject.setString("cloudAccount", cloudAccount.value()); + } + } if (job.type().isProduction() && job.type().isDeployment()) { status.deploymentFor(job).ifPresent(deployment -> { diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/ApplicationPackageBuilder.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/ApplicationPackageBuilder.java index 2c1e0b743fe..965201ec6da 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/ApplicationPackageBuilder.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/ApplicationPackageBuilder.java @@ -173,6 +173,10 @@ public class ApplicationPackageBuilder { return this; } + public ApplicationPackageBuilder region(String regionName, String cloudAccount) { + return region(RegionName.from(regionName), cloudAccount); + } + public ApplicationPackageBuilder region(RegionName regionName, String cloudAccount) { prodBody.append(" <region ") .append("cloud-account=\"") diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java index 6555277b06b..d999514597a 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java @@ -2,9 +2,13 @@ package com.yahoo.vespa.hosted.controller.restapi.application; import com.yahoo.component.Version; +import com.yahoo.config.provision.CloudAccount; +import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.container.jdisc.HttpResponse; import com.yahoo.slime.SlimeUtils; +import com.yahoo.vespa.flags.PermanentFlags; +import com.yahoo.vespa.hosted.controller.ControllerTester; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerException; import com.yahoo.vespa.hosted.controller.api.integration.deployment.RevisionId; import com.yahoo.vespa.hosted.controller.api.integration.deployment.RunId; @@ -25,6 +29,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.time.Duration; import java.time.Instant; +import java.util.List; import java.util.Optional; import static com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerException.ErrorCode.INVALID_APPLICATION_PACKAGE; @@ -198,6 +203,24 @@ public class JobControllerApiHandlerHelperTest { "jobs-direct-deployment.json"); } + @Test + void testEnclave() { + var cloudAccount = CloudAccount.from("aws:123456789012"); + var applicationPackage = new ApplicationPackageBuilder() + .stagingTest() + .systemTest() + .region("aws-us-east-1c", cloudAccount.value()) + .build(); + var tester = new DeploymentTester(new ControllerTester(SystemName.Public)); + tester.controllerTester().flagSource().withListFlag(PermanentFlags.CLOUD_ACCOUNTS.id(), List.of(cloudAccount.value()), String.class); + tester.controllerTester().zoneRegistry().configureCloudAccount(cloudAccount, ZoneId.from("prod.aws-us-east-1c")); + + var app = tester.newDeploymentContext(); + app.submit(applicationPackage).deploy(); + + assertResponse(JobControllerApiHandlerHelper.overviewResponse(tester.controller(), app.application().id(), URI.create("https://some.url:43/root/")), "overview-enclave.json"); + } + private void assertResponse(HttpResponse response, String fileName) { try { Path path = Paths.get("src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/").resolve(fileName); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/overview-enclave.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/overview-enclave.json new file mode 100644 index 00000000000..6a322f9f381 --- /dev/null +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/overview-enclave.json @@ -0,0 +1,280 @@ +{ + "tenant": "tenant", + "application": "application", + "projectId": 1000, + "steps": [ + { + "type": "instance", + "dependencies": [ ], + "declared": true, + "instance": "default", + "readyAt": 0, + "deploying": { }, + "latestVersions": { + "platform": { + "platform": "6.1.0", + "at": 1600000000000, + "upgrade": false, + "available": [ + { + "platform": "6.1.0", + "upgrade": false + } + ], + "blockers": [ ] + }, + "application": { + "application": { + "build": 1, + "compileVersion": "6.1.0", + "sourceUrl": "repository1/tree/commit1", + "commit": "commit1" + }, + "at": 1000, + "upgrade": false, + "available": [ + { + "application": { + "build": 1, + "compileVersion": "6.1.0", + "sourceUrl": "repository1/tree/commit1", + "commit": "commit1" + } + } + ], + "blockers": [ ] + } + }, + "delayCause": null + }, + { + "type": "test", + "dependencies": [ ], + "declared": true, + "instance": "default", + "readyAt": 0, + "jobName": "staging-test", + "url": "https://some.url:43/instance/default/job/staging-test", + "environment": "staging", + "toRun": [ ], + "runs": [ + { + "id": 1, + "url": "https://some.url:43/instance/default/job/staging-test/run/1", + "start": 1600000000000, + "end": 1600000000000, + "status": "success", + "versions": { + "targetPlatform": "6.1.0", + "targetApplication": { + "build": 1, + "compileVersion": "6.1.0", + "sourceUrl": "repository1/tree/commit1", + "commit": "commit1" + } + }, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "deployInitialReal", + "status": "succeeded" + }, + { + "name": "installInitialReal", + "status": "succeeded" + }, + { + "name": "startStagingSetup", + "status": "succeeded" + }, + { + "name": "endStagingSetup", + "status": "succeeded" + }, + { + "name": "deployReal", + "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" + } + ] + } + ], + "delayCause": null + }, + { + "type": "test", + "dependencies": [ ], + "declared": true, + "instance": "default", + "readyAt": 0, + "jobName": "system-test", + "url": "https://some.url:43/instance/default/job/system-test", + "environment": "test", + "toRun": [ ], + "runs": [ + { + "id": 1, + "url": "https://some.url:43/instance/default/job/system-test/run/1", + "start": 1600000000000, + "end": 1600000000000, + "status": "success", + "versions": { + "targetPlatform": "6.1.0", + "targetApplication": { + "build": 1, + "compileVersion": "6.1.0", + "sourceUrl": "repository1/tree/commit1", + "commit": "commit1" + } + }, + "steps": [ + { + "name": "deployTester", + "status": "succeeded" + }, + { + "name": "installTester", + "status": "succeeded" + }, + { + "name": "deployReal", + "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" + } + ] + } + ], + "delayCause": null + }, + { + "type": "deployment", + "dependencies": [ + 0, + 1, + 2 + ], + "declared": true, + "instance": "default", + "readyAt": 1600000000000, + "jobName": "production-aws-us-east-1c", + "url": "https://some.url:43/instance/default/job/production-aws-us-east-1c", + "environment": "prod", + "region": "prod.aws-us-east-1c", + "enclave": { + "cloudAccount": "aws:123456789012" + }, + "currentPlatform": "6.1.0", + "currentApplication": { + "build": 1, + "compileVersion": "6.1.0", + "sourceUrl": "repository1/tree/commit1", + "commit": "commit1" + }, + "toRun": [ ], + "runs": [ + { + "id": 1, + "url": "https://some.url:43/instance/default/job/production-aws-us-east-1c/run/1", + "start": 1600000000000, + "end": 1600000000000, + "status": "success", + "versions": { + "targetPlatform": "6.1.0", + "targetApplication": { + "build": 1, + "compileVersion": "6.1.0", + "sourceUrl": "repository1/tree/commit1", + "commit": "commit1" + } + }, + "steps": [ + { + "name": "deployReal", + "status": "succeeded" + }, + { + "name": "installReal", + "status": "succeeded" + }, + { + "name": "report", + "status": "succeeded" + } + ] + } + ], + "delayCause": null + } + ], + "builds": [ + { + "build": 1, + "compileVersion": "6.1.0", + "sourceUrl": "repository1/tree/commit1", + "commit": "commit1", + "deployable": true, + "submittedAt": 1600000000000 + } + ] +} |