diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-05-11 14:25:57 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-05-11 14:25:57 +0200 |
commit | d5120622e144d884af22834f75b4bc874b3311e5 (patch) | |
tree | fcdd5eabae627a3abe595ad593e06707b0569911 /config-model-api | |
parent | 4030c7c7afd867482c08ef53dff19c118a9fc172 (diff) |
Add serial form
Diffstat (limited to 'config-model-api')
-rw-r--r-- | config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java | 65 | ||||
-rw-r--r-- | config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java | 18 |
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()); + } } |