diff options
author | Martin Polden <mpolden@mpolden.no> | 2021-07-19 11:25:48 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2021-07-19 11:25:48 +0200 |
commit | e5cdbc1cc713c4013776bf471b6242c6b6c7d5fd (patch) | |
tree | 302fc9bcc2649310cdb52ebab0b9944df779dbc6 /controller-api | |
parent | b4e04e695d8d72bc097328fe95e98782d84194af (diff) |
Replace list overloading with NodeFilter
Diffstat (limited to 'controller-api')
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); |