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 /controller-server | |
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 'controller-server')
4 files changed, 50 insertions, 0 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationList.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationList.java index ca642d0fb2c..e46df3c5a4a 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationList.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationList.java @@ -162,6 +162,12 @@ public class ApplicationList { return listOf(list.stream().filter(a -> a.deploymentSpec().canUpgradeAt(instant))); } + /** Returns the subset of applications that hasn't pinned to another major version than the given one */ + public ApplicationList allowMajorVersion(int majorVersion) { + return listOf(list.stream().filter(a -> ! a.deploymentSpec().majorVersion().isPresent() || + a.deploymentSpec().majorVersion().get().equals(majorVersion))); + } + /** Returns the first n application in this (or all, if there are less than n). */ public ApplicationList first(int n) { if (list.size() < n) return this; diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/Upgrader.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/Upgrader.java index 506b9b4642b..676fe808bfe 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/Upgrader.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/Upgrader.java @@ -66,6 +66,7 @@ public class Upgrader extends Maintainer { cancelUpgradesOf(applications().with(UpgradePolicy.conservative).upgrading().failing().notUpgradingTo(conservativeTarget), reason); // Schedule the right upgrades + canaryTarget.ifPresent(target -> upgrade(applications().with(UpgradePolicy.canary), target)); defaultTarget.ifPresent(target -> upgrade(applications().with(UpgradePolicy.defaultPolicy), target)); conservativeTarget.ifPresent(target -> upgrade(applications().with(UpgradePolicy.conservative), target)); @@ -94,6 +95,7 @@ public class Upgrader extends Maintainer { applications = applications.notPullRequest(); // Pull requests are deployed as separate applications to test then deleted; No need to upgrade applications = applications.hasProductionDeployment(); applications = applications.onLowerVersionThan(version); + applications = applications.allowMajorVersion(version.getMajor()); applications = applications.notDeployingAt(controller().clock().instant()); // wait with applications deploying an application change or already upgrading applications = applications.notFailingOn(version); // try to upgrade only if it hasn't failed on this version applications = applications.canUpgradeAt(controller().clock().instant()); // wait with applications that are currently blocking upgrades diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/ApplicationPackageBuilder.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/ApplicationPackageBuilder.java index 2f9703b91e1..b7539166c33 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/ApplicationPackageBuilder.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/ApplicationPackageBuilder.java @@ -16,6 +16,7 @@ import java.time.Duration; import java.time.Instant; import java.util.Arrays; import java.util.Date; +import java.util.Optional; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -30,12 +31,18 @@ public class ApplicationPackageBuilder { private final StringBuilder validationOverridesBody = new StringBuilder(); private final StringBuilder blockChange = new StringBuilder(); + private Optional<Integer> majorVersion = Optional.empty(); private String upgradePolicy = null; private Environment environment = Environment.prod; private String globalServiceId = null; private String athenzIdentityAttributes = null; private String searchDefinition = "search test { }"; + public ApplicationPackageBuilder majorVersion(int majorVersion) { + this.majorVersion = Optional.of(majorVersion); + return this; + } + public ApplicationPackageBuilder upgradePolicy(String upgradePolicy) { this.upgradePolicy = upgradePolicy; return this; @@ -108,6 +115,7 @@ public class ApplicationPackageBuilder { private byte[] deploymentSpec() { StringBuilder xml = new StringBuilder(); xml.append("<deployment version='1.0' "); + majorVersion.ifPresent(v -> xml.append("major-version='").append(v).append("' ")); if(athenzIdentityAttributes != null) { xml.append(athenzIdentityAttributes); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/UpgraderTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/UpgraderTest.java index a6e31a4a34b..04c0e7e9a6f 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/UpgraderTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/UpgraderTest.java @@ -890,6 +890,40 @@ public class UpgraderTest { } @Test + public void testPinningMajorVersion() { + Version version = Version.fromString("6.2"); + tester.upgradeSystem(version); + + ApplicationPackage version6ApplicationPackage = new ApplicationPackageBuilder() + .majorVersion(6) + .upgradePolicy("default") + .environment(Environment.prod) + .region("us-west-1") + .build(); + + // Setup applications + Application canary0 = tester.createAndDeploy("canary0", 1, "canary"); + Application default0 = tester.createAndDeploy("default0", 2, version6ApplicationPackage); + + // New major version is released + version = Version.fromString("7.0"); + tester.upgradeSystem(version); + assertEquals(version, tester.controller().versionStatus().systemVersion().get().versionNumber()); + tester.triggerUntilQuiescence(); + + // ... canary upgrade to it + assertEquals(2, tester.buildService().jobs().size()); + tester.completeUpgrade(canary0, version, "canary"); + assertEquals(0, tester.buildService().jobs().size()); + tester.computeVersionStatus(); + + // The other application does not because it has pinned to major version 6 + tester.upgrader().maintain(); + tester.triggerUntilQuiescence(); + assertEquals(0, tester.buildService().jobs().size()); + } + + @Test public void testAllowApplicationChangeDuringFailingUpgrade() { Version version = Version.fromString("6.2"); tester.upgradeSystem(version); |