diff options
author | Valerij Fredriksen <valerij92@gmail.com> | 2020-06-01 19:45:51 +0200 |
---|---|---|
committer | Valerij Fredriksen <valerij92@gmail.com> | 2020-06-01 19:45:51 +0200 |
commit | f3502c34efdfb318556ebf688c2bd86d8b71b602 (patch) | |
tree | 7f72ccf32dacbb0beda6a9017ca22d01f0fa93bf /node-repository | |
parent | 42508c8fd230926f345f0561a4384210b17d4695 (diff) |
Exclude deprovisioned nodes by default
Diffstat (limited to 'node-repository')
6 files changed, 89 insertions, 7 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/StateFilter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/StateFilter.java index 5778800d02c..a2590e8c727 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/StateFilter.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/StateFilter.java @@ -1,11 +1,10 @@ // Copyright 2017 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.google.common.collect.ImmutableSet; import com.yahoo.text.StringUtilities; import com.yahoo.vespa.hosted.provision.Node; -import java.util.Collections; +import java.util.EnumSet; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -23,22 +22,27 @@ public class StateFilter extends NodeFilter { private StateFilter(Set<Node.State> states, NodeFilter next) { super(next); Objects.requireNonNull(states, "state cannot be null, use an empty set"); - this.states = ImmutableSet.copyOf(states); + this.states = EnumSet.copyOf(states); } @Override public boolean matches(Node node) { - if ( ! states.isEmpty() && ! states.contains(node.state())) return false; + if ( ! states.contains(node.state())) return false; return nextMatches(node); } /** Returns a copy of the given filter which only matches for the given state */ public static StateFilter from(Node.State state, NodeFilter filter) { - return new StateFilter(Collections.singleton(state), filter); + return new StateFilter(EnumSet.of(state), filter); } /** Returns a node filter which matches a comma or space-separated list of states */ - public static StateFilter from(String states, NodeFilter next) { + public static StateFilter from(String states, boolean includeDeprovisioned, NodeFilter next) { + if (states == null) { + return new StateFilter(includeDeprovisioned ? + EnumSet.allOf(Node.State.class) : EnumSet.complementOf(EnumSet.of(Node.State.deprovisioned)), next); + } + return new StateFilter(StringUtilities.split(states).stream().map(Node.State::valueOf).collect(Collectors.toSet()), next); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java index 3e6bc4e96e5..80136de6f03 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java @@ -322,7 +322,7 @@ public class NodesV2ApiHandler extends LoggingRequestHandler { request.getProperty("clusterType"), request.getProperty("clusterId"))); filter = ApplicationFilter.from(request.getProperty("application"), filter); - filter = StateFilter.from(request.getProperty("state"), filter); + filter = StateFilter.from(request.getProperty("state"), request.getBooleanProperty("includeDeprovisioned"), filter); filter = NodeTypeFilter.from(request.getProperty("type"), filter); filter = ParentHostFilter.from(request.getProperty("parentHost"), filter); filter = NodeOsVersionFilter.from(request.getProperty("osVersion"), filter); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java index 8e5cb9d088c..94b97d91312 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java @@ -130,6 +130,8 @@ public class MockNodeRepository extends NodeRepository { flavors.getFlavorOrThrow("large"), Optional.empty(), NodeType.host)); nodes.add(createNode("dockerhost5", "dockerhost5.yahoo.com", ipConfig(104, 1, 3), Optional.empty(), flavors.getFlavorOrThrow("large"), Optional.empty(), NodeType.host)); + nodes.add(createNode("dockerhost6", "dockerhost6.yahoo.com", ipConfig(105, 1, 3), Optional.empty(), + flavors.getFlavorOrThrow("large"), Optional.empty(), NodeType.host)); // Config servers nodes.add(createNode("cfg1", "cfg1.yahoo.com", ipConfig(201), Optional.empty(), @@ -147,6 +149,9 @@ public class MockNodeRepository extends NodeRepository { fail(node5.hostname(), Agent.system, getClass().getSimpleName()); dirtyRecursively(node55.hostname(), Agent.system, getClass().getSimpleName()); + fail("dockerhost6.yahoo.com", Agent.operator, getClass().getSimpleName()); + removeRecursively("dockerhost6.yahoo.com"); + ApplicationId zoneApp = ApplicationId.from(TenantName.from("zoneapp"), ApplicationName.from("zoneapp"), InstanceName.from("zoneapp")); ClusterSpec zoneCluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("node-admin")).vespaVersion("6.42").build(); activate(provisioner.prepare(zoneApp, zoneCluster, Capacity.fromRequiredNodeType(NodeType.host), null), zoneApp, provisioner); 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 fee2958b124..29dac58e10c 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 @@ -56,6 +56,7 @@ public class NodesV2ApiTest { assertFile(new Request("http://localhost:8080/nodes/v2/state/active?recursive=true"), "active-nodes.json"); assertFile(new Request("http://localhost:8080/nodes/v2/node/"), "nodes.json"); assertFile(new Request("http://localhost:8080/nodes/v2/node/?recursive=true"), "nodes-recursive.json"); + assertFile(new Request("http://localhost:8080/nodes/v2/node/?recursive=true&includeDeprovisioned=true"), "nodes-recursive-include-deprovisioned.json"); assertFile(new Request("http://localhost:8080/nodes/v2/node/host2.yahoo.com"), "node2.json"); // GET with filters diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/dockerhost6.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/dockerhost6.json new file mode 100644 index 00000000000..8d437b3e47c --- /dev/null +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/dockerhost6.json @@ -0,0 +1,48 @@ +{ + "url": "http://localhost:8080/nodes/v2/node/dockerhost6.yahoo.com", + "id": "dockerhost6.yahoo.com", + "state": "deprovisioned", + "type": "host", + "hostname": "dockerhost6.yahoo.com", + "openStackId": "dockerhost6", + "flavor": "large", + "cpuCores": 4.0, + "resources": { + "vcpu": 4.0, + "memoryGb": 32.0, + "diskGb": 1600.0, + "bandwidthGbps": 20.0, + "diskSpeed": "fast", + "storageType": "remote" + }, + "environment": "BARE_METAL", + "rebootGeneration": 0, + "currentRebootGeneration": 0, + "failCount": 1, + "wantToRetire": false, + "wantToDeprovision": false, + "history": [ + { + "event": "provisioned", + "at": 123, + "agent": "system" + }, + { + "event": "readied", + "at": 123, + "agent": "system" + }, + { + "event": "failed", + "at": 123, + "agent": "operator" + }, + { + "event": "deprovisioned", + "at": 123, + "agent": "system" + } + ], + "ipAddresses": [], + "additionalIpAddresses": [] +} diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes-recursive-include-deprovisioned.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes-recursive-include-deprovisioned.json new file mode 100644 index 00000000000..2b650bad39b --- /dev/null +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes-recursive-include-deprovisioned.json @@ -0,0 +1,24 @@ +{ + "nodes": [ + @include(node7.json), + @include(cfg1.json), + @include(node3.json), + @include(cfg2.json), + @include(node10.json), + @include(docker-node3.json), + @include(node14.json), + @include(node4.json), + @include(docker-node4.json), + @include(node6.json), + @include(docker-container1.json), + @include(docker-node5.json), + @include(docker-node2.json), + @include(node13.json), + @include(node2.json), + @include(docker-node1.json), + @include(node1.json), + @include(node55.json), + @include(node5.json), + @include(dockerhost6.json) + ] +} |