diff options
author | Martin Polden <mpolden@mpolden.no> | 2018-11-13 13:56:21 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2018-11-13 13:56:49 +0100 |
commit | 18e313f35f6a0d0e0ac9cf7a75d26a5b58c35fd4 (patch) | |
tree | 045600cd224adbefe5deafdc7e773f6493c2367f /controller-server | |
parent | 03c01d5476f9884b31328e8301e5e6e7bf7752ab (diff) |
Allow forcing downgrade of OS
Diffstat (limited to 'controller-server')
5 files changed, 11 insertions, 7 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java index 47e11af056d..332b9c61dbe 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java @@ -219,7 +219,7 @@ public class Controller extends AbstractComponent { } /** Set the target OS version for infrastructure on cloud in this system */ - public void upgradeOsIn(CloudName cloud, Version version) { + public void upgradeOsIn(CloudName cloud, Version version, boolean force) { if (version.isEmpty()) { throw new IllegalArgumentException("Invalid version '" + version.toFullString() + "'"); } @@ -228,8 +228,8 @@ public class Controller extends AbstractComponent { } try (Lock lock = curator.lockOsVersions()) { Set<OsVersion> versions = new TreeSet<>(curator.readOsVersions()); - if (versions.stream().anyMatch(osVersion -> osVersion.cloud().equals(cloud) && - osVersion.version().isAfter(version))) { + if (!force && versions.stream().anyMatch(osVersion -> osVersion.cloud().equals(cloud) && + osVersion.version().isAfter(version))) { throw new IllegalArgumentException("Cannot downgrade cloud '" + cloud.value() + "' to version " + version.toFullString()); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java index 3283fd4fcc4..fa1b8699612 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java @@ -73,6 +73,7 @@ public class OsApiHandler extends LoggingRequestHandler { Inspector root = requestData.get(); Inspector versionField = root.field("version"); Inspector cloudField = root.field("cloud"); + boolean force = root.field("force").asBool(); if (!versionField.valid() || !cloudField.valid()) { throw new IllegalArgumentException("Fields 'version' and 'cloud' are required"); } @@ -85,7 +86,7 @@ public class OsApiHandler extends LoggingRequestHandler { throw new IllegalArgumentException("Invalid version '" + versionField.asString() + "'", e); } - controller.upgradeOsIn(cloud, target); + controller.upgradeOsIn(cloud, target, force); Slime response = new Slime(); Cursor cursor = response.setObject(); cursor.setString("message", "Set target OS version for cloud '" + cloud.value() + "' to " + diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgraderTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgraderTest.java index 74f7ab7faf2..a21c3bb272d 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgraderTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgraderTest.java @@ -76,8 +76,8 @@ public class OsUpgraderTest { // New OS version released Version version1 = Version.fromString("7.1"); CloudName cloud = CloudName.defaultName(); - tester.controller().upgradeOsIn(cloud, Version.fromString("7.0")); - tester.controller().upgradeOsIn(cloud, version1); + tester.controller().upgradeOsIn(cloud, Version.fromString("7.0"), false); + tester.controller().upgradeOsIn(cloud, version1, false); assertEquals(1, tester.controller().osVersions().size()); // Only allows one version per cloud statusUpdater.maintain(); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdaterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdaterTest.java index 97084ea4ae9..0ea90a22910 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdaterTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdaterTest.java @@ -43,7 +43,7 @@ public class OsVersionStatusUpdaterTest { // Setting a new target adds it to current status Version version1 = Version.fromString("7.1"); CloudName cloud = CloudName.defaultName(); - tester.controller().upgradeOsIn(cloud, version1); + tester.controller().upgradeOsIn(cloud, version1, false); statusUpdater.maintain(); Map<OsVersion, List<OsVersionStatus.Node>> osVersions = tester.controller().osVersionStatus().versions(); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiTest.java index 2d76517bfe7..a7f98103885 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiTest.java @@ -87,6 +87,9 @@ public class OsApiTest extends ControllerContainerTest { completeUpgrade(zone2, zone3); assertFile(new Request("http://localhost:8080/os/v1/"), "versions-all-upgraded.json"); + // Downgrade with force is permitted + assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"7.5.1\", \"cloud\": \"cloud1\", \"force\": true}", Request.Method.PATCH), + "{\"message\":\"Set target OS version for cloud 'cloud1' to 7.5.1\"}", 200); // Error: Missing field 'cloud' or 'version' assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"7.6\"}", Request.Method.PATCH), |