diff options
7 files changed, 18 insertions, 4 deletions
diff --git a/config-model-api/abi-spec.json b/config-model-api/abi-spec.json index 22664d73b51..841bac213ed 100644 --- a/config-model-api/abi-spec.json +++ b/config-model-api/abi-spec.json @@ -436,11 +436,12 @@ "public" ], "methods" : [ - "public void <init>(java.util.List, java.util.Optional, java.util.Optional, java.util.Optional, java.util.List, java.lang.String, java.util.List)", + "public void <init>(java.util.List, java.util.Optional, java.util.Optional, java.util.Optional, java.util.Optional, java.util.List, java.lang.String, java.util.List)", "public java.util.Optional majorVersion()", "public java.util.List steps()", "public java.util.Optional athenzDomain()", "public java.util.Optional athenzService()", + "public java.util.Optional cloudAccount()", "public java.lang.String xmlForm()", "public java.util.Optional instance(com.yahoo.config.provision.InstanceName)", "public com.yahoo.config.application.api.DeploymentInstanceSpec requireInstance(java.lang.String)", diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java index 2df55ffce95..c9ec9780fad 100644 --- a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java +++ b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java @@ -40,6 +40,7 @@ public class DeploymentSpec { Optional.empty(), Optional.empty(), Optional.empty(), + Optional.empty(), List.of(), "<deployment version='1.0'/>", List.of()); @@ -50,6 +51,7 @@ public class DeploymentSpec { private final Optional<Integer> majorVersion; private final Optional<AthenzDomain> athenzDomain; private final Optional<AthenzService> athenzService; + private final Optional<CloudAccount> cloudAccount; private final List<Endpoint> endpoints; private final List<DeprecatedElement> deprecatedElements; @@ -59,6 +61,7 @@ public class DeploymentSpec { Optional<Integer> majorVersion, Optional<AthenzDomain> athenzDomain, Optional<AthenzService> athenzService, + Optional<CloudAccount> cloudAccount, List<Endpoint> endpoints, String xmlForm, List<DeprecatedElement> deprecatedElements) { @@ -66,6 +69,7 @@ public class DeploymentSpec { this.majorVersion = Objects.requireNonNull(majorVersion); this.athenzDomain = Objects.requireNonNull(athenzDomain); this.athenzService = Objects.requireNonNull(athenzService); + this.cloudAccount = Objects.requireNonNull(cloudAccount); this.xmlForm = Objects.requireNonNull(xmlForm); this.endpoints = List.copyOf(Objects.requireNonNull(endpoints)); this.deprecatedElements = List.copyOf(Objects.requireNonNull(deprecatedElements)); @@ -166,7 +170,10 @@ public class DeploymentSpec { // b. for multi-instance specs the root tag may or may not have a service, and unknown instances also lead here; and // 3. any tester application deployment is always an unknown instance, and always gets here, but there should not be any reason // to have environment, instance or region variants on those. - public Optional<AthenzService> athenzService() { return this.athenzService; } + public Optional<AthenzService> athenzService() { return athenzService; } + + /** Cloud account set on the deployment root; see discussion for {@link #athenzService}. */ + public Optional<CloudAccount> cloudAccount() { return cloudAccount; } /** Returns the XML form of this spec, or null if it was not created by fromXml, nor is empty */ public String xmlForm() { return xmlForm; } diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java b/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java index 75949d2b6cd..82402afa3f3 100644 --- a/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java +++ b/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java @@ -148,6 +148,7 @@ public class DeploymentSpecXmlReader { optionalIntegerAttribute(majorVersionAttribute, root), stringAttribute(athenzDomainAttribute, root).map(AthenzDomain::from), stringAttribute(athenzServiceAttribute, root).map(AthenzService::from), + stringAttribute(cloudAccountAttribute, root).map(CloudAccount::new), applicationEndpoints, xmlForm, deprecatedElements); 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 2fda56e5290..c6dfa0f8cb7 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 @@ -1613,6 +1613,7 @@ public class DeploymentSpecTest { "</deployment>" ); DeploymentSpec spec = DeploymentSpec.fromXml(r); + assertEquals(Optional.of(new CloudAccount("100000000000")), spec.cloudAccount()); assertCloudAccount("800000000000", spec.requireInstance("alpha"), Environment.prod, "us-east-1"); assertCloudAccount("200000000000", spec.requireInstance("beta"), Environment.prod, "us-west-1"); assertCloudAccount("600000000000", spec.requireInstance("beta"), Environment.staging, ""); diff --git a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecWithoutInstanceTest.java b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecWithoutInstanceTest.java index 4acf0c692fb..ccefa24738c 100644 --- a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecWithoutInstanceTest.java +++ b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecWithoutInstanceTest.java @@ -4,6 +4,7 @@ package com.yahoo.config.application.api; import com.google.common.collect.ImmutableSet; import com.yahoo.config.provision.CloudAccount; import com.yahoo.config.provision.Environment; +import com.yahoo.config.provision.InstanceName; import com.yahoo.config.provision.RegionName; import org.junit.Test; @@ -715,6 +716,7 @@ public class DeploymentSpecWithoutInstanceTest { ); DeploymentSpec spec = DeploymentSpec.fromXml(r); DeploymentInstanceSpec instance = spec.requireInstance("default"); + assertEquals(Optional.of(new CloudAccount("012345678912")), spec.cloudAccount()); assertEquals(Optional.of(new CloudAccount("219876543210")), instance.cloudAccount(Environment.prod, Optional.of(RegionName.from("us-east-1")))); assertEquals(Optional.of(new CloudAccount("012345678912")), instance.cloudAccount(Environment.prod, Optional.of(RegionName.from("us-west-1")))); assertEquals(Optional.of(new CloudAccount("012345678912")), instance.cloudAccount(Environment.staging, Optional.empty())); @@ -728,6 +730,7 @@ public class DeploymentSpecWithoutInstanceTest { "</deployment>" ); spec = DeploymentSpec.fromXml(r); + assertEquals(Optional.empty(), spec.cloudAccount()); assertEquals(Optional.of(new CloudAccount("219876543210")), spec.requireInstance("default").cloudAccount(Environment.prod, Optional.of(RegionName.from("us-east-1")))); assertEquals(Optional.empty(), spec.requireInstance("default").cloudAccount(Environment.prod, Optional.of(RegionName.from("us-west-1")))); } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java index 307e0e17955..6fbe334ba30 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java @@ -1005,7 +1005,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { .ifPresent(domain -> { AthenzService service = spec.instance(app.getApplicationId().instance()) .flatMap(instanceSpec -> instanceSpec.athenzService(zone.environment(), zone.region())) - .or(() -> spec.athenzService()) + .or(spec::athenzService) .orElseThrow(() -> new IllegalArgumentException("Missing Athenz service configuration in instance '" + app.getApplicationId().instance() + "'")); String zoneDnsSuffix = zone.environment().value() + "-" + zone.region().value() + "." + athenzDnsSuffix; 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 902c1803b6b..34a7ae89dd2 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 @@ -674,7 +674,8 @@ public class ApplicationController { ZoneId zoneId = deployment.zoneId(); Optional<CloudAccount> requestedAccount = spec.instance(deployment.applicationId().instance()) .flatMap(instanceSpec -> instanceSpec.cloudAccount(zoneId.environment(), - Optional.of(zoneId.region()))); + Optional.of(zoneId.region()))) + .or(spec::cloudAccount); if (requestedAccount.isEmpty()) { return Optional.empty(); } |