diff options
author | Martin Polden <mpolden@mpolden.no> | 2021-07-19 12:38:34 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-19 12:38:34 +0200 |
commit | b8a1426317d81829ddb0e97f3b829fc9668a3404 (patch) | |
tree | 302fc9bcc2649310cdb52ebab0b9944df779dbc6 | |
parent | b4e04e695d8d72bc097328fe95e98782d84194af (diff) | |
parent | e5cdbc1cc713c4013776bf471b6242c6b6c7d5fd (diff) |
Merge pull request #18634 from vespa-engine/mpolden/controller-node-cleanup-4
Replace list overloading with NodeFilter
29 files changed, 187 insertions, 93 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); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java index e9b4b25672a..804604cfc52 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java @@ -36,6 +36,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServ import com.yahoo.vespa.hosted.controller.api.integration.configserver.ContainerEndpoint; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Log; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.deployment.ApplicationStore; import com.yahoo.vespa.hosted.controller.api.integration.deployment.ApplicationVersion; import com.yahoo.vespa.hosted.controller.api.integration.deployment.ArtifactRepository; @@ -80,7 +81,6 @@ import java.time.Instant; import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -277,8 +277,9 @@ public class ApplicationController { /** Reads the oldest installed platform for the given application and zone from the node repo of that zone. */ private Optional<Version> oldestInstalledPlatform(JobId job) { return configServer.nodeRepository().list(job.type().zone(controller.system()), - job.application(), - EnumSet.of(active, reserved)) + NodeFilter.all() + .applications(job.application()) + .states(active, reserved)) .stream() .map(Node::currentVersion) .filter(version -> ! version.isEmpty()) diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java index c49e3c88df3..986e89d03f5 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java @@ -1,7 +1,6 @@ // 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.deployment; -import com.google.common.collect.ImmutableSet; import com.yahoo.component.Version; import com.yahoo.config.application.api.DeploymentInstanceSpec; import com.yahoo.config.application.api.DeploymentSpec; @@ -31,6 +30,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.LogEntry; import com.yahoo.vespa.hosted.controller.api.integration.certificates.EndpointCertificateException; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerException; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.configserver.PrepareResponse; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ServiceConvergence; import com.yahoo.vespa.hosted.controller.api.integration.deployment.ApplicationVersion; @@ -103,6 +103,7 @@ import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toSet; /** * Runs steps of a deployment job against its provided controller. @@ -313,10 +314,14 @@ public class InternalStepRunner implements StepRunner { return Optional.empty(); } List<Node> nodes = controller.serviceRegistry().configServer().nodeRepository().list(id.type().zone(controller.system()), - id.application(), - Set.of(active)); + NodeFilter.all() + .applications(id.application()) + .states(active)); + + Set<HostName> parentHostnames = nodes.stream().map(node -> node.parentHostname().get()).collect(toSet()); List<Node> parents = controller.serviceRegistry().configServer().nodeRepository().list(id.type().zone(controller.system()), - nodes.stream().map(node -> node.parentHostname().get()).collect(toList())); + NodeFilter.all() + .hostnames(parentHostnames)); NodeList nodeList = NodeList.of(nodes, parents, services.get()); boolean firstTick = run.convergenceSummary().isEmpty(); if (firstTick) { // Run the first time (for each convergence step). @@ -419,10 +424,13 @@ public class InternalStepRunner implements StepRunner { : Optional.empty(); } List<Node> nodes = controller.serviceRegistry().configServer().nodeRepository().list(zone, - testerId, - ImmutableSet.of(active, reserved)); + NodeFilter.all() + .applications(testerId) + .states(active, reserved)); + Set<HostName> parentHostnames = nodes.stream().map(node -> node.parentHostname().get()).collect(toSet()); List<Node> parents = controller.serviceRegistry().configServer().nodeRepository().list(zone, - nodes.stream().map(node -> node.parentHostname().get()).collect(toList())); + NodeFilter.all() + .hostnames(parentHostnames)); NodeList nodeList = NodeList.of(nodes, parents, services.get()); logger.log(nodeList.asList().stream() .flatMap(node -> nodeDetails(node, false)) diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeManagementAssessor.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeManagementAssessor.java index fc7b256a644..39edcde325b 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeManagementAssessor.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeManagementAssessor.java @@ -5,6 +5,7 @@ import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeRepository; import java.util.Collection; @@ -25,7 +26,7 @@ public class ChangeManagementAssessor { } public Assessment assessment(List<String> impactedHostnames, ZoneId zone) { - return assessmentInner(impactedHostnames, nodeRepository.list(zone, false), zone); + return assessmentInner(impactedHostnames, nodeRepository.list(zone, NodeFilter.all()), zone); } Assessment assessmentInner(List<String> impactedHostnames, List<Node> allNodes, ZoneId zone) { diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeRequestMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeRequestMaintainer.java index 14e3e685a8a..f491c87f2a0 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeRequestMaintainer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeRequestMaintainer.java @@ -5,6 +5,7 @@ import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.vespa.hosted.controller.Controller; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeRepository; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.ChangeRequest; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.ChangeRequestClient; @@ -100,7 +101,7 @@ public class ChangeRequestMaintainer extends ControllerMaintainer { .stream() .collect(Collectors.toMap( zone -> zone, - zone -> nodeRepository.list(zone, false) + zone -> nodeRepository.list(zone, NodeFilter.all()) .stream() .map(node -> node.hostname().value()) .collect(Collectors.toList()) diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/CloudEventTracker.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/CloudEventTracker.java index 2758eb52608..47a9bd5e8e9 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/CloudEventTracker.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/CloudEventTracker.java @@ -8,6 +8,7 @@ import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.api.integration.aws.CloudEventFetcher; import com.yahoo.vespa.hosted.controller.api.integration.aws.CloudEvent; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeRepository; import java.time.Duration; @@ -53,7 +54,7 @@ public class CloudEventTracker extends ControllerMaintainer { /** Deprovision any host affected by given event */ private void deprovisionAffectedHosts(String region, CloudEvent event) { for (var zone : zonesByCloudNativeRegion.get(region)) { - for (var node : nodeRepository.list(zone.getId(), false)) { + for (var node : nodeRepository.list(zone.getId(), NodeFilter.all())) { if (!affects(node, event)) continue; log.info("Retiring and deprovisioning " + node.hostname().value() + " in " + zone.getId() + ": Affected by maintenance event " + event.instanceEventId); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/HostInfoUpdater.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/HostInfoUpdater.java index 5622fcdac4e..a66886608a5 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/HostInfoUpdater.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/HostInfoUpdater.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.controller.maintenance; import com.yahoo.config.provision.SystemName; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeRepository; import com.yahoo.vespa.hosted.controller.api.integration.entity.EntityService; import com.yahoo.vespa.hosted.controller.api.integration.entity.NodeEntity; @@ -44,7 +45,7 @@ public class HostInfoUpdater extends ControllerMaintainer { int hostsUpdated = 0; try { for (var zone : controller().zoneRegistry().zones().controllerUpgraded().all().ids()) { - for (var node : nodeRepository.list(zone, false)) { + for (var node : nodeRepository.list(zone, NodeFilter.all())) { if (!node.type().isHost()) continue; NodeEntity nodeEntity = nodeEntities.get(registeredHostnameOf(node)); if (nodeEntity == null) continue; diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/InfrastructureUpgrader.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/InfrastructureUpgrader.java index 221a7524ab1..1ea57d3ccb4 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/InfrastructureUpgrader.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/InfrastructureUpgrader.java @@ -8,6 +8,7 @@ import com.yahoo.config.provision.zone.ZoneApi; import com.yahoo.text.Text; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.application.SystemApplication; import com.yahoo.yolean.Exceptions; @@ -112,7 +113,7 @@ public abstract class InfrastructureUpgrader<VERSION> extends ControllerMaintain try { return controller().serviceRegistry().configServer() .nodeRepository() - .list(zone.getVirtualId(), application.id()) + .list(zone.getVirtualId(), NodeFilter.all().applications(application.id())) .stream() .filter(node -> expectUpgradeOf(node, application, zone)) .map(versionField) diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java index 39ad233ce46..854780dd336 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java @@ -12,6 +12,7 @@ import com.yahoo.jdisc.Metric; import com.yahoo.vespa.hosted.controller.ApplicationController; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeRepository; import com.yahoo.vespa.hosted.controller.api.integration.resource.MeteringClient; import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceAllocation; @@ -142,7 +143,7 @@ public class ResourceMeterMaintainer extends ControllerMaintainer { return controller().zoneRegistry().zones() .reachable().zones().stream() .map(ZoneApi::getId) - .map(zoneId -> createResourceSnapshotsFromNodes(zoneId, nodeRepository.list(zoneId, false))) + .map(zoneId -> createResourceSnapshotsFromNodes(zoneId, nodeRepository.list(zoneId, NodeFilter.all()))) .flatMap(Collection::stream) .collect(Collectors.toList()); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceTagMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceTagMaintainer.java index e0441df025b..4d2c0a87bc0 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceTagMaintainer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceTagMaintainer.java @@ -9,10 +9,10 @@ import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.api.integration.aws.ResourceTagger; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import java.time.Duration; import java.util.Map; -import java.util.Optional; import java.util.logging.Level; import java.util.stream.Collectors; @@ -47,7 +47,7 @@ public class ResourceTagMaintainer extends ControllerMaintainer { private Map<HostName, ApplicationId> getTenantOfParentHosts(ZoneId zoneId) { return controller().serviceRegistry().configServer().nodeRepository() - .list(zoneId, false) + .list(zoneId, NodeFilter.all()) .stream() .filter(node -> node.type().isHost()) .collect(Collectors.toMap( diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VcmrMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VcmrMaintainer.java index 69c9bd83ba5..cc5bf5655f4 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VcmrMaintainer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VcmrMaintainer.java @@ -8,6 +8,7 @@ import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.text.Text; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeRepository; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.ChangeRequest; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.ChangeRequest.Impact; @@ -245,7 +246,7 @@ public class VcmrMaintainer extends ControllerMaintainer { .stream() .collect(Collectors.toMap( zone -> zone, - zone -> nodeRepository.list(zone, false) + zone -> nodeRepository.list(zone, NodeFilter.all()) )); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/metric/CostCalculator.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/metric/CostCalculator.java index b6468464a0b..c3b2d794a71 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/metric/CostCalculator.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/metric/CostCalculator.java @@ -6,6 +6,7 @@ import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.TenantName; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.api.identifiers.Property; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeRepository; import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceAllocation; import com.yahoo.vespa.hosted.controller.application.SystemApplication; @@ -48,7 +49,7 @@ public class CostCalculator { Map<Property, ResourceAllocation> allocationByProperty = new HashMap<>(); var nodes = controller.zoneRegistry().zones() .reachable().in(Environment.prod).ofCloud(cloudName).zones().stream() - .flatMap(zone -> uncheck(() -> nodeRepository.list(zone.getId(), false).stream())) + .flatMap(zone -> uncheck(() -> nodeRepository.list(zone.getId(), NodeFilter.all()).stream())) .filter(node -> node.owner().isPresent() && !node.owner().get().tenant().equals(SystemApplication.TENANT)) .collect(Collectors.toList()); var totalAllocation = ResourceAllocation.ZERO; diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java index 2b884cc950b..2a06fc76f39 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java @@ -57,6 +57,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.configserver.Cluster; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerException; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Log; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.deployment.ApplicationVersion; import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobId; import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType; @@ -865,7 +866,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { private HttpResponse nodes(String tenantName, String applicationName, String instanceName, String environment, String region) { ApplicationId id = ApplicationId.from(tenantName, applicationName, instanceName); ZoneId zone = requireZone(environment, region); - List<Node> nodes = controller.serviceRegistry().configServer().nodeRepository().list(zone, id); + List<Node> nodes = controller.serviceRegistry().configServer().nodeRepository().list(zone, NodeFilter.all().applications(id)); Slime slime = new Slime(); Cursor nodesArray = slime.setObject().setArray("nodes"); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandler.java index cffdd9fc928..c0690f73e50 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandler.java @@ -16,6 +16,7 @@ import com.yahoo.slime.Inspector; import com.yahoo.slime.Slime; import com.yahoo.slime.SlimeUtils; import com.yahoo.vespa.hosted.controller.Controller; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.ChangeRequest; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.VespaChangeRequest; import com.yahoo.vespa.hosted.controller.auditlog.AuditLoggingRequestHandler; @@ -278,10 +279,9 @@ public class ChangeManagementApiHandler extends AuditLoggingRequestHandler { } private Optional<ZoneId> affectedZone(List<String> hosts) { - var affectedHosts = hosts.stream() - .map(HostName::from) - .collect(Collectors.toList()); - + NodeFilter affectedHosts = NodeFilter.all().hostnames(hosts.stream() + .map(HostName::from) + .collect(Collectors.toSet())); for (var zone : getProdZones()) { var affectedHostsInZone = controller.serviceRegistry().configServer().nodeRepository().list(zone, affectedHosts); if (!affectedHostsInZone.isEmpty()) @@ -293,7 +293,7 @@ public class ChangeManagementApiHandler extends AuditLoggingRequestHandler { private List<String> hostsOnSwitch(List<String> switches) { return getProdZones().stream() - .flatMap(zone -> controller.serviceRegistry().configServer().nodeRepository().list(zone, false).stream()) + .flatMap(zone -> controller.serviceRegistry().configServer().nodeRepository().list(zone, NodeFilter.all()).stream()) .filter(node -> node.switchHostname().map(switches::contains).orElse(false)) .map(node -> node.hostname().value()) .collect(Collectors.toList()); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersionStatus.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersionStatus.java index 78c7b36181e..92351df9430 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersionStatus.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersionStatus.java @@ -6,6 +6,7 @@ import com.yahoo.component.Version; import com.yahoo.config.provision.CloudName; import com.yahoo.config.provision.zone.ZoneApi; import com.yahoo.vespa.hosted.controller.Controller; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.application.SystemApplication; import com.yahoo.vespa.hosted.controller.maintenance.OsUpgrader; @@ -71,7 +72,7 @@ public class OsVersionStatus { .osVersion(application.nodeType()) .orElse(Version.emptyVersion); - for (var node : controller.serviceRegistry().configServer().nodeRepository().list(zone.getVirtualId(), application.id())) { + for (var node : controller.serviceRegistry().configServer().nodeRepository().list(zone.getVirtualId(), NodeFilter.all().applications(application.id()))) { if (!OsUpgrader.canUpgrade(node)) continue; Optional<Instant> suspendedAt = node.suspendedSince(); NodeVersion nodeVersion = new NodeVersion(node.hostname(), zone.getVirtualId(), node.currentOsVersion(), diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java index beefaadb2a1..1833e7b3b35 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.controller.versions; import com.yahoo.component.Version; import com.yahoo.config.provision.HostName; import com.yahoo.vespa.hosted.controller.Controller; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.application.ApplicationList; import com.yahoo.vespa.hosted.controller.application.SystemApplication; import com.yahoo.vespa.hosted.controller.maintenance.SystemUpgrader; @@ -156,7 +157,7 @@ public class VersionStatus { for (var zone : controller.zoneRegistry().zones().controllerUpgraded().zones()) { for (var application : SystemApplication.notController()) { var nodes = controller.serviceRegistry().configServer().nodeRepository() - .list(zone.getId(), application.id()).stream() + .list(zone.getId(), NodeFilter.all().applications(application.id())).stream() .filter(SystemUpgrader::eligibleForUpgrade) .collect(Collectors.toList()); if (nodes.isEmpty()) continue; diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java index 5d6f1965009..420d0be04ac 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java @@ -20,6 +20,7 @@ import com.yahoo.vespa.hosted.controller.ControllerTester; import com.yahoo.vespa.hosted.controller.Instance; import com.yahoo.vespa.hosted.controller.api.identifiers.DeploymentId; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerException; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.deployment.ApplicationVersion; import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobId; import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType; @@ -192,7 +193,8 @@ public class DeploymentContext { for (var spec : application().deploymentSpec().instances()) for (JobType type : new DeploymentSteps(spec, tester.controller()::system).productionJobs()) assertTrue(tester.configServer().nodeRepository() - .list(type.zone(tester.controller().system()), applicationId.defaultInstance()).stream() // TODO jonmv: support more + .list(type.zone(tester.controller().system()), + NodeFilter.all().applications(applicationId.defaultInstance())).stream() // TODO jonmv: support more .allMatch(node -> node.currentVersion().equals(version))); assertFalse(instance().change().hasTargets()); @@ -543,7 +545,7 @@ public class DeploymentContext { assertTrue(jobs.run(id).get().hasEnded()); assertFalse(jobs.run(id).get().hasFailed()); assertEquals(job.type().isProduction(), instance().deployments().containsKey(zone)); - assertTrue(configServer().nodeRepository().list(zone, TesterId.of(id.application()).id()).isEmpty()); + assertTrue(configServer().nodeRepository().list(zone, NodeFilter.all().applications(TesterId.of(id.application()).id())).isEmpty()); } private JobId jobId(JobType type) { diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java index 5e79f1e4d12..d685c6a2354 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java @@ -20,6 +20,7 @@ import com.yahoo.vespa.hosted.controller.api.application.v4.model.configserverbi import com.yahoo.vespa.hosted.controller.api.integration.LogEntry; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerException; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType; import com.yahoo.vespa.hosted.controller.api.integration.deployment.RunId; import com.yahoo.vespa.hosted.controller.api.integration.deployment.TesterCloud; @@ -194,7 +195,7 @@ public class InternalStepRunnerTest { assertEquals(succeeded, tester.jobs().last(app.instanceId(), JobType.stagingTest).get().stepStatuses().get(Step.installTester)); Node systemTestNode = tester.configServer().nodeRepository().list(JobType.systemTest.zone(system()), - app.instanceId()).iterator().next(); + NodeFilter.all().applications(app.instanceId())).iterator().next(); tester.clock().advance(InternalStepRunner.Timeouts.of(system()).noNodesDown().minus(Duration.ofSeconds(1))); tester.configServer().nodeRepository().putNodes(JobType.systemTest.zone(system()), Node.builder(systemTestNode) diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java index c66cc3710c9..e18542108c0 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java @@ -31,6 +31,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.configserver.ContainerE import com.yahoo.vespa.hosted.controller.api.integration.configserver.LoadBalancer; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Log; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.configserver.PrepareResponse; import com.yahoo.vespa.hosted.controller.api.integration.configserver.ProxyResponse; import com.yahoo.vespa.hosted.controller.api.integration.configserver.QuotaUsage; @@ -133,7 +134,7 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer new com.yahoo.vespa.hosted.controller.api.integration.configserver.Application(application, List.of(cluster))); - Node parent = nodeRepository().list(zone, SystemApplication.tenantHost.id()).stream().findAny() + Node parent = nodeRepository().list(zone, NodeFilter.all().applications(SystemApplication.tenantHost.id())).stream().findAny() .orElseThrow(() -> new IllegalStateException("No parent hosts in " + zone)); nodeRepository().putNodes(zone, Node.builder().hostname(hostFor(application, zone)) .state(Node.State.reserved) @@ -189,7 +190,7 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer /** Converge all services belonging to the given application */ public void convergeServices(ApplicationId application, ZoneId zone) { - List<Node> nodes = nodeRepository.list(zone, application); + List<Node> nodes = nodeRepository.list(zone, NodeFilter.all().applications(application)); serviceStatus.put(new DeploymentId(application, zone), new ServiceConvergence(application, zone, true, @@ -219,7 +220,7 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer /** Set version for an application in a given zone */ public void setVersion(Version version, ApplicationId application, ZoneId zone) { - setVersion(zone, nodeRepository.list(zone, application), version, false); + setVersion(zone, nodeRepository.list(zone, NodeFilter.all().applications(application)), version, false); } /** Set version for nodeCount number of nodes in application in a given zone */ @@ -229,7 +230,7 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer /** Set OS version for an application in a given zone */ public void setOsVersion(Version version, ApplicationId application, ZoneId zone) { - setVersion(zone, nodeRepository.list(zone, application), version, true); + setVersion(zone, nodeRepository.list(zone, NodeFilter.all().applications(application)), version, true); } /** Set OS version for an application in a given zone */ @@ -382,7 +383,7 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer applications.put(id, new Application(id.applicationId(), lastPrepareVersion, new ApplicationPackage(deployment.applicationPackage()))); ClusterSpec.Id cluster = ClusterSpec.Id.from("default"); - if (nodeRepository().list(id.zoneId(), id.applicationId()).isEmpty()) + if (nodeRepository().list(id.zoneId(), NodeFilter.all().applications(id.applicationId())).isEmpty()) provision(id.zoneId(), id.applicationId(), cluster); this.containerEndpoints.put( @@ -405,7 +406,7 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer return () -> { Application application = applications.get(id); application.activate(); - List<Node> nodes = nodeRepository.list(id.zoneId(), id.applicationId()); + List<Node> nodes = nodeRepository.list(id.zoneId(), NodeFilter.all().applications(id.applicationId())); for (Node node : nodes) { nodeRepository.putNodes(id.zoneId(), Node.builder(node) .state(Node.State.active) @@ -471,7 +472,7 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer public void deactivate(DeploymentId deployment) { ApplicationId applicationId = deployment.applicationId(); nodeRepository().removeNodes(deployment.zoneId(), - nodeRepository().list(deployment.zoneId(), applicationId)); + nodeRepository().list(deployment.zoneId(), NodeFilter.all().applications(applicationId))); if ( ! applications.containsKey(deployment)) return; diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/NodeRepositoryMock.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/NodeRepositoryMock.java index 8a9aa6b4b1b..543d89a2240 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/NodeRepositoryMock.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/NodeRepositoryMock.java @@ -14,6 +14,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.configserver.Applicatio import com.yahoo.vespa.hosted.controller.api.integration.configserver.ApplicationStats; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Load; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeRepoStats; import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeRepository; import com.yahoo.vespa.hosted.controller.api.integration.configserver.TargetVersions; @@ -75,23 +76,13 @@ public class NodeRepositoryMock implements NodeRepository { } @Override - public List<Node> list(ZoneId zone, boolean includeDeprovisioned) { + public List<Node> list(ZoneId zone, NodeFilter filter) { return nodeRepository.getOrDefault(zone, Map.of()).values().stream() - .filter(node -> includeDeprovisioned || node.state() != Node.State.deprovisioned) - .collect(Collectors.toList()); - } - - @Override - public List<Node> list(ZoneId zone, ApplicationId application) { - return nodeRepository.getOrDefault(zone, Map.of()).values().stream() - .filter(node -> node.owner().map(application::equals).orElse(false)) - .collect(Collectors.toList()); - } - - @Override - public List<Node> list(ZoneId zone, List<HostName> hostnames) { - return nodeRepository.getOrDefault(zone, Map.of()).values().stream() - .filter(node -> hostnames.contains(node.hostname())) + .filter(node -> filter.includeDeprovisioned() || node.state() != Node.State.deprovisioned) + .filter(node -> filter.applications().isEmpty() || + (node.owner().isPresent() && filter.applications().contains(node.owner().get()))) + .filter(node -> filter.hostnames().isEmpty() || filter.hostnames().contains(node.hostname())) + .filter(node -> filter.states().isEmpty() || filter.states().contains(node.state())) .collect(Collectors.toList()); } @@ -344,7 +335,7 @@ public class NodeRepositoryMock implements NodeRepository { if (hostname.isPresent()) { nodes = List.of(require(zone, hostname.get())); } else { - nodes = list(zone, false); + nodes = list(zone, NodeFilter.all()); } putNodes(zone, nodes.stream().map(patcher).collect(Collectors.toList())); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CloudEventTrackerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CloudEventTrackerTest.java index 17852547a0b..919b8386b2c 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CloudEventTrackerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CloudEventTrackerTest.java @@ -8,6 +8,7 @@ import com.yahoo.vespa.hosted.controller.ControllerTester; import com.yahoo.vespa.hosted.controller.api.integration.aws.CloudEvent; import com.yahoo.vespa.hosted.controller.api.integration.aws.MockCloudEventFetcher; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.integration.ZoneApiMock; import org.junit.Test; @@ -128,7 +129,7 @@ public class CloudEventTrackerTest { } private Set<String> hostsNotDeprovisioning(ZoneId zoneId) { - return tester.configServer().nodeRepository().list(zoneId, false) + return tester.configServer().nodeRepository().list(zoneId, NodeFilter.all()) .stream() .filter(node -> !node.wantToDeprovision()) .map(node -> node.hostname().value()) diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/HostInfoUpdaterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/HostInfoUpdaterTest.java index 56f8de494f0..bc17e53c0ca 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/HostInfoUpdaterTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/HostInfoUpdaterTest.java @@ -6,6 +6,7 @@ import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.vespa.hosted.controller.ControllerTester; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.entity.NodeEntity; import org.junit.Test; @@ -108,7 +109,7 @@ public class HostInfoUpdaterTest { private static List<Node> allNodes(ControllerTester tester) { List<Node> nodes = new ArrayList<>(); for (var zone : tester.zoneRegistry().zones().controllerUpgraded().all().ids()) { - nodes.addAll(tester.serviceRegistry().configServer().nodeRepository().list(zone, false)); + nodes.addAll(tester.serviceRegistry().configServer().nodeRepository().list(zone, NodeFilter.all())); } return nodes; } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java index 3789777a8fc..a9046a8e060 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java @@ -14,6 +14,7 @@ import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.ControllerTester; import com.yahoo.vespa.hosted.controller.api.integration.billing.PlanId; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.application.ApplicationPackage; import com.yahoo.vespa.hosted.controller.application.Change; import com.yahoo.vespa.hosted.controller.application.SystemApplication; @@ -300,7 +301,7 @@ public class MetricsReporterTest { var version0 = Version.fromString("7.0"); tester.upgradeSystem(version0); reporter.maintain(); - var hosts = tester.configServer().nodeRepository().list(zone, SystemApplication.configServer.id()); + var hosts = tester.configServer().nodeRepository().list(zone, NodeFilter.all().applications(SystemApplication.configServer.id())); assertPlatformChangeDuration(Duration.ZERO, hosts); var targets = List.of(Version.fromString("7.1"), Version.fromString("7.2")); @@ -361,7 +362,7 @@ public class MetricsReporterTest { tester.configServer().setOsVersion(version0, SystemApplication.tenantHost.id(), zone); tester.configServer().setOsVersion(version0, SystemApplication.configServerHost.id(), zone); runAll(statusUpdater, reporter); - List<Node> hosts = tester.configServer().nodeRepository().list(zone, false); + List<Node> hosts = tester.configServer().nodeRepository().list(zone, NodeFilter.all()); assertOsChangeDuration(Duration.ZERO, hosts); var targets = List.of(Version.fromString("8.1"), Version.fromString("8.2")); @@ -382,10 +383,10 @@ public class MetricsReporterTest { // Nodes are told to upgrade, but do not suspend yet assertEquals("Wanted OS version is raised for all nodes", nextVersion, - tester.configServer().nodeRepository().list(zone, SystemApplication.tenantHost.id()).stream() + tester.configServer().nodeRepository().list(zone, NodeFilter.all().applications(SystemApplication.tenantHost.id())).stream() .map(Node::wantedOsVersion).min(Comparator.naturalOrder()).get()); assertTrue("No nodes are suspended", tester.controller().serviceRegistry().configServer() - .nodeRepository().list(zone, false).stream() + .nodeRepository().list(zone, NodeFilter.all()).stream() .noneMatch(node -> node.serviceState() == Node.ServiceState.allowedDown)); // Another 30 minutes pass @@ -536,9 +537,9 @@ public class MetricsReporterTest { } private List<Node> getNodes(ZoneId zone, List<Node> nodes, ControllerTester tester) { - return tester.configServer().nodeRepository().list(zone, nodes.stream() - .map(Node::hostname) - .collect(Collectors.toList())); + return tester.configServer().nodeRepository().list(zone, NodeFilter.all().hostnames(nodes.stream() + .map(Node::hostname) + .collect(Collectors.toSet()))); } private void updateNodes(List<Node> nodes, UnaryOperator<Node.Builder> builderOps, ZoneId zone, diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgraderTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgraderTest.java index eca000ff969..ee4c39c2924 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgraderTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgraderTest.java @@ -8,6 +8,7 @@ import com.yahoo.config.provision.zone.ZoneApi; import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.vespa.hosted.controller.ControllerTester; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.application.SystemApplication; import com.yahoo.vespa.hosted.controller.integration.NodeRepositoryMock; import com.yahoo.vespa.hosted.controller.integration.ZoneApiMock; @@ -261,14 +262,14 @@ public class OsUpgraderTest { } private List<Node> nodesRequiredToUpgrade(ZoneApi zone, SystemApplication application) { - return nodeRepository().list(zone.getVirtualId(), application.id()) + return nodeRepository().list(zone.getVirtualId(), NodeFilter.all().applications(application.id())) .stream() .filter(OsUpgrader::canUpgrade) .collect(Collectors.toList()); } private void failNodeIn(ZoneApi zone, SystemApplication application) { - List<Node> nodes = nodeRepository().list(zone.getVirtualId(), application.id()); + List<Node> nodes = nodeRepository().list(zone.getVirtualId(), NodeFilter.all().applications(application.id())); if (nodes.isEmpty()) { throw new IllegalArgumentException("No nodes allocated to " + application.id()); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/SystemUpgraderTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/SystemUpgraderTest.java index 8090765b5f9..7d6da68440e 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/SystemUpgraderTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/SystemUpgraderTest.java @@ -6,6 +6,7 @@ import com.yahoo.config.provision.zone.UpgradePolicy; import com.yahoo.config.provision.zone.ZoneApi; import com.yahoo.vespa.hosted.controller.ControllerTester; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.application.SystemApplication; import com.yahoo.vespa.hosted.controller.integration.NodeRepositoryMock; import com.yahoo.vespa.hosted.controller.integration.ZoneApiMock; @@ -322,7 +323,7 @@ public class SystemUpgraderTest { } private void failNodeIn(ZoneApi zone, SystemApplication application) { - List<Node> nodes = nodeRepository().list(zone.getId(), application.id()); + List<Node> nodes = nodeRepository().list(zone.getId(), NodeFilter.all().applications(application.id())); if (nodes.isEmpty()) { throw new IllegalArgumentException("No nodes allocated to " + application.id()); } @@ -372,7 +373,7 @@ public class SystemUpgraderTest { } private List<Node> listNodes(ZoneApi zone, SystemApplication application) { - return nodeRepository().list(zone.getId(), application.id()).stream() + return nodeRepository().list(zone.getId(), NodeFilter.all().applications(application.id())).stream() .filter(SystemUpgrader::eligibleForUpgrade) .collect(Collectors.toList()); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VcmrMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VcmrMaintainerTest.java index 1d66434ea42..a2da6e357b6 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VcmrMaintainerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VcmrMaintainerTest.java @@ -5,6 +5,7 @@ import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.vespa.hosted.controller.ControllerTester; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.ChangeRequest; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.ChangeRequestSource; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.HostAction; @@ -66,7 +67,7 @@ public class VcmrMaintainerTest { maintainer.maintain(); // Only the parked node is recycled, VCMR report is cleared - var nodeList = nodeRepo.list(zoneId, List.of(host1, host2)); + var nodeList = nodeRepo.list(zoneId, NodeFilter.all().hostnames(host1, host2)); assertEquals(Node.State.dirty, nodeList.get(0).state()); assertEquals(Node.State.failed, nodeList.get(1).state()); @@ -111,7 +112,7 @@ public class VcmrMaintainerTest { assertEquals(State.NONE, failedNodeAction.getState()); assertEquals(Status.IN_PROGRESS, writtenChangeRequest.getStatus()); - activeNode = nodeRepo.list(zoneId, List.of(activeNode.hostname())).get(0); + activeNode = nodeRepo.list(zoneId, NodeFilter.all().hostnames(activeNode.hostname())).get(0); assertTrue(activeNode.wantToRetire()); } @@ -168,7 +169,7 @@ public class VcmrMaintainerTest { var approvedChangeRequests = tester.serviceRegistry().changeRequestClient().getApprovedChangeRequests(); assertEquals(1, approvedChangeRequests.size()); - activeNode = nodeRepo.list(zoneId, List.of(host2)).get(0); + activeNode = nodeRepo.list(zoneId, NodeFilter.all().hostnames(host2)).get(0); var report = VcmrReport.fromReports(activeNode.reports()); var reportAdded = report.getVcmrs().stream() .filter(vcmr -> vcmr.getId().equals(changeRequestId)) @@ -190,11 +191,11 @@ public class VcmrMaintainerTest { var hostAction = writtenChangeRequest.getHostActionPlan().get(0); assertEquals(State.PENDING_RETIREMENT, hostAction.getState()); - parkedNode = nodeRepo.list(zoneId, List.of(parkedNode.hostname())).get(0); + parkedNode = nodeRepo.list(zoneId, NodeFilter.all().hostnames(parkedNode.hostname())).get(0); assertEquals(Node.State.dirty, parkedNode.state()); assertFalse(parkedNode.wantToRetire()); - retiringNode = nodeRepo.list(zoneId, List.of(retiringNode.hostname())).get(0); + retiringNode = nodeRepo.list(zoneId, NodeFilter.all().hostnames(retiringNode.hostname())).get(0); assertEquals(Node.State.active, retiringNode.state()); assertFalse(retiringNode.wantToRetire()); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiTest.java index c1358decf19..90685980835 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiTest.java @@ -10,6 +10,7 @@ import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.vespa.athenz.api.AthenzIdentity; import com.yahoo.vespa.athenz.api.AthenzUser; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.application.SystemApplication; import com.yahoo.vespa.hosted.controller.integration.NodeRepositoryMock; import com.yahoo.vespa.hosted.controller.integration.ZoneApiMock; @@ -140,7 +141,7 @@ public class OsApiTest extends ControllerContainerTest { for (ZoneId zone : zones) { for (SystemApplication application : SystemApplication.all()) { var targetVersion = nodeRepository().targetVersionsOf(zone).osVersion(application.nodeType()); - for (Node node : nodeRepository().list(zone, application.id())) { + for (Node node : nodeRepository().list(zone, NodeFilter.all().applications(application.id()))) { var version = targetVersion.orElse(node.wantedOsVersion()); nodeRepository().putNodes(zone, Node.builder(node).currentOsVersion(version).wantedOsVersion(version).build()); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java index 6e70fb8c3cb..03002aee955 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java @@ -9,6 +9,7 @@ import com.yahoo.config.provision.zone.ZoneApi; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.ControllerTester; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; +import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobId; import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType; import com.yahoo.vespa.hosted.controller.application.ApplicationPackage; @@ -69,7 +70,7 @@ public class VersionStatusTest { Version version1 = Version.fromString("6.5"); // Upgrade some config servers for (ZoneApi zone : tester.zoneRegistry().zones().all().zones()) { - for (Node node : tester.configServer().nodeRepository().list(zone.getId(), SystemApplication.configServer.id())) { + for (Node node : tester.configServer().nodeRepository().list(zone.getId(), NodeFilter.all().applications(SystemApplication.configServer.id()))) { Node upgradedNode = Node.builder(node).currentVersion(version1).build(); tester.configServer().nodeRepository().putNodes(zone.getId(), upgradedNode); break; @@ -113,7 +114,7 @@ public class VersionStatusTest { // Downgrade one config server in each zone Version ancientVersion = Version.fromString("5.1"); for (ZoneApi zone : tester.controller().zoneRegistry().zones().all().zones()) { - for (Node node : tester.configServer().nodeRepository().list(zone.getId(), SystemApplication.configServer.id())) { + for (Node node : tester.configServer().nodeRepository().list(zone.getId(), NodeFilter.all().applications(SystemApplication.configServer.id()))) { Node downgradedNode = Node.builder(node).currentVersion(ancientVersion).build(); tester.configServer().nodeRepository().putNodes(zone.getId(), downgradedNode); break; |