summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorØyvind Grønnesby <oyving@yahooinc.com>2023-06-13 11:02:11 +0200
committerGitHub <noreply@github.com>2023-06-13 11:02:11 +0200
commita044917d2e2353886f3c707252d406cad4da166f (patch)
treed5e1ed478cb2f9fcda3b28377a2862daac3bd065
parent3092b0045dfb7e701f8a2a4b7a359acc696d9fc3 (diff)
parentb1f6112e00aac573fa5f5dbaffc6dfae639c4494 (diff)
Merge pull request #27373 from vespa-engine/ogronnesby/enclave-in-deployment
Return if a deployment job is in enclave
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelper.java10
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/ApplicationPackageBuilder.java4
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/JobControllerApiHandlerHelperTest.java23
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/overview-enclave.json280
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
+ }
+ ]
+}