diff options
author | Jon Marius Venstad <jonmv@users.noreply.github.com> | 2020-05-28 22:53:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-28 22:53:40 +0200 |
commit | df731e25b35496ab4aada70d4c15bd6f704ea74b (patch) | |
tree | 17b51f2caaeaf54041373b8b14926400e996614b /config-model-api | |
parent | 392706b822d0517f933cf58fca0277b192272bc5 (diff) | |
parent | 57d19fab47444292cb4d9a87d5f8a3c4b4da5dee (diff) |
Merge pull request #13420 from vespa-engine/jonmv/empty-instances-are-nothing
Avoid creating empty instance specs
Diffstat (limited to 'config-model-api')
3 files changed, 44 insertions, 2 deletions
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 68f27a21ce4..48a675fa182 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 @@ -45,6 +45,7 @@ import java.util.stream.Stream; */ public class DeploymentSpecXmlReader { + private static final String deploymentTag = "deployment"; private static final String instanceTag = "instance"; private static final String majorVersionTag = "major-version"; private static final String testTag = "test"; @@ -93,6 +94,9 @@ public class DeploymentSpecXmlReader { /** Reads a deployment spec from XML */ public DeploymentSpec read(String xmlForm) { Element root = XML.getDocument(xmlForm).getDocumentElement(); + if ( ! root.getTagName().equals(deploymentTag)) + throw new IllegalArgumentException("The root tag must be <deployment>"); + if (isEmptySpec(root)) return DeploymentSpec.empty; @@ -133,6 +137,13 @@ public class DeploymentSpecXmlReader { Element instanceTag, MutableOptional<String> globalServiceId, Element parentTag) { + if (instanceNameString.isBlank()) + throw new IllegalArgumentException("<instance> attribute 'id' must be specified, and not be blank"); + + // If this is an absolutely empty instance, or the implicit "default" instance but without content, ignore it + if (XML.getChildren(instanceTag).isEmpty() && (instanceTag.getAttributes().getLength() == 0 || instanceTag == parentTag)) + return List.of(); + if (validate) validateTagOrder(instanceTag); 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 32d903786dc..a793630c8b9 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 @@ -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; @@ -422,6 +423,23 @@ public class DeploymentSpecTest { } @Test + public void testOnlyAthenzServiceDefinedInInstance() { + StringReader r = new StringReader( + "<deployment athenz-domain='domain'>" + + " <instance id='default' athenz-service='service' />" + + "</deployment>" + ); + DeploymentSpec spec = DeploymentSpec.fromXml(r); + + assertEquals("domain", spec.athenzDomain().get().value()); + assertEquals(1, spec.instances().size()); + + DeploymentInstanceSpec instance = spec.instances().get(0); + assertEquals("default", instance.name().value()); + assertEquals("service", instance.athenzService(Environment.prod, RegionName.defaultName()).get().value()); + } + + @Test public void productionSpecWithParallelDeployments() { StringReader r = new StringReader( "<deployment>" + @@ -652,7 +670,7 @@ public class DeploymentSpecTest { public void deploymentSpecWithIncreasinglyStrictUpgradePoliciesInParallel() { StringReader r = new StringReader( "<deployment version='1.0'>" + - " <instance />" + + " <instance id='instance0'/>" + " <parallel>" + " <instance id='instance1'>" + " <upgrade policy='conservative'/>" + @@ -678,7 +696,7 @@ public class DeploymentSpecTest { " <upgrade policy='canary'/>" + " </instance>" + " </parallel>" + - " <instance />" + + " <instance id='instance3'/>" + "</deployment>" ); DeploymentSpec.fromXml(r); 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 4a7ef7b43f7..89972773e1c 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; @@ -326,6 +327,18 @@ public class DeploymentSpecWithoutInstanceTest { } @Test + public void testOnlyAthenzServiceDefined() { + StringReader r = new StringReader( + "<deployment athenz-domain='domain' athenz-service='service'>" + + "</deployment>" + ); + DeploymentSpec spec = DeploymentSpec.fromXml(r); + + assertEquals("domain", spec.athenzDomain().get().value()); + assertEquals(List.of(), spec.instances()); + } + + @Test public void productionSpecWithParallelDeployments() { StringReader r = new StringReader( "<deployment>\n" + |