summaryrefslogtreecommitdiffstats
path: root/config-model-api/src
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2017-05-09 10:01:00 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2017-05-09 10:01:00 +0200
commitcb565354a1b54e631c7da9ef69501a42498e0b7a (patch)
treef5474190be35503dd1b866fbcdea5e51a5b460fe /config-model-api/src
parent7cd93ed7b4059628da8193dec5ad627e3e1147d3 (diff)
Add upgrade policy
Diffstat (limited to 'config-model-api/src')
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java55
-rw-r--r--config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java18
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());
+ }
}