summaryrefslogtreecommitdiffstats
path: root/config-model-api
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2018-10-18 12:45:33 +0200
committerJon Bratseth <bratseth@oath.com>2018-10-18 12:45:33 +0200
commitff5425a5ced4134efcf8682c04d546e89bbe770e (patch)
tree493b20ea1082cd23f74195bb5b0aa4c2866ec72a /config-model-api
parent0a5aeca4ccd596256bb1ee9265857499440de0a4 (diff)
Don't upgrade if major version i pinned
Add major-version to deployment as that makes it available to deployment orchestration.
Diffstat (limited to 'config-model-api')
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java15
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java23
-rw-r--r--config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java15
3 files changed, 50 insertions, 3 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 64e986abf9b..6fc6d2257e2 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
@@ -39,6 +39,7 @@ 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,
+ Optional.empty(),
Collections.emptyList(),
Collections.emptyList(),
"<deployment version='1.0'/>",
@@ -47,6 +48,7 @@ public class DeploymentSpec {
private final Optional<String> globalServiceId;
private final UpgradePolicy upgradePolicy;
+ private final Optional<Integer> majorVersion;
private final List<ChangeBlocker> changeBlockers;
private final List<Step> steps;
private final String xmlForm;
@@ -55,15 +57,21 @@ public class DeploymentSpec {
public DeploymentSpec(Optional<String> globalServiceId, UpgradePolicy upgradePolicy,
List<ChangeBlocker> changeBlockers, List<Step> steps) {
- this(globalServiceId, upgradePolicy, changeBlockers, steps, null, Optional.empty(), Optional.empty());
+ this(globalServiceId, upgradePolicy, Optional.empty(), changeBlockers, steps, null, Optional.empty(), Optional.empty());
}
- public DeploymentSpec(Optional<String> globalServiceId, UpgradePolicy upgradePolicy,
+ public DeploymentSpec(Optional<String> globalServiceId, UpgradePolicy upgradePolicy, Optional<Integer> majorVersion,
+ List<ChangeBlocker> changeBlockers, List<Step> steps) {
+ this(globalServiceId, upgradePolicy, majorVersion, changeBlockers, steps, null, Optional.empty(), Optional.empty());
+ }
+
+ public DeploymentSpec(Optional<String> globalServiceId, UpgradePolicy upgradePolicy, Optional<Integer> majorVersion,
List<ChangeBlocker> changeBlockers, List<Step> steps, String xmlForm,
Optional<AthenzDomain> athenzDomain, Optional<AthenzService> athenzService) {
validateTotalDelay(steps);
this.globalServiceId = globalServiceId;
this.upgradePolicy = upgradePolicy;
+ this.majorVersion = majorVersion;
this.changeBlockers = changeBlockers;
this.steps = ImmutableList.copyOf(completeSteps(new ArrayList<>(steps)));
this.xmlForm = xmlForm;
@@ -166,6 +174,9 @@ public class DeploymentSpec {
/** Returns the upgrade policy of this, which is defaultPolicy if none is specified */
public UpgradePolicy upgradePolicy() { return upgradePolicy; }
+ /** Returns the major version this application is pinned to, or empty (default) to allow all major versions */
+ public Optional<Integer> majorVersion() { return majorVersion; }
+
/** Returns whether upgrade can occur at the given instant */
public boolean canUpgradeAt(Instant instant) {
return changeBlockers.stream().filter(block -> block.blocksVersions())
diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java b/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java
index 8bc4e0026a6..1900e2139cd 100644
--- a/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java
+++ b/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java
@@ -30,6 +30,7 @@ import java.util.stream.Collectors;
*/
public class DeploymentSpecXmlReader {
+ private static final String majorVersionTag = "major-version";
private static final String testTag = "test";
private static final String stagingTag = "staging";
private static final String blockChangeTag = "block-change";
@@ -101,7 +102,14 @@ public class DeploymentSpecXmlReader {
}
Optional<AthenzDomain> athenzDomain = stringAttribute("athenz-domain", root).map(AthenzDomain::from);
Optional<AthenzService> athenzService = stringAttribute("athenz-service", root).map(AthenzService::from);
- return new DeploymentSpec(globalServiceId, readUpgradePolicy(root), readChangeBlockers(root), steps, xmlForm, athenzDomain, athenzService);
+ return new DeploymentSpec(globalServiceId,
+ readUpgradePolicy(root),
+ optionalIntegerAttribute(majorVersionTag, root),
+ readChangeBlockers(root),
+ steps,
+ xmlForm,
+ athenzDomain,
+ athenzService);
}
/** Imposes some constraints on tag order which are not expressible in the schema */
@@ -138,6 +146,19 @@ public class DeploymentSpecXmlReader {
}
}
+ /** Returns the given attribute as an integer, or 0 if it is not present */
+ private Optional<Integer> optionalIntegerAttribute(String attributeName, Element tag) {
+ String value = tag.getAttribute(attributeName);
+ if (value == null || value.isEmpty()) return Optional.empty();
+ try {
+ return Optional.of(Integer.parseInt(value));
+ }
+ catch (NumberFormatException e) {
+ throw new IllegalArgumentException("Expected an integer for attribute '" + attributeName +
+ "' but got '" + value + "'");
+ }
+ }
+
/** Returns the given attribute as a string, or Optional.empty if it is not present or empty */
private Optional<String> stringAttribute(String attributeName, Element tag) {
String value = tag.getAttribute(attributeName);
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 103724744de..a0423293d1d 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
@@ -30,6 +30,7 @@ public class DeploymentSpecTest {
DeploymentSpec spec = DeploymentSpec.fromXml(r);
assertEquals(specXml, spec.xmlForm());
assertEquals(1, spec.steps().size());
+ assertFalse(spec.majorVersion().isPresent());
assertTrue(spec.steps().get(0).deploysTo(Environment.test));
assertTrue(spec.includes(Environment.test, Optional.empty()));
assertFalse(spec.includes(Environment.test, Optional.of(RegionName.from("region1"))));
@@ -39,6 +40,20 @@ public class DeploymentSpecTest {
}
@Test
+ public void testSpecPinningMajorVersion() {
+ String specXml = "<deployment version='1.0' major-version='6'>" +
+ " <test/>" +
+ "</deployment>";
+
+ StringReader r = new StringReader(specXml);
+ DeploymentSpec spec = DeploymentSpec.fromXml(r);
+ assertEquals(specXml, spec.xmlForm());
+ assertEquals(1, spec.steps().size());
+ assertTrue(spec.majorVersion().isPresent());
+ assertEquals(6, (int)spec.majorVersion().get());
+ }
+
+ @Test
public void stagingSpec() {
StringReader r = new StringReader(
"<deployment version='1.0'>" +