diff options
author | Morten Tokle <mortent@verizonmedia.com> | 2021-11-11 10:56:26 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-11 10:56:26 +0100 |
commit | fdb2da7a85a2deb4f0ccaf023b642b9469f73eb6 (patch) | |
tree | df6f05cbb71f20feb0511ae9756126c9497a5f3c /config-model-api | |
parent | 8f2d366794bc53194b1fa11956025e86e0f7bab0 (diff) | |
parent | 353b483bc10adfc7f90d80274ddf4acdc1bf18ee (diff) |
Merge pull request #19956 from vespa-engine/mpolden/ensure-positive-weight-sum
Ensure positive weight sum when changing routing status
Diffstat (limited to 'config-model-api')
2 files changed, 5 insertions, 1 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 4ca9ee1dc2f..6f77dce8fc5 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 @@ -281,6 +281,7 @@ public class DeploymentSpecXmlReader { List<Endpoint.Target> targets = new ArrayList<>(); if (level == Endpoint.Level.application) { String region = requireStringAttribute("region", endpointElement); + int weightSum = 0; for (var instanceElement : XML.getChildren(endpointElement, "instance")) { String instanceName = instanceElement.getTextContent(); String weightFromAttribute = requireStringAttribute("weight", instanceElement); @@ -291,10 +292,12 @@ public class DeploymentSpecXmlReader { } catch (NumberFormatException e) { throw new IllegalArgumentException(msgPrefix + "invalid weight value '" + weightFromAttribute + "'"); } + weightSum += weight; targets.add(new Endpoint.Target(RegionName.from(region), InstanceName.from(instanceName), weight)); } + if (weightSum == 0) illegal(msgPrefix + "sum of all weights must be positive, got " + weightSum); } else { if (stringAttribute("region", endpointElement).isPresent()) illegal(msgPrefix + "invalid 'region' attribute"); for (var regionElement : XML.getChildren(endpointElement, "region")) { 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 8f9c9bccfcd..74e79d5e8cf 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 @@ -1200,7 +1200,7 @@ public class DeploymentSpecTest { } @Test - public void applicationLevelEndpointRequiresAttributes() { + public void applicationLevelEndpointValidation() { String xmlForm = "<deployment>\n" + " <instance id=\"beta\">\n" + " <prod>\n" + @@ -1226,6 +1226,7 @@ public class DeploymentSpecTest { assertInvalid(String.format(xmlForm, "region='invalid'", "weight='1'", "main", ""), "Application-level endpoint 'foo': targets undeclared region 'invalid' in instance 'main'"); assertInvalid(String.format(xmlForm, "region='us-west-1'", "weight='foo'", "main", ""), "Application-level endpoint 'foo': invalid weight value 'foo'"); assertInvalid(String.format(xmlForm, "region='us-west-1'", "weight='1'", "main", "<region>us-east-3</region>"), "Application-level endpoint 'foo': invalid element 'region'"); + assertInvalid(String.format(xmlForm, "region='us-west-1'", "weight='0'", "main", ""), "Application-level endpoint 'foo': sum of all weights must be positive, got 0"); } @Test |