diff options
author | Martin Polden <mpolden@mpolden.no> | 2022-05-20 11:40:03 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2022-05-20 11:40:03 +0200 |
commit | e00afcb0ce9e22be19584e0ee414ae5cb7f219b9 (patch) | |
tree | 67a454d3f9b81080e439dc2eb7081b2d8cf48420 /node-repository | |
parent | bff1a34dd62df8033973a8d66815e5960675eda2 (diff) |
Allow patching wantedOsVersion
Diffstat (limited to 'node-repository')
4 files changed, 20 insertions, 5 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java index c3c4771ec1d..4476befe70a 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java @@ -492,6 +492,12 @@ public final class Node implements Nodelike { return this.with(newStatus).with(newHistory); } + /** Returns a copy of this node with wanted OS version set to given version */ + public Node withWantedOsVersion(Optional<Version> version) { + if (status.osVersion().wanted().equals(version)) return this; + return with(status.withOsVersion(status.osVersion().withWanted(version))); + } + /** Returns a copy of this node with firmware verified at the given instant */ public Node withFirmwareVerifiedAt(Instant instant) { var newStatus = status.withFirmwareVerifiedAt(instant); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java index 3aa09b1b667..8292b9590d7 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java @@ -628,10 +628,7 @@ public class Nodes { * @return the nodes in their new state */ public List<Node> upgradeOs(Predicate<Node> filter, Optional<Version> version) { - return performOn(filter, (node, lock) -> { - var newStatus = node.status().withOsVersion(node.status().osVersion().withWanted(version)); - return write(node.with(newStatus), lock); - }); + return performOn(filter, (node, lock) -> write(node.withWantedOsVersion(version), lock)); } /** Retire nodes matching given filter */ diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodePatcher.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodePatcher.java index d8e1828b10c..15ba96caa70 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodePatcher.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodePatcher.java @@ -154,6 +154,8 @@ public class NodePatcher { return node.with(node.status().withVespaVersion(Version.fromString(asString(value)))); case "currentOsVersion" : return node.withCurrentOsVersion(Version.fromString(asString(value)), clock.instant()); + case "wantedOsVersion": // Node repository manages this field internally. Setting this manually should only be used for debugging purposes + return node.withWantedOsVersion(value.type() == Type.NIX ? Optional.empty() : Optional.of(Version.fromString(value.asString()))); case "currentFirmwareCheck": return node.withFirmwareVerifiedAt(Instant.ofEpochMilli(asLong(value))); case "failCount" : diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java index 5ac79a1cc24..6b1853b3893 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java @@ -777,7 +777,7 @@ public class NodesV2ApiTest { // Other node type does not return wanted OS version Response r = tester.container().handleRequest(new Request("http://localhost:8080/nodes/v2/node/host1.yahoo.com")); - assertFalse("Response omits wantedOsVersions field", r.getBodyAsString().contains("wantedOsVersion")); + assertFalse("Response omits wantedOsVersion field", r.getBodyAsString().contains("wantedOsVersion")); // Node updates its node object after upgrading OS assertResponse(new Request("http://localhost:8080/nodes/v2/node/dockerhost1.yahoo.com", @@ -786,6 +786,16 @@ public class NodesV2ApiTest { "{\"message\":\"Updated dockerhost1.yahoo.com\"}"); assertFile(new Request("http://localhost:8080/nodes/v2/node/dockerhost1.yahoo.com"), "docker-node1-os-upgrade-complete.json"); + // Override wantedOsVersion + assertResponse(new Request("http://localhost:8080/nodes/v2/node/dockerhost1.yahoo.com", + Utf8.toBytes("{\"wantedOsVersion\": \"7.5.3\"}"), + Request.Method.PATCH), + "{\"message\":\"Updated dockerhost1.yahoo.com\"}"); + assertResponse(new Request("http://localhost:8080/nodes/v2/node/dockerhost1.yahoo.com", + Utf8.toBytes("{\"wantedOsVersion\": \"7.5.2\"}"), + Request.Method.PATCH), + "{\"message\":\"Updated dockerhost1.yahoo.com\"}"); + // Another node upgrades assertResponse(new Request("http://localhost:8080/nodes/v2/node/dockerhost2.yahoo.com", Utf8.toBytes("{\"currentOsVersion\": \"7.5.2\"}"), |