summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2021-07-13 18:09:55 +0200
committerMartin Polden <mpolden@mpolden.no>2021-07-14 13:55:42 +0200
commit3f5ae1a97891afda12a214ff3f86b716c6a08ef8 (patch)
tree1ae047d2011ad0e2b81eda96b6c8577390e7ca95 /controller-server
parent7af0a1695d43836dcf83e26710f5db5092f8e4ab (diff)
Do not use serializable NodeRepositoryNode internally in controller
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeManagementAssessor.java58
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainer.java3
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java8
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java67
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/NodeRepositoryMock.java252
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeManagementAssessorTest.java90
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CloudEventReporterTest.java8
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CostReportMaintainerTest.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/HostInfoUpdaterTest.java12
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java3
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgraderTest.java8
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java34
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceTagMaintainerTest.java39
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/SystemUpgraderTest.java4
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainerTest.java32
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandlerTest.java82
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiTest.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java4
19 files changed, 325 insertions, 385 deletions
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 d74578d9adc..fc7b256a644 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
@@ -2,13 +2,10 @@
package com.yahoo.vespa.hosted.controller.maintenance;
import com.yahoo.config.provision.HostName;
+import com.yahoo.config.provision.NodeType;
import com.yahoo.config.provision.zone.ZoneId;
-import com.yahoo.text.Text;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeRepository;
-import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeRepositoryNode;
-import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeState;
-import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeType;
import java.util.Collection;
import java.util.List;
@@ -16,6 +13,9 @@ import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
+/**
+ * @author smorgrav
+ */
public class ChangeManagementAssessor {
private final NodeRepository nodeRepository;
@@ -25,31 +25,31 @@ public class ChangeManagementAssessor {
}
public Assessment assessment(List<String> impactedHostnames, ZoneId zone) {
- return assessmentInner(impactedHostnames, nodeRepository.listNodes(zone).nodes(), zone);
+ return assessmentInner(impactedHostnames, nodeRepository.list(zone, false), zone);
}
- Assessment assessmentInner(List<String> impactedHostnames, List<NodeRepositoryNode> allNodes, ZoneId zone) {
+ Assessment assessmentInner(List<String> impactedHostnames, List<Node> allNodes, ZoneId zone) {
List<String> impactedParentHosts = toParentHosts(impactedHostnames, allNodes);
// Group impacted application nodes by parent host
- Map<NodeRepositoryNode, List<NodeRepositoryNode>> prParentHost = allNodes.stream()
- .filter(nodeRepositoryNode -> nodeRepositoryNode.getState() == NodeState.active) //TODO look at more states?
- .filter(node -> impactedParentHosts.contains(node.getParentHostname() == null ? "" : node.getParentHostname()))
+ Map<Node, List<Node>> prParentHost = allNodes.stream()
+ .filter(node -> node.state() == Node.State.active) //TODO look at more states?
+ .filter(node -> impactedParentHosts.contains(node.parentHostname().map(HostName::value).orElse("")))
.collect(Collectors.groupingBy(node ->
allNodes.stream()
- .filter(parent -> parent.getHostname().equals(node.getParentHostname()))
+ .filter(parent -> parent.hostname().equals(node.parentHostname().get()))
.findFirst().orElseThrow()
));
// Group nodes pr cluster
- Map<Cluster, List<NodeRepositoryNode>> prCluster = prParentHost.values()
+ Map<Cluster, List<Node>> prCluster = prParentHost.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.groupingBy(ChangeManagementAssessor::clusterKey));
var tenantHosts = prParentHost.keySet().stream()
- .filter(node -> node.getType() == NodeType.host)
- .map(node -> HostName.from(node.getHostname()))
+ .filter(node -> node.type() == NodeType.host)
+ .map(node -> node.hostname())
.collect(Collectors.toList());
boolean allHostsReplacable = tenantHosts.isEmpty() || nodeRepository.isReplaceable(
@@ -60,7 +60,7 @@ public class ChangeManagementAssessor {
// Report assessment pr cluster
var clusterAssessments = prCluster.entrySet().stream().map((entry) -> {
Cluster cluster = entry.getKey();
- List<NodeRepositoryNode> nodes = entry.getValue();
+ List<Node> nodes = entry.getValue();
long[] totalStats = clusterStats(cluster, allNodes);
long[] impactedStats = clusterStats(cluster, nodes);
@@ -87,8 +87,8 @@ public class ChangeManagementAssessor {
var hostAssessments = prParentHost.entrySet().stream().map((entry) -> {
HostAssessment hostAssessment = new HostAssessment();
- hostAssessment.hostName = entry.getKey().getHostname();
- hostAssessment.switchName = entry.getKey().getSwitchHostname();
+ hostAssessment.hostName = entry.getKey().hostname().value();
+ hostAssessment.switchName = entry.getKey().switchHostname().orElse(null);
hostAssessment.numberOfChildren = entry.getValue().size();
//TODO: Some better heuristic for what's considered problematic
@@ -103,31 +103,31 @@ public class ChangeManagementAssessor {
return new Assessment(clusterAssessments, hostAssessments);
}
- private List<String> toParentHosts(List<String> impactedHostnames, List<NodeRepositoryNode> allNodes) {
+ private List<String> toParentHosts(List<String> impactedHostnames, List<Node> allNodes) {
return impactedHostnames.stream()
.flatMap(hostname ->
allNodes.stream()
- .filter(node -> List.of(NodeType.config, NodeType.proxy, NodeType.host).contains(node.getType()))
- .filter(node -> hostname.equals(node.getHostname()) || hostname.equals(node.getParentHostname()))
+ .filter(node -> List.of(NodeType.config, NodeType.proxy, NodeType.host).contains(node.type()))
+ .filter(node -> hostname.equals(node.hostname().value()) || hostname.equals(node.parentHostname().map(HostName::value).orElse("")))
.map(node -> {
- if (node.getType() == NodeType.host)
- return node.getHostname();
- return node.getParentHostname();
+ if (node.type() == NodeType.host)
+ return node.hostname().value();
+ return node.parentHostname().get().value();
}).findFirst().stream()
)
.collect(Collectors.toList());
}
- private static Cluster clusterKey(NodeRepositoryNode node) {
- if (node.getOwner() == null)
+ private static Cluster clusterKey(Node node) {
+ if (node.owner().isEmpty())
return Cluster.EMPTY;
- String appId = Text.format("%s:%s:%s", node.getOwner().tenant, node.getOwner().application, node.getOwner().instance);
- return new Cluster(Node.ClusterType.valueOf(node.getMembership().clustertype), node.getMembership().clusterid, appId, node.getType());
+ String appId = node.owner().get().serializedForm();
+ return new Cluster(node.clusterType(), node.clusterId(), appId, node.type());
}
- private static long[] clusterStats(Cluster cluster, List<NodeRepositoryNode> containerNodes) {
- List<NodeRepositoryNode> clusterNodes = containerNodes.stream().filter(nodeRepositoryNode -> cluster.equals(clusterKey(nodeRepositoryNode))).collect(Collectors.toList());
- long groups = clusterNodes.stream().map(nodeRepositoryNode -> nodeRepositoryNode.getMembership() != null ? nodeRepositoryNode.getMembership().group : "").distinct().count();
+ private static long[] clusterStats(Cluster cluster, List<Node> containerNodes) {
+ List<Node> clusterNodes = containerNodes.stream().filter(node -> cluster.equals(clusterKey(node))).collect(Collectors.toList());
+ long groups = clusterNodes.stream().map(Node::group).distinct().count();
return new long[] { clusterNodes.size(), groups};
}
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 38e10aa6750..19617a1f293 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
@@ -1,6 +1,7 @@
// 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.maintenance;
+import com.fasterxml.jackson.databind.JsonNode;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.NodeType;
import com.yahoo.config.provision.SystemName;
@@ -174,7 +175,7 @@ public class VCMRMaintainer extends ControllerMaintainer {
} catch (Exception e) {
logger.warning("Failed to retire host " + node.hostname() + ": " + Exceptions.toMessageString(e));
// Check if retirement actually failed
- if (!nodeRepository.getNode(changeRequest.getZoneId(), node.hostname().value()).getWantToRetire()) {
+ if (!nodeRepository.getNode(changeRequest.getZoneId(), node.hostname().value()).wantToRetire()) {
return hostAction;
}
}
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 c1e6c362c83..1a4fa3fcd79 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
@@ -880,7 +880,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler {
toSlime(node.resources(), nodeObject);
nodeObject.setString("clusterId", node.clusterId());
nodeObject.setString("clusterType", valueOf(node.clusterType()));
- nodeObject.setBool("down", node.history().stream().anyMatch(event -> "down".equals(event.getEvent())));
+ nodeObject.setBool("down", node.history().stream().anyMatch(event -> "down".equals(event.name())));
nodeObject.setBool("retired", node.retired() || node.wantToRetire());
nodeObject.setBool("restarting", node.wantedRestartGeneration() > node.restartGeneration());
nodeObject.setBool("rebooting", node.wantedRebootGeneration() > node.rebootGeneration());
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 d8bddac4187..5e79f1e4d12 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
@@ -197,10 +197,10 @@ public class InternalStepRunnerTest {
app.instanceId()).iterator().next();
tester.clock().advance(InternalStepRunner.Timeouts.of(system()).noNodesDown().minus(Duration.ofSeconds(1)));
tester.configServer().nodeRepository().putNodes(JobType.systemTest.zone(system()),
- new Node.Builder(systemTestNode)
- .serviceState(Node.ServiceState.allowedDown)
- .suspendedSince(tester.clock().instant())
- .build());
+ Node.builder(systemTestNode)
+ .serviceState(Node.ServiceState.allowedDown)
+ .suspendedSince(tester.clock().instant())
+ .build());
tester.runner().run();
assertEquals(unfinished, tester.jobs().last(app.instanceId(), JobType.systemTest).get().stepStatuses().get(Step.installReal));
assertEquals(unfinished, tester.jobs().last(app.instanceId(), JobType.stagingTest).get().stepStatuses().get(Step.installInitialReal));
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 92c8cbc4889..c66cc3710c9 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
@@ -63,10 +63,7 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.function.BooleanSupplier;
import java.util.function.Consumer;
-import java.util.function.Function;
import java.util.function.Supplier;
import java.util.logging.Level;
import java.util.stream.Collectors;
@@ -138,23 +135,23 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer
Node parent = nodeRepository().list(zone, SystemApplication.tenantHost.id()).stream().findAny()
.orElseThrow(() -> new IllegalStateException("No parent hosts in " + zone));
- nodeRepository().putNodes(zone, new Node.Builder().hostname(hostFor(application, zone))
- .state(Node.State.reserved)
- .type(NodeType.tenant)
- .owner(application)
- .parentHostname(parent.hostname())
- .currentVersion(initialVersion)
- .wantedVersion(initialVersion)
- .currentDockerImage(initialDockerImage)
- .wantedDockerImage(initialDockerImage)
- .currentOsVersion(Version.emptyVersion)
- .wantedOsVersion(Version.emptyVersion)
- .resources(new NodeResources(2, 8, 50, 1, slow, remote))
- .serviceState(Node.ServiceState.unorchestrated)
- .flavor("d-2-8-50")
- .clusterId(clusterId.value())
- .clusterType(Node.ClusterType.container)
- .build());
+ nodeRepository().putNodes(zone, Node.builder().hostname(hostFor(application, zone))
+ .state(Node.State.reserved)
+ .type(NodeType.tenant)
+ .owner(application)
+ .parentHostname(parent.hostname())
+ .currentVersion(initialVersion)
+ .wantedVersion(initialVersion)
+ .currentDockerImage(initialDockerImage)
+ .wantedDockerImage(initialDockerImage)
+ .currentOsVersion(Version.emptyVersion)
+ .wantedOsVersion(Version.emptyVersion)
+ .resources(new NodeResources(2, 8, 50, 1, slow, remote))
+ .serviceState(Node.ServiceState.unorchestrated)
+ .flavor("d-2-8-50")
+ .clusterId(clusterId.value())
+ .clusterType(Node.ClusterType.container)
+ .build());
}
public HostName hostFor(ApplicationId application, ZoneId zone) {
@@ -174,16 +171,16 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer
for (ZoneId zone : zones) {
for (SystemApplication application : applications) {
for (int i = 1; i <= 3; i++) {
- Node node = new Node.Builder()
- .hostname(HostName.from("node-" + i + "-" + application.id().application()
+ Node node = Node.builder()
+ .hostname(HostName.from("node-" + i + "-" + application.id().application()
.value() + "-" + zone.value()))
- .state(Node.State.active)
- .type(application.nodeType())
- .owner(application.id())
- .currentVersion(initialVersion).wantedVersion(initialVersion)
- .currentOsVersion(Version.emptyVersion).wantedOsVersion(Version.emptyVersion)
- .build();
- nodeRepository().putNode(zone, node);
+ .state(Node.State.active)
+ .type(application.nodeType())
+ .owner(application.id())
+ .currentVersion(initialVersion).wantedVersion(initialVersion)
+ .currentOsVersion(Version.emptyVersion).wantedOsVersion(Version.emptyVersion)
+ .build();
+ nodeRepository().putNodes(zone, node);
}
convergeServices(application.id(), zone);
}
@@ -244,9 +241,9 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer
for (var node : nodes) {
Node newNode;
if (osVersion) {
- newNode = new Node.Builder(node).currentOsVersion(version).wantedOsVersion(version).build();
+ newNode = Node.builder(node).currentOsVersion(version).wantedOsVersion(version).build();
} else {
- newNode = new Node.Builder(node).currentVersion(version).wantedVersion(version).build();
+ newNode = Node.builder(node).currentVersion(version).wantedVersion(version).build();
}
nodeRepository().putNodes(zone, newNode);
}
@@ -410,10 +407,10 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer
application.activate();
List<Node> nodes = nodeRepository.list(id.zoneId(), id.applicationId());
for (Node node : nodes) {
- nodeRepository.putNodes(id.zoneId(), new Node.Builder(node)
- .state(Node.State.active)
- .wantedVersion(application.version().get())
- .build());
+ nodeRepository.putNodes(id.zoneId(), Node.builder(node)
+ .state(Node.State.active)
+ .wantedVersion(application.version().get())
+ .build());
}
serviceStatus.put(id, new ServiceConvergence(id.applicationId(),
id.zoneId(),
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 4079591730d..b16817c0f3d 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
@@ -1,7 +1,6 @@
// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller.integration;
-import com.fasterxml.jackson.databind.JsonNode;
import com.yahoo.collections.Pair;
import com.yahoo.component.Version;
import com.yahoo.config.provision.ApplicationId;
@@ -18,13 +17,11 @@ import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node;
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;
-import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeList;
import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeRepositoryNode;
import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeState;
import java.net.URI;
import java.time.Duration;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -33,7 +30,6 @@ import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.util.Optional;
-import java.util.function.Function;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;
@@ -50,115 +46,12 @@ public class NodeRepositoryMock implements NodeRepository {
private final Map<DeploymentId, Pair<Double, Double>> trafficFractions = new HashMap<>();
private final Map<ZoneId, Map<TenantName, URI>> archiveUris = new HashMap<>();
- // A separate/alternative list of NodeRepositoryNode nodes.
- // Methods operating with Node and NodeRepositoryNode lives separate lives.
- private final Map<ZoneId, List<NodeRepositoryNode>> nodeRepoNodes = new HashMap<>();
-
private boolean allowPatching = false;
private boolean hasSpareCapacity = false;
- /** Add or update given nodes in zone */
- public void putNodes(ZoneId zone, List<Node> nodes) {
- Map<HostName, Node> zoneNodes = nodeRepository.computeIfAbsent(zone, (k) -> new HashMap<>());
- for (var node : nodes) {
- zoneNodes.put(node.hostname(), node);
- }
- }
-
- public void putNode(ZoneId zone, Node node) {
- nodeRepository.computeIfAbsent(zone, (k) -> new HashMap<>()).put(node.hostname(), node);
- }
-
- public void putApplication(ZoneId zone, Application application) {
- applications.putIfAbsent(zone, new HashMap<>());
- applications.get(zone).put(application.id(), application);
- }
-
- @Override
- public NodeRepoStats getStats(ZoneId zone) {
- List<ApplicationStats> applicationStats =
- applications.containsKey(zone)
- ? applications.get(zone).keySet().stream()
- .map(id -> new ApplicationStats(id, Load.zero(), 0, 0))
- .collect(Collectors.toList())
- : List.of();
-
- return new NodeRepoStats(Load.zero(), Load.zero(), applicationStats);
- }
-
- public Pair<Double, Double> getTrafficFraction(ApplicationId application, ZoneId zone) {
- return trafficFractions.get(new DeploymentId(application, zone));
- }
-
- /** Add or update given node in zone */
- public void putNodes(ZoneId zone, Node node) {
- putNodes(zone, Collections.singletonList(node));
- }
-
- /** Remove given nodes from zone */
- public void removeNodes(ZoneId zone, List<Node> nodes) {
- nodes.forEach(node -> nodeRepository.get(zone).remove(node.hostname()));
- }
-
- /** Remove all nodes in all zones */
- public void clear() {
- nodeRepository.clear();
- nodeRepoNodes.clear();
- }
-
- /** Replace nodes in zone with given nodes */
- public void setNodes(ZoneId zone, List<Node> nodes) {
- nodeRepository.put(zone, nodes.stream().collect(Collectors.toMap(Node::hostname, Function.identity())));
- }
-
- public Node require(HostName hostName) {
- return nodeRepository.values().stream()
- .map(zoneNodes -> zoneNodes.get(hostName))
- .filter(Objects::nonNull)
- .findFirst()
- .orElseThrow(() -> new NoSuchElementException("No node with the hostname " + hostName + " is known."));
- }
-
- /** Replace nodes in zone with a fixed set of nodes */
- public void setFixedNodes(ZoneId zone) {
- var nodeA = new Node.Builder()
- .hostname(HostName.from("hostA"))
- .parentHostname(HostName.from("parentHostA"))
- .state(Node.State.active)
- .type(NodeType.tenant)
- .owner(ApplicationId.from("tenant1", "app1", "default"))
- .currentVersion(Version.fromString("7.42"))
- .wantedVersion(Version.fromString("7.42"))
- .currentOsVersion(Version.fromString("7.6"))
- .wantedOsVersion(Version.fromString("7.6"))
- .serviceState(Node.ServiceState.expectedUp)
- .resources(new NodeResources(24, 24, 500, 1))
- .clusterId("clusterA")
- .clusterType(Node.ClusterType.container)
- .exclusiveTo(ApplicationId.from("t1", "a1", "i1"))
- .build();
- var nodeB = new Node.Builder()
- .hostname(HostName.from("hostB"))
- .parentHostname(HostName.from("parentHostB"))
- .state(Node.State.active)
- .type(NodeType.tenant)
- .owner(ApplicationId.from("tenant2", "app2", "default"))
- .currentVersion(Version.fromString("7.42"))
- .wantedVersion(Version.fromString("7.42"))
- .currentOsVersion(Version.fromString("7.6"))
- .wantedOsVersion(Version.fromString("7.6"))
- .serviceState(Node.ServiceState.expectedUp)
- .resources(new NodeResources(40, 24, 500, 1))
- .cost(20)
- .clusterId("clusterB")
- .clusterType(Node.ClusterType.container)
- .build();
- setNodes(zone, List.of(nodeA, nodeB));
- }
-
@Override
public void addNodes(ZoneId zone, Collection<NodeRepositoryNode> nodes) {
- nodeRepoNodes.put(zone, new ArrayList<>(nodes));
+ throw new UnsupportedOperationException();
}
@Override
@@ -171,23 +64,18 @@ public class NodeRepositoryMock implements NodeRepository {
var existing = list(zone, List.of(HostName.from(hostName)));
if (existing.size() != 1) throw new IllegalArgumentException("Node " + hostName + " not found in " + zone);
- var node = new Node.Builder(existing.get(0))
- .state(Node.State.valueOf(nodeState.name()))
- .build();
+ var node = Node.builder(existing.get(0))
+ .state(Node.State.valueOf(nodeState.name()))
+ .build();
putNodes(zone, node);
}
@Override
- public NodeRepositoryNode getNode(ZoneId zone, String hostname) {
+ public Node getNode(ZoneId zone, String hostname) {
throw new UnsupportedOperationException();
}
@Override
- public NodeList listNodes(ZoneId zone) {
- return new NodeList(nodeRepoNodes.get(zone));
- }
-
- @Override
public List<Node> list(ZoneId zone, boolean includeDeprovisioned) {
return List.copyOf(nodeRepository.getOrDefault(zone, Map.of()).values());
}
@@ -218,6 +106,18 @@ public class NodeRepositoryMock implements NodeRepository {
}
@Override
+ public NodeRepoStats getStats(ZoneId zone) {
+ List<ApplicationStats> applicationStats =
+ applications.containsKey(zone)
+ ? applications.get(zone).keySet().stream()
+ .map(id -> new ApplicationStats(id, Load.zero(), 0, 0))
+ .collect(Collectors.toList())
+ : List.of();
+
+ return new NodeRepoStats(Load.zero(), Load.zero(), applicationStats);
+ }
+
+ @Override
public Map<TenantName, URI> getArchiveUris(ZoneId zone) {
return Map.copyOf(archiveUris.getOrDefault(zone, Map.of()));
}
@@ -244,7 +144,7 @@ public class NodeRepositoryMock implements NodeRepository {
nodeRepository.getOrDefault(zone, Map.of()).values()
.stream()
.filter(node -> node.type() == type)
- .map(node -> new Node.Builder(node).wantedVersion(version).build())
+ .map(node -> Node.builder(node).wantedVersion(version).build())
.forEach(node -> putNodes(zone, node));
}
@@ -261,7 +161,7 @@ public class NodeRepositoryMock implements NodeRepository {
nodeRepository.getOrDefault(zone, Map.of()).values()
.stream()
.filter(node -> node.type() == type)
- .map(node -> new Node.Builder(node).wantedOsVersion(version).build())
+ .map(node -> Node.builder(node).wantedOsVersion(version).build())
.forEach(node -> putNodes(zone, node));
}
@@ -290,15 +190,20 @@ public class NodeRepositoryMock implements NodeRepository {
if (existing.size() != 1) throw new IllegalArgumentException("Node " + hostName + " not found in " + zoneId);
// Note: Only supports switchHostname, modelName and wantToRetire
- Node.Builder newNode = new Node.Builder(existing.get(0));
+ Node.Builder newNode = Node.builder(existing.get(0));
if (node.getSwitchHostname() != null)
newNode.switchHostname(node.getSwitchHostname());
if (node.getModelName() != null)
newNode.modelName(node.getModelName());
if (node.getWantToRetire() != null)
newNode.wantToRetire(node.getWantToRetire());
- if (!node.getReports().isEmpty())
- newNode.reports(node.getReports());
+
+ Map<String, String> reports = new HashMap<>();
+ for (var kv : node.getReports().entrySet()) {
+ if (kv.getValue() == null) continue; // Null value clears a report
+ reports.put(kv.getKey(), kv.getValue().toString());
+ }
+ newNode.reports(reports);
putNodes(zoneId, newNode.build());
}
@@ -313,6 +218,83 @@ public class NodeRepositoryMock implements NodeRepository {
return hasSpareCapacity;
}
+ /** Add or update given nodes in zone */
+ public void putNodes(ZoneId zone, List<Node> nodes) {
+ Map<HostName, Node> zoneNodes = nodeRepository.computeIfAbsent(zone, (k) -> new HashMap<>());
+ for (var node : nodes) {
+ zoneNodes.put(node.hostname(), node);
+ }
+ }
+
+ /** Add or update given node in zone */
+ public void putNodes(ZoneId zone, Node node) {
+ putNodes(zone, List.of(node));
+ }
+
+ public void putApplication(ZoneId zone, Application application) {
+ applications.computeIfAbsent(zone, (k) -> new HashMap<>())
+ .put(application.id(), application);
+ }
+
+ public Pair<Double, Double> getTrafficFraction(ApplicationId application, ZoneId zone) {
+ return trafficFractions.get(new DeploymentId(application, zone));
+ }
+
+ /** Remove given nodes from zone */
+ public void removeNodes(ZoneId zone, List<Node> nodes) {
+ nodes.forEach(node -> nodeRepository.get(zone).remove(node.hostname()));
+ }
+
+ /** Remove all nodes in all zones */
+ public void clear() {
+ nodeRepository.clear();
+ }
+
+ public Node require(HostName hostName) {
+ return nodeRepository.values().stream()
+ .map(zoneNodes -> zoneNodes.get(hostName))
+ .filter(Objects::nonNull)
+ .findFirst()
+ .orElseThrow(() -> new NoSuchElementException("No node with the hostname " + hostName + " is known."));
+ }
+
+ /** Add a fixed set of nodes to given zone */
+ public void addFixedNodes(ZoneId zone) {
+ var nodeA = Node.builder()
+ .hostname(HostName.from("hostA"))
+ .parentHostname(HostName.from("parentHostA"))
+ .state(Node.State.active)
+ .type(NodeType.tenant)
+ .owner(ApplicationId.from("tenant1", "app1", "default"))
+ .currentVersion(Version.fromString("7.42"))
+ .wantedVersion(Version.fromString("7.42"))
+ .currentOsVersion(Version.fromString("7.6"))
+ .wantedOsVersion(Version.fromString("7.6"))
+ .serviceState(Node.ServiceState.expectedUp)
+ .resources(new NodeResources(24, 24, 500, 1))
+ .clusterId("clusterA")
+ .clusterType(Node.ClusterType.container)
+ .exclusiveTo(ApplicationId.from("t1", "a1", "i1"))
+ .build();
+ var nodeB = Node.builder()
+ .hostname(HostName.from("hostB"))
+ .parentHostname(HostName.from("parentHostB"))
+ .state(Node.State.active)
+ .type(NodeType.tenant)
+ .owner(ApplicationId.from("tenant2", "app2", "default"))
+ .currentVersion(Version.fromString("7.42"))
+ .wantedVersion(Version.fromString("7.42"))
+ .currentOsVersion(Version.fromString("7.6"))
+ .wantedOsVersion(Version.fromString("7.6"))
+ .serviceState(Node.ServiceState.expectedUp)
+ .resources(new NodeResources(40, 24, 500, 1))
+ .cost(20)
+ .clusterId("clusterB")
+ .clusterType(Node.ClusterType.container)
+ .build();
+ putNodes(zone, List.of(nodeA, nodeB));
+ }
+
public Optional<Duration> osUpgradeBudget(ZoneId zone, NodeType type, Version version) {
return Optional.ofNullable(osUpgradeBudgets.get(Objects.hash(zone, type, version)));
}
@@ -320,10 +302,10 @@ public class NodeRepositoryMock implements NodeRepository {
public void doUpgrade(DeploymentId deployment, Optional<HostName> hostName, Version version) {
modifyNodes(deployment, hostName, node -> {
assert node.wantedVersion().equals(version);
- return new Node.Builder(node)
- .currentVersion(version)
- .currentDockerImage(node.wantedDockerImage())
- .build();
+ return Node.builder(node)
+ .currentVersion(version)
+ .currentDockerImage(node.wantedDockerImage())
+ .build();
});
}
@@ -336,23 +318,29 @@ public class NodeRepositoryMock implements NodeRepository {
}
public void requestRestart(DeploymentId deployment, Optional<HostName> hostname) {
- modifyNodes(deployment, hostname, node -> new Node.Builder(node).wantedRestartGeneration(node.wantedRestartGeneration() + 1).build());
+ modifyNodes(deployment, hostname, node -> Node.builder(node).wantedRestartGeneration(node.wantedRestartGeneration() + 1).build());
}
public void doRestart(DeploymentId deployment, Optional<HostName> hostname) {
- modifyNodes(deployment, hostname, node -> new Node.Builder(node).restartGeneration(node.restartGeneration() + 1).build());
+ modifyNodes(deployment, hostname, node -> Node.builder(node).restartGeneration(node.restartGeneration() + 1).build());
}
public void requestReboot(DeploymentId deployment, Optional<HostName> hostname) {
- modifyNodes(deployment, hostname, node -> new Node.Builder(node).wantedRebootGeneration(node.wantedRebootGeneration() + 1).build());
+ modifyNodes(deployment, hostname, node -> Node.builder(node).wantedRebootGeneration(node.wantedRebootGeneration() + 1).build());
}
public void doReboot(DeploymentId deployment, Optional<HostName> hostname) {
- modifyNodes(deployment, hostname, node -> new Node.Builder(node).rebootGeneration(node.rebootGeneration() + 1).build());
+ modifyNodes(deployment, hostname, node -> Node.builder(node).rebootGeneration(node.rebootGeneration() + 1).build());
}
- public void addReport(ZoneId zoneId, HostName hostName, String reportId, JsonNode report) {
- nodeRepository.get(zoneId).get(hostName).reports().put(reportId, report);
+ public void addReport(ZoneId zoneId, HostName hostName, String reportId, String report) {
+ Node node = nodeRepository.getOrDefault(zoneId, Map.of()).get(hostName);
+ if (node == null) throw new IllegalArgumentException("No node named " + hostName + " in " + zoneId);
+
+ Map<String, String> reports = new HashMap<>(node.reports());
+ reports.put(reportId, report);
+ Node newNode = Node.builder(node).reports(reports).build();
+ putNodes(zoneId, newNode);
}
public NodeRepositoryMock allowPatching(boolean allowPatching) {
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeManagementAssessorTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeManagementAssessorTest.java
index 476d2465202..01c16139667 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeManagementAssessorTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeManagementAssessorTest.java
@@ -2,32 +2,32 @@
package com.yahoo.vespa.hosted.controller.maintenance;
+import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.NodeType;
import com.yahoo.config.provision.zone.ZoneId;
-import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeMembership;
-import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeOwner;
-import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeRepositoryNode;
-import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeState;
-import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeType;
+import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node;
import com.yahoo.vespa.hosted.controller.integration.NodeRepositoryMock;
import org.junit.Test;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+/**
+ * @author smorgrav
+ */
public class ChangeManagementAssessorTest {
- private ChangeManagementAssessor changeManagementAssessor = new ChangeManagementAssessor(new NodeRepositoryMock());
+ private final ChangeManagementAssessor changeManagementAssessor = new ChangeManagementAssessor(new NodeRepositoryMock());
@Test
public void empty_input_variations() {
ZoneId zone = ZoneId.from("prod", "eu-trd");
List<String> hostNames = new ArrayList<>();
- List<NodeRepositoryNode> allNodesInZone = new ArrayList<>();
+ List<Node> allNodesInZone = new ArrayList<>();
// Both zone and hostnames are empty
ChangeManagementAssessor.Assessment assessment
@@ -39,7 +39,7 @@ public class ChangeManagementAssessorTest {
public void one_host_one_cluster_no_groups() {
ZoneId zone = ZoneId.from("prod", "eu-trd");
List<String> hostNames = Collections.singletonList("host1");
- List<NodeRepositoryNode> allNodesInZone = new ArrayList<>();
+ List<Node> allNodesInZone = new ArrayList<>();
allNodesInZone.add(createNode("node1", "host1", "default", 0 ));
allNodesInZone.add(createNode("node2", "host1", "default", 0 ));
allNodesInZone.add(createNode("node3", "host1", "default", 0 ));
@@ -69,8 +69,8 @@ public class ChangeManagementAssessorTest {
@Test
public void one_of_two_groups_in_one_of_two_clusters() {
ZoneId zone = ZoneId.from("prod", "eu-trd");
- List<String> hostNames = Arrays.asList("host1", "host2", "host5");
- List<NodeRepositoryNode> allNodesInZone = new ArrayList<>();
+ List<String> hostNames = List.of("host1", "host2", "host5");
+ List<Node> allNodesInZone = new ArrayList<>();
// Two impacted nodes on host1
allNodesInZone.add(createNode("node1", "host1", "default", 0 ));
@@ -123,8 +123,8 @@ public class ChangeManagementAssessorTest {
@Test
public void two_config_nodes() {
var zone = ZoneId.from("prod", "eu-trd");
- var hostNames = Arrays.asList("config1", "config2");
- var allNodesInZone = new ArrayList<NodeRepositoryNode>();
+ var hostNames = List.of("config1", "config2");
+ var allNodesInZone = new ArrayList<Node>();
// Add config nodes and parents
allNodesInZone.add(createNode("config1", "confighost1", "config", 0, NodeType.config));
@@ -141,8 +141,8 @@ public class ChangeManagementAssessorTest {
@Test
public void one_of_three_proxy_nodes() {
var zone = ZoneId.from("prod", "eu-trd");
- var hostNames = Arrays.asList("routing1");
- var allNodesInZone = new ArrayList<NodeRepositoryNode>();
+ var hostNames = List.of("routing1");
+ var allNodesInZone = new ArrayList<Node>();
// Add routing nodes and parents
allNodesInZone.add(createNode("routing1", "parentrouting1", "routing", 0, NodeType.proxy));
@@ -156,47 +156,33 @@ public class ChangeManagementAssessorTest {
assertEquals("33% of routing nodes impacted. Consider reprovisioning if too many", assessment.get(0).impact);
}
- private NodeOwner createOwner() {
- NodeOwner owner = new NodeOwner();
- owner.tenant = "mytenant";
- owner.application = "myapp";
- owner.instance = "default";
- return owner;
- }
-
- private NodeMembership createMembership(String clusterId, int group) {
- NodeMembership membership = new NodeMembership();
- membership.group = "" + group;
- membership.clusterid = clusterId;
- membership.clustertype = "content";
- membership.index = 2;
- membership.retired = false;
- return membership;
- }
-
- private NodeRepositoryNode createNode(String nodename, String hostname, String clusterId, int group) {
+ private Node createNode(String nodename, String hostname, String clusterId, int group) {
return createNode(nodename, hostname, clusterId, group, NodeType.tenant);
}
- private NodeRepositoryNode createNode(String nodename, String hostname, String clusterId, int group, NodeType nodeType) {
- NodeRepositoryNode node = new NodeRepositoryNode();
- node.setHostname(nodename);
- node.setParentHostname(hostname);
- node.setState(NodeState.active);
- node.setOwner(createOwner());
- node.setMembership(createMembership(clusterId, group));
- node.setType(nodeType);
-
- return node;
+ private Node createNode(String nodename, String hostname, String clusterId, int group, NodeType nodeType) {
+ return Node.builder().hostname(nodename)
+ .parentHostname(hostname)
+ .state(Node.State.active)
+ .owner(ApplicationId.from("mytenant", "myapp", "default"))
+ .group(String.valueOf(group))
+ .clusterId(clusterId)
+ .clusterType(Node.ClusterType.content)
+ .type(nodeType)
+ .build();
}
- private NodeRepositoryNode createHost(String hostname, NodeType nodeType) {
- NodeRepositoryNode node = new NodeRepositoryNode();
- node.setHostname(hostname);
- node.setSwitchHostname("switch1");
- node.setType(nodeType);
- node.setOwner(createOwner());
- node.setMembership(createMembership(nodeType.name(), 0));
- return node;
+ private Node createHost(String hostname, NodeType nodeType) {
+ return Node.builder()
+ .hostname(hostname)
+ .switchHostname("switch1")
+ .state(Node.State.active)
+ .owner(ApplicationId.from("mytenant", "myapp", "default"))
+ .group(String.valueOf(0))
+ .clusterId(nodeType.name())
+ .clusterType(Node.ClusterType.content)
+ .type(nodeType)
+ .build();
}
+
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CloudEventReporterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CloudEventReporterTest.java
index 680743055c9..e838a693be1 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CloudEventReporterTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CloudEventReporterTest.java
@@ -121,10 +121,10 @@ public class CloudEventReporterTest {
}
private Node createNode(String hostname, NodeType nodeType) {
- return new Node.Builder()
- .hostname(HostName.from(hostname))
- .type(nodeType)
- .build();
+ return Node.builder()
+ .hostname(HostName.from(hostname))
+ .type(nodeType)
+ .build();
}
private Set<String> getHostnames(ZoneId zoneId) {
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CostReportMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CostReportMaintainerTest.java
index cbffd6d610f..d78b48c362a 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CostReportMaintainerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/CostReportMaintainerTest.java
@@ -54,7 +54,7 @@ public class CostReportMaintainerTest {
private void addNodes() {
for (var zone : tester.zoneRegistry().zones().all().zones()) {
- tester.configServer().nodeRepository().setFixedNodes(zone.getId());
+ tester.configServer().nodeRepository().addFixedNodes(zone.getId());
}
}
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 0baee28143c..56f8de494f0 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
@@ -83,12 +83,12 @@ public class HostInfoUpdaterTest {
// Updates node registered under a different hostname
ZoneId zone = tester.zoneRegistry().zones().controllerUpgraded().all().ids().get(0);
String hostnameSuffix = ".prod." + zone.value();
- Node configNode = new Node.Builder().hostname(HostName.from("cfg3" + hostnameSuffix))
- .type(NodeType.config)
- .build();
- Node configHost = new Node.Builder().hostname(HostName.from("cfghost3" + hostnameSuffix))
- .type(NodeType.confighost)
- .build();
+ Node configNode = Node.builder().hostname(HostName.from("cfg3" + hostnameSuffix))
+ .type(NodeType.config)
+ .build();
+ Node configHost = Node.builder().hostname(HostName.from("cfghost3" + hostnameSuffix))
+ .type(NodeType.confighost)
+ .build();
tester.serviceRegistry().configServer().nodeRepository().putNodes(zone, List.of(configNode, configHost));
String switchHostname = switchHostname(configHost);
NodeEntity configNodeEntity = new NodeEntity("cfg3" + hostnameSuffix, "RD350G", "Lenovo", switchHostname);
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 29c5573a1f5..3789777a8fc 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
@@ -28,7 +28,6 @@ import org.junit.Test;
import java.time.Duration;
import java.util.Comparator;
import java.util.List;
-import java.util.Map;
import java.util.Set;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;
@@ -546,7 +545,7 @@ public class MetricsReporterTest {
ControllerTester tester) {
var currentNodes = getNodes(zone, nodes, tester);
var updatedNodes = currentNodes.stream()
- .map(node -> builderOps.apply(new Node.Builder(node)).build())
+ .map(node -> builderOps.apply(Node.builder(node)).build())
.collect(Collectors.toList());
tester.configServer().nodeRepository().putNodes(zone, updatedNodes);
}
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 c29e10ab643..eca000ff969 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
@@ -273,7 +273,7 @@ public class OsUpgraderTest {
throw new IllegalArgumentException("No nodes allocated to " + application.id());
}
Node node = nodes.get(0);
- nodeRepository().putNodes(zone.getVirtualId(), new Node.Builder(node).state(Node.State.failed).build());
+ nodeRepository().putNodes(zone.getVirtualId(), Node.builder(node).state(Node.State.failed).build());
}
/** Simulate OS upgrade of nodes allocated to application. In a real system this is done by the node itself */
@@ -285,9 +285,9 @@ public class OsUpgraderTest {
assertWanted(wantedVersion, application, zones);
for (ZoneApi zone : zones) {
for (Node node : nodesRequiredToUpgrade(zone, application)) {
- nodeRepository().putNodes(zone.getVirtualId(), new Node.Builder(node).wantedOsVersion(version)
- .currentOsVersion(version)
- .build());
+ nodeRepository().putNodes(zone.getVirtualId(), Node.builder(node).wantedOsVersion(version)
+ .currentOsVersion(version)
+ .build());
}
assertCurrent(version, application, zone);
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java
index e61516cbb1a..5ef64b460b9 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainerTest.java
@@ -114,8 +114,8 @@ public class ResourceMeterMaintainerTest {
ZoneApiMock zone1 = ZoneApiMock.newBuilder().withId("prod.region-2").build();
ZoneApiMock zone2 = ZoneApiMock.newBuilder().withId("test.region-3").build();
tester.zoneRegistry().setZones(zone1, zone2);
- tester.configServer().nodeRepository().setFixedNodes(zone1.getId());
- tester.configServer().nodeRepository().setFixedNodes(zone2.getId());
+ tester.configServer().nodeRepository().addFixedNodes(zone1.getId());
+ tester.configServer().nodeRepository().addFixedNodes(zone2.getId());
tester.configServer().nodeRepository().putNodes(zone1.getId(), createNodes());
}
@@ -126,21 +126,21 @@ public class ResourceMeterMaintainerTest {
Node.State.failed,
Node.State.parked,
Node.State.active)
- .map(state -> new Node.Builder()
- .hostname(HostName.from("host" + state))
- .parentHostname(HostName.from("parenthost" + state))
- .state(state)
- .type(NodeType.tenant)
- .owner(ApplicationId.from("tenant1", "app1", "default"))
- .currentVersion(Version.fromString("7.42"))
- .wantedVersion(Version.fromString("7.42"))
- .currentOsVersion(Version.fromString("7.6"))
- .wantedOsVersion(Version.fromString("7.6"))
- .serviceState(Node.ServiceState.expectedUp)
- .resources(new NodeResources(24, 24, 500, 1))
- .clusterId("clusterA")
- .clusterType(state == Node.State.active ? Node.ClusterType.admin : Node.ClusterType.container)
- .build())
+ .map(state -> Node.builder()
+ .hostname(HostName.from("host" + state))
+ .parentHostname(HostName.from("parenthost" + state))
+ .state(state)
+ .type(NodeType.tenant)
+ .owner(ApplicationId.from("tenant1", "app1", "default"))
+ .currentVersion(Version.fromString("7.42"))
+ .wantedVersion(Version.fromString("7.42"))
+ .currentOsVersion(Version.fromString("7.6"))
+ .wantedOsVersion(Version.fromString("7.6"))
+ .serviceState(Node.ServiceState.expectedUp)
+ .resources(new NodeResources(24, 24, 500, 1))
+ .clusterId("clusterA")
+ .clusterType(state == Node.State.active ? Node.ClusterType.admin : Node.ClusterType.container)
+ .build())
.collect(Collectors.toUnmodifiableList());
}
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceTagMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceTagMaintainerTest.java
index 516c28ab5cd..a90c8a9593b 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceTagMaintainerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceTagMaintainerTest.java
@@ -15,7 +15,6 @@ import org.junit.Test;
import java.time.Duration;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
import static com.yahoo.vespa.hosted.controller.maintenance.ResourceTagMaintainer.SHARED_HOST_APPLICATION;
import static org.junit.Assert.assertEquals;
@@ -25,7 +24,7 @@ import static org.junit.Assert.assertEquals;
*/
public class ResourceTagMaintainerTest {
- final ControllerTester tester = new ControllerTester();
+ private final ControllerTester tester = new ControllerTester();
@Test
public void maintain() {
@@ -51,24 +50,24 @@ public class ResourceTagMaintainerTest {
}
public void setNodes(ZoneId zone) {
- var hostA = new Node.Builder()
- .hostname(HostName.from("parentHostA." + zone.value()))
- .type(NodeType.host)
- .owner(ApplicationId.from(SystemApplication.TENANT.value(), "tenant-host", "default"))
- .exclusiveTo(ApplicationId.from("t1", "a1", "i1"))
- .build();
- var nodeA = new Node.Builder()
- .hostname(HostName.from("hostA." + zone.value()))
- .type(NodeType.tenant)
- .parentHostname(HostName.from("parentHostA." + zone.value()))
- .owner(ApplicationId.from("tenant1", "app1", "default"))
- .build();
- var hostB = new Node.Builder()
- .hostname(HostName.from("parentHostB." + zone.value()))
- .type(NodeType.host)
- .owner(ApplicationId.from(SystemApplication.TENANT.value(), "tenant-host", "default"))
- .build();
- tester.configServer().nodeRepository().setNodes(zone, List.of(hostA, nodeA, hostB));
+ var hostA = Node.builder()
+ .hostname(HostName.from("parentHostA." + zone.value()))
+ .type(NodeType.host)
+ .owner(ApplicationId.from(SystemApplication.TENANT.value(), "tenant-host", "default"))
+ .exclusiveTo(ApplicationId.from("t1", "a1", "i1"))
+ .build();
+ var nodeA = Node.builder()
+ .hostname(HostName.from("hostA." + zone.value()))
+ .type(NodeType.tenant)
+ .parentHostname(HostName.from("parentHostA." + zone.value()))
+ .owner(ApplicationId.from("tenant1", "app1", "default"))
+ .build();
+ var hostB = Node.builder()
+ .hostname(HostName.from("parentHostB." + zone.value()))
+ .type(NodeType.host)
+ .owner(ApplicationId.from(SystemApplication.TENANT.value(), "tenant-host", "default"))
+ .build();
+ tester.configServer().nodeRepository().putNodes(zone, List.of(hostA, nodeA, hostB));
}
}
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 db2353860ae..8090765b5f9 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
@@ -305,7 +305,7 @@ public class SystemUpgraderTest {
for (Node node : listNodes(zone, application)) {
nodeRepository().putNodes(
zone.getId(),
- new Node.Builder(node).currentVersion(node.wantedVersion()).build());
+ Node.builder(node).currentVersion(node.wantedVersion()).build());
}
assertCurrentVersion(application, version, zone);
});
@@ -329,7 +329,7 @@ public class SystemUpgraderTest {
Node node = nodes.get(0);
nodeRepository().putNodes(
zone.getId(),
- new Node.Builder(node).state(Node.State.failed).build());
+ Node.builder(node).state(Node.State.failed).build());
}
private void assertSystemVersion(Version version) {
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 16ed6b7ef98..f957b14ef95 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
@@ -20,8 +20,12 @@ import java.time.Duration;
import java.time.Instant;
import java.time.ZonedDateTime;
import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
/**
* @author olaa
@@ -49,9 +53,12 @@ public class VCMRMaintainerTest {
vcmrReport.addVcmr("id123", ZonedDateTime.now(), ZonedDateTime.now());
var parkedNode = createNode(host1, NodeType.host, Node.State.parked, true);
var failedNode = createNode(host2, NodeType.host, Node.State.failed, false);
- parkedNode = new Node.Builder(parkedNode)
- .reports(vcmrReport.toNodeReports())
- .build();
+ Map<String, String> reports = vcmrReport.toNodeReports().entrySet().stream()
+ .collect(Collectors.toMap(Map.Entry::getKey,
+ kv -> kv.getValue().toString()));
+ parkedNode = Node.builder(parkedNode)
+ .reports(reports)
+ .build();
nodeRepo.putNodes(zoneId, List.of(parkedNode, failedNode));
@@ -63,8 +70,7 @@ public class VCMRMaintainerTest {
assertEquals(Node.State.dirty, nodeList.get(0).state());
assertEquals(Node.State.failed, nodeList.get(1).state());
- var report = nodeList.get(0).reports();
- assertNull(report.get(VCMRReport.getReportId()));
+ assertTrue(nodeList.get(0).reports().isEmpty());
var writtenChangeRequest = tester.curator().readChangeRequest(changeRequestId).get();
assertEquals(Status.COMPLETED, writtenChangeRequest.getStatus());
@@ -235,11 +241,11 @@ public class VCMRMaintainerTest {
}
private Node createNode(HostName hostname, NodeType nodeType, Node.State state, boolean wantToRetire) {
- return new Node.Builder()
- .hostname(hostname)
- .type(nodeType)
- .state(state)
- .wantToRetire(wantToRetire)
- .build();
+ return Node.builder()
+ .hostname(hostname)
+ .type(nodeType)
+ .state(state)
+ .wantToRetire(wantToRetire)
+ .build();
}
-} \ No newline at end of file
+}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandlerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandlerTest.java
index 80cee3af58b..5846ab5f2a4 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandlerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandlerTest.java
@@ -2,23 +2,17 @@
package com.yahoo.vespa.hosted.controller.restapi.changemanagement;
import com.yahoo.application.container.handler.Request;
-import com.yahoo.config.provision.HostName;
+import com.yahoo.config.provision.ApplicationId;
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.noderepository.NodeMembership;
-import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeOwner;
-import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeRepositoryNode;
-import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeState;
-import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeType;
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;
import com.yahoo.vespa.hosted.controller.api.integration.vcmr.VespaChangeRequest;
import com.yahoo.vespa.hosted.controller.restapi.ContainerTester;
import com.yahoo.vespa.hosted.controller.restapi.ControllerContainerTest;
-import org.intellij.lang.annotations.Language;
import org.junit.Before;
import org.junit.Test;
@@ -42,8 +36,7 @@ public class ChangeManagementApiHandlerTest extends ControllerContainerTest {
public void before() {
tester = new ContainerTester(container, responses);
addUserToHostedOperatorRole(operator);
- tester.serviceRegistry().configServer().nodeRepository().addNodes(ZoneId.from("prod.us-east-3"), createNodes());
- tester.serviceRegistry().configServer().nodeRepository().putNodes(ZoneId.from("prod.us-east-3"), createNode());
+ tester.serviceRegistry().configServer().nodeRepository().putNodes(ZoneId.from("prod.us-east-3"), createNodes());
tester.controller().curator().writeChangeRequest(createChangeRequest());
}
@@ -85,23 +78,11 @@ public class ChangeManagementApiHandlerTest extends ControllerContainerTest {
assertEquals(VespaChangeRequest.Status.COMPLETED, changeRequest.getStatus());
}
- private void assertResponse(Request request, @Language("JSON") String body, int statusCode) {
- addIdentityToRequest(request, operator);
- tester.assertResponse(request, body, statusCode);
- }
-
private void assertFile(Request request, String filename) {
addIdentityToRequest(request, operator);
tester.assertResponse(request, new File(filename));
}
- private Node createNode() {
- return new Node.Builder()
- .hostname(HostName.from("host1"))
- .switchHostname("switch1")
- .build();
- }
-
private VespaChangeRequest createChangeRequest() {
var instant = Instant.ofEpochMilli(9001);
var date = ZonedDateTime.ofInstant(instant, java.time.ZoneId.of("UTC"));
@@ -124,8 +105,8 @@ public class ChangeManagementApiHandlerTest extends ControllerContainerTest {
);
}
- private List<NodeRepositoryNode> createNodes() {
- List<NodeRepositoryNode> nodes = new ArrayList<>();
+ private List<Node> createNodes() {
+ List<Node> nodes = new ArrayList<>();
nodes.add(createNode("node1", "host1", "default", 0 ));
nodes.add(createNode("node2", "host1", "default", 0 ));
nodes.add(createNode("node3", "host1", "default", 0 ));
@@ -135,44 +116,27 @@ public class ChangeManagementApiHandlerTest extends ControllerContainerTest {
return nodes;
}
- private NodeOwner createOwner() {
- NodeOwner owner = new NodeOwner();
- owner.tenant = "mytenant";
- owner.application = "myapp";
- owner.instance = "default";
- return owner;
- }
-
- private NodeMembership createMembership(String clusterId, int group) {
- NodeMembership membership = new NodeMembership();
- membership.group = "" + group;
- membership.clusterid = clusterId;
- membership.clustertype = "content";
- membership.index = 2;
- membership.retired = false;
- return membership;
- }
-
- private NodeRepositoryNode createNode(String nodename, String hostname, String clusterId, int group) {
- NodeRepositoryNode node = new NodeRepositoryNode();
- node.setHostname(nodename);
- node.setParentHostname(hostname);
- node.setState(NodeState.active);
- node.setOwner(createOwner());
- node.setMembership(createMembership(clusterId, group));
- node.setType(NodeType.tenant);
-
- return node;
+ private Node createNode(String nodename, String hostname, String clusterId, int group) {
+ return Node.builder()
+ .hostname(nodename)
+ .parentHostname(hostname).state(Node.State.active)
+ .owner(ApplicationId.from("mytenant", "myapp", "default"))
+ .type(com.yahoo.config.provision.NodeType.tenant)
+ .clusterId(clusterId)
+ .group(String.valueOf(group))
+ .clusterType(Node.ClusterType.content)
+ .build();
}
- private NodeRepositoryNode createHost(String hostname, String switchName) {
- NodeRepositoryNode node = new NodeRepositoryNode();
- node.setHostname(hostname);
- node.setSwitchHostname(switchName);
- node.setOwner(createOwner());
- node.setType(NodeType.host);
- node.setMembership(createMembership("host", 0));
- return node;
+ private Node createHost(String hostname, String switchName) {
+ return Node.builder()
+ .hostname(hostname)
+ .switchHostname(switchName)
+ .owner(ApplicationId.from("mytenant", "myapp", "default"))
+ .type(com.yahoo.config.provision.NodeType.host)
+ .clusterId("host")
+ .group("0")
+ .build();
}
}
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 7364723f5f0..c1358decf19 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
@@ -142,7 +142,7 @@ public class OsApiTest extends ControllerContainerTest {
var targetVersion = nodeRepository().targetVersionsOf(zone).osVersion(application.nodeType());
for (Node node : nodeRepository().list(zone, application.id())) {
var version = targetVersion.orElse(node.wantedOsVersion());
- nodeRepository().putNodes(zone, new Node.Builder(node).currentOsVersion(version).wantedOsVersion(version).build());
+ 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 4dd283cf5d7..6e70fb8c3cb 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
@@ -70,7 +70,7 @@ public class VersionStatusTest {
// Upgrade some config servers
for (ZoneApi zone : tester.zoneRegistry().zones().all().zones()) {
for (Node node : tester.configServer().nodeRepository().list(zone.getId(), SystemApplication.configServer.id())) {
- Node upgradedNode = new Node.Builder(node).currentVersion(version1).build();
+ Node upgradedNode = Node.builder(node).currentVersion(version1).build();
tester.configServer().nodeRepository().putNodes(zone.getId(), upgradedNode);
break;
}
@@ -114,7 +114,7 @@ public class VersionStatusTest {
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())) {
- Node downgradedNode = new Node.Builder(node).currentVersion(ancientVersion).build();
+ Node downgradedNode = Node.builder(node).currentVersion(ancientVersion).build();
tester.configServer().nodeRepository().putNodes(zone.getId(), downgradedNode);
break;
}