summaryrefslogtreecommitdiffstats
path: root/config-application-package
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-10-12 15:55:11 +0200
committerJon Bratseth <bratseth@gmail.com>2022-10-12 15:55:11 +0200
commit5e0502391c2ca7c4b0bfc9f4f652da2676f26314 (patch)
tree1fb5c7073f0af7b111d3290e4295a323d0d9ece2 /config-application-package
parent08f7a121fff008dd1307b106bd1b7d7a84433fe6 (diff)
Add instance tags
Diffstat (limited to 'config-application-package')
-rw-r--r--config-application-package/src/main/java/com/yahoo/config/application/OverrideProcessor.java76
-rw-r--r--config-application-package/src/main/java/com/yahoo/config/application/XmlPreProcessor.java45
-rw-r--r--config-application-package/src/main/java/com/yahoo/config/model/application/provider/DeployData.java20
-rw-r--r--config-application-package/src/main/java/com/yahoo/config/model/application/provider/FilesApplicationPackage.java6
-rw-r--r--config-application-package/src/test/java/com/yahoo/config/application/HostedOverrideProcessorTagsTest.java124
-rw-r--r--config-application-package/src/test/java/com/yahoo/config/application/HostedOverrideProcessorTest.java86
-rw-r--r--config-application-package/src/test/java/com/yahoo/config/application/MultiOverrideProcessorTest.java5
-rw-r--r--config-application-package/src/test/java/com/yahoo/config/application/OverrideProcessorTest.java13
-rw-r--r--config-application-package/src/test/java/com/yahoo/config/application/XmlPreprocessorTest.java47
9 files changed, 355 insertions, 67 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 d7efca3b723..21bb193ef93 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,6 +4,7 @@ package com.yahoo.config.application;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.InstanceName;
import com.yahoo.config.provision.RegionName;
+import com.yahoo.config.provision.Tags;
import com.yahoo.text.XML;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -23,7 +24,7 @@ import java.util.logging.Logger;
import java.util.stream.Collectors;
/**
- * Handles overrides in a XML document according to the rules defined for multi environment application packages.
+ * Handles overrides in a XML document according to the rules defined for multi-environment application packages.
*
* Rules:
*
@@ -41,16 +42,19 @@ class OverrideProcessor implements PreProcessor {
private final InstanceName instance;
private final Environment environment;
private final RegionName region;
+ private final Tags tags;
private static final String ID_ATTRIBUTE = "id";
private static final String INSTANCE_ATTRIBUTE = "instance";
private static final String ENVIRONMENT_ATTRIBUTE = "environment";
private static final String REGION_ATTRIBUTE = "region";
+ private static final String TAGS_ATTRIBUTE = "tags";
- public OverrideProcessor(InstanceName instance, Environment environment, RegionName region) {
+ public OverrideProcessor(InstanceName instance, Environment environment, RegionName region, Tags tags) {
this.instance = instance;
this.environment = environment;
this.region = region;
+ this.tags = tags;
}
public Document process(Document input) throws TransformerException {
@@ -80,6 +84,7 @@ class OverrideProcessor implements PreProcessor {
child.removeAttributeNS(XmlPreProcessor.deployNamespaceUri, INSTANCE_ATTRIBUTE);
child.removeAttributeNS(XmlPreProcessor.deployNamespaceUri, ENVIRONMENT_ATTRIBUTE);
child.removeAttributeNS(XmlPreProcessor.deployNamespaceUri, REGION_ATTRIBUTE);
+ child.removeAttributeNS(XmlPreProcessor.deployNamespaceUri, TAGS_ATTRIBUTE);
}
}
@@ -87,13 +92,16 @@ class OverrideProcessor implements PreProcessor {
Set<InstanceName> instances = context.instances;
Set<Environment> environments = context.environments;
Set<RegionName> regions = context.regions;
+ Tags tags = context.tags;
if (instances.isEmpty())
instances = getInstances(parent);
if (environments.isEmpty())
environments = getEnvironments(parent);
if (regions.isEmpty())
regions = getRegions(parent);
- return Context.create(instances, environments, regions);
+ if (tags.isEmpty())
+ tags = getTags(parent);
+ return Context.create(instances, environments, regions, tags);
}
/**
@@ -128,17 +136,21 @@ class OverrideProcessor implements PreProcessor {
throw new IllegalArgumentException("Regions in child (" + regions +
") are not a subset of those of the parent (" + context.regions + ") at " + child);
}
+
+ Tags tags = getTags(child);
+ if ( ! tags.isEmpty() && ! context.tags.isEmpty() && ! context.tags.containsAll(tags)) {
+ throw new IllegalArgumentException("Tags in child (" + environments +
+ ") are not a subset of those of the parent (" + context.tags + ") at " + child);
+ }
}
}
- /**
- * Prune elements that are not matching our environment and region
- */
+ /** Prune elements that are not matching our environment and region. */
private void pruneNonMatching(Element parent, List<Element> children) {
Iterator<Element> elemIt = children.iterator();
while (elemIt.hasNext()) {
Element child = elemIt.next();
- if ( ! matches(getInstances(child), getEnvironments(child), getRegions(child))) {
+ if ( ! matches(getInstances(child), getEnvironments(child), getRegions(child), getTags(child))) {
parent.removeChild(child);
elemIt.remove();
}
@@ -147,7 +159,8 @@ class OverrideProcessor implements PreProcessor {
private boolean matches(Set<InstanceName> elementInstances,
Set<Environment> elementEnvironments,
- Set<RegionName> elementRegions) {
+ Set<RegionName> elementRegions,
+ Tags elementTags) {
if ( ! elementInstances.isEmpty()) { // match instance
if ( ! elementInstances.contains(instance)) return false;
}
@@ -164,12 +177,14 @@ class OverrideProcessor implements PreProcessor {
if ( ! environment.isMultiRegion() && elementEnvironments.isEmpty() ) return false;
}
+ if ( ! elementTags.isEmpty()) { // match tags
+ if ( ! elementTags.intersects(tags)) return false;
+ }
+
return true;
}
- /**
- * Find the most specific element and remove all others.
- */
+ /** Find the most specific element and remove all others. */
private void retainMostSpecific(Element parent, List<Element> children, Context context) {
// Keep track of elements with highest number of matches (might be more than one element with same tag, need a list)
List<Element> bestMatches = new ArrayList<>();
@@ -205,12 +220,15 @@ class OverrideProcessor implements PreProcessor {
Set<InstanceName> elementInstances = hasInstance(child) ? getInstances(child) : context.instances;
Set<Environment> elementEnvironments = hasEnvironment(child) ? getEnvironments(child) : context.environments;
Set<RegionName> elementRegions = hasRegion(child) ? getRegions(child) : context.regions;
+ Tags elementTags = hasTag(child) ? getTags(child) : context.tags;
if ( ! elementInstances.isEmpty() && elementInstances.contains(instance))
currentMatch++;
if ( ! elementEnvironments.isEmpty() && elementEnvironments.contains(environment))
currentMatch++;
if ( ! elementRegions.isEmpty() && elementRegions.contains(region))
currentMatch++;
+ if ( elementTags.intersects(tags))
+ currentMatch++;
return currentMatch;
}
@@ -233,16 +251,14 @@ class OverrideProcessor implements PreProcessor {
return false;
}
- /**
- * Retains all elements where at least one element is overridden. Removes non-overridden elements from map.
- */
+ /** Retains all elements where at least one element is overridden. Removes non-overridden elements from map. */
private void retainOverriddenElements(Map<String, List<Element>> elementsByTagName) {
Iterator<Map.Entry<String, List<Element>>> it = elementsByTagName.entrySet().iterator();
while (it.hasNext()) {
List<Element> elements = it.next().getValue();
boolean hasOverrides = false;
for (Element element : elements) {
- if (hasEnvironment(element) || hasRegion(element)) {
+ if (hasInstance(element) || hasEnvironment(element) || hasRegion(element) || hasTag(element)) {
hasOverrides = true;
}
}
@@ -264,24 +280,34 @@ class OverrideProcessor implements PreProcessor {
return element.hasAttributeNS(XmlPreProcessor.deployNamespaceUri, ENVIRONMENT_ATTRIBUTE);
}
+ private boolean hasTag(Element element) {
+ return element.hasAttributeNS(XmlPreProcessor.deployNamespaceUri, TAGS_ATTRIBUTE);
+ }
+
private Set<InstanceName> getInstances(Element element) {
String instance = element.getAttributeNS(XmlPreProcessor.deployNamespaceUri, INSTANCE_ATTRIBUTE);
- if (instance == null || instance.isEmpty()) return Collections.emptySet();
+ if (instance == null || instance.isEmpty()) return Set.of();
return Arrays.stream(instance.split(" ")).map(InstanceName::from).collect(Collectors.toSet());
}
private Set<Environment> getEnvironments(Element element) {
String env = element.getAttributeNS(XmlPreProcessor.deployNamespaceUri, ENVIRONMENT_ATTRIBUTE);
- if (env == null || env.isEmpty()) return Collections.emptySet();
+ if (env == null || env.isEmpty()) return Set.of();
return Arrays.stream(env.split(" ")).map(Environment::from).collect(Collectors.toSet());
}
private Set<RegionName> getRegions(Element element) {
String reg = element.getAttributeNS(XmlPreProcessor.deployNamespaceUri, REGION_ATTRIBUTE);
- if (reg == null || reg.isEmpty()) return Collections.emptySet();
+ if (reg == null || reg.isEmpty()) return Set.of();
return Arrays.stream(reg.split(" ")).map(RegionName::from).collect(Collectors.toSet());
}
+ private Tags getTags(Element element) {
+ String env = element.getAttributeNS(XmlPreProcessor.deployNamespaceUri, TAGS_ATTRIBUTE);
+ if (env == null || env.isEmpty()) return Tags.empty();
+ return Tags.fromString(env);
+ }
+
private Map<String, List<Element>> elementsByTagNameAndId(List<Element> children) {
Map<String, List<Element>> elementsByTagName = new LinkedHashMap<>();
// Index by tag name
@@ -336,21 +362,27 @@ class OverrideProcessor implements PreProcessor {
final Set<InstanceName> instances;
final Set<Environment> environments;
final Set<RegionName> regions;
+ final Tags tags;
- private Context(Set<InstanceName> instances, Set<Environment> environments, Set<RegionName> regions) {
+ private Context(Set<InstanceName> instances,
+ Set<Environment> environments,
+ Set<RegionName> regions,
+ Tags tags) {
this.instances = Set.copyOf(instances);
this.environments = Set.copyOf(environments);
this.regions = Set.copyOf(regions);
+ this.tags = tags;
}
static Context empty() {
- return new Context(Set.of(), Set.of(), Set.of());
+ return new Context(Set.of(), Set.of(), Set.of(), Tags.empty());
}
public static Context create(Set<InstanceName> instances,
Set<Environment> environments,
- Set<RegionName> regions) {
- return new Context(instances, environments, regions);
+ Set<RegionName> regions,
+ Tags tags) {
+ return new Context(instances, environments, regions, tags);
}
}
diff --git a/config-application-package/src/main/java/com/yahoo/config/application/XmlPreProcessor.java b/config-application-package/src/main/java/com/yahoo/config/application/XmlPreProcessor.java
index ba68894c9f9..42333ea7662 100644
--- a/config-application-package/src/main/java/com/yahoo/config/application/XmlPreProcessor.java
+++ b/config-application-package/src/main/java/com/yahoo/config/application/XmlPreProcessor.java
@@ -5,6 +5,7 @@ import com.yahoo.config.application.FileSystemWrapper.FileWrapper;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.InstanceName;
import com.yahoo.config.provision.RegionName;
+import com.yahoo.config.provision.Tags;
import com.yahoo.text.XML;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
@@ -19,6 +20,7 @@ import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;
+import java.util.Set;
/**
* A preprocessor for services.xml files that handles deploy:environment, deploy:region, preprocess:properties, preprocess:include
@@ -38,22 +40,53 @@ public class XmlPreProcessor {
private final InstanceName instance;
private final Environment environment;
private final RegionName region;
+ private final Tags tags;
private final List<PreProcessor> chain;
- public XmlPreProcessor(File applicationDir, File xmlInput, InstanceName instance, Environment environment, RegionName region) throws IOException {
- this(applicationDir, new FileReader(xmlInput), instance, environment, region);
+ // TODO: Remove after November 2022
+ public XmlPreProcessor(File applicationDir,
+ File xmlInput,
+ InstanceName instance,
+ Environment environment,
+ RegionName region) throws IOException {
+ this(applicationDir, new FileReader(xmlInput), instance, environment, region, Tags.empty());
}
- public XmlPreProcessor(File applicationDir, Reader xmlInput, InstanceName instance, Environment environment, RegionName region) {
- this(FileSystemWrapper.getDefault(applicationDir.toPath()).wrap(applicationDir.toPath()), xmlInput, instance, environment, region);
+ public XmlPreProcessor(File applicationDir,
+ File xmlInput,
+ InstanceName instance,
+ Environment environment,
+ RegionName region,
+ Tags tags) throws IOException {
+ this(applicationDir, new FileReader(xmlInput), instance, environment, region, tags);
}
- public XmlPreProcessor(FileWrapper applicationDir, Reader xmlInput, InstanceName instance, Environment environment, RegionName region) {
+ public XmlPreProcessor(File applicationDir,
+ Reader xmlInput,
+ InstanceName instance,
+ Environment environment,
+ RegionName region,
+ Tags tags) {
+ this(FileSystemWrapper.getDefault(applicationDir.toPath()).wrap(applicationDir.toPath()),
+ xmlInput,
+ instance,
+ environment,
+ region,
+ tags);
+ }
+
+ public XmlPreProcessor(FileWrapper applicationDir,
+ Reader xmlInput,
+ InstanceName instance,
+ Environment environment,
+ RegionName region,
+ Tags tags) {
this.applicationDir = applicationDir;
this.xmlInput = xmlInput;
this.instance = instance;
this.environment = environment;
this.region = region;
+ this.tags = tags;
this.chain = setupChain();
}
@@ -73,7 +106,7 @@ public class XmlPreProcessor {
private List<PreProcessor> setupChain() {
List<PreProcessor> chain = new ArrayList<>();
chain.add(new IncludeProcessor(applicationDir));
- chain.add(new OverrideProcessor(instance, environment, region));
+ chain.add(new OverrideProcessor(instance, environment, region, tags));
chain.add(new PropertiesProcessor());
chain.add(new ValidationProcessor()); // must be last in chain
return chain;
diff --git a/config-application-package/src/main/java/com/yahoo/config/model/application/provider/DeployData.java b/config-application-package/src/main/java/com/yahoo/config/model/application/provider/DeployData.java
index 279af646a8c..c3e9b99f562 100644
--- a/config-application-package/src/main/java/com/yahoo/config/model/application/provider/DeployData.java
+++ b/config-application-package/src/main/java/com/yahoo/config/model/application/provider/DeployData.java
@@ -2,6 +2,9 @@
package com.yahoo.config.model.application.provider;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.Tags;
+
+import java.util.Set;
/**
* Data generated or computed during deployment
@@ -12,6 +15,8 @@ public class DeployData {
private final ApplicationId applicationId;
+ private final Tags tags;
+
/** The absolute path to the directory holding the application */
private final String deployedFromDir;
@@ -25,25 +30,16 @@ public class DeployData {
private final long generation;
private final long currentlyActiveGeneration;
- // TODO: Remove when oldest version in use is 8.13
- public DeployData(String ignored,
- String deployedFromDir,
- ApplicationId applicationId,
- Long deployTimestamp,
- boolean internalRedeploy,
- Long generation,
- long currentlyActiveGeneration) {
- this(deployedFromDir, applicationId, deployTimestamp, internalRedeploy, generation, currentlyActiveGeneration);
- }
-
public DeployData(String deployedFromDir,
ApplicationId applicationId,
+ Tags tags,
Long deployTimestamp,
boolean internalRedeploy,
Long generation,
long currentlyActiveGeneration) {
this.deployedFromDir = deployedFromDir;
this.applicationId = applicationId;
+ this.tags = tags;
this.deployTimestamp = deployTimestamp;
this.internalRedeploy = internalRedeploy;
this.generation = generation;
@@ -62,4 +58,6 @@ public class DeployData {
public ApplicationId getApplicationId() { return applicationId; }
+ public Tags getTags() { return tags; }
+
}
diff --git a/config-application-package/src/main/java/com/yahoo/config/model/application/provider/FilesApplicationPackage.java b/config-application-package/src/main/java/com/yahoo/config/model/application/provider/FilesApplicationPackage.java
index 7b483d0603c..e61ea01a99a 100644
--- a/config-application-package/src/main/java/com/yahoo/config/model/application/provider/FilesApplicationPackage.java
+++ b/config-application-package/src/main/java/com/yahoo/config/model/application/provider/FilesApplicationPackage.java
@@ -17,6 +17,7 @@ import com.yahoo.config.model.application.AbstractApplicationPackage;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ApplicationName;
import com.yahoo.config.provision.InstanceName;
+import com.yahoo.config.provision.Tags;
import com.yahoo.config.provision.TenantName;
import com.yahoo.config.provision.Zone;
import com.yahoo.io.HexDump;
@@ -138,6 +139,7 @@ public class FilesApplicationPackage extends AbstractApplicationPackage {
deployData.getDeployTimestamp(),
deployData.isInternalRedeploy(),
deployData.getApplicationId(),
+ deployData.getTags(),
computeCheckSum(appDir),
deployData.getGeneration(),
deployData.getCurrentlyActiveGeneration());
@@ -484,6 +486,7 @@ public class FilesApplicationPackage extends AbstractApplicationPackage {
ApplicationId.from(TenantName.defaultName(),
ApplicationName.from(originalAppDir),
InstanceName.defaultName()),
+ Tags.empty(),
"",
0L,
0L);
@@ -583,7 +586,8 @@ public class FilesApplicationPackage extends AbstractApplicationPackage {
inputXml,
metaData.getApplicationId().instance(),
zone.environment(),
- zone.region())
+ zone.region(),
+ metaData.getTags())
.run();
try (FileOutputStream outputStream = new FileOutputStream(destination)) {
diff --git a/config-application-package/src/test/java/com/yahoo/config/application/HostedOverrideProcessorTagsTest.java b/config-application-package/src/test/java/com/yahoo/config/application/HostedOverrideProcessorTagsTest.java
new file mode 100644
index 00000000000..8d7431d33b6
--- /dev/null
+++ b/config-application-package/src/test/java/com/yahoo/config/application/HostedOverrideProcessorTagsTest.java
@@ -0,0 +1,124 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.config.application;
+
+import com.yahoo.config.provision.Environment;
+import com.yahoo.config.provision.InstanceName;
+import com.yahoo.config.provision.RegionName;
+import com.yahoo.config.provision.Tags;
+import org.custommonkey.xmlunit.XMLUnit;
+import org.junit.Test;
+import org.w3c.dom.Document;
+
+import javax.xml.transform.TransformerException;
+import java.io.StringReader;
+
+/**
+ * @author bratseth
+ */
+public class HostedOverrideProcessorTagsTest {
+
+ static {
+ XMLUnit.setIgnoreWhitespace(true);
+ }
+
+ private static final String input =
+ "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" +
+ "<services xmlns:deploy='vespa' xmlns:preprocess='?' version='1.0'>" +
+ " <container id='foo' version='1.0'>" +
+ " <nodes count='5' deploy:tags='a' deploy:environment='perf'/>" +
+ " <nodes count='10' deploy:tags='a b'/>" +
+ " <nodes count='20' deploy:tags='c'/>" +
+ " <search deploy:tags='b'/>" +
+ " <document-api deploy:tags='d'/>" +
+ " </container>" +
+ "</services>";
+
+ @Test
+ public void testParsingTagAPerf() throws TransformerException {
+ String expected =
+ "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" +
+ "<services xmlns:deploy='vespa' xmlns:preprocess='?' version='1.0'>" +
+ " <container id='foo' version='1.0'>" +
+ " <nodes count='5' required='true'/>" +
+ " </container>" +
+ "</services>";
+ assertOverride(InstanceName.defaultName(),
+ Environment.perf,
+ RegionName.defaultName(),
+ Tags.fromString("a"),
+ expected);
+ }
+
+ @Test
+ public void testParsingTagAProd() throws TransformerException {
+ String expected =
+ "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" +
+ "<services xmlns:deploy='vespa' xmlns:preprocess='?' version='1.0'>" +
+ " <container id='foo' version='1.0'>" +
+ " <nodes count='10' required='true'/>" +
+ " </container>" +
+ "</services>";
+ assertOverride(InstanceName.defaultName(),
+ Environment.prod,
+ RegionName.defaultName(),
+ Tags.fromString("a"),
+ expected);
+ }
+
+ @Test
+ public void testParsingTagB() throws TransformerException {
+ String expected =
+ "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" +
+ "<services xmlns:deploy='vespa' xmlns:preprocess='?' version='1.0'>" +
+ " <container id='foo' version='1.0'>" +
+ " <nodes count='10' required='true'/>" +
+ " <search/>" +
+ " </container>" +
+ "</services>";
+ assertOverride(InstanceName.defaultName(),
+ Environment.prod,
+ RegionName.defaultName(),
+ Tags.fromString("b"),
+ expected);
+ }
+
+ @Test
+ public void testParsingTagC() throws TransformerException {
+ String expected =
+ "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" +
+ "<services xmlns:deploy='vespa' xmlns:preprocess='?' version='1.0'>" +
+ " <container id='foo' version='1.0'>" +
+ " <nodes count='20' required='true'/>" +
+ " </container>" +
+ "</services>";
+ assertOverride(InstanceName.defaultName(),
+ Environment.prod,
+ RegionName.defaultName(),
+ Tags.fromString("c"),
+ expected);
+ }
+
+ @Test
+ public void testParsingTagCAndD() throws TransformerException {
+ String expected =
+ "<?xml version='1.0' encoding='UTF-8' standalone='no'?>" +
+ "<services xmlns:deploy='vespa' xmlns:preprocess='?' version='1.0'>" +
+ " <container id='foo' version='1.0'>" +
+ " <nodes count='20' required='true'/>" +
+ " <document-api/>" +
+ " </container>" +
+ "</services>";
+ assertOverride(InstanceName.defaultName(),
+ Environment.prod,
+ RegionName.defaultName(),
+ Tags.fromString("c d"),
+ expected);
+ }
+
+ private void assertOverride(InstanceName instance, Environment environment, RegionName region, Tags tags, String expected) throws TransformerException {
+ Document inputDoc = Xml.getDocument(new StringReader(input));
+ Document newDoc = new OverrideProcessor(instance, environment, region, tags).process(inputDoc);
+ TestBase.assertDocument(expected, newDoc);
+ }
+
+}
diff --git a/config-application-package/src/test/java/com/yahoo/config/application/HostedOverrideProcessorTest.java b/config-application-package/src/test/java/com/yahoo/config/application/HostedOverrideProcessorTest.java
index 1a4dab01930..451c7a3c217 100644
--- a/config-application-package/src/test/java/com/yahoo/config/application/HostedOverrideProcessorTest.java
+++ b/config-application-package/src/test/java/com/yahoo/config/application/HostedOverrideProcessorTest.java
@@ -4,6 +4,7 @@ package com.yahoo.config.application;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.InstanceName;
import com.yahoo.config.provision.RegionName;
+import com.yahoo.config.provision.Tags;
import org.custommonkey.xmlunit.XMLUnit;
import org.junit.Test;
import org.w3c.dom.Document;
@@ -14,6 +15,7 @@ import javax.xml.stream.XMLStreamException;
import javax.xml.transform.TransformerException;
import java.io.IOException;
import java.io.StringReader;
+import java.util.List;
/**
* @author bratseth
@@ -48,7 +50,11 @@ public class HostedOverrideProcessorTest {
" <nodes count='1'/>" +
" </container>" +
"</services>";
- assertOverride(Environment.test, RegionName.defaultName(), expected);
+ assertOverride(InstanceName.defaultName(),
+ Environment.test,
+ RegionName.defaultName(),
+ Tags.empty(),
+ expected);
}
@Test
@@ -60,7 +66,27 @@ public class HostedOverrideProcessorTest {
" <nodes count='4' required='true'/>" +
" </container>" +
"</services>";
- assertOverride(Environment.from("prod"), RegionName.from("us-west"), expected);
+ assertOverride(InstanceName.defaultName(),
+ Environment.from("prod"),
+ RegionName.from("us-west"),
+ Tags.empty(),
+ expected);
+ }
+
+ @Test
+ public void testParsingSpecificTag() throws TransformerException {
+ String expected =
+ "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" +
+ "<services xmlns:deploy=\"vespa\" xmlns:preprocess=\"?\" version=\"1.0\">" +
+ " <container id=\"foo\" version=\"1.0\">" +
+ " <nodes count='4' required='true'/>" +
+ " </container>" +
+ "</services>";
+ assertOverride(InstanceName.defaultName(),
+ Environment.from("prod"),
+ RegionName.from("us-west"),
+ Tags.empty(),
+ expected);
}
@Test
@@ -72,7 +98,11 @@ public class HostedOverrideProcessorTest {
" <nodes count='1' required='true'/>" +
" </container>" +
"</services>";
- assertOverride(InstanceName.from("myinstance"), Environment.from("prod"), RegionName.from("us-west"), expected);
+ assertOverride(InstanceName.from("myinstance"),
+ Environment.from("prod"),
+ RegionName.from("us-west"),
+ Tags.empty(),
+ expected);
}
@Test
@@ -84,7 +114,11 @@ public class HostedOverrideProcessorTest {
" <nodes count='5' flavor='v-8-8-100' required='true'/>" +
" </container>" +
"</services>";
- assertOverride(Environment.from("prod"), RegionName.from("us-east-3"), expected);
+ assertOverride(InstanceName.defaultName(),
+ Environment.from("prod"),
+ RegionName.from("us-east-3"),
+ Tags.empty(),
+ expected);
}
@Test
@@ -96,7 +130,11 @@ public class HostedOverrideProcessorTest {
" <nodes count='3' required='true'/>" +
" </container>" +
"</services>";
- assertOverride(Environment.from("perf"), RegionName.from("us-east-3"), expected);
+ assertOverride(InstanceName.defaultName(),
+ Environment.from("perf"),
+ RegionName.from("us-east-3"),
+ Tags.empty(),
+ expected);
}
@Test
@@ -108,7 +146,11 @@ public class HostedOverrideProcessorTest {
" <nodes count='3' flavor='v-4-8-100' required='true'/>" +
" </container>" +
"</services>";
- assertOverride(Environment.valueOf("prod"), RegionName.from("unknown"), expected);
+ assertOverride(InstanceName.defaultName(),
+ Environment.valueOf("prod"),
+ RegionName.from("unknown"),
+ Tags.empty(),
+ expected);
}
@Test
@@ -120,7 +162,11 @@ public class HostedOverrideProcessorTest {
" <nodes count='3' flavor='v-4-8-100' required='true'/>" +
" </container>" +
"</services>";
- assertOverride(Environment.from("prod"), RegionName.defaultName(), expected);
+ assertOverride(InstanceName.defaultName(),
+ Environment.from("prod"),
+ RegionName.defaultName(),
+ Tags.empty(),
+ expected);
}
@Test
@@ -132,7 +178,11 @@ public class HostedOverrideProcessorTest {
" <nodes count='1'/>" +
" </container>" +
"</services>";
- assertOverride(Environment.from("dev"), RegionName.defaultName(), expected);
+ assertOverride(InstanceName.defaultName(),
+ Environment.from("dev"),
+ RegionName.defaultName(),
+ Tags.empty(),
+ expected);
}
@Test
@@ -144,7 +194,11 @@ public class HostedOverrideProcessorTest {
" <nodes count='1'/>" +
" </container>" +
"</services>";
- assertOverride(Environment.from("test"), RegionName.from("us-west"), expected);
+ assertOverride(InstanceName.defaultName(),
+ Environment.from("test"),
+ RegionName.from("us-west"),
+ Tags.empty(),
+ expected);
}
@Test
@@ -156,16 +210,16 @@ public class HostedOverrideProcessorTest {
" <nodes count='2' required='true'/>" +
" </container>" +
"</services>";
- assertOverride(Environment.from("staging"), RegionName.from("us-west"), expected);
- }
-
- private void assertOverride(Environment environment, RegionName region, String expected) throws TransformerException {
- assertOverride(InstanceName.from("default"), environment, region, expected);
+ assertOverride(InstanceName.defaultName(),
+ Environment.from("staging"),
+ RegionName.from("us-west"),
+ Tags.empty(),
+ expected);
}
- private void assertOverride(InstanceName instance, Environment environment, RegionName region, String expected) throws TransformerException {
+ private void assertOverride(InstanceName instance, Environment environment, RegionName region, Tags tags, String expected) throws TransformerException {
Document inputDoc = Xml.getDocument(new StringReader(input));
- Document newDoc = new OverrideProcessor(instance, environment, region).process(inputDoc);
+ Document newDoc = new OverrideProcessor(instance, environment, region, tags).process(inputDoc);
TestBase.assertDocument(expected, newDoc);
}
diff --git a/config-application-package/src/test/java/com/yahoo/config/application/MultiOverrideProcessorTest.java b/config-application-package/src/test/java/com/yahoo/config/application/MultiOverrideProcessorTest.java
index 44bcb12957a..debde6c1438 100644
--- a/config-application-package/src/test/java/com/yahoo/config/application/MultiOverrideProcessorTest.java
+++ b/config-application-package/src/test/java/com/yahoo/config/application/MultiOverrideProcessorTest.java
@@ -4,6 +4,7 @@ package com.yahoo.config.application;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.InstanceName;
import com.yahoo.config.provision.RegionName;
+import com.yahoo.config.provision.Tags;
import org.custommonkey.xmlunit.XMLUnit;
import org.junit.Test;
import org.w3c.dom.Document;
@@ -124,13 +125,13 @@ public class MultiOverrideProcessorTest {
private void assertOverride(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);
+ Document newDoc = new OverrideProcessor(InstanceName.from("default"), environment, region, Tags.empty()).process(inputDoc);
TestBase.assertDocument(expected, newDoc);
}
private void assertOverrideWithIds(Environment environment, RegionName region, String expected) throws TransformerException {
Document inputDoc = Xml.getDocument(new StringReader(inputWithIds));
- Document newDoc = new OverrideProcessor(InstanceName.from("default"), environment, region).process(inputDoc);
+ Document newDoc = new OverrideProcessor(InstanceName.from("default"), environment, region, Tags.empty()).process(inputDoc);
TestBase.assertDocument(expected, newDoc);
}
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 e9ee7c97876..150999390d8 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
@@ -4,6 +4,7 @@ package com.yahoo.config.application;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.InstanceName;
import com.yahoo.config.provision.RegionName;
+import com.yahoo.config.provision.Tags;
import org.custommonkey.xmlunit.XMLUnit;
import org.junit.Test;
import org.w3c.dom.Document;
@@ -332,7 +333,10 @@ public class OverrideProcessorTest {
" </admin>" +
"</services>";
Document inputDoc = Xml.getDocument(new StringReader(in));
- new OverrideProcessor(InstanceName.from("default"), Environment.from("prod"), RegionName.from("us-west")).process(inputDoc);
+ new OverrideProcessor(InstanceName.from("default"),
+ Environment.from("prod"),
+ RegionName.from("us-west"),
+ Tags.empty()).process(inputDoc);
}
@Test(expected = IllegalArgumentException.class)
@@ -344,7 +348,10 @@ public class OverrideProcessorTest {
" </admin>" +
"</services>";
Document inputDoc = Xml.getDocument(new StringReader(in));
- new OverrideProcessor(InstanceName.from("default"), Environment.defaultEnvironment(), RegionName.from("us-west")).process(inputDoc);
+ new OverrideProcessor(InstanceName.from("default"),
+ Environment.defaultEnvironment(),
+ RegionName.from("us-west"),
+ Tags.empty()).process(inputDoc);
}
@Test
@@ -399,7 +406,7 @@ public class OverrideProcessorTest {
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);
+ Document newDoc = new OverrideProcessor(InstanceName.from("default"), environment, region, Tags.empty()).process(inputDoc);
TestBase.assertDocument(expected, newDoc);
}
diff --git a/config-application-package/src/test/java/com/yahoo/config/application/XmlPreprocessorTest.java b/config-application-package/src/test/java/com/yahoo/config/application/XmlPreprocessorTest.java
index 92c2c2a820f..0da94b69e58 100644
--- a/config-application-package/src/test/java/com/yahoo/config/application/XmlPreprocessorTest.java
+++ b/config-application-package/src/test/java/com/yahoo/config/application/XmlPreprocessorTest.java
@@ -4,11 +4,13 @@ package com.yahoo.config.application;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.InstanceName;
import com.yahoo.config.provision.RegionName;
+import com.yahoo.config.provision.Tags;
import org.junit.Test;
import org.w3c.dom.Document;
import java.io.File;
import java.io.StringReader;
+import java.util.Set;
/**
* @author hmusum
@@ -44,7 +46,13 @@ public class XmlPreprocessorTest {
" </nodes>\n" +
" </container>\n" +
"</services>";
- TestBase.assertDocument(expectedDev, new XmlPreProcessor(appDir, services, InstanceName.defaultName(), Environment.dev, RegionName.defaultName()).run());
+ TestBase.assertDocument(expectedDev,
+ new XmlPreProcessor(appDir,
+ services,
+ InstanceName.defaultName(),
+ Environment.dev,
+ RegionName.defaultName(),
+ Tags.empty()).run());
String expectedStaging =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" +
@@ -70,7 +78,13 @@ public class XmlPreprocessorTest {
" </nodes>\n" +
" </container>\n" +
"</services>";
- TestBase.assertDocument(expectedStaging, new XmlPreProcessor(appDir, services, InstanceName.defaultName(), Environment.staging, RegionName.defaultName()).run());
+ TestBase.assertDocument(expectedStaging,
+ new XmlPreProcessor(appDir,
+ services,
+ InstanceName.defaultName(),
+ Environment.staging,
+ RegionName.defaultName(),
+ Tags.empty()).run());
String expectedUsWest =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" +
@@ -104,7 +118,13 @@ public class XmlPreprocessorTest {
" </nodes>\n" +
" </container>\n" +
"</services>";
- TestBase.assertDocument(expectedUsWest, new XmlPreProcessor(appDir, services, InstanceName.defaultName(), Environment.prod, RegionName.from("us-west")).run());
+ TestBase.assertDocument(expectedUsWest,
+ new XmlPreProcessor(appDir,
+ services,
+ InstanceName.defaultName(),
+ Environment.prod,
+ RegionName.from("us-west"),
+ Tags.empty()).run());
String expectedUsEastAndCentral =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>" +
@@ -138,9 +158,19 @@ public class XmlPreprocessorTest {
" </container>\n" +
"</services>";
TestBase.assertDocument(expectedUsEastAndCentral,
- new XmlPreProcessor(appDir, services, InstanceName.defaultName(), Environment.prod, RegionName.from("us-east")).run());
+ new XmlPreProcessor(appDir,
+ services,
+ InstanceName.defaultName(),
+ Environment.prod,
+ RegionName.from("us-east"),
+ Tags.empty()).run());
TestBase.assertDocument(expectedUsEastAndCentral,
- new XmlPreProcessor(appDir, services, InstanceName.defaultName(), Environment.prod, RegionName.from("us-central")).run());
+ new XmlPreProcessor(appDir,
+ services,
+ InstanceName.defaultName(),
+ Environment.prod,
+ RegionName.from("us-central"),
+ Tags.empty()).run());
}
@Test
@@ -184,7 +214,12 @@ public class XmlPreprocessorTest {
" <adminserver hostalias=\"node0\"/>" +
" </admin>" +
"</services>";
- Document docDev = (new XmlPreProcessor(appDir, new StringReader(input), InstanceName.defaultName(), Environment.prod, RegionName.defaultName()).run());
+ Document docDev = (new XmlPreProcessor(appDir,
+ new StringReader(input),
+ InstanceName.defaultName(),
+ Environment.prod,
+ RegionName.defaultName(),
+ Tags.empty()).run());
TestBase.assertDocument(expectedProd, docDev);
}