diff options
5 files changed, 44 insertions, 2 deletions
diff --git a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java index 465f35e0b43..dab84233e02 100644 --- a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java +++ b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java @@ -1601,6 +1601,7 @@ public class DeploymentSpecTest { <perf cloud-account='700000000000'/> <prod> <region>us-west-1</region> + <region cloud-account='default'>us-west-2</region> </prod> </instance> <instance id='main'> @@ -1625,6 +1626,7 @@ public class DeploymentSpecTest { assertCloudAccount("400000000000", spec.requireInstance("main"), Environment.dev, ""); assertCloudAccount("500000000000", spec.requireInstance("main"), Environment.test, ""); assertCloudAccount("100000000000", spec.requireInstance("main"), Environment.staging, ""); + assertCloudAccount("default", spec.requireInstance("beta"), Environment.prod, "us-west-2"); } private void assertCloudAccount(String expected, DeploymentInstanceSpec instance, Environment environment, String region) { diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/CloudAccount.java b/config-provisioning/src/main/java/com/yahoo/config/provision/CloudAccount.java index 1f988ee696e..0e709575627 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/CloudAccount.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/CloudAccount.java @@ -13,15 +13,18 @@ import java.util.regex.Pattern; public class CloudAccount extends PatternedStringWrapper<CloudAccount> { public static final CloudAccount empty = new CloudAccount(""); + public static final CloudAccount default_ = new CloudAccount("default"); public CloudAccount(String value) { - super(value, Pattern.compile("^([0-9]{12})?$"), "cloud account"); + super(value, Pattern.compile("^([0-9]{12}|default)?$"), "cloud account"); } public boolean isEmpty() { return this.equals(empty); } + public boolean isDefault() { return this.equals(default_); } + @Override public String toString() { return isEmpty() ? "unspecified account" : "account '" + value() + "'"; diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java index e09e1f04b8e..ba148345d0d 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java @@ -677,7 +677,7 @@ public class ApplicationController { .flatMap(instanceSpec -> instanceSpec.cloudAccount(zoneId.environment(), Optional.of(zoneId.region()))) .or(spec::cloudAccount); - if (requestedAccount.isEmpty()) { + if (requestedAccount.isEmpty() || requestedAccount.map(CloudAccount::isDefault).orElse(false)) { return Optional.empty(); } TenantName tenant = deployment.applicationId().tenant(); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java index 43a4ac0f6fc..f6af6bbe7e5 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java @@ -1325,6 +1325,33 @@ public class ControllerTest { } @Test + void testCloudAccountWithDefaultOverride() { + var context = tester.newDeploymentContext(); + var prodZone1 = productionUsEast3.zone(); + var prodZone2 = productionUsWest1.zone(); + var cloudAccount = "012345678912"; + var application = new ApplicationPackageBuilder() + .cloudAccount(cloudAccount) + .region(prodZone1.region()) + .region(prodZone2.region(), "default") + .build(); + + // I don't know why this makes the test pass :( + tester.controllerTester().flagSource().withListFlag(PermanentFlags.CLOUD_ACCOUNTS.id(), List.of(cloudAccount), String.class); + + // Deployment to prod succeeds once all zones are configured in requested account + tester.controllerTester().zoneRegistry().configureCloudAccount(new CloudAccount(cloudAccount), + systemTest.zone(), + stagingTest.zone(), + prodZone1); + + context.submit(application).deploy(); + + assertEquals(cloudAccount, tester.controllerTester().configServer().cloudAccount(context.deploymentIdIn(prodZone1)).get().value()); + assertEquals(Optional.empty(), tester.controllerTester().configServer().cloudAccount(context.deploymentIdIn(prodZone2))); + } + + @Test void testSubmitWithElementDeprecatedOnPreviousMajor() { DeploymentContext context = tester.newDeploymentContext(); var applicationPackage = new ApplicationPackageBuilder() 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 7fb85af0d4a..2c1e0b743fe 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,16 @@ public class ApplicationPackageBuilder { return this; } + public ApplicationPackageBuilder region(RegionName regionName, String cloudAccount) { + prodBody.append(" <region ") + .append("cloud-account=\"") + .append(cloudAccount) + .append("\">") + .append(regionName) + .append("</region>\n"); + return this; + } + public ApplicationPackageBuilder region(RegionName regionName, boolean active) { prodBody.append(" <region active='") .append(active) |