aboutsummaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2021-06-24 14:30:14 +0200
committerMartin Polden <mpolden@mpolden.no>2021-06-24 14:30:14 +0200
commit99665f650e8ef38626d6a0c4b9d4a21b1243f086 (patch)
tree745b7078939e59166b86b57219732831d6211971 /controller-server
parentd25995ae103887c9509cb8622429a50b9138a7f7 (diff)
Remove unnecessary NodeVersions class
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporter.java6
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/NodeVersionSerializer.java17
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java7
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java13
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java5
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersion.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersions.java77
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersionStatus.java42
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java24
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VespaVersion.java7
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgraderTest.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdaterTest.java4
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializerTest.java16
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializerTest.java5
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiTest.java5
16 files changed, 71 insertions, 163 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporter.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporter.java
index 3f65c2e49cd..e23cda4dae0 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporter.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporter.java
@@ -9,7 +9,6 @@ import com.yahoo.jdisc.Metric;
import com.yahoo.vespa.hosted.controller.Application;
import com.yahoo.vespa.hosted.controller.Controller;
import com.yahoo.vespa.hosted.controller.Instance;
-import com.yahoo.vespa.hosted.controller.api.integration.billing.PlanId;
import com.yahoo.vespa.hosted.controller.api.integration.deployment.ApplicationVersion;
import com.yahoo.vespa.hosted.controller.application.ApplicationList;
import com.yahoo.vespa.hosted.controller.application.Deployment;
@@ -19,7 +18,6 @@ import com.yahoo.vespa.hosted.controller.deployment.DeploymentStatusList;
import com.yahoo.vespa.hosted.controller.deployment.JobList;
import com.yahoo.vespa.hosted.controller.rotation.RotationLock;
import com.yahoo.vespa.hosted.controller.versions.NodeVersion;
-import com.yahoo.vespa.hosted.controller.versions.NodeVersions;
import com.yahoo.vespa.hosted.controller.versions.VersionStatus;
import com.yahoo.vespa.hosted.controller.versions.VespaVersion;
@@ -221,11 +219,11 @@ public class MetricsReporter extends ControllerMaintainer {
return changeDurations(controller().osVersionStatus().versions().values(), Function.identity());
}
- private <V> Map<NodeVersion, Duration> changeDurations(Collection<V> versions, Function<V, NodeVersions> versionsGetter) {
+ private <V> Map<NodeVersion, Duration> changeDurations(Collection<V> versions, Function<V, List<NodeVersion>> versionsGetter) {
var now = clock.instant();
var durations = new HashMap<NodeVersion, Duration>();
for (var version : versions) {
- for (var nodeVersion : versionsGetter.apply(version).asMap().values()) {
+ for (var nodeVersion : versionsGetter.apply(version)) {
durations.put(nodeVersion, nodeVersion.changeDuration(now));
}
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/NodeVersionSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/NodeVersionSerializer.java
index 2861e8922a5..857087ab0b3 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/NodeVersionSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/NodeVersionSerializer.java
@@ -1,7 +1,6 @@
// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller.persistence;
-import com.google.common.collect.ImmutableMap;
import com.yahoo.component.Version;
import com.yahoo.config.provision.HostName;
import com.yahoo.config.provision.zone.ZoneId;
@@ -10,7 +9,9 @@ import com.yahoo.slime.Cursor;
import com.yahoo.slime.Inspector;
import com.yahoo.slime.SlimeUtils;
import com.yahoo.vespa.hosted.controller.versions.NodeVersion;
-import com.yahoo.vespa.hosted.controller.versions.NodeVersions;
+
+import java.util.ArrayList;
+import java.util.List;
/**
* Serializer for {@link com.yahoo.vespa.hosted.controller.versions.NodeVersion}.
@@ -31,8 +32,8 @@ public class NodeVersionSerializer {
private static final String wantedVersionField = "wantedVersion";
private static final String suspendedAtField = "suspendedAt";
- public void nodeVersionsToSlime(NodeVersions nodeVersions, Cursor array) {
- for (var nodeVersion : nodeVersions.asMap().values()) {
+ public void nodeVersionsToSlime(List<NodeVersion> nodeVersions, Cursor array) {
+ for (var nodeVersion : nodeVersions) {
var nodeVersionObject = array.addObject();
nodeVersionObject.setString(hostnameField, nodeVersion.hostname().value());
nodeVersionObject.setString(zoneField, nodeVersion.zone().value());
@@ -42,16 +43,16 @@ public class NodeVersionSerializer {
}
}
- public NodeVersions nodeVersionsFromSlime(Inspector array, Version version) {
- var nodeVersions = ImmutableMap.<HostName, NodeVersion>builder();
+ public List<NodeVersion> nodeVersionsFromSlime(Inspector array, Version version) {
+ List<NodeVersion> nodeVersions = new ArrayList<>();
array.traverse((ArrayTraverser) (i, entry) -> {
var hostname = HostName.from(entry.field(hostnameField).asString());
var zone = ZoneId.from(entry.field(zoneField).asString());
var wantedVersion = Version.fromString(entry.field(wantedVersionField).asString());
var suspendedAt = SlimeUtils.optionalInstant(entry.field(suspendedAtField));
- nodeVersions.put(hostname, new NodeVersion(hostname, zone, version, wantedVersion, suspendedAt));
+ nodeVersions.add(new NodeVersion(hostname, zone, version, wantedVersion, suspendedAt));
});
- return new NodeVersions(nodeVersions.build());
+ return nodeVersions;
}
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java
index 8899ff89c0d..e2420993cb2 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializer.java
@@ -7,10 +7,11 @@ import com.yahoo.slime.ArrayTraverser;
import com.yahoo.slime.Cursor;
import com.yahoo.slime.Inspector;
import com.yahoo.slime.Slime;
-import com.yahoo.vespa.hosted.controller.versions.NodeVersions;
+import com.yahoo.vespa.hosted.controller.versions.NodeVersion;
import com.yahoo.vespa.hosted.controller.versions.OsVersion;
import com.yahoo.vespa.hosted.controller.versions.OsVersionStatus;
+import java.util.List;
import java.util.Objects;
/**
@@ -54,8 +55,8 @@ public class OsVersionStatusSerializer {
return new OsVersionStatus(osVersionsFromSlime(slime.get().field(versionsField)));
}
- private ImmutableMap<OsVersion, NodeVersions> osVersionsFromSlime(Inspector array) {
- var versions = ImmutableSortedMap.<OsVersion, NodeVersions>naturalOrder();
+ private ImmutableMap<OsVersion, List<NodeVersion>> osVersionsFromSlime(Inspector array) {
+ var versions = ImmutableSortedMap.<OsVersion, List<NodeVersion>>naturalOrder();
array.traverse((ArrayTraverser) (i, object) -> {
OsVersion osVersion = osVersionSerializer.fromSlime(object);
versions.put(osVersion, nodeVersionSerializer.nodeVersionsFromSlime(object.field(nodeVersionsField), osVersion.version()));
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java
index eccda7332e1..0288a251798 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java
@@ -2,13 +2,12 @@
package com.yahoo.vespa.hosted.controller.persistence;
import com.yahoo.component.Version;
-import com.yahoo.config.provision.ApplicationId;
import com.yahoo.slime.ArrayTraverser;
import com.yahoo.slime.Cursor;
import com.yahoo.slime.Inspector;
import com.yahoo.slime.Slime;
import com.yahoo.slime.SlimeUtils;
-import com.yahoo.vespa.hosted.controller.versions.NodeVersions;
+import com.yahoo.vespa.hosted.controller.versions.NodeVersion;
import com.yahoo.vespa.hosted.controller.versions.VersionStatus;
import com.yahoo.vespa.hosted.controller.versions.VespaVersion;
@@ -85,7 +84,7 @@ public class VersionStatusSerializer {
nodeVersionsToSlime(version.nodeVersions(), object.setArray(nodeVersionsField));
}
- private void nodeVersionsToSlime(NodeVersions nodeVersions, Cursor array) {
+ private void nodeVersionsToSlime(List<NodeVersion> nodeVersions, Cursor array) {
nodeVersionSerializer.nodeVersionsToSlime(nodeVersions, array);
}
@@ -116,12 +115,4 @@ public class VersionStatusSerializer {
);
}
- private List<ApplicationId> applicationsFromSlime(Inspector array) {
- List<ApplicationId> applications = new ArrayList<>();
- array.traverse((ArrayTraverser) (i, entry) -> applications.add(
- ApplicationId.fromSerializedForm(entry.asString()))
- );
- return Collections.unmodifiableList(applications);
- }
-
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java
index 5d819ec9804..6ec0533c358 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java
@@ -4,7 +4,6 @@ package com.yahoo.vespa.hosted.controller.restapi.deployment;
import com.yahoo.config.application.api.DeploymentInstanceSpec;
import com.yahoo.config.application.api.DeploymentSpec;
import com.yahoo.config.provision.ApplicationId;
-import com.yahoo.config.provision.HostName;
import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.container.jdisc.HttpResponse;
import com.yahoo.container.jdisc.LoggingRequestHandler;
@@ -109,9 +108,9 @@ public class DeploymentApiHandler extends LoggingRequestHandler {
versionObject.setBool("systemVersion", version.isSystemVersion());
Cursor configServerArray = versionObject.setArray("configServers");
- for (HostName hostname : version.nodeVersions().hostnames()) {
+ for (var nodeVersion : version.nodeVersions()) {
Cursor configServerObject = configServerArray.addObject();
- configServerObject.setString("hostname", hostname.value());
+ configServerObject.setString("hostname", nodeVersion.hostname().value());
}
DeploymentStatistics statistics = deploymentStatistics.get(version.versionNumber());
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java
index b34c6685693..5a8e2c2fa62 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java
@@ -176,7 +176,7 @@ public class OsApiHandler extends AuditLoggingRequestHandler {
target.ifPresent(t -> currentVersionObject.setString("upgradeBudget", t.upgradeBudget().toString()));
currentVersionObject.setString("cloud", osVersion.cloud().value());
Cursor nodesArray = currentVersionObject.setArray("nodes");
- nodeVersions.asMap().values().forEach(nodeVersion -> {
+ nodeVersions.forEach(nodeVersion -> {
Cursor nodeObject = nodesArray.addObject();
nodeObject.setString("hostname", nodeVersion.hostname().value());
nodeObject.setString("environment", nodeVersion.zone().environment().value());
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersion.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersion.java
index 15136ed79eb..8a1714e86d6 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersion.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersion.java
@@ -61,7 +61,7 @@ public class NodeVersion {
return Duration.between(suspendedAt.get(), instant).abs();
}
- /** The most recent time the node referenced by this suspended. This is empty if the node is not suspended. */
+ /** The most recent time the node referenced in this suspended. This is empty if the node is not suspended. */
public Optional<Instant> suspendedAt() {
return suspendedAt;
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersions.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersions.java
deleted file mode 100644
index e2791c0bfe5..00000000000
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersions.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.controller.versions;
-
-import com.google.common.collect.ImmutableMap;
-import com.yahoo.component.Version;
-import com.yahoo.config.provision.HostName;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.function.Predicate;
-
-/**
- * A filterable list of {@link NodeVersion}s. This is immutable.
- *
- * @author mpolden
- */
-public class NodeVersions {
-
- private final ImmutableMap<HostName, NodeVersion> nodeVersions;
-
- public NodeVersions(Map<HostName, NodeVersion> nodeVersions) {
- this.nodeVersions = ImmutableMap.copyOf(Objects.requireNonNull(nodeVersions));
- }
-
- public Map<HostName, NodeVersion> asMap() {
- return nodeVersions;
- }
-
- /** Returns host names in this */
- public Set<HostName> hostnames() {
- return nodeVersions.keySet();
- }
-
- /** Returns a copy of this containing only node versions of given version */
- public NodeVersions matching(Version version) {
- return copyOf(nodeVersions.values(), nodeVersion -> nodeVersion.currentVersion().equals(version));
- }
-
- /** Returns number of node versions in this */
- public int size() {
- return nodeVersions.size();
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- NodeVersions that = (NodeVersions) o;
- return nodeVersions.equals(that.nodeVersions);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(nodeVersions);
- }
-
- public static NodeVersions copyOf(List<NodeVersion> nodeVersions) {
- return copyOf(nodeVersions, (ignored) -> true);
- }
-
- public static NodeVersions copyOf(Map<HostName, NodeVersion> nodeVersions) {
- return new NodeVersions(nodeVersions);
- }
-
- private static NodeVersions copyOf(Collection<NodeVersion> nodeVersions, Predicate<NodeVersion> predicate) {
- var newNodeVersions = ImmutableMap.<HostName, NodeVersion>builder();
- for (var nodeVersion : nodeVersions) {
- if (!predicate.test(nodeVersion)) continue;
- newNodeVersions.put(nodeVersion.hostname(), nodeVersion);
- }
- return new NodeVersions(newNodeVersions.build());
- }
-
-}
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 69808a987fc..78c7b36181e 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
@@ -4,18 +4,19 @@ package com.yahoo.vespa.hosted.controller.versions;
import com.google.common.collect.ImmutableMap;
import com.yahoo.component.Version;
import com.yahoo.config.provision.CloudName;
-import com.yahoo.config.provision.HostName;
import com.yahoo.config.provision.zone.ZoneApi;
import com.yahoo.vespa.hosted.controller.Controller;
import com.yahoo.vespa.hosted.controller.application.SystemApplication;
import com.yahoo.vespa.hosted.controller.maintenance.OsUpgrader;
+import java.time.Instant;
import java.util.ArrayList;
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.stream.Collectors;
@@ -28,15 +29,15 @@ public class OsVersionStatus {
public static final OsVersionStatus empty = new OsVersionStatus(ImmutableMap.of());
- private final Map<OsVersion, NodeVersions> versions;
+ private final Map<OsVersion, List<NodeVersion>> versions;
/** Public for serialization purpose only. Use {@link OsVersionStatus#compute(Controller)} for an up-to-date status */
- public OsVersionStatus(ImmutableMap<OsVersion, NodeVersions> versions) {
+ public OsVersionStatus(Map<OsVersion, List<NodeVersion>> versions) {
this.versions = ImmutableMap.copyOf(Objects.requireNonNull(versions, "versions must be non-null"));
}
/** All known OS versions and their nodes */
- public Map<OsVersion, NodeVersions> versions() {
+ public Map<OsVersion, List<NodeVersion>> versions() {
return versions;
}
@@ -44,8 +45,9 @@ public class OsVersionStatus {
public List<NodeVersion> nodesIn(CloudName cloud) {
return versions.entrySet().stream()
.filter(entry -> entry.getKey().cloud().equals(cloud))
- .flatMap(entry -> entry.getValue().asMap().values().stream())
- .collect(Collectors.toUnmodifiableList());
+ .map(Map.Entry::getValue)
+ .findFirst()
+ .orElseGet(List::of);
}
/** Returns versions that exist in given cloud */
@@ -58,38 +60,30 @@ public class OsVersionStatus {
/** Compute the current OS versions in this system. This is expensive and should be called infrequently */
public static OsVersionStatus compute(Controller controller) {
- var osVersions = new HashMap<OsVersion, List<NodeVersion>>();
+ Map<OsVersion, List<NodeVersion>> osVersions = new HashMap<>();
controller.osVersionTargets().forEach(target -> osVersions.put(target.osVersion(), new ArrayList<>()));
for (var application : SystemApplication.all()) {
for (var zone : zonesToUpgrade(controller)) {
if (!application.shouldUpgradeOs()) continue;
- var targetOsVersion = controller.serviceRegistry().configServer().nodeRepository()
- .targetVersionsOf(zone.getVirtualId())
- .osVersion(application.nodeType())
- .orElse(Version.emptyVersion);
+ Version targetOsVersion = controller.serviceRegistry().configServer().nodeRepository()
+ .targetVersionsOf(zone.getVirtualId())
+ .osVersion(application.nodeType())
+ .orElse(Version.emptyVersion);
for (var node : controller.serviceRegistry().configServer().nodeRepository().list(zone.getVirtualId(), application.id())) {
if (!OsUpgrader.canUpgrade(node)) continue;
- var suspendedAt = node.suspendedSince();
- var nodeVersion = new NodeVersion(node.hostname(), zone.getVirtualId(), node.currentOsVersion(),
- targetOsVersion, suspendedAt);
- var osVersion = new OsVersion(nodeVersion.currentVersion(), zone.getCloudName());
+ Optional<Instant> suspendedAt = node.suspendedSince();
+ NodeVersion nodeVersion = new NodeVersion(node.hostname(), zone.getVirtualId(), node.currentOsVersion(),
+ targetOsVersion, suspendedAt);
+ OsVersion osVersion = new OsVersion(nodeVersion.currentVersion(), zone.getCloudName());
osVersions.computeIfAbsent(osVersion, (k) -> new ArrayList<>())
.add(nodeVersion);
}
}
}
- var newOsVersions = ImmutableMap.<OsVersion, NodeVersions>builder();
- for (var osVersion : osVersions.entrySet()) {
- var nodeVersions = ImmutableMap.<HostName, NodeVersion>builder();
- for (var nodeVersion : osVersion.getValue()) {
- nodeVersions.put(nodeVersion.hostname(), nodeVersion);
- }
- newOsVersions.put(osVersion.getKey(), new NodeVersions(nodeVersions.build()));
- }
- return new OsVersionStatus(newOsVersions.build());
+ return new OsVersionStatus(osVersions);
}
private static List<ZoneApi> zonesToUpgrade(Controller controller) {
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 c45cea29c33..beefaadb2a1 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
@@ -12,7 +12,6 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
-import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -86,7 +85,7 @@ public class VersionStatus {
/** Create a full, updated version status. This is expensive and should be done infrequently */
public static VersionStatus compute(Controller controller) {
VersionStatus versionStatus = controller.readVersionStatus();
- NodeVersions systemApplicationVersions = findSystemApplicationVersions(controller, versionStatus);
+ List<NodeVersion> systemApplicationVersions = findSystemApplicationVersions(controller, versionStatus);
Map<ControllerVersion, List<HostName>> controllerVersions = findControllerVersions(controller);
Map<Version, List<HostName>> infrastructureVersions = new HashMap<>();
@@ -94,9 +93,9 @@ public class VersionStatus {
infrastructureVersions.computeIfAbsent(kv.getKey().version(), (k) -> new ArrayList<>())
.addAll(kv.getValue());
}
- for (var kv : systemApplicationVersions.asMap().entrySet()) {
- infrastructureVersions.computeIfAbsent(kv.getValue().currentVersion(), (k) -> new ArrayList<>())
- .add(kv.getKey());
+ for (var nodeVersion : systemApplicationVersions) {
+ infrastructureVersions.computeIfAbsent(nodeVersion.currentVersion(), (k) -> new ArrayList<>())
+ .add(nodeVersion.hostname());
}
// The system version is the oldest infrastructure version, if that version is newer than the current system
@@ -130,11 +129,14 @@ public class VersionStatus {
try {
boolean isReleased = Collections.binarySearch(releasedVersions, statistics.version()) >= 0;
+ List<NodeVersion> nodeVersions = systemApplicationVersions.stream()
+ .filter(nodeVersion -> nodeVersion.currentVersion().equals(statistics.version()))
+ .collect(Collectors.toList());
VespaVersion vespaVersion = createVersion(statistics,
controllerVersions.keySet(),
systemVersion,
isReleased,
- systemApplicationVersions.matching(statistics.version()),
+ nodeVersions,
controller,
versionStatus);
versions.add(vespaVersion);
@@ -149,8 +151,8 @@ public class VersionStatus {
return new VersionStatus(versions);
}
- private static NodeVersions findSystemApplicationVersions(Controller controller, VersionStatus versionStatus) {
- var nodeVersions = new LinkedHashMap<HostName, NodeVersion>();
+ private static List<NodeVersion> findSystemApplicationVersions(Controller controller, VersionStatus versionStatus) {
+ List<NodeVersion> nodeVersions = new ArrayList<>();
for (var zone : controller.zoneRegistry().zones().controllerUpgraded().zones()) {
for (var application : SystemApplication.notController()) {
var nodes = controller.serviceRegistry().configServer().nodeRepository()
@@ -168,11 +170,11 @@ public class VersionStatus {
var version = configConverged ? node.currentVersion() : controller.systemVersion(versionStatus);
var nodeVersion = new NodeVersion(node.hostname(), zone.getId(), version, node.wantedVersion(),
node.suspendedSince());
- nodeVersions.put(nodeVersion.hostname(), nodeVersion);
+ nodeVersions.add(nodeVersion);
}
}
}
- return NodeVersions.copyOf(nodeVersions);
+ return nodeVersions;
}
private static Map<ControllerVersion, List<HostName>> findControllerVersions(Controller controller) {
@@ -194,7 +196,7 @@ public class VersionStatus {
Set<ControllerVersion> controllerVersions,
Version systemVersion,
boolean isReleased,
- NodeVersions nodeVersions,
+ List<NodeVersion> nodeVersions,
Controller controller,
VersionStatus versionStatus) {
ControllerVersion latestVersion = controllerVersions.stream().max(Comparator.naturalOrder()).get();
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VespaVersion.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VespaVersion.java
index 3510a4f78cd..d61e0e37fae 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VespaVersion.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VespaVersion.java
@@ -9,6 +9,7 @@ import com.yahoo.vespa.hosted.controller.application.InstanceList;
import java.time.Instant;
import java.time.ZoneOffset;
+import java.util.List;
import static com.yahoo.config.application.api.DeploymentSpec.UpgradePolicy;
@@ -28,12 +29,12 @@ public class VespaVersion implements Comparable<VespaVersion> {
private final boolean isControllerVersion;
private final boolean isSystemVersion;
private final boolean isReleased;
- private final NodeVersions nodeVersions;
+ private final List<NodeVersion> nodeVersions;
private final Confidence confidence;
public VespaVersion(Version version, String releaseCommit, Instant committedAt,
boolean isControllerVersion, boolean isSystemVersion, boolean isReleased,
- NodeVersions nodeVersions,
+ List<NodeVersion> nodeVersions,
Confidence confidence) {
this.version = version;
this.releaseCommit = releaseCommit;
@@ -104,7 +105,7 @@ public class VespaVersion implements Comparable<VespaVersion> {
public boolean isReleased() { return isReleased; }
/** Returns the versions of nodes allocated to system applications (across all zones) */
- public NodeVersions nodeVersions() {
+ public List<NodeVersion> nodeVersions() {
return nodeVersions;
}
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 664a1fdc83c..092f72274e5 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
@@ -235,7 +235,7 @@ public class OsUpgraderTest {
private List<NodeVersion> nodesOn(Version version) {
return tester.controller().osVersionStatus().versions().entrySet().stream()
.filter(entry -> entry.getKey().version().equals(version))
- .flatMap(entry -> entry.getValue().asMap().values().stream())
+ .flatMap(entry -> entry.getValue().stream())
.collect(Collectors.toList());
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdaterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdaterTest.java
index 95f6af06230..307540a9694 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdaterTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdaterTest.java
@@ -45,8 +45,8 @@ public class OsVersionStatusUpdaterTest {
var osVersions = tester.controller().osVersionStatus().versions();
assertEquals(2, osVersions.size());
- assertFalse("All nodes on unknown version", osVersions.get(new OsVersion(Version.emptyVersion, cloud)).asMap().isEmpty());
- assertTrue("No nodes on current target", osVersions.get(new OsVersion(version1, cloud)).asMap().isEmpty());
+ assertFalse("All nodes on unknown version", osVersions.get(new OsVersion(Version.emptyVersion, cloud)).isEmpty());
+ assertTrue("No nodes on current target", osVersions.get(new OsVersion(version1, cloud)).isEmpty());
}
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializerTest.java
index efdf412ab77..cff845c9dbe 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionStatusSerializerTest.java
@@ -1,19 +1,19 @@
// 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.persistence;
-import com.google.common.collect.ImmutableMap;
import com.yahoo.component.Version;
import com.yahoo.config.provision.CloudName;
import com.yahoo.config.provision.HostName;
import com.yahoo.config.provision.zone.ZoneId;
import com.yahoo.vespa.hosted.controller.versions.NodeVersion;
-import com.yahoo.vespa.hosted.controller.versions.NodeVersions;
import com.yahoo.vespa.hosted.controller.versions.OsVersion;
import com.yahoo.vespa.hosted.controller.versions.OsVersionStatus;
import org.junit.Test;
import java.time.Instant;
+import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
import static org.junit.Assert.assertEquals;
@@ -27,19 +27,19 @@ public class OsVersionStatusSerializerTest {
public void serialization() {
Version version1 = Version.fromString("7.1");
Version version2 = Version.fromString("7.2");
- var versions = ImmutableMap.<OsVersion, NodeVersions>builder();
+ Map<OsVersion, List<NodeVersion>> versions = new LinkedHashMap<>();
- versions.put(new OsVersion(version1, CloudName.defaultName()), NodeVersions.copyOf(List.of(
+ versions.put(new OsVersion(version1, CloudName.defaultName()), List.of(
new NodeVersion(HostName.from("node1"), ZoneId.from("prod", "us-west"), version1, version2, Optional.of(Instant.ofEpochMilli(11))),
new NodeVersion(HostName.from("node2"), ZoneId.from("prod", "us-east"), version1, version2, Optional.of(Instant.ofEpochMilli(22)))
- )));
- versions.put(new OsVersion(version2, CloudName.defaultName()), NodeVersions.copyOf(List.of(
+ ));
+ versions.put(new OsVersion(version2, CloudName.defaultName()), List.of(
new NodeVersion(HostName.from("node3"), ZoneId.from("prod", "us-west"), version2, version2, Optional.of(Instant.ofEpochMilli(33))),
new NodeVersion(HostName.from("node4"), ZoneId.from("prod", "us-east"), version2, version2, Optional.of(Instant.ofEpochMilli(44)))
- )));
+ ));
OsVersionStatusSerializer serializer = new OsVersionStatusSerializer(new OsVersionSerializer(), new NodeVersionSerializer());
- OsVersionStatus status = new OsVersionStatus(versions.build());
+ OsVersionStatus status = new OsVersionStatus(versions);
OsVersionStatus serialized = serializer.fromSlime(serializer.toSlime(status));
assertEquals(status.versions(), serialized.versions());
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializerTest.java
index 41d59239321..a8bc83ff2ac 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializerTest.java
@@ -5,7 +5,6 @@ import com.yahoo.component.Version;
import com.yahoo.config.provision.HostName;
import com.yahoo.config.provision.zone.ZoneId;
import com.yahoo.vespa.hosted.controller.versions.NodeVersion;
-import com.yahoo.vespa.hosted.controller.versions.NodeVersions;
import com.yahoo.vespa.hosted.controller.versions.VersionStatus;
import com.yahoo.vespa.hosted.controller.versions.VespaVersion;
import org.junit.Test;
@@ -53,12 +52,12 @@ public class VersionStatusSerializerTest {
}
- private static NodeVersions nodeVersions(Version version, Version wantedVersion, String... hostnames) {
+ private static List<NodeVersion> nodeVersions(Version version, Version wantedVersion, String... hostnames) {
var nodeVersions = new ArrayList<NodeVersion>();
for (var hostname : hostnames) {
nodeVersions.add(new NodeVersion(HostName.from(hostname), ZoneId.from("prod", "us-north-1"), version, wantedVersion, Optional.empty()));
}
- return NodeVersions.copyOf(nodeVersions);
+ return nodeVersions;
}
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiTest.java
index 3d07b5d51d4..cd24ec170c5 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiTest.java
@@ -13,7 +13,6 @@ import com.yahoo.vespa.hosted.controller.deployment.DeploymentTester;
import com.yahoo.vespa.hosted.controller.restapi.ContainerTester;
import com.yahoo.vespa.hosted.controller.restapi.ControllerContainerTest;
import com.yahoo.vespa.hosted.controller.versions.NodeVersion;
-import com.yahoo.vespa.hosted.controller.versions.NodeVersions;
import com.yahoo.vespa.hosted.controller.versions.VersionStatus;
import com.yahoo.vespa.hosted.controller.versions.VespaVersion;
import org.junit.Test;
@@ -86,8 +85,8 @@ public class DeploymentApiTest extends ControllerContainerTest {
version.isControllerVersion(),
version.isSystemVersion(),
version.isReleased(),
- NodeVersions.copyOf(List.of(new NodeVersion(HostName.from("config1.test"), ZoneId.defaultId(), version.versionNumber(), version.versionNumber(), Optional.empty()),
- new NodeVersion(HostName.from("config2.test"), ZoneId.defaultId(), version.versionNumber(), version.versionNumber(), Optional.empty()))),
+ List.of(new NodeVersion(HostName.from("config1.test"), ZoneId.defaultId(), version.versionNumber(), version.versionNumber(), Optional.empty()),
+ new NodeVersion(HostName.from("config2.test"), ZoneId.defaultId(), version.versionNumber(), version.versionNumber(), Optional.empty())),
version.confidence()
);
}