diff options
author | Håkon Hallingstad <hakon@verizonmedia.com> | 2020-11-02 11:00:06 +0100 |
---|---|---|
committer | Håkon Hallingstad <hakon@verizonmedia.com> | 2020-11-02 11:00:06 +0100 |
commit | a20ea689f5dc24025485050eee34994e5698b7cb (patch) | |
tree | f9a1178b5bb7a0f3898a0067218008126e580b91 /config-application-package/src | |
parent | bd7181b95f36434052b73a95fc8202995551f8cf (diff) |
Add required="true" for override without node children
Diffstat (limited to 'config-application-package/src')
2 files changed, 62 insertions, 4 deletions
diff --git a/config-application-package/src/main/java/com/yahoo/config/application/OverrideProcessor.java b/config-application-package/src/main/java/com/yahoo/config/application/OverrideProcessor.java index 6a946e1ce75..6f4d782a5b4 100644 --- a/config-application-package/src/main/java/com/yahoo/config/application/OverrideProcessor.java +++ b/config-application-package/src/main/java/com/yahoo/config/application/OverrideProcessor.java @@ -4,7 +4,6 @@ package com.yahoo.config.application; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.InstanceName; import com.yahoo.config.provision.RegionName; -import java.util.logging.Level; import com.yahoo.text.XML; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -19,6 +18,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; @@ -218,9 +218,17 @@ class OverrideProcessor implements PreProcessor { private void doElementSpecificProcessingOnOverride(List<Element> elements) { // if node capacity is specified explicitly for some combination we should require that capacity elements.forEach(element -> { - if (element.getTagName().equals("nodes")) - if (element.getChildNodes().getLength() == 0) // specifies capacity, not a list of nodes + if (element.getTagName().equals("nodes")) { + boolean hasNodeChild = false; + for (var child : XML.getChildren(element)) { + if (child.getTagName().equals("node")) { + hasNodeChild = true; + break; + } + } + if (!hasNodeChild) // specifies capacity, not a list of nodes element.setAttribute("required", "true"); + } }); } diff --git a/config-application-package/src/test/java/com/yahoo/config/application/OverrideProcessorTest.java b/config-application-package/src/test/java/com/yahoo/config/application/OverrideProcessorTest.java index 05a5357a8ab..d8e35ced227 100644 --- a/config-application-package/src/test/java/com/yahoo/config/application/OverrideProcessorTest.java +++ b/config-application-package/src/test/java/com/yahoo/config/application/OverrideProcessorTest.java @@ -347,8 +347,58 @@ public class OverrideProcessorTest { new OverrideProcessor(InstanceName.from("default"), Environment.defaultEnvironment(), RegionName.from("us-west")).process(inputDoc); } + @Test + public void testImpliedRequired() throws TransformerException { + String input = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" + + "<services xmlns:deploy=\"vespa\" xmlns:preprocess=\"?\" version=\"1.0\">" + + " <content id=\"foo\" version=\"1.0\">" + + " <nodes deploy:environment=\"dev\">" + + " <!-- comment -->" + + " <resources vcpu=\"2\" memory=\"8Gb\" disk=\"50Gb\" disk-speed=\"any\"/>" + + " </nodes>" + + " </content>" + + "</services>"; + String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" + + "<services xmlns:deploy=\"vespa\" xmlns:preprocess=\"?\" version=\"1.0\">" + + " <content id=\"foo\" version=\"1.0\">" + + " <nodes required=\"true\">" + + " <!-- comment -->" + + " <resources vcpu=\"2\" memory=\"8Gb\" disk=\"50Gb\" disk-speed=\"any\"/>" + + " </nodes>" + + " </content>" + + "</services>"; + + assertOverride(input, Environment.dev, RegionName.defaultName(), expected); + } + + @Test + public void testNodeElementCancelsImpliedRequired() throws TransformerException { + String input = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" + + "<services xmlns:deploy=\"vespa\" xmlns:preprocess=\"?\" version=\"1.0\">" + + " <content id=\"foo\" version=\"1.0\">" + + " <nodes deploy:environment=\"dev\">" + + " <node distribution-key=\"0\" hostalias=\"node0\"/>" + + " </nodes>" + + " </content>" + + "</services>"; + String expected = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" + + "<services xmlns:deploy=\"vespa\" xmlns:preprocess=\"?\" version=\"1.0\">" + + " <content id=\"foo\" version=\"1.0\">" + + " <nodes>" + + " <node distribution-key=\"0\" hostalias=\"node0\"/>" + + " </nodes>" + + " </content>" + + "</services>"; + + assertOverride(input, Environment.dev, RegionName.defaultName(), expected); + } + private void assertOverride(Environment environment, RegionName region, String expected) throws TransformerException { - Document inputDoc = Xml.getDocument(new StringReader(OverrideProcessorTest.input)); + assertOverride(input, environment, region, expected); + } + + private void assertOverride(String input, Environment environment, RegionName region, String expected) throws TransformerException { + Document inputDoc = Xml.getDocument(new StringReader(input)); Document newDoc = new OverrideProcessor(InstanceName.from("default"), environment, region).process(inputDoc); TestBase.assertDocument(expected, newDoc); } |