summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorValerij Fredriksen <valerij92@gmail.com>2021-04-14 18:02:30 +0200
committerValerij Fredriksen <valerij92@gmail.com>2021-04-15 13:22:23 +0200
commit50fe282683d3e17daabd4a513f93fd3de1c303e2 (patch)
tree2e66564df9646df9c5679fbcb1eb62457672763c /node-repository
parent7dd25b911e859fe609928bb9794444d2749ce0ba (diff)
Refactor node-repository filters
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java14
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/ApplicationFilter.java37
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeFilter.java36
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeHostFilter.java38
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeListFilter.java32
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeOsVersionFilter.java24
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeTypeFilter.java32
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/ParentHostFilter.java26
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/StateFilter.java32
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java6
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java23
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java2
14 files changed, 105 insertions, 201 deletions
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 b468c4a31d7..b9602ef0ad4 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
@@ -16,7 +16,6 @@ import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeList;
import com.yahoo.vespa.hosted.provision.NodeMutex;
import com.yahoo.vespa.hosted.provision.maintenance.NodeFailer;
-import com.yahoo.vespa.hosted.provision.node.filter.NodeFilter;
import com.yahoo.vespa.hosted.provision.node.filter.StateFilter;
import com.yahoo.vespa.hosted.provision.persistence.CuratorDatabaseClient;
import com.yahoo.vespa.hosted.provision.restapi.NotFoundException;
@@ -32,6 +31,7 @@ import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.BiFunction;
+import java.util.function.Predicate;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
@@ -581,8 +581,8 @@ public class Nodes {
*
* @return the nodes in their new state
*/
- public List<Node> restart(NodeFilter filter) {
- return performOn(StateFilter.from(Node.State.active, filter),
+ public List<Node> restart(Predicate<Node> filter) {
+ return performOn(StateFilter.from(Node.State.active).and(filter),
(node, lock) -> write(node.withRestart(node.allocation().get().restartGeneration().withIncreasedWanted()),
lock));
}
@@ -592,7 +592,7 @@ public class Nodes {
*
* @return the nodes in their new state
*/
- public List<Node> reboot(NodeFilter filter) {
+ public List<Node> reboot(Predicate<Node> filter) {
return performOn(filter, (node, lock) -> write(node.withReboot(node.status().reboot().withIncreasedWanted()), lock));
}
@@ -601,7 +601,7 @@ public class Nodes {
*
* @return the nodes in their new state
*/
- public List<Node> upgradeOs(NodeFilter filter, Optional<Version> version) {
+ 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);
@@ -609,7 +609,7 @@ public class Nodes {
}
/** Retire nodes matching given filter */
- public List<Node> retire(NodeFilter filter, Agent agent, Instant instant) {
+ public List<Node> retire(Predicate<Node> filter, Agent agent, Instant instant) {
return performOn(filter, (node, lock) -> write(node.withWantToRetire(true, agent, instant), lock));
}
@@ -662,7 +662,7 @@ public class Nodes {
return db.writeTo(nodes, Agent.system, Optional.empty());
}
- private List<Node> performOn(NodeFilter filter, BiFunction<Node, Mutex, Node> action) {
+ private List<Node> performOn(Predicate<Node> filter, BiFunction<Node, Mutex, Node> action) {
return performOn(list().matching(filter), action);
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/ApplicationFilter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/ApplicationFilter.java
index aa285cd707d..d2226fa71b0 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/ApplicationFilter.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/ApplicationFilter.java
@@ -1,16 +1,13 @@
// 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.config.provision.ApplicationId;
-import com.yahoo.config.provision.ApplicationName;
-import com.yahoo.config.provision.InstanceName;
-import com.yahoo.config.provision.TenantName;
import com.yahoo.text.StringUtilities;
import com.yahoo.vespa.hosted.provision.Node;
import java.util.Objects;
import java.util.Set;
+import java.util.function.Predicate;
import java.util.stream.Collectors;
/**
@@ -18,33 +15,29 @@ import java.util.stream.Collectors;
*
* @author bratseth
*/
-public class ApplicationFilter extends NodeFilter {
+public class ApplicationFilter {
- private final Set<ApplicationId> applications;
+ private ApplicationFilter() {}
/** Creates a node filter which filters using the given host filter */
- private ApplicationFilter(Set<ApplicationId> applications, NodeFilter next) {
- super(next);
+ private static Predicate<Node> makePredicate(Set<ApplicationId> applications) {
Objects.requireNonNull(applications, "Applications set cannot be null, use an empty set");
- this.applications = applications;
+ if (applications.isEmpty()) return node -> true;
+ return node -> node.allocation().isPresent() && applications.contains(node.allocation().get().owner());
}
- @Override
- public boolean matches(Node node) {
- if ( ! applications.isEmpty() && ! (node.allocation().isPresent() && applications.contains(node.allocation().get().owner()))) return false;
- return nextMatches(node);
+ public static Predicate<Node> from(ApplicationId applicationId) {
+ return makePredicate(Set.of(applicationId));
}
- public static ApplicationFilter from(ApplicationId applicationId, NodeFilter next) {
- return new ApplicationFilter(ImmutableSet.of(applicationId), next);
+ public static Predicate<Node> from(Set<ApplicationId> applicationIds) {
+ return makePredicate(Set.copyOf(applicationIds));
}
- public static ApplicationFilter from(Set<ApplicationId> applicationIds, NodeFilter next) {
- return new ApplicationFilter(ImmutableSet.copyOf(applicationIds), next);
- }
-
- public static ApplicationFilter from(String applicationIds, NodeFilter next) {
- return new ApplicationFilter(StringUtilities.split(applicationIds).stream().map(ApplicationFilter::toApplicationId).collect(Collectors.toSet()), next);
+ public static Predicate<Node> from(String applicationIds) {
+ return makePredicate(StringUtilities.split(applicationIds).stream()
+ .map(ApplicationFilter::toApplicationId)
+ .collect(Collectors.toUnmodifiableSet()));
}
public static ApplicationId toApplicationId(String applicationIdString) {
@@ -52,7 +45,7 @@ public class ApplicationFilter extends NodeFilter {
if (parts.length != 3)
throw new IllegalArgumentException("Application id must be on the form tenant.application.instance, got '" +
applicationIdString + "'");
- return ApplicationId.from(TenantName.from(parts[0]), ApplicationName.from(parts[1]), InstanceName.from(parts[2]));
+ return ApplicationId.from(parts[0], parts[1], parts[2]);
}
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeFilter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeFilter.java
deleted file mode 100644
index 296b3ab798a..00000000000
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeFilter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-// 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.yahoo.vespa.hosted.provision.Node;
-
-import java.util.function.Predicate;
-
-/**
- * A chainable node filter
- *
- * @author bratseth
- */
-public abstract class NodeFilter implements Predicate<Node> {
-
- private final NodeFilter next;
-
- /** Creates a node filter with a chained filter, or null if this is the last filter */
- protected NodeFilter(NodeFilter next) {
- this.next = next;
- }
-
- /** Returns whether this node matches this filter */
- public abstract boolean matches(Node node);
-
- @Override
- public final boolean test(Node node) {
- return matches(node);
- }
-
- /** Returns whether this is a match according to the chained filter */
- protected final boolean nextMatches(Node node) {
- if (next == null) return true;
- return next.matches(node);
- }
-
-}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeHostFilter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeHostFilter.java
index ed66d085972..8891720ec33 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeHostFilter.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeHostFilter.java
@@ -1,47 +1,29 @@
// 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.yahoo.config.provision.ClusterMembership;
import com.yahoo.config.provision.HostFilter;
import com.yahoo.vespa.hosted.provision.Node;
+import com.yahoo.vespa.hosted.provision.node.Allocation;
import java.util.Objects;
-import java.util.Optional;
+import java.util.function.Predicate;
/**
* A node filter adaption of a host filter
*
* @author bratseth
*/
-public class NodeHostFilter extends NodeFilter {
+public class NodeHostFilter {
- private final HostFilter filter;
+ private NodeHostFilter() {}
/** Creates a node filter which filters using the given host filter */
- private NodeHostFilter(HostFilter filter, NodeFilter next) {
- super(next);
- this.filter = Objects.requireNonNull(filter, "filter cannot be null, use HostFilter.all()");
- }
-
- @Override
- public boolean matches(Node node) {
- if ( ! filter.matches(node.hostname(), node.flavor().name(), membership(node))) return false;
- return nextMatches(node);
- }
-
- private Optional<ClusterMembership> membership(Node node) {
- if (node.allocation().isPresent())
- return Optional.of(node.allocation().get().membership());
- else
- return Optional.empty();
- }
-
- public static NodeHostFilter from(HostFilter hostFilter) {
- return new NodeHostFilter(hostFilter, null);
- }
-
- public static NodeHostFilter from(HostFilter hostFilter, NodeFilter next) {
- return new NodeHostFilter(hostFilter, next);
+ public static Predicate<Node> from(HostFilter filter) {
+ Objects.requireNonNull(filter, "filter cannot be null, use HostFilter.all()");
+ return node -> filter.matches(
+ node.hostname(),
+ node.flavor().name(),
+ node.allocation().map(Allocation::membership));
}
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeListFilter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeListFilter.java
index 9bd9f6400d5..0e33eab6aba 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeListFilter.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeListFilter.java
@@ -1,43 +1,33 @@
// 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.vespa.hosted.provision.Node;
-import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Set;
+import java.util.function.Predicate;
/**
* A node filter which matches a particular list of nodes
*
* @author bratseth
*/
-public class NodeListFilter extends NodeFilter {
+public class NodeListFilter {
- private final Set<Node> nodes;
+ private NodeListFilter() {}
- private NodeListFilter(List<Node> nodes, NodeFilter next) {
- super(next);
- this.nodes = ImmutableSet.copyOf(Objects.requireNonNull(nodes, "nodes cannot be null"));
+ private static Predicate<Node> makePredicate(List<Node> nodes) {
+ Objects.requireNonNull(nodes, "nodes cannot be null");
+ Set<Node> nodesSet = Set.copyOf(nodes);
+ return nodesSet::contains;
}
- @Override
- public boolean matches(Node node) {
- return nodes.contains(node);
+ public static Predicate<Node> from(Node nodes) {
+ return makePredicate(List.of(nodes));
}
- public static NodeListFilter from(Node nodes) {
- return new NodeListFilter(Collections.singletonList(nodes), null);
+ public static Predicate<Node> from(List<Node> nodes) {
+ return makePredicate(nodes);
}
-
- public static NodeListFilter from(List<Node> nodes) {
- return new NodeListFilter(nodes, null);
- }
-
- public static NodeListFilter from(List<Node> nodes, NodeFilter next) {
- return new NodeListFilter(nodes, next);
- }
-
}
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
index e2718cf8b68..5c3040b12bd 100644
--- 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
@@ -5,31 +5,25 @@ import com.yahoo.component.Version;
import com.yahoo.vespa.hosted.provision.Node;
import java.util.Objects;
+import java.util.function.Predicate;
/**
* Filter nodes by their OS version.
*
* @author mpolden
*/
-public class NodeOsVersionFilter extends NodeFilter {
+public class NodeOsVersionFilter {
- private final Version version;
+ private NodeOsVersionFilter() {}
- private NodeOsVersionFilter(Version version, NodeFilter next) {
- super(next);
- this.version = Objects.requireNonNull(version, "version cannot be null");
+ private static Predicate<Node> makePredicate(Version version) {
+ Objects.requireNonNull(version, "version cannot be null");
+ if (version.isEmpty()) return node -> true;
+ return node -> node.status().osVersion().matches(version);
}
- @Override
- public boolean matches(Node node) {
- if (!version.isEmpty() && !node.status().osVersion().matches(version)) {
- return false;
- }
- return nextMatches(node);
- }
-
- public static NodeOsVersionFilter from(String version, NodeFilter filter) {
- return new NodeOsVersionFilter(Version.fromString(version), filter);
+ public static Predicate<Node> from(String version) {
+ return makePredicate(Version.fromString(version));
}
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeTypeFilter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeTypeFilter.java
index 2a50961e0a4..cac7b870366 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeTypeFilter.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/NodeTypeFilter.java
@@ -1,42 +1,38 @@
// 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.config.provision.NodeType;
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.function.Predicate;
import java.util.stream.Collectors;
/**
* @author bratseth
*/
-public class NodeTypeFilter extends NodeFilter {
+public class NodeTypeFilter {
- private final Set<NodeType> types;
-
- protected NodeTypeFilter(Set<NodeType> types, NodeFilter next) {
- super(next);
- this.types = ImmutableSet.copyOf(Objects.requireNonNull(types, "Node types cannot be null"));
- }
+ private NodeTypeFilter() {}
- @Override
- public boolean matches(Node node) {
- if (! types.isEmpty() && ! types.contains(node.type())) return false;
- return nextMatches(node);
+ private static Predicate<Node> makePredicate(EnumSet<NodeType> types) {
+ Objects.requireNonNull(types, "Node types cannot be null");
+ if (types.isEmpty()) return node -> true;
+ return node -> types.contains(node.type());
}
/** Returns a copy of the given filter which only matches for the given type */
- public static NodeTypeFilter from(NodeType type, NodeFilter filter) {
- return new NodeTypeFilter(Collections.singleton(type), filter);
+ public static Predicate<Node> from(NodeType type) {
+ return makePredicate(EnumSet.of(type));
}
/** Returns a node filter which matches a comma or space-separated list of types */
- public static NodeTypeFilter from(String types, NodeFilter next) {
- return new NodeTypeFilter(StringUtilities.split(types).stream().map(NodeType::valueOf).collect(Collectors.toSet()), next);
+ public static Predicate<Node> from(String types) {
+ return makePredicate(StringUtilities.split(types).stream()
+ .map(NodeType::valueOf)
+ .collect(Collectors.toCollection(() -> EnumSet.noneOf(NodeType.class))));
}
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/ParentHostFilter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/ParentHostFilter.java
index 3c51161d4ca..25ce0373f15 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/ParentHostFilter.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/filter/ParentHostFilter.java
@@ -1,12 +1,12 @@
// 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.Objects;
import java.util.Set;
+import java.util.function.Predicate;
import java.util.stream.Collectors;
/**
@@ -14,27 +14,19 @@ import java.util.stream.Collectors;
*
* @author dybis
*/
-public class ParentHostFilter extends NodeFilter {
+public class ParentHostFilter {
- private final Set<String> parentHostNames;
+ private ParentHostFilter() {}
/** Creates a node filter which filters using the given parent host name */
- private ParentHostFilter(Set<String> parentHostNames, NodeFilter next) {
- super(next);
- this.parentHostNames = ImmutableSet.copyOf(Objects.requireNonNull(parentHostNames, "parentHostNames cannot be null"));
- }
-
- @Override
- public boolean matches(Node node) {
- if (! parentHostNames.isEmpty() && (
- ! node.parentHostname().isPresent() || ! parentHostNames.contains(node.parentHostname().get())))
- return false;
- return nextMatches(node);
+ private static Predicate<Node> makePredicate(Set<String> parentHostNames) {
+ Objects.requireNonNull(parentHostNames, "parentHostNames cannot be null");
+ if (parentHostNames.isEmpty()) return node -> true;
+ return node -> node.parentHostname().isPresent() && parentHostNames.contains(node.parentHostname().get());
}
/** Returns a copy of the given filter which only matches for the given parent */
- public static ParentHostFilter from(String parentNames, NodeFilter filter) {
- return new ParentHostFilter(StringUtilities.split(parentNames).stream().collect(Collectors.toSet()), filter);
+ public static Predicate<Node> from(String parentNames) {
+ return makePredicate(StringUtilities.split(parentNames).stream().collect(Collectors.toUnmodifiableSet()));
}
-
}
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 a2590e8c727..48f9513a434 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
@@ -6,7 +6,7 @@ import com.yahoo.vespa.hosted.provision.Node;
import java.util.EnumSet;
import java.util.Objects;
-import java.util.Set;
+import java.util.function.Predicate;
import java.util.stream.Collectors;
/**
@@ -14,36 +14,30 @@ import java.util.stream.Collectors;
*
* @author bratseth
*/
-public class StateFilter extends NodeFilter {
+public class StateFilter {
- private final Set<Node.State> states;
+ private StateFilter() {}
- /** Creates a node filter which filters using the given host filter */
- private StateFilter(Set<Node.State> states, NodeFilter next) {
- super(next);
+ private static Predicate<Node> makePredicate(EnumSet<Node.State> states) {
Objects.requireNonNull(states, "state cannot be null, use an empty set");
- this.states = EnumSet.copyOf(states);
- }
-
- @Override
- public boolean matches(Node node) {
- if ( ! states.contains(node.state())) return false;
- return nextMatches(node);
+ return node -> states.contains(node.state());
}
/** 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(EnumSet.of(state), filter);
+ public static Predicate<Node> from(Node.State state) {
+ return makePredicate(EnumSet.of(state));
}
/** Returns a node filter which matches a comma or space-separated list of states */
- public static StateFilter from(String states, boolean includeDeprovisioned, NodeFilter next) {
+ public static Predicate<Node> from(String states, boolean includeDeprovisioned) {
if (states == null) {
- return new StateFilter(includeDeprovisioned ?
- EnumSet.allOf(Node.State.class) : EnumSet.complementOf(EnumSet.of(Node.State.deprovisioned)), next);
+ return makePredicate(includeDeprovisioned ?
+ EnumSet.allOf(Node.State.class) : EnumSet.complementOf(EnumSet.of(Node.State.deprovisioned)));
}
- return new StateFilter(StringUtilities.split(states).stream().map(Node.State::valueOf).collect(Collectors.toSet()), next);
+ return makePredicate(StringUtilities.split(states).stream()
+ .map(Node.State::valueOf)
+ .collect(Collectors.toCollection(() -> EnumSet.noneOf(Node.State.class))));
}
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java
index a54acbe52ae..ab881a68ebe 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java
@@ -122,7 +122,7 @@ public class NodeRepositoryProvisioner implements Provisioner {
@Override
public void restart(ApplicationId application, HostFilter filter) {
- nodeRepository.nodes().restart(ApplicationFilter.from(application, NodeHostFilter.from(filter)));
+ nodeRepository.nodes().restart(ApplicationFilter.from(application).and(NodeHostFilter.from(filter)));
}
@Override
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java
index 1528a455046..1b3b2f81f11 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java
@@ -15,7 +15,6 @@ import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeRepository;
import com.yahoo.vespa.hosted.provision.node.Address;
import com.yahoo.vespa.hosted.provision.node.History;
-import com.yahoo.vespa.hosted.provision.node.filter.NodeFilter;
import com.yahoo.vespa.orchestrator.Orchestrator;
import com.yahoo.vespa.orchestrator.status.HostInfo;
import com.yahoo.vespa.orchestrator.status.HostStatus;
@@ -25,6 +24,7 @@ import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
+import java.util.function.Predicate;
/**
* @author bratseth
@@ -40,7 +40,7 @@ class NodesResponse extends SlimeJsonResponse {
/** The parent url of nodes */
private final String nodeParentUrl;
- private final NodeFilter filter;
+ private final Predicate<Node> filter;
private final boolean recursive;
private final Function<HostName, Optional<HostInfo>> orchestrator;
private final NodeRepository nodeRepository;
@@ -104,7 +104,7 @@ class NodesResponse extends SlimeJsonResponse {
private void toSlime(List<Node> nodes, Cursor array) {
for (Node node : nodes) {
- if ( ! filter.matches(node)) continue;
+ if ( ! filter.test(node)) continue;
toSlime(node, recursive, array.addObject());
}
}
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 7deaf36ba17..c7bd12204a6 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
@@ -36,7 +36,6 @@ import com.yahoo.vespa.hosted.provision.node.Address;
import com.yahoo.vespa.hosted.provision.node.Agent;
import com.yahoo.vespa.hosted.provision.node.IP;
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;
@@ -58,6 +57,7 @@ import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
+import java.util.function.Predicate;
import java.util.logging.Level;
import java.util.stream.Collectors;
@@ -330,17 +330,16 @@ public class NodesV2ApiHandler extends LoggingRequestHandler {
return NodeSerializer.typeFrom(object.asString());
}
- public static NodeFilter toNodeFilter(HttpRequest request) {
- NodeFilter filter = NodeHostFilter.from(HostFilter.from(request.getProperty("hostname"),
- request.getProperty("flavor"),
- request.getProperty("clusterType"),
- request.getProperty("clusterId")));
- filter = ApplicationFilter.from(request.getProperty("application"), 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);
- return filter;
+ public static Predicate<Node> toNodeFilter(HttpRequest request) {
+ return NodeHostFilter.from(HostFilter.from(request.getProperty("hostname"),
+ request.getProperty("flavor"),
+ request.getProperty("clusterType"),
+ request.getProperty("clusterId")))
+ .and(ApplicationFilter.from(request.getProperty("application")))
+ .and(StateFilter.from(request.getProperty("state"), request.getBooleanProperty("includeDeprovisioned")))
+ .and(NodeTypeFilter.from(request.getProperty("type")))
+ .and(ParentHostFilter.from(request.getProperty("parentHost")))
+ .and(NodeOsVersionFilter.from(request.getProperty("osVersion")));
}
private static boolean isPatchOverride(HttpRequest request) {
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java
index 924d38cc6c2..5043529507f 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java
@@ -185,7 +185,7 @@ public class RetiredExpirerTest {
// Set wantToRetire on all 3 config servers
List<Node> wantToRetireNodes = tester.nodeRepository().nodes()
- .retire(NodeTypeFilter.from(NodeType.config, null), Agent.operator, Instant.now());
+ .retire(NodeTypeFilter.from(NodeType.config), Agent.operator, Instant.now());
assertEquals(3, wantToRetireNodes.size());
// Redeploy to retire all 3 config servers
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java
index df101c416c1..f4333dfa0c3 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java
@@ -271,7 +271,7 @@ public class ProvisioningTester {
for (Node node : nodeRepository.nodes().list(Node.State.active).owner(application)) {
int expectedRestarts = 0;
for (HostFilter filter : filters)
- if (NodeHostFilter.from(filter).matches(node))
+ if (NodeHostFilter.from(filter).test(node))
expectedRestarts++;
assertEquals(expectedRestarts, node.allocation().get().restartGeneration().wanted());
}