summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java2
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/CloudAccount.java5
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java27
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/ApplicationPackageBuilder.java10
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)