diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-05-09 10:01:00 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2017-05-09 10:01:00 +0200 |
commit | cb565354a1b54e631c7da9ef69501a42498e0b7a (patch) | |
tree | f5474190be35503dd1b866fbcdea5e51a5b460fe /config-model-api | |
parent | 7cd93ed7b4059628da8193dec5ad627e3e1147d3 (diff) |
Add upgrade policy
Diffstat (limited to 'config-model-api')
-rw-r--r-- | config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java | 55 | ||||
-rw-r--r-- | config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java | 18 |
2 files changed, 64 insertions, 9 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 e758e332901..aa3d83afad1 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 @@ -10,6 +10,7 @@ import java.io.BufferedReader; import java.io.FileReader; import java.io.Reader; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -24,13 +25,23 @@ import java.util.Optional; public class DeploymentSpec { private final Optional<String> globalServiceId; + private final UpgradePolicy upgradePolicy; private final List<DeclaredZone> zones; - public DeploymentSpec(List<DeclaredZone> zones, Optional<String> globalServiceId) { - this.zones = Collections.unmodifiableList(new ArrayList<>(zones)); + public DeploymentSpec(Optional<String> globalServiceId, UpgradePolicy upgradePolicy, List<DeclaredZone> zones) { this.globalServiceId = globalServiceId; + this.upgradePolicy = upgradePolicy; + this.zones = Collections.unmodifiableList(new ArrayList<>(zones)); + } + + /** Returns the ID of the service to expose through global routing, if present */ + public Optional<String> globalServiceId() { + return globalServiceId; } + /** Returns the upgrade policy of this, which is defaultPolicy if none is specified */ + public UpgradePolicy upgradePolicy() { return upgradePolicy; } + /** Returns the zones this declares as a read-only list. */ public List<DeclaredZone> zones() { return zones; } @@ -41,11 +52,6 @@ public class DeploymentSpec { return false; } - /** Returns the ID of the service to expose through global routing, if present */ - public Optional<String> globalServiceId() { - return globalServiceId; - } - /** * Creates a deployment spec from XML. * @@ -54,8 +60,9 @@ public class DeploymentSpec { public static DeploymentSpec fromXml(Reader reader) { List<DeclaredZone> zones = new ArrayList<>(); Element root = XML.getDocument(reader).getDocumentElement(); - Optional<String> globalServiceId = Optional.empty(); + 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()) { @@ -75,7 +82,13 @@ public class DeploymentSpec { throw new IllegalArgumentException("Attribute 'global-service-id' is only valid on 'prod' tag."); } } - return new DeploymentSpec(zones, globalServiceId); + return new DeploymentSpec(globalServiceId, readUpgradePolicy(root), zones); + } + + /** Returns whether we should assume this tag name is the name of an environment */ + private static boolean isEnvironmentName(String tagName) { + if (tagName.equals("upgrade")) return false; + return true; // by method of elimination } private static Optional<String> readGlobalServiceId(Element environmentTag) { @@ -87,6 +100,20 @@ public class DeploymentSpec { return Optional.of(globalServiceId); } } + + private static UpgradePolicy readUpgradePolicy(Element root) { + Element upgradeElement = XML.getChild(root, "upgrade"); + if (upgradeElement == null) return UpgradePolicy.defaultPolicy; + + String policy = upgradeElement.getAttribute("policy"); + switch (policy) { + case "canary" : return UpgradePolicy.canary; + case "default" : return UpgradePolicy.defaultPolicy; + case "conservative" : return UpgradePolicy.conservative; + default : throw new IllegalArgumentException("Illegal upgrade policy '" + policy + "': " + + "Must be one of " + Arrays.toString(UpgradePolicy.values())); + } + } private static boolean readActive(Element regionTag) { String activeValue = regionTag.getAttribute("active"); @@ -179,4 +206,14 @@ public class DeploymentSpec { } + /** Controls when this application will be upgraded to new Vespa versions */ + public enum UpgradePolicy { + /** Canary: Applications with this policy will upgrade before any other */ + canary, + /** Default: Will upgrade after all canary applications upgraded successfully. The default. */ + defaultPolicy, + /** Will upgrade after most default applications upgraded successfully */ + conservative + } + } 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 4023bca54bf..919735f91db 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 @@ -82,6 +82,8 @@ public class DeploymentSpecTest { assertTrue(spec.includes(Environment.prod, Optional.of(RegionName.from("us-west1")))); assertFalse(spec.includes(Environment.prod, Optional.of(RegionName.from("no-such-region")))); assertFalse(spec.globalServiceId().isPresent()); + + assertEquals(DeploymentSpec.UpgradePolicy.defaultPolicy, spec.upgradePolicy()); } @Test @@ -177,5 +179,21 @@ public class DeploymentSpecTest { assertEquals("qrs", spec.globalServiceId().get()); } + @Test + public void productionSpecWithUpgradePolicy() { + StringReader r = new StringReader( + "<deployment>" + + " <upgrade policy='canary'/>" + + " <prod>" + + " <region active='true'>us-west-1</region>" + + " <region active='true'>us-central-1</region>" + + " <region active='true'>us-east-3</region>" + + " </prod>" + + "</deployment>" + ); + + DeploymentSpec spec = DeploymentSpec.fromXml(r); + assertEquals("canary", spec.upgradePolicy().toString()); + } } |