diff options
6 files changed, 132 insertions, 5 deletions
diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentInstanceSpec.java b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentInstanceSpec.java index df611d66b87..f96400fc9a9 100644 --- a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentInstanceSpec.java +++ b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentInstanceSpec.java @@ -129,7 +129,7 @@ public class DeploymentInstanceSpec extends DeploymentSpec.Step { // If athenz domain is not set, athenz service cannot be set on any level if (athenzDomain.isEmpty()) { for (DeploymentSpec.DeclaredZone zone : zones()) { - if(zone.athenzService().isPresent()) { + if (zone.athenzService().isPresent()) { throw new IllegalArgumentException("Athenz service configured for zone: " + zone + ", but Athenz domain is not configured"); } } 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 9b0454cffee..b5bf2725b09 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 @@ -252,9 +252,10 @@ public class DeploymentSpec { return instance.get(); } - /** Returns the steps of this which are instances */ + /** Returns the step descendants of this which are instances */ public List<DeploymentInstanceSpec> instances() { return steps.stream() + .flatMap(step -> step instanceof ParallelZones ? ((ParallelZones)step).steps.stream() : List.of(step).stream()) .filter(step -> step instanceof DeploymentInstanceSpec).map(DeploymentInstanceSpec.class::cast) .collect(Collectors.toList()); } 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 59b31985376..bc17ee0cb2b 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 @@ -102,7 +102,7 @@ public class DeploymentSpecXmlReader { if (topLevelTag.getTagName().equals(instanceTag)) steps.addAll(readInstanceContent(topLevelTag.getAttribute(idAttribute), topLevelTag, new MutableOptional<>(), root)); else - steps.addAll(readNonInstanceSteps(topLevelTag, new MutableOptional<>(), topLevelTag)); // (No global service id here) + steps.addAll(readNonInstanceSteps(topLevelTag, new MutableOptional<>(), root)); // (No global service id here) } } @@ -194,7 +194,7 @@ public class DeploymentSpecXmlReader { longAttribute("seconds", stepTag)))); case parallelTag: // regions and instances may be nested within return List.of(new ParallelZones(XML.getChildren(stepTag).stream() - .flatMap(child -> readSteps(child, globalServiceId, stepTag).stream()) + .flatMap(child -> readSteps(child, globalServiceId, parentTag).stream()) .collect(Collectors.toList()))); case regionTag: return List.of(readDeclaredZone(Environment.prod, athenzService, testerFlavor, stepTag)); diff --git a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecDeprecatedAPITest.java b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecDeprecatedAPITest.java index dabdd0c4a69..4ab287ab5c0 100644 --- a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecDeprecatedAPITest.java +++ b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecDeprecatedAPITest.java @@ -3,6 +3,7 @@ package com.yahoo.config.application.api; import com.google.common.collect.ImmutableSet; import com.yahoo.config.provision.Environment; +import com.yahoo.config.provision.InstanceName; import com.yahoo.config.provision.RegionName; import org.junit.Test; @@ -26,7 +27,7 @@ import static org.junit.Assert.fail; /** * @author bratseth */ -// TODO: Remove after October 2019 +// TODO: Remove after November 2019 public class DeploymentSpecDeprecatedAPITest { @Test @@ -374,6 +375,30 @@ public class DeploymentSpecDeprecatedAPITest { } @Test + public void athenz_config_is_propagated_through_parallel_zones() { + StringReader r = new StringReader( + "<deployment athenz-domain='domain' athenz-service='service'>" + + " <prod athenz-service='prod-service'>" + + " <region active='true'>us-central-1</region>" + + " <parallel>" + + " <region active='true'>us-west-1</region>" + + " <region active='true'>us-east-3</region>" + + " </parallel>" + + " </prod>" + + "</deployment>" + ); + DeploymentSpec spec = DeploymentSpec.fromXml(r); + assertEquals("domain", spec.athenzDomain().get().value()); + assertEquals("prod-service", spec.athenzService(Environment.prod, + RegionName.from("us-central-1")).get().value()); + assertEquals("prod-service", spec.athenzService(Environment.prod, + RegionName.from("us-west-1")).get().value()); + assertEquals("prod-service", spec.athenzService(Environment.prod, + RegionName.from("us-east-3")).get().value()); + assertEquals("domain", spec.athenzDomain().get().value()); + } + + @Test public void athenz_service_is_overridden_from_environment() { StringReader r = new StringReader( "<deployment athenz-domain='domain' athenz-service='service'>\n" + 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 c6035ac8d46..7b571417ef8 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 @@ -617,6 +617,79 @@ public class DeploymentSpecTest { } @Test + public void athenz_config_is_propagated_through_parallel_zones() { + StringReader r = new StringReader( + "<deployment athenz-domain='domain' athenz-service='service'>" + + " <instance id='instance1'>" + + " <prod athenz-service='prod-service'>" + + " <region active='true'>us-central-1</region>" + + " <parallel>" + + " <region active='true'>us-west-1</region>" + + " <region active='true'>us-east-3</region>" + + " </parallel>" + + " </prod>" + + " </instance>" + + "</deployment>" + ); + DeploymentSpec spec = DeploymentSpec.fromXml(r); + assertEquals("domain", spec.athenzDomain().get().value()); + assertEquals("prod-service", spec.athenzService(InstanceName.from("instance1"), + Environment.prod, + RegionName.from("us-west-1")).get().value()); + assertEquals("service", spec.athenzService(InstanceName.from("non-existent"), + Environment.prod, + RegionName.from("us-west-1")).get().value()); + assertEquals("domain", spec.requireInstance("instance1").athenzDomain().get().value()); + assertEquals("prod-service", spec.requireInstance("instance1").athenzService(Environment.prod, + RegionName.from("us-central-1")).get().value()); + assertEquals("prod-service", spec.requireInstance("instance1").athenzService(Environment.prod, + RegionName.from("us-west-1")).get().value()); + assertEquals("prod-service", spec.requireInstance("instance1").athenzService(Environment.prod, + RegionName.from("us-east-3")).get().value()); + } + + @Test + public void athenz_config_is_propagated_through_parallel_zones_and_instances() { + StringReader r = new StringReader( + "<deployment athenz-domain='domain' athenz-service='service'>" + + " <parallel>" + + " <instance id='instance1'>" + + " <prod>" + + " <parallel>" + + " <region active='true'>us-west-1</region>" + + " <region active='true'>us-east-3</region>" + + " </parallel>" + + " </prod>" + + " </instance>" + + " <instance id='instance2'>" + + " <prod>" + + " <parallel>" + + " <region active='true'>us-west-1</region>" + + " <region active='true'>us-east-3</region>" + + " </parallel>" + + " </prod>" + + " </instance>" + + " </parallel>" + + "</deployment>" + ); + DeploymentSpec spec = DeploymentSpec.fromXml(r); + assertEquals("domain", spec.athenzDomain().get().value()); + assertEquals("service", spec.athenzService(InstanceName.from("instance1"), + Environment.prod, + RegionName.from("us-west-1")).get().value()); + assertEquals("service", spec.athenzService(InstanceName.from("non-existent"), + Environment.prod, + RegionName.from("us-west-1")).get().value()); + assertEquals("domain", spec.requireInstance("instance1").athenzDomain().get().value()); + assertEquals("service", spec.requireInstance("instance1").athenzService(Environment.prod, + RegionName.from("us-west-1")).get().value()); + assertEquals("service", spec.requireInstance("instance1").athenzService(Environment.prod, + RegionName.from("us-east-3")).get().value()); + assertEquals("service", spec.requireInstance("instance2").athenzService(Environment.prod, + RegionName.from("us-east-3")).get().value()); + } + + @Test public void athenz_config_is_read_from_instance() { StringReader r = new StringReader( "<deployment>" + 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 ad5c6375aa6..7805b73cc6a 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 @@ -3,6 +3,7 @@ package com.yahoo.config.application.api; import com.google.common.collect.ImmutableSet; import com.yahoo.config.provision.Environment; +import com.yahoo.config.provision.InstanceName; import com.yahoo.config.provision.RegionName; import org.junit.Test; @@ -373,6 +374,33 @@ public class DeploymentSpecWithoutInstanceTest { } @Test + public void athenz_config_is_propagated_through_parallel_zones() { + StringReader r = new StringReader( + "<deployment athenz-domain='domain' athenz-service='service'>" + + " <prod athenz-service='prod-service'>" + + " <region active='true'>us-central-1</region>" + + " <parallel>" + + " <region active='true'>us-west-1</region>" + + " <region active='true'>us-east-3</region>" + + " </parallel>" + + " </prod>" + + "</deployment>" + ); + DeploymentSpec spec = DeploymentSpec.fromXml(r); + assertEquals("domain", spec.athenzDomain().get().value()); + assertEquals("prod-service", spec.athenzService(InstanceName.from("default"), + Environment.prod, + RegionName.from("us-central-1")).get().value()); + assertEquals("prod-service", spec.athenzService(InstanceName.from("default"), + Environment.prod, + RegionName.from("us-west-1")).get().value()); + assertEquals("prod-service", spec.athenzService(InstanceName.from("default"), + Environment.prod, + RegionName.from("us-east-3")).get().value()); + assertEquals("domain", spec.athenzDomain().get().value()); + } + + @Test public void athenz_service_is_overridden_from_environment() { StringReader r = new StringReader( "<deployment athenz-domain='domain' athenz-service='service'>\n" + |