summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorMorten Tokle <morten.tokle@gmail.com>2018-02-22 12:26:57 +0100
committerGitHub <noreply@github.com>2018-02-22 12:26:57 +0100
commitdc04a5a8a11f7af6dee056deb6b77ed023243f89 (patch)
treee3809485bed68e7365f9e98accb5ff8a7eed4d58 /controller-server
parente307df56eaaf5b0ebca5aefb7f7e0c5c3a970bdb (diff)
parentd86eabe26a18ec03f1df587b1a46d8b824190837 (diff)
Merge pull request #5111 from vespa-engine/mpolden/remember-application-change-during-failing-upgrade
Allow application change during failing upgrade
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Change.java4
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java8
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/UpgraderTest.java49
3 files changed, 59 insertions, 2 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Change.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Change.java
index 603f16a9ef6..0b50ec36a32 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Change.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Change.java
@@ -98,4 +98,8 @@ public final class Change {
return new Change(Optional.of(platformChange), Optional.empty());
}
+ public static Change of(Version platformChange, ApplicationVersion applicationVersion) {
+ return new Change(Optional.of(platformChange), Optional.of(applicationVersion));
+ }
+
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java
index 8c93d53ea9e..70c1702d0b5 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java
@@ -86,8 +86,12 @@ public class DeploymentTrigger {
if (report.success()) {
if (report.jobType() == JobType.component) {
if (acceptNewApplicationVersionNow(application)) {
- // Set this as the change we are doing, unless we are already pushing a platform change
- if ( ! ( application.change().platform().isPresent())) {
+ // If there's an ongoing upgrade, we allow the upgrade and new application package to be
+ // deployed together
+ if (application.change().platform().isPresent()) {
+ application = application.withChange(Change.of(application.change().platform().get(),
+ applicationVersion));
+ } else {
application = application.withChange(Change.of(applicationVersion));
}
}
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 7c4dd58fa33..e13f4fca97c 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
@@ -837,4 +837,53 @@ public class UpgraderTest {
assertTrue("All jobs consumed", tester.buildSystem().jobs().isEmpty());
}
+ @Test
+ public void testAllowApplicationChangeDuringFailingUpgrade() {
+ DeploymentTester tester = new DeploymentTester();
+ Version version = Version.fromString("5.0");
+ tester.updateVersionStatus(version);
+
+ ApplicationPackage applicationPackage = new ApplicationPackageBuilder()
+ .environment(Environment.prod)
+ .region("us-west-1")
+ .build();
+
+ Application app = tester.createAndDeploy("app1", 1, applicationPackage);
+
+ // New version is released
+ version = Version.fromString("5.1");
+ tester.updateVersionStatus(version);
+ tester.upgrader().maintain();
+
+ tester.deployAndNotify(app, applicationPackage, true, systemTest);
+ tester.deployAndNotify(app, applicationPackage, true, stagingTest);
+
+ // Production job fails and exhausts retries, new application changes are now accepted
+ tester.deployAndNotify(app, applicationPackage, false, productionUsWest1);
+ tester.clock().advance(Duration.ofHours(1));
+ tester.deployAndNotify(app, applicationPackage, false, productionUsWest1);
+
+ // New application change
+ tester.jobCompletion(component).application(app).buildNumber(43).uploadArtifact(applicationPackage).submit();
+ String applicationVersion = "1.0.43-commit1";
+
+ // Application change recorded together with ongoing upgrade
+ app = tester.application(app.id());
+ assertTrue("Change contains both upgrade and application change",
+ app.change().platform().get().equals(version) &&
+ app.change().application().get().id().equals(applicationVersion));
+
+ // Deployment completes
+ tester.deployAndNotify(app, applicationPackage, true, systemTest);
+ tester.deployAndNotify(app, applicationPackage, true, stagingTest);
+ tester.deployAndNotify(app, applicationPackage, true, productionUsWest1);
+ assertTrue("All jobs consumed", tester.buildSystem().jobs().isEmpty());
+
+ app = tester.application(app.id());
+ for (Deployment deployment : app.deployments().values()) {
+ assertEquals(version, deployment.version());
+ assertEquals(applicationVersion, deployment.applicationVersion().id());
+ }
+ }
+
}