diff options
author | Martin Polden <mpolden@mpolden.no> | 2018-08-10 15:07:55 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2018-08-13 09:30:05 +0200 |
commit | e4ba6335bda72508ad6474f400f987b9f6e7c376 (patch) | |
tree | ea32fc016ca108a5c4500123f4eb1369f5fc457f /node-repository | |
parent | 900e92a4db728fb1a653eeb58e2139bae81c6db2 (diff) |
Add OS version filter
Diffstat (limited to 'node-repository')
3 files changed, 50 insertions, 0 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeOsVersionFilter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeOsVersionFilter.java new file mode 100644 index 00000000000..f7083a6398f --- /dev/null +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeOsVersionFilter.java @@ -0,0 +1,35 @@ +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.provision.node.filter; + +import com.yahoo.component.Version; +import com.yahoo.vespa.hosted.provision.Node; + +import java.util.Objects; + +/** + * Filter nodes by their OS version. + * + * @author mpolden + */ +public class NodeOsVersionFilter extends NodeFilter { + + private final Version version; + + private NodeOsVersionFilter(Version version, NodeFilter next) { + super(next); + this.version = Objects.requireNonNull(version, "version cannot be null"); + } + + @Override + public boolean matches(Node node) { + if (!version.isEmpty() && !node.status().osVersion().filter(v -> v.equals(version)).isPresent()) { + return false; + } + return nextMatches(node); + } + + public static NodeOsVersionFilter from(String version, NodeFilter filter) { + return new NodeOsVersionFilter(Version.fromString(version), filter); + } + +} diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java index a8d9266c9b7..c282993a466 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java @@ -21,6 +21,7 @@ import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.filter.ApplicationFilter; import com.yahoo.vespa.hosted.provision.node.filter.NodeFilter; import com.yahoo.vespa.hosted.provision.node.filter.NodeHostFilter; +import com.yahoo.vespa.hosted.provision.node.filter.NodeOsVersionFilter; import com.yahoo.vespa.hosted.provision.node.filter.NodeTypeFilter; import com.yahoo.vespa.hosted.provision.node.filter.ParentHostFilter; import com.yahoo.vespa.hosted.provision.node.filter.StateFilter; @@ -248,6 +249,7 @@ public class NodesApiHandler extends LoggingRequestHandler { filter = StateFilter.from(request.getProperty("state"), filter); filter = NodeTypeFilter.from(request.getProperty("type"), filter); filter = ParentHostFilter.from(request.getProperty("parentHost"), filter); + filter = NodeOsVersionFilter.from(request.getProperty("osVersion"), filter); return filter; } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java index 84eaae3809f..448b64d1e78 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java @@ -599,6 +599,19 @@ public class RestApiTest { Request.Method.PATCH), "{\"message\":\"Updated dockerhost1.yahoo.com\"}"); assertFile(new Request("http://localhost:8080/nodes/v2/node/dockerhost1.yahoo.com"), "docker-node1-os-upgrade-complete.json"); + + // Another node upgrades + assertResponse(new Request("http://localhost:8080/nodes/v2/node/dockerhost2.yahoo.com", + Utf8.toBytes("{\"currentOsVersion\": \"7.5.2\"}"), + Request.Method.PATCH), + "{\"message\":\"Updated dockerhost2.yahoo.com\"}"); + + // Filter nodes by osVersion + assertResponse(new Request("http://localhost:8080/nodes/v2/node/?osVersion=7.5.2"), + "{\"nodes\":[" + + "{\"url\":\"http://localhost:8080/nodes/v2/node/dockerhost2.yahoo.com\"}," + + "{\"url\":\"http://localhost:8080/nodes/v2/node/dockerhost1.yahoo.com\"}" + + "]}"); } /** Tests the rendering of each node separately to make it easier to find errors */ |