summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2018-11-13 13:56:21 +0100
committerMartin Polden <mpolden@mpolden.no>2018-11-13 13:56:49 +0100
commit18e313f35f6a0d0e0ac9cf7a75d26a5b58c35fd4 (patch)
tree045600cd224adbefe5deafdc7e773f6493c2367f /controller-server
parent03c01d5476f9884b31328e8301e5e6e7bf7752ab (diff)
Allow forcing downgrade of OS
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java6
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java3
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgraderTest.java4
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdaterTest.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiTest.java3
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),