summaryrefslogtreecommitdiffstats
path: root/controller-server
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 /controller-server
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 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationList.java6
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/Upgrader.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/ApplicationPackageBuilder.java8
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/UpgraderTest.java34
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);