diff options
author | Martin Polden <mpolden@mpolden.no> | 2021-07-16 13:22:05 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2021-07-16 13:22:05 +0200 |
commit | 3aa2d28f0a0571a2345042a44559fbaf71fcc6f2 (patch) | |
tree | 3d59962c47ec5112e535fca16475d68d4a07a04f /controller-server | |
parent | 236c15593258ec5e0d495332edc64468df269fc4 (diff) |
Support listing nodes for multiple applications
Diffstat (limited to 'controller-server')
3 files changed, 37 insertions, 32 deletions
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..24d9db362ef 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 @@ -277,7 +277,7 @@ 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(), + Set.of(job.application()), EnumSet.of(active, reserved)) .stream() .map(Node::currentVersion) 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..7b17b3e44ff 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; @@ -65,6 +64,7 @@ import java.time.Duration; import java.time.Instant; import java.util.ArrayList; import java.util.Date; +import java.util.EnumSet; import java.util.List; import java.util.Map; import java.util.Optional; @@ -313,8 +313,8 @@ 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)); + Set.of(id.application()), + EnumSet.of(active)); List<Node> parents = controller.serviceRegistry().configServer().nodeRepository().list(id.type().zone(controller.system()), nodes.stream().map(node -> node.parentHostname().get()).collect(toList())); NodeList nodeList = NodeList.of(nodes, parents, services.get()); @@ -419,8 +419,8 @@ public class InternalStepRunner implements StepRunner { : Optional.empty(); } List<Node> nodes = controller.serviceRegistry().configServer().nodeRepository().list(zone, - testerId, - ImmutableSet.of(active, reserved)); + Set.of(testerId), + EnumSet.of(active, reserved)); List<Node> parents = controller.serviceRegistry().configServer().nodeRepository().list(zone, nodes.stream().map(node -> node.parentHostname().get()).collect(toList())); NodeList nodeList = NodeList.of(nodes, parents, services.get()); @@ -447,14 +447,13 @@ public class InternalStepRunner implements StepRunner { if ( ! endpoints.containsKey(zoneId)) return false; - return endpoints.get(zoneId).parallelStream().map(endpoint -> { + return endpoints.get(zoneId).parallelStream().allMatch(endpoint -> { boolean ready = controller.jobController().cloud().ready(endpoint.url()); - if ( ! ready) { + if (!ready) { logger.log("Failed to get 100 consecutive OKs from " + endpoint); - return Boolean.FALSE; } - return Boolean.TRUE; - }).allMatch(Boolean.TRUE::equals); + return ready; + }); } /** Returns true iff all containers in the tester deployment give 100 consecutive 200 OK responses on /status.html. */ 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..e02cd25ff23 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 @@ -20,11 +20,13 @@ import com.yahoo.vespa.hosted.controller.api.integration.configserver.TargetVers import java.net.URI; import java.time.Duration; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; +import java.util.Set; import java.util.function.UnaryOperator; import java.util.stream.Collectors; @@ -76,23 +78,25 @@ public class NodeRepositoryMock implements NodeRepository { @Override public List<Node> list(ZoneId zone, boolean includeDeprovisioned) { - return nodeRepository.getOrDefault(zone, Map.of()).values().stream() - .filter(node -> includeDeprovisioned || node.state() != Node.State.deprovisioned) - .collect(Collectors.toList()); + return list(zone).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()); + public List<Node> list(ZoneId zone, List<HostName> hostnames) { + return list(zone).stream() + .filter(node -> hostnames.contains(node.hostname())) + .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())) - .collect(Collectors.toList()); + public List<Node> list(ZoneId zone, Set<ApplicationId> applications, Set<Node.State> states) { + return list(zone).stream() + .filter(node -> states.isEmpty() || states.contains(node.state())) + .filter(node -> applications.isEmpty() || + (node.owner().isPresent() && applications.contains(node.owner().get()))) + .collect(Collectors.toList()); } @Override @@ -142,11 +146,10 @@ public class NodeRepositoryMock implements NodeRepository { return targetVersions.withVespaVersion(type, version); }); // Bump wanted version of each node. This is done by InfrastructureProvisioner in a real node repository. - nodeRepository.getOrDefault(zone, Map.of()).values() - .stream() - .filter(node -> node.type() == type) - .map(node -> Node.builder(node).wantedVersion(version).build()) - .forEach(node -> putNodes(zone, node)); + patchNodes(zone, Optional.empty(), node -> { + if (node.type() != type) return node; + return Node.builder(node).wantedVersion(version).build(); + }); } @Override @@ -159,11 +162,10 @@ public class NodeRepositoryMock implements NodeRepository { return targetVersions.withOsVersion(type, version); }); // Bump wanted version of each node. This is done by OsUpgradeActivator in a real node repository. - nodeRepository.getOrDefault(zone, Map.of()).values() - .stream() - .filter(node -> node.type() == type) - .map(node -> Node.builder(node).wantedOsVersion(version).build()) - .forEach(node -> putNodes(zone, node)); + patchNodes(zone, Optional.empty(), node -> { + if (node.type() != type) return node; + return Node.builder(node).wantedOsVersion(version).build(); + }); } @Override @@ -320,6 +322,10 @@ public class NodeRepositoryMock implements NodeRepository { this.hasSpareCapacity = hasSpareCapacity; } + private Collection<Node> list(ZoneId zone) { + return nodeRepository.getOrDefault(zone, Map.of()).values(); + } + private Node require(ZoneId zone, String hostname) { return require(zone, HostName.from(hostname)); } |