summaryrefslogtreecommitdiffstats
path: root/config-model-api/src
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2017-05-11 14:25:57 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2017-05-11 14:25:57 +0200
commitd5120622e144d884af22834f75b4bc874b3311e5 (patch)
treefcdd5eabae627a3abe595ad593e06707b0569911 /config-model-api/src
parent4030c7c7afd867482c08ef53dff19c118a9fc172 (diff)
Add serial form
Diffstat (limited to 'config-model-api/src')
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java65
-rw-r--r--config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java18
2 files changed, 56 insertions, 27 deletions
diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java
index ab33948d1de..755067010dc 100644
--- a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java
+++ b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java
@@ -4,12 +4,15 @@ package com.yahoo.config.application.api;
import com.google.common.collect.ImmutableList;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.RegionName;
+import com.yahoo.io.IOUtils;
import com.yahoo.text.XML;
import org.w3c.dom.Element;
import java.io.BufferedReader;
import java.io.FileReader;
+import java.io.IOException;
import java.io.Reader;
+import java.io.UncheckedIOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -27,16 +30,26 @@ import java.util.Optional;
public class DeploymentSpec {
/** The empty deployment spec, specifying no zones or rotation, and defaults for all settings */
- public static final DeploymentSpec empty = new DeploymentSpec(Optional.empty(), UpgradePolicy.defaultPolicy, ImmutableList.of());
+ public static final DeploymentSpec empty = new DeploymentSpec(Optional.empty(),
+ UpgradePolicy.defaultPolicy,
+ ImmutableList.of(),
+ "<deployment version='1.0'/>");
private final Optional<String> globalServiceId;
private final UpgradePolicy upgradePolicy;
private final List<DeclaredZone> zones;
+ private final String xmlForm;
public DeploymentSpec(Optional<String> globalServiceId, UpgradePolicy upgradePolicy, List<DeclaredZone> zones) {
+ this(globalServiceId, upgradePolicy, zones, null);
+ }
+
+ private DeploymentSpec(Optional<String> globalServiceId, UpgradePolicy upgradePolicy,
+ List<DeclaredZone> zones, String xmlForm) {
this.globalServiceId = globalServiceId;
this.upgradePolicy = upgradePolicy;
this.zones = ImmutableList.copyOf(zones);
+ this.xmlForm = xmlForm;
}
/** Returns the ID of the service to expose through global routing, if present */
@@ -49,6 +62,9 @@ public class DeploymentSpec {
/** Returns the zones this declares as a read-only list. */
public List<DeclaredZone> zones() { return zones; }
+
+ /** Returns the XML form of this spec, or null if it was not created by fromXml or is the empty spec */
+ public String xmlForm() { return xmlForm; }
/** Returns whether this deployment spec specifies the given zone, either implicitly or explicitly */
public boolean includes(Environment environment, Optional<RegionName> region) {
@@ -63,31 +79,36 @@ public class DeploymentSpec {
* @throws IllegalArgumentException if the XML is invalid
*/
public static DeploymentSpec fromXml(Reader reader) {
- List<DeclaredZone> zones = new ArrayList<>();
- Element root = XML.getDocument(reader).getDocumentElement();
- Optional<String> globalServiceId = Optional.empty();
- for (Element environmentTag : XML.getChildren(root)) {
- if ( ! isEnvironmentName(environmentTag.getTagName())) continue;
- Environment environment = Environment.from(environmentTag.getTagName());
- List<Element> regionTags = XML.getChildren(environmentTag, "region");
- if (regionTags.isEmpty()) {
- zones.add(new DeclaredZone(environment, Optional.empty(), false));
- }
- else {
- for (Element regionTag : regionTags) {
- RegionName region = RegionName.from(XML.getValue(regionTag).trim());
- boolean active = environment == Environment.prod && readActive(regionTag);
- zones.add(new DeclaredZone(environment, Optional.of(region), active));
+ try {
+ String xmlForm = IOUtils.readAll(reader);
+ List<DeclaredZone> zones = new ArrayList<>();
+ Optional<String> globalServiceId = Optional.empty();
+ Element root = XML.getDocument(xmlForm).getDocumentElement();
+ for (Element environmentTag : XML.getChildren(root)) {
+ if (!isEnvironmentName(environmentTag.getTagName())) continue;
+ Environment environment = Environment.from(environmentTag.getTagName());
+ List<Element> regionTags = XML.getChildren(environmentTag, "region");
+ if (regionTags.isEmpty()) {
+ zones.add(new DeclaredZone(environment, Optional.empty(), false));
+ } else {
+ for (Element regionTag : regionTags) {
+ RegionName region = RegionName.from(XML.getValue(regionTag).trim());
+ boolean active = environment == Environment.prod && readActive(regionTag);
+ zones.add(new DeclaredZone(environment, Optional.of(region), active));
+ }
}
- }
- if (Environment.prod.equals(environment)) {
- globalServiceId = readGlobalServiceId(environmentTag);
- } else if (readGlobalServiceId(environmentTag).isPresent()) {
- throw new IllegalArgumentException("Attribute 'global-service-id' is only valid on 'prod' tag.");
+ if (Environment.prod.equals(environment)) {
+ globalServiceId = readGlobalServiceId(environmentTag);
+ } else if (readGlobalServiceId(environmentTag).isPresent()) {
+ throw new IllegalArgumentException("Attribute 'global-service-id' is only valid on 'prod' tag.");
+ }
}
+ return new DeploymentSpec(globalServiceId, readUpgradePolicy(root), zones, xmlForm);
+ }
+ catch (IOException e) {
+ throw new IllegalArgumentException("Could not read deployment spec", e);
}
- return new DeploymentSpec(globalServiceId, readUpgradePolicy(root), zones);
}
private static boolean isEnvironmentName(String tagName) {
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 f1a9840bd88..ffde5b21458 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
@@ -19,13 +19,13 @@ public class DeploymentSpecTest {
@Test
public void testSpec() {
- StringReader r = new StringReader(
- "<deployment version='1.0'>" +
- " <test/>" +
- "</deployment>"
- );
+ String specXml = "<deployment version='1.0'>" +
+ " <test/>" +
+ "</deployment>";
+ StringReader r = new StringReader(specXml);
DeploymentSpec spec = DeploymentSpec.fromXml(r);
+ assertEquals(specXml, spec.xmlForm());
assertEquals(1, spec.zones().size());
assertEquals(Environment.test, spec.zones().get(0).environment());
assertTrue(spec.includes(Environment.test, Optional.empty()));
@@ -192,5 +192,13 @@ public class DeploymentSpecTest {
DeploymentSpec spec = DeploymentSpec.fromXml(r);
assertEquals("canary", spec.upgradePolicy().toString());
}
+
+ @Test
+ public void testEmpty() {
+ assertFalse(DeploymentSpec.empty.globalServiceId().isPresent());
+ assertEquals(DeploymentSpec.UpgradePolicy.defaultPolicy, DeploymentSpec.empty.upgradePolicy());
+ assertTrue(DeploymentSpec.empty.zones().isEmpty());
+ assertEquals("<deployment version='1.0'/>", DeploymentSpec.empty.xmlForm());
+ }
}