aboutsummaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2019-10-03 09:31:46 +0200
committerMartin Polden <mpolden@mpolden.no>2019-10-03 13:16:36 +0200
commitfc7556fbe854dff4c5c2a4f4ffbe8f5092731c0c (patch)
treec12fabbb1c410fee0aa5e9e04e69caf29788142f /controller-server
parent2e796663bfe3a7b48bdb47c443399323b575f604 (diff)
Only count actively upgrading nodes
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporter.java18
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializer.java11
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersion.java43
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersions.java66
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java8
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java7
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java58
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/VersionStatusSerializerTest.java17
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiTest.java4
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java1
10 files changed, 136 insertions, 97 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 650b8400298..9253e249765 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
@@ -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.maintenance;
-import com.google.common.collect.ImmutableMap;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.jdisc.Metric;
import com.yahoo.vespa.hosted.controller.Controller;
@@ -13,6 +12,7 @@ import com.yahoo.vespa.hosted.controller.application.DeploymentMetrics;
import com.yahoo.vespa.hosted.controller.application.JobList;
import com.yahoo.vespa.hosted.controller.application.JobStatus;
import com.yahoo.vespa.hosted.controller.rotation.RotationLock;
+import com.yahoo.vespa.hosted.controller.versions.VespaVersion;
import java.time.Clock;
import java.time.Duration;
@@ -23,6 +23,8 @@ import java.util.Map;
import java.util.stream.Collectors;
/**
+ * This calculates and reports system-wide metrics based on data from a {@link Controller}.
+ *
* @author mortent
* @author mpolden
*/
@@ -104,9 +106,13 @@ public class MetricsReporter extends Maintainer {
private int nodesFailingSystemUpgrade() {
if (!controller().versionStatus().isUpgrading()) return 0;
var nodesFailingUpgrade = 0;
- var timeoutInstant = clock.instant().minus(NODE_UPGRADE_TIMEOUT);
+ var acceptableInstant = clock.instant().minus(NODE_UPGRADE_TIMEOUT);
for (var vespaVersion : controller().versionStatus().versions()) {
- nodesFailingUpgrade += vespaVersion.nodeVersions().changedBefore(timeoutInstant).size();
+ if (vespaVersion.confidence() == VespaVersion.Confidence.broken) continue;
+ for (var nodeVersion : vespaVersion.nodeVersions().asMap().values()) {
+ if (!nodeVersion.changing()) continue;
+ if (nodeVersion.changedAt().isBefore(acceptableInstant)) nodesFailingUpgrade++;
+ }
}
return nodesFailingUpgrade;
}
@@ -166,10 +172,8 @@ public class MetricsReporter extends Maintainer {
}
private static Map<String, String> dimensions(ApplicationId application) {
- return ImmutableMap.of(
- "tenant", application.tenant().value(),
- "app",application.application().value() + "." + application.instance().value()
- );
+ return Map.of("tenant", application.tenant().value(),
+ "app",application.application().value() + "." + application.instance().value());
}
}
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 f4a9900c9ec..5061f32da68 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
@@ -1,6 +1,7 @@
// 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.ApplicationId;
import com.yahoo.config.provision.HostName;
@@ -18,7 +19,6 @@ import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
-import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@@ -55,6 +55,7 @@ public class VersionStatusSerializer {
// NodeVersion fields
private static final String hostnameField = "hostname";
+ private static final String wantedVersionField = "wantedVersion";
private static final String changedAtField = "changedAt";
// DeploymentStatistics fields
@@ -95,6 +96,7 @@ public class VersionStatusSerializer {
for (NodeVersion nodeVersion : nodeVersions.asMap().values()) {
var nodeVersionObject = array.addObject();
nodeVersionObject.setString(hostnameField, nodeVersion.hostname().value());
+ nodeVersionObject.setString(wantedVersionField, nodeVersion.wantedVersion().toFullString());
nodeVersionObject.setLong(changedAtField, nodeVersion.changedAt().toEpochMilli());
}
}
@@ -135,13 +137,14 @@ public class VersionStatusSerializer {
}
private NodeVersions nodeVersionsFromSlime(Inspector root, Version version) {
- var nodeVersions = new LinkedHashMap<HostName, NodeVersion>();
+ var nodeVersions = ImmutableMap.<HostName, NodeVersion>builder();
var nodeVersionsRoot = root.field(nodeVersionsField);
if (nodeVersionsRoot.valid()) {
nodeVersionsRoot.traverse((ArrayTraverser) (i, entry) -> {
var hostname = HostName.from(entry.field(hostnameField).asString());
+ var wantedVersion = Version.fromString(entry.field(wantedVersionField).asString());
var changedAt = Instant.ofEpochMilli(entry.field(changedAtField).asLong());
- nodeVersions.put(hostname, new NodeVersion(hostname, version, changedAt));
+ nodeVersions.put(hostname, new NodeVersion(hostname, version, wantedVersion, changedAt));
});
} else {
// TODO(mpolden): Remove after October 2019
@@ -150,7 +153,7 @@ public class VersionStatusSerializer {
nodeVersions.put(hostname, NodeVersion.empty(hostname));
}
}
- return new NodeVersions(nodeVersions);
+ return new NodeVersions(nodeVersions.build());
}
private Set<HostName> configServersFromSlime(Inspector array) {
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 3ba1e4800db..0a690b90410 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
@@ -17,12 +17,14 @@ import java.util.Objects;
public class NodeVersion {
private final HostName hostname;
- private final Version version;
+ private final Version currentVersion;
+ private final Version wantedVersion;
private final Instant changedAt;
- public NodeVersion(HostName hostname, Version version, Instant changedAt) {
+ public NodeVersion(HostName hostname, Version currentVersion, Version wantedVersion, Instant changedAt) {
this.hostname = Objects.requireNonNull(hostname, "hostname must be non-null");
- this.version = Objects.requireNonNull(version, "version must be non-null");
+ this.currentVersion = Objects.requireNonNull(currentVersion, "version must be non-null");
+ this.wantedVersion = Objects.requireNonNull(wantedVersion, "wantedVersion must be non-null");
this.changedAt = Objects.requireNonNull(changedAt, "changedAt must be non-null");
}
@@ -32,8 +34,18 @@ public class NodeVersion {
}
/** Current version of this */
- public Version version() {
- return version;
+ public Version currentVersion() {
+ return currentVersion;
+ }
+
+ /** Wanted version of this */
+ public Version wantedVersion() {
+ return wantedVersion;
+ }
+
+ /** Returns whether this is changing (upgrading or downgrading) */
+ public boolean changing() {
+ return !currentVersion.equals(wantedVersion);
}
/** The most recent time the version of this changed */
@@ -41,9 +53,21 @@ public class NodeVersion {
return changedAt;
}
+ /** Returns a copy of this with current version set to given version */
+ public NodeVersion withCurrentVersion(Version version, Instant changedAt) {
+ if (currentVersion.equals(version)) return this;
+ return new NodeVersion(hostname, version, wantedVersion, changedAt);
+ }
+
+ /** Returns a copy of this with wanted version set to given version */
+ public NodeVersion withWantedVersion(Version version) {
+ if (wantedVersion.equals(version)) return this;
+ return new NodeVersion(hostname, currentVersion, version, changedAt);
+ }
+
@Override
public String toString() {
- return hostname + " on " + version + " [changed at " + changedAt + "]";
+ return hostname + ": " + currentVersion + " -> " + wantedVersion + " [changedAt=" + changedAt + "]";
}
@Override
@@ -52,17 +76,18 @@ public class NodeVersion {
if (o == null || getClass() != o.getClass()) return false;
NodeVersion that = (NodeVersion) o;
return hostname.equals(that.hostname) &&
- version.equals(that.version) &&
+ currentVersion.equals(that.currentVersion) &&
+ wantedVersion.equals(that.wantedVersion) &&
changedAt.equals(that.changedAt);
}
@Override
public int hashCode() {
- return Objects.hash(hostname, version, changedAt);
+ return Objects.hash(hostname, currentVersion, wantedVersion, changedAt);
}
public static NodeVersion empty(HostName hostname) {
- return new NodeVersion(hostname, Version.emptyVersion, Instant.EPOCH);
+ return new NodeVersion(hostname, Version.emptyVersion, Version.emptyVersion, Instant.EPOCH);
}
}
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
index 80ecc2dd9bb..3ab96e03bcd 100644
--- 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
@@ -2,21 +2,17 @@
package com.yahoo.vespa.hosted.controller.versions;
import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.ImmutableSortedMap;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ListMultimap;
import com.yahoo.component.Version;
import com.yahoo.config.provision.HostName;
-import java.time.Instant;
-import java.util.LinkedHashMap;
+import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.function.Predicate;
-import static java.util.stream.Collectors.collectingAndThen;
-import static java.util.stream.Collectors.toMap;
-
/**
* A filterable list of {@link NodeVersion}s. This is immutable.
*
@@ -24,12 +20,12 @@ import static java.util.stream.Collectors.toMap;
*/
public class NodeVersions {
- public static final NodeVersions EMPTY = new NodeVersions(Map.of());
+ public static final NodeVersions EMPTY = new NodeVersions(ImmutableMap.of());
- private final Map<HostName, NodeVersion> nodeVersions;
+ private final ImmutableMap<HostName, NodeVersion> nodeVersions;
- public NodeVersions(Map<HostName, NodeVersion> nodeVersions) {
- this.nodeVersions = ImmutableSortedMap.copyOf(Objects.requireNonNull(nodeVersions));
+ public NodeVersions(ImmutableMap<HostName, NodeVersion> nodeVersions) {
+ this.nodeVersions = Objects.requireNonNull(nodeVersions);
}
public Map<HostName, NodeVersion> asMap() {
@@ -40,7 +36,7 @@ public class NodeVersions {
public ListMultimap<Version, HostName> asVersionMap() {
var versions = ImmutableListMultimap.<Version, HostName>builder();
for (var kv : nodeVersions.entrySet()) {
- versions.put(kv.getValue().version(), kv.getKey());
+ versions.put(kv.getValue().currentVersion(), kv.getKey());
}
return versions.build();
}
@@ -52,21 +48,7 @@ public class NodeVersions {
/** Returns a copy of this containing only node versions of given version */
public NodeVersions matching(Version version) {
- return filter(nodeVersion -> nodeVersion.version().equals(version));
- }
-
- /** Returns a copy of this containing only node versions that last changed before given instant */
- public NodeVersions changedBefore(Instant instant) {
- return filter(nodeVersion -> nodeVersion.changedAt().isBefore(instant));
- }
-
- /** Returns a copy of this retaining only node versions for the given host names */
- public NodeVersions retainAll(Set<HostName> hostnames) {
- if (this.nodeVersions.keySet().equals(hostnames)) return this;
-
- var nodeVersions = new LinkedHashMap<>(this.nodeVersions);
- nodeVersions.keySet().retainAll(hostnames);
- return new NodeVersions(nodeVersions);
+ return filter(nodeVersion -> nodeVersion.currentVersion().equals(version));
}
/** Returns number of node versions in this */
@@ -74,21 +56,29 @@ public class NodeVersions {
return nodeVersions.size();
}
- /** Returns a copy of this with a new node version added. Duplicate node versions are ignored */
- public NodeVersions with(NodeVersion nodeVersion) {
- var existing = nodeVersions.get(nodeVersion.hostname());
- if (existing != null && existing.version().equals(nodeVersion.version())) return this;
-
- var nodeVersions = new LinkedHashMap<>(this.nodeVersions);
- nodeVersions.put(nodeVersion.hostname(), nodeVersion);
- return new NodeVersions(nodeVersions);
+ /** Returns a copy of this containing only the given node versions */
+ public NodeVersions with(List<NodeVersion> nodeVersions) {
+ var newNodeVersions = ImmutableMap.<HostName, NodeVersion>builder();
+ for (var nodeVersion : nodeVersions) {
+ var existing = this.nodeVersions.get(nodeVersion.hostname());
+ if (existing != null) {
+ newNodeVersions.put(nodeVersion.hostname(), existing.withCurrentVersion(nodeVersion.currentVersion(),
+ nodeVersion.changedAt())
+ .withWantedVersion(nodeVersion.wantedVersion()));
+ } else {
+ newNodeVersions.put(nodeVersion.hostname(), nodeVersion);
+ }
+ }
+ return new NodeVersions(newNodeVersions.build());
}
private NodeVersions filter(Predicate<NodeVersion> predicate) {
- return nodeVersions.entrySet().stream()
- .filter(kv -> predicate.test(kv.getValue()))
- .collect(collectingAndThen(toMap(Map.Entry::getKey, Map.Entry::getValue),
- NodeVersions::new));
+ var newNodeVersions = ImmutableMap.<HostName, NodeVersion>builder();
+ for (var kv : nodeVersions.entrySet()) {
+ if (!predicate.test(kv.getValue())) continue;
+ newNodeVersions.put(kv.getKey(), kv.getValue());
+ }
+ return new NodeVersions(newNodeVersions.build());
}
@Override
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 8c7e539dee4..bb43ec20234 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
@@ -21,7 +21,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -156,7 +155,7 @@ public class VersionStatus {
var nodeVersions = controller.versionStatus().systemVersion()
.map(VespaVersion::nodeVersions)
.orElse(NodeVersions.EMPTY);
- var hostnames = new HashSet<HostName>();
+ var newNodeVersions = new ArrayList<NodeVersion>();
for (var zone : controller.zoneRegistry().zones().controllerUpgraded().zones()) {
for (var application : SystemApplication.all()) {
var nodes = controller.serviceRegistry().configServer().nodeRepository()
@@ -173,12 +172,11 @@ public class VersionStatus {
for (var node : nodes) {
// Only use current node version if config has converged
Version version = configConverged ? node.currentVersion() : controller.systemVersion();
- nodeVersions = nodeVersions.with(new NodeVersion(node.hostname(), version, now));
- hostnames.add(node.hostname());
+ newNodeVersions.add(new NodeVersion(node.hostname(), version, node.wantedVersion(), now));
}
}
}
- return nodeVersions.retainAll(hostnames);
+ return nodeVersions.with(newNodeVersions);
}
private static ListMultimap<ControllerVersion, HostName> findControllerVersions(Controller controller) {
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 6d2090b652b..6da77a967f1 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
@@ -151,9 +151,16 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer
/** Set version for an application in a given zone */
public void setVersion(ApplicationId application, ZoneId zone, Version version) {
+ setVersion(application, zone, version, -1);
+ }
+
+ /** Set version for nodeCount number of nodes in application in a given zone */
+ public void setVersion(ApplicationId application, ZoneId zone, Version version, int nodeCount) {
+ int n = 0;
for (Node node : nodeRepository().list(zone, application)) {
nodeRepository().putByHostname(zone, new Node(node.hostname(), node.state(), node.type(), node.owner(),
version, version));
+ if (++n == nodeCount) break;
}
}
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 f285e771a23..9cb40d60677 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
@@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.controller.maintenance;
import com.yahoo.component.Version;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.Environment;
+import com.yahoo.config.provision.zone.UpgradePolicy;
import com.yahoo.config.provision.zone.ZoneId;
import com.yahoo.vespa.hosted.controller.Application;
import com.yahoo.vespa.hosted.controller.Controller;
@@ -16,6 +17,7 @@ import com.yahoo.vespa.hosted.controller.deployment.ApplicationPackageBuilder;
import com.yahoo.vespa.hosted.controller.deployment.DeploymentTester;
import com.yahoo.vespa.hosted.controller.deployment.InternalDeploymentTester;
import com.yahoo.vespa.hosted.controller.integration.MetricsMock;
+import com.yahoo.vespa.hosted.controller.integration.ZoneApiMock;
import com.yahoo.vespa.hosted.controller.persistence.MockCuratorDb;
import org.junit.Test;
@@ -219,6 +221,11 @@ public class MetricsReporterTest {
public void test_nodes_failing_system_upgrade() {
var tester = new DeploymentTester();
var reporter = createReporter(tester.controller());
+ var zone1 = ZoneApiMock.fromId("prod.eu-west-1");
+ tester.controllerTester().zoneRegistry().setUpgradePolicy(UpgradePolicy.create().upgrade(zone1));
+ var systemUpgrader = new SystemUpgrader(tester.controller(), Duration.ofDays(1),
+ new JobControl(tester.controllerTester().curator()));
+ tester.configServer().bootstrap(List.of(zone1.getId()), SystemApplication.configServer);
// System on initial version
var version0 = Version.fromString("7.0");
@@ -226,30 +233,33 @@ public class MetricsReporterTest {
reporter.maintain();
assertEquals(0, getNodesFailingUpgrade());
- // System starts upgrading to next version
- var version1 = Version.fromString("7.1");
- tester.upgradeController(version1);
- reporter.maintain();
- assertEquals(0, getNodesFailingUpgrade());
-
- // Some time passes, but only a subset of nodes upgrade within timeout
- tester.clock().advance(Duration.ofMinutes(30));
- tester.upgradeSystemApplications(version1, List.of(SystemApplication.configServerHost));
- reporter.maintain();
- assertEquals(0, getNodesFailingUpgrade());
- tester.clock().advance(Duration.ofMinutes(30).plus(Duration.ofSeconds(1)));
- reporter.maintain();
- assertEquals(48, getNodesFailingUpgrade());
-
- // Some nodes are repaired and upgrade
- tester.upgradeSystemApplications(version1, List.of(SystemApplication.configServer));
- reporter.maintain();
- assertEquals(36, getNodesFailingUpgrade());
-
- // All nodes are repaired and system upgrades
- tester.upgradeSystem(version1);
- reporter.maintain();
- assertEquals(0, getNodesFailingUpgrade());
+ for (var version : List.of(Version.fromString("7.1"), Version.fromString("7.2"))) {
+ // System starts upgrading to next version
+ tester.upgradeController(version);
+ reporter.maintain();
+ assertEquals(0, getNodesFailingUpgrade());
+ systemUpgrader.maintain();
+
+ // 30 minutes pass and nothing happens
+ tester.clock().advance(Duration.ofMinutes(30));
+ tester.computeVersionStatus();
+ reporter.maintain();
+ assertEquals(0, getNodesFailingUpgrade());
+
+ // 1/3 nodes upgrade within timeout
+ tester.configServer().setVersion(SystemApplication.configServer.id(), zone1.getId(), version, 1);
+ tester.clock().advance(Duration.ofMinutes(30).plus(Duration.ofSeconds(1)));
+ tester.computeVersionStatus();
+ reporter.maintain();
+ assertEquals(2, getNodesFailingUpgrade());
+
+ // 3/3 nodes upgrade
+ tester.configServer().setVersion(SystemApplication.configServer.id(), zone1.getId(), version);
+ tester.computeVersionStatus();
+ reporter.maintain();
+ assertEquals(0, getNodesFailingUpgrade());
+ assertEquals(version, tester.controller().systemVersion());
+ }
}
private Duration getAverageDeploymentDuration(ApplicationId id) {
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 82837c20020..5d65cf0381e 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
@@ -39,9 +39,11 @@ public class VersionStatusSerializerTest {
ApplicationId.from("tenant2", "success2", "default"))
);
vespaVersions.add(new VespaVersion(statistics, "dead", Instant.now(), false, false,
- true, nodeVersions(Version.fromString("5.0"), Instant.ofEpochMilli(123), "cfg1", "cfg2", "cfg3"), VespaVersion.Confidence.normal));
+ true, nodeVersions(Version.fromString("5.0"), Version.fromString("5.1"),
+ Instant.ofEpochMilli(123), "cfg1", "cfg2", "cfg3"), VespaVersion.Confidence.normal));
vespaVersions.add(new VespaVersion(statistics, "cafe", Instant.now(), true, true,
- false, nodeVersions(Version.fromString("5.0"), Instant.ofEpochMilli(456), "cfg1", "cfg2", "cfg3"), VespaVersion.Confidence.normal));
+ false, nodeVersions(Version.fromString("5.0"), Version.fromString("5.1"),
+ Instant.ofEpochMilli(456), "cfg1", "cfg2", "cfg3"), VespaVersion.Confidence.normal));
VersionStatus status = new VersionStatus(vespaVersions);
VersionStatusSerializer serializer = new VersionStatusSerializer();
VersionStatus deserialized = serializer.fromSlime(serializer.toSlime(status));
@@ -77,7 +79,8 @@ public class VersionStatusSerializerTest {
var vespaVersion = new VespaVersion(statistics, "badc0ffee",
Instant.ofEpochMilli(123), true,
true, true,
- nodeVersions(Version.emptyVersion, Instant.EPOCH, "cfg1", "cfg2", "cfg3"),
+ nodeVersions(Version.emptyVersion, Version.emptyVersion,
+ Instant.EPOCH, "cfg1", "cfg2", "cfg3"),
VespaVersion.Confidence.normal);
VespaVersion deserialized = deserializedStatus.versions().get(0);
@@ -91,12 +94,12 @@ public class VersionStatusSerializerTest {
assertEquals(vespaVersion.confidence(), deserialized.confidence());
}
- private static NodeVersions nodeVersions(Version version, Instant changedAt, String... hostnames) {
- var nodeVersions = NodeVersions.EMPTY;
+ private static NodeVersions nodeVersions(Version version, Version wantedVersion, Instant changedAt, String... hostnames) {
+ var nodeVersions = new ArrayList<NodeVersion>();
for (var hostname : hostnames) {
- nodeVersions = nodeVersions.with(new NodeVersion(HostName.from(hostname), version, changedAt));
+ nodeVersions.add(new NodeVersion(HostName.from(hostname), version, wantedVersion, changedAt));
}
- return nodeVersions;
+ return NodeVersions.EMPTY.with(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 7140702ad60..0a4d046e318 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
@@ -76,8 +76,8 @@ public class DeploymentApiTest extends ControllerContainerTest {
version.isControllerVersion(),
version.isSystemVersion(),
version.isReleased(),
- NodeVersions.EMPTY.with(new NodeVersion(HostName.from("config1.test"), version.versionNumber(), Instant.EPOCH))
- .with(new NodeVersion(HostName.from("config2.test"), version.versionNumber(), Instant.EPOCH)),
+ NodeVersions.EMPTY.with(List.of(new NodeVersion(HostName.from("config1.test"), version.versionNumber(), version.versionNumber(), Instant.EPOCH),
+ new NodeVersion(HostName.from("config2.test"), version.versionNumber(), version.versionNumber(), Instant.EPOCH))),
VespaVersion.confidenceFrom(version.statistics(), controller)
);
}
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 ba8309de286..83223b0e041 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
@@ -8,7 +8,6 @@ import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.HostName;
import com.yahoo.config.provision.zone.ZoneApi;
import com.yahoo.vespa.hosted.controller.Application;
-import com.yahoo.vespa.hosted.controller.Instance;
import com.yahoo.vespa.hosted.controller.Controller;
import com.yahoo.vespa.hosted.controller.ControllerTester;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node;