summaryrefslogtreecommitdiffstats
path: root/config-model-api
diff options
context:
space:
mode:
authorMorten Tokle <mortent@verizonmedia.com>2021-11-11 10:56:26 +0100
committerGitHub <noreply@github.com>2021-11-11 10:56:26 +0100
commitfdb2da7a85a2deb4f0ccaf023b642b9469f73eb6 (patch)
treedf6f05cbb71f20feb0511ae9756126c9497a5f3c /config-model-api
parent8f2d366794bc53194b1fa11956025e86e0f7bab0 (diff)
parent353b483bc10adfc7f90d80274ddf4acdc1bf18ee (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')
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java3
-rw-r--r--config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java3
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