diff options
author | Jon Bratseth <bratseth@oath.com> | 2018-10-18 12:45:33 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@oath.com> | 2018-10-18 12:45:33 +0200 |
commit | ff5425a5ced4134efcf8682c04d546e89bbe770e (patch) | |
tree | 493b20ea1082cd23f74195bb5b0aa4c2866ec72a /config-model-api | |
parent | 0a5aeca4ccd596256bb1ee9265857499440de0a4 (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')
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'>" + |