summaryrefslogtreecommitdiffstats
path: root/controller-api
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2021-07-19 11:25:48 +0200
committerMartin Polden <mpolden@mpolden.no>2021-07-19 11:25:48 +0200
commite5cdbc1cc713c4013776bf471b6242c6b6c7d5fd (patch)
tree302fc9bcc2649310cdb52ebab0b9944df779dbc6 /controller-api
parentb4e04e695d8d72bc097328fe95e98782d84194af (diff)
Replace list overloading with NodeFilter
Diffstat (limited to 'controller-api')
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeFilter.java86
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeRepository.java19
2 files changed, 88 insertions, 17 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeFilter.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeFilter.java
new file mode 100644
index 00000000000..abd526c4803
--- /dev/null
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeFilter.java
@@ -0,0 +1,86 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.controller.api.integration.configserver;
+
+import com.google.common.collect.ImmutableSet;
+import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.HostName;
+
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * A filter for listing nodes.
+ *
+ * This is immutable.
+ *
+ * @author mpolden
+ */
+public class NodeFilter {
+
+ private final boolean includeDeprovisioned;
+ private final Set<Node.State> states;
+ private final Set<HostName> hostnames;
+ private final Set<ApplicationId> applications;
+
+ private NodeFilter(boolean includeDeprovisioned, Set<Node.State> states, Set<HostName> hostnames,
+ Set<ApplicationId> applications) {
+ this.includeDeprovisioned = includeDeprovisioned;
+ // Uses Guava Set to preserve insertion order
+ this.states = ImmutableSet.copyOf(Objects.requireNonNull(states));
+ this.hostnames = ImmutableSet.copyOf(Objects.requireNonNull(hostnames));
+ this.applications = ImmutableSet.copyOf(Objects.requireNonNull(applications));
+ if (!includeDeprovisioned && states.contains(Node.State.deprovisioned)) {
+ throw new IllegalArgumentException("Must include deprovisioned nodes when matching deprovisioned state");
+ }
+ }
+
+ public boolean includeDeprovisioned() {
+ return includeDeprovisioned;
+ }
+
+ public Set<Node.State> states() {
+ return states;
+ }
+
+ public Set<HostName> hostnames() {
+ return hostnames;
+ }
+
+ public Set<ApplicationId> applications() {
+ return applications;
+ }
+
+ public NodeFilter includeDeprovisioned(boolean includeDeprovisioned) {
+ return new NodeFilter(includeDeprovisioned, states, hostnames, applications);
+ }
+
+ public NodeFilter states(Node.State... states) {
+ return states(ImmutableSet.copyOf(states));
+ }
+
+ public NodeFilter states(Set<Node.State> states) {
+ return new NodeFilter(includeDeprovisioned, states, hostnames, applications);
+ }
+
+ public NodeFilter hostnames(HostName... hostnames) {
+ return hostnames(ImmutableSet.copyOf(hostnames));
+ }
+
+ public NodeFilter hostnames(Set<HostName> hostnames) {
+ return new NodeFilter(includeDeprovisioned, states, hostnames, applications);
+ }
+
+ public NodeFilter applications(ApplicationId... applications) {
+ return applications(ImmutableSet.copyOf(applications));
+ }
+
+ public NodeFilter applications(Set<ApplicationId> applications) {
+ return new NodeFilter(includeDeprovisioned, states, hostnames, applications);
+ }
+
+ /** A filter which matches all nodes, except deprovisioned ones */
+ public static NodeFilter all() {
+ return new NodeFilter(false, Set.of(), Set.of(), Set.of());
+ }
+
+}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeRepository.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeRepository.java
index 60b24ad8c0b..2191b31b88f 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeRepository.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/NodeRepository.java
@@ -13,8 +13,6 @@ import java.time.Duration;
import java.util.List;
import java.util.Map;
import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
/**
* Node repository interface intended for use by the controller.
@@ -35,21 +33,8 @@ public interface NodeRepository {
/** Get node from zone */
Node getNode(ZoneId zone, String hostname);
- /** List all nodes in given zone */
- List<Node> list(ZoneId zone, boolean includeDeprovisioned);
-
- /** List all nodes in zone having given hostnames */
- List<Node> list(ZoneId zone, List<HostName> hostnames);
-
- /** List all nodes in zone owned by given application */
- List<Node> list(ZoneId zone, ApplicationId application);
-
- /** List all nodes in states, in zone owned by given application */
- default List<Node> list(ZoneId zone, ApplicationId application, Set<Node.State> states) {
- return list(zone, application).stream()
- .filter(node -> states.contains(node.state()))
- .collect(Collectors.toList());
- }
+ /** List nodes in given zone matching given filter */
+ List<Node> list(ZoneId zone, NodeFilter filter);
/** Get node repository's view of given application */
Application getApplication(ZoneId zone, ApplicationId application);