aboutsummaryrefslogtreecommitdiffstats
path: root/controller-server/src
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2022-11-15 13:52:08 +0100
committerMartin Polden <mpolden@mpolden.no>2022-11-15 14:03:57 +0100
commit328dd453bd91dc15b1cc733bce5ef895b8d4091e (patch)
treec8676688ecd7c13ed7194fdd376517fa8ade67a1 /controller-server/src
parent1b538760a2e23a2ca81bda94b6bda26eab40a191 (diff)
Stop setting OS upgrade budget
Diffstat (limited to 'controller-server/src')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java13
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeScheduler.java15
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgrader.java23
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionTargetSerializer.java6
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java7
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersionTarget.java9
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/NodeRepositoryMock.java10
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java4
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java11
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgraderTest.java85
-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/OsVersionTargetSerializerTest.java5
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiTest.java20
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/responses/versions-all-upgraded.json2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/responses/versions-partially-upgraded.json2
15 files changed, 47 insertions, 169 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java
index 22ce4db10e5..b40db745fd7 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Controller.java
@@ -1,10 +1,10 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller;
-import com.yahoo.component.annotation.Inject;
import com.yahoo.component.AbstractComponent;
import com.yahoo.component.Version;
import com.yahoo.component.Vtag;
+import com.yahoo.component.annotation.Inject;
import com.yahoo.concurrent.maintenance.JobControl;
import com.yahoo.config.provision.CloudName;
import com.yahoo.config.provision.HostName;
@@ -37,7 +37,6 @@ import com.yahoo.vespa.hosted.rotation.config.RotationsConfig;
import com.yahoo.yolean.concurrent.Sleeper;
import java.time.Clock;
-import java.time.Duration;
import java.time.Instant;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -222,7 +221,7 @@ public class Controller extends AbstractComponent {
}
/** Set the target OS version for given cloud in this system */
- public void upgradeOsIn(CloudName cloudName, Version version, Duration upgradeBudget, boolean force) {
+ public void upgradeOsIn(CloudName cloudName, Version version, boolean force) {
if (version.isEmpty()) {
throw new IllegalArgumentException("Invalid version '" + version.toFullString() + "'");
}
@@ -241,15 +240,13 @@ public class Controller extends AbstractComponent {
throw new IllegalArgumentException("Cannot downgrade cloud '" + cloudName.value() + "' to version " +
version.toFullString());
}
- if (currentTarget.osVersion().version().equals(version) &&
- currentTarget.upgradeBudget().equals(upgradeBudget)) return; // Version and budget unchanged
+ if (currentTarget.osVersion().version().equals(version)) return; // Version unchanged
}
- OsVersionTarget newTarget = new OsVersionTarget(new OsVersion(version, cloudName), upgradeBudget, scheduledAt);
+ OsVersionTarget newTarget = new OsVersionTarget(new OsVersion(version, cloudName), scheduledAt);
targets.put(cloudName, newTarget);
curator.writeOsVersionTargets(new TreeSet<>(targets.values()));
- log.info("Triggered OS upgrade to " + version.toFullString() + " in cloud " +
- cloudName.value() + ", with upgrade budget " + upgradeBudget);
+ log.info("Triggered OS upgrade to " + version.toFullString() + " in cloud " + cloudName.value());
}
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeScheduler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeScheduler.java
index 502b3b0188f..f930e64fc5a 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeScheduler.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeScheduler.java
@@ -38,7 +38,7 @@ public class OsUpgradeScheduler extends ControllerMaintainer {
Optional<Change> change = changeIn(cloud, now);
if (change.isEmpty()) continue;
if (!change.get().scheduleAt(now)) continue;
- controller().upgradeOsIn(cloud, change.get().version(), change.get().upgradeBudget(), false);
+ controller().upgradeOsIn(cloud, change.get().version(), false);
}
return 1.0;
}
@@ -101,12 +101,11 @@ public class OsUpgradeScheduler extends ControllerMaintainer {
}
- /** OS version change, its budget and the earliest time it can be scheduled */
- public record Change(Version version, Duration upgradeBudget, Instant scheduleAt) {
+ /** OS version change and the earliest time it can be scheduled */
+ public record Change(Version version, Instant scheduleAt) {
public Change {
Objects.requireNonNull(version);
- Objects.requireNonNull(upgradeBudget);
Objects.requireNonNull(scheduleAt);
}
@@ -131,7 +130,7 @@ public class OsUpgradeScheduler extends ControllerMaintainer {
if (!release.version().isAfter(currentVersion)) return Optional.empty();
Duration cooldown = remainingCooldownOf(cooldown(), release.age(instant));
Instant scheduleAt = schedulingInstant(instant.plus(cooldown), system);
- return Optional.of(new Change(release.version(), Duration.ZERO, scheduleAt));
+ return Optional.of(new Change(release.version(), scheduleAt));
}
/** Returns the release tag tracked by this system */
@@ -174,7 +173,7 @@ public class OsUpgradeScheduler extends ControllerMaintainer {
}
Duration cooldown = remainingCooldownOf(cooldown(), version.age(instant));
Instant schedulingInstant = schedulingInstant(instant.plus(cooldown), system);
- return Optional.of(new Change(version.version(), upgradeBudget(), schedulingInstant));
+ return Optional.of(new Change(version.version(), schedulingInstant));
}
private Duration cooldown() {
@@ -183,10 +182,6 @@ public class OsUpgradeScheduler extends ControllerMaintainer {
: Duration.ofDays(7 - RELEASE_DAY.ordinal()); // non-CD: Wait until start of the following week
}
- private Duration upgradeBudget() {
- return system.isCd() ? Duration.ZERO : Duration.ofDays(14);
- }
-
/** Find the most recent version available according to the scheduling step, relative to now */
static CalendarVersion findVersion(Instant now, Version currentVersion) {
Instant candidate = START_OF_SCHEDULE;
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgrader.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgrader.java
index f4dcf7f6088..b44643b4405 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgrader.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgrader.java
@@ -44,14 +44,11 @@ public class OsUpgrader extends InfrastructureUpgrader<OsVersionTarget> {
@Override
protected void upgrade(OsVersionTarget target, SystemApplication application, ZoneApi zone) {
- Duration zoneUpgradeBudget = zoneBudgetOf(target.upgradeBudget(), zone);
- log.info(Text.format("Upgrading OS of %s to version %s in %s in cloud %s%s", application.id(),
+ log.info(Text.format("Upgrading OS of %s to version %s in %s in cloud %s", application.id(),
target.osVersion().version().toFullString(),
- zone.getVirtualId(), zone.getCloudName(),
- " with time budget " + zoneUpgradeBudget));
+ zone.getVirtualId(), zone.getCloudName()));
controller().serviceRegistry().configServer().nodeRepository().upgradeOs(zone.getVirtualId(), application.nodeType(),
- target.osVersion().version(),
- zoneUpgradeBudget);
+ target.osVersion().version());
}
@Override
@@ -85,20 +82,6 @@ public class OsUpgrader extends InfrastructureUpgrader<OsVersionTarget> {
.orElse(true);
}
- /** Returns the available upgrade budget for given zone */
- private Duration zoneBudgetOf(Duration totalBudget, ZoneApi zone) {
- if (!spendBudgetOn(zone)) return Duration.ZERO;
- long consecutiveZones = upgradePolicy.steps().stream()
- .filter(step -> step.zones().stream().anyMatch(this::spendBudgetOn))
- .count();
- return totalBudget.dividedBy(consecutiveZones);
- }
-
- /** Returns whether to spend upgrade budget on given zone */
- private boolean spendBudgetOn(ZoneApi zone) {
- return !controller().zoneRegistry().systemZone().getVirtualId().equals(zone.getVirtualId()); // Do not spend budget on controller zone
- }
-
/** Returns whether node currently allows upgrades */
public static boolean canUpgrade(Node node, boolean includeDeferring) {
return (includeDeferring || !node.deferOsUpgrade()) && upgradableNodeStates.contains(node.state());
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionTargetSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionTargetSerializer.java
index 9cad402832f..c06a36d3a1d 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionTargetSerializer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionTargetSerializer.java
@@ -9,7 +9,6 @@ import com.yahoo.slime.SlimeUtils;
import com.yahoo.vespa.hosted.controller.versions.OsVersion;
import com.yahoo.vespa.hosted.controller.versions.OsVersionTarget;
-import java.time.Duration;
import java.time.Instant;
import java.util.Collections;
import java.util.Set;
@@ -25,7 +24,6 @@ public class OsVersionTargetSerializer {
private final OsVersionSerializer osVersionSerializer;
private static final String versionsField = "versions";
- private static final String upgradeBudgetField = "upgradeBudget";
private static final String scheduledAtField = "scheduledAt";
public OsVersionTargetSerializer(OsVersionSerializer osVersionSerializer) {
@@ -45,16 +43,14 @@ public class OsVersionTargetSerializer {
Set<OsVersionTarget> osVersionTargets = new TreeSet<>();
array.traverse((ArrayTraverser) (i, inspector) -> {
OsVersion osVersion = osVersionSerializer.fromSlime(inspector);
- Duration upgradeBudget = SlimeUtils.duration(inspector.field(upgradeBudgetField));
Instant scheduledAt = SlimeUtils.instant(inspector.field(scheduledAtField));
- osVersionTargets.add(new OsVersionTarget(osVersion, upgradeBudget, scheduledAt));
+ osVersionTargets.add(new OsVersionTarget(osVersion, scheduledAt));
});
return Collections.unmodifiableSet(osVersionTargets);
}
private void toSlime(OsVersionTarget target, Cursor object) {
osVersionSerializer.toSlime(target.osVersion(), object);
- object.setLong(upgradeBudgetField, target.upgradeBudget().toMillis());
object.setLong(scheduledAtField, target.scheduledAt().toEpochMilli());
}
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 704bafe7082..8675f4f18c6 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
@@ -146,11 +146,10 @@ public class OsApiHandler extends AuditLoggingRequestHandler {
return new MessageResponse("Cleared target OS version for cloud '" + cloud.value() + "'");
}
Version target = parseStringField("version", root, Version::fromString);
- Duration upgradeBudget = parseStringField("upgradeBudget", root, Duration::parse);
boolean force = root.field("force").asBool();
- controller.upgradeOsIn(cloud, target, upgradeBudget, force);
+ controller.upgradeOsIn(cloud, target, force);
return new MessageResponse("Set target OS version for cloud '" + cloud.value() + "' to " +
- target.toFullString() + " with upgrade budget " + upgradeBudget);
+ target.toFullString());
}
private Slime osVersions() {
@@ -166,7 +165,7 @@ public class OsApiHandler extends AuditLoggingRequestHandler {
Optional<OsVersionTarget> target = targets.stream().filter(t -> t.osVersion().equals(osVersion)).findFirst();
currentVersionObject.setBool("targetVersion", target.isPresent());
target.ifPresent(t -> {
- currentVersionObject.setString("upgradeBudget", t.upgradeBudget().toString());
+ currentVersionObject.setString("upgradeBudget", Duration.ZERO.toString());
currentVersionObject.setLong("scheduledAt", t.scheduledAt().toEpochMilli());
Optional<Change> nextChange = osUpgradeScheduler.changeIn(t.osVersion().cloud(), now);
nextChange.ifPresent(c -> {
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersionTarget.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersionTarget.java
index 0a13244ce5e..471670ec399 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersionTarget.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersionTarget.java
@@ -3,24 +3,19 @@ package com.yahoo.vespa.hosted.controller.versions;
import com.yahoo.component.Version;
-import java.time.Duration;
import java.time.Instant;
import java.util.Objects;
/**
- * The OS version target for a cloud/system, containing the {@link OsVersion} and its upgrade budget.
+ * The OS version target for a cloud and the time it was scheduled.
*
* @author mpolden
*/
-public record OsVersionTarget(OsVersion osVersion,
- Duration upgradeBudget,
- Instant scheduledAt) implements VersionTarget, Comparable<OsVersionTarget> {
+public record OsVersionTarget(OsVersion osVersion, Instant scheduledAt) implements VersionTarget, Comparable<OsVersionTarget> {
public OsVersionTarget {
Objects.requireNonNull(osVersion);
- Objects.requireNonNull(upgradeBudget);
Objects.requireNonNull(scheduledAt);
- if (upgradeBudget.isNegative()) throw new IllegalArgumentException("upgradeBudget cannot be negative");
}
@Override
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 f39eb6e161d..f440d724b56 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/NodeRepositoryMock.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/NodeRepositoryMock.java
@@ -20,10 +20,8 @@ import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeReposi
import com.yahoo.vespa.hosted.controller.api.integration.configserver.TargetVersions;
import java.net.URI;
-import java.time.Duration;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.Optional;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
@@ -39,7 +37,6 @@ public class NodeRepositoryMock implements NodeRepository {
private final Map<ZoneId, Map<HostName, Node>> nodeRepository = new ConcurrentHashMap<>();
private final Map<ZoneId, Map<ApplicationId, Application>> applications = new ConcurrentHashMap<>();
private final Map<ZoneId, TargetVersions> targetVersions = new ConcurrentHashMap<>();
- private final Map<Integer, Duration> osUpgradeBudgets = new ConcurrentHashMap<>();
private final Map<DeploymentId, Pair<Double, Double>> trafficFractions = new ConcurrentHashMap<>();
private final Map<ZoneId, Map<TenantName, URI>> archiveUris = new ConcurrentHashMap<>();
@@ -148,8 +145,7 @@ public class NodeRepositoryMock implements NodeRepository {
}
@Override
- public void upgradeOs(ZoneId zone, NodeType type, Version version, Duration upgradeBudget) {
- this.osUpgradeBudgets.put(Objects.hash(zone, type, version), upgradeBudget);
+ public void upgradeOs(ZoneId zone, NodeType type, Version version) {
this.targetVersions.compute(zone, (ignored, targetVersions) -> {
if (targetVersions == null) {
targetVersions = TargetVersions.EMPTY;
@@ -280,10 +276,6 @@ public class NodeRepositoryMock implements NodeRepository {
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)));
- }
-
public void doUpgrade(DeploymentId deployment, Optional<HostName> hostName, Version version) {
patchNodes(deployment, hostName, node -> {
return Node.builder(node)
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 64baa107a1c..4072fef3395 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
@@ -365,7 +365,7 @@ public class MetricsReporterTest {
// All nodes upgrade to initial OS version
var version0 = Version.fromString("8.0");
- tester.controller().upgradeOsIn(cloud, version0, Duration.ZERO, false);
+ tester.controller().upgradeOsIn(cloud, version0, false);
osUpgrader.maintain();
tester.configServer().setOsVersion(version0, SystemApplication.tenantHost.id(), zone);
tester.configServer().setOsVersion(version0, SystemApplication.configServerHost.id(), zone);
@@ -379,7 +379,7 @@ public class MetricsReporterTest {
var currentVersion = i == 0 ? version0 : targets.get(i - 1);
var nextVersion = targets.get(i);
// System starts upgrading to next OS version
- tester.controller().upgradeOsIn(cloud, nextVersion, Duration.ZERO, false);
+ tester.controller().upgradeOsIn(cloud, nextVersion, false);
runAll(osUpgrader, statusUpdater, reporter);
assertOsChangeDuration(Duration.ZERO, hosts);
assertOsNodeCount(hosts.size(), currentVersion);
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java
index 3034b926c62..899745c7a39 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java
@@ -47,7 +47,7 @@ public class OsUpgradeSchedulerTest {
// Target is set manually
Version version0 = Version.fromString("7.0.0.20220101");
- tester.controller().upgradeOsIn(cloud, version0, Duration.ofDays(1), false);
+ tester.controller().upgradeOsIn(cloud, version0, false);
// Target remains unchanged as it hasn't expired yet
for (var interval : List.of(Duration.ZERO, Duration.ofDays(30))) {
@@ -106,7 +106,7 @@ public class OsUpgradeSchedulerTest {
// Set initial target
Version version0 = Version.fromString("7.0.0.20220101");
- tester.controller().upgradeOsIn(cloud, version0, Duration.ofDays(1), false);
+ tester.controller().upgradeOsIn(cloud, version0, false);
// Next version is triggered
Version version1 = Version.fromString("7.0.0.20220301");
@@ -137,7 +137,7 @@ public class OsUpgradeSchedulerTest {
// Set initial target
CloudName cloud = tester.controller().clouds().iterator().next();
Version version0 = Version.fromString("8.0");
- tester.controller().upgradeOsIn(cloud, version0, Duration.ZERO, false);
+ tester.controller().upgradeOsIn(cloud, version0, false);
// Stable release (tagged outside trigger period) is scheduled once trigger period opens
Version version1 = Version.fromString("8.1");
@@ -151,7 +151,7 @@ public class OsUpgradeSchedulerTest {
// A newer version is triggered manually
Version version3 = Version.fromString("8.3");
- tester.controller().upgradeOsIn(cloud, version3, Duration.ZERO, false);
+ tester.controller().upgradeOsIn(cloud, version3, false);
// Nothing happens in next iteration as tagged release is older than manually triggered version
scheduleUpgradeAfter(Duration.ofDays(7), version3, scheduler, tester);
@@ -168,7 +168,7 @@ public class OsUpgradeSchedulerTest {
// Set initial target
CloudName cloud = tester.controller().clouds().iterator().next();
Version version0 = Version.fromString("8.0");
- tester.controller().upgradeOsIn(cloud, version0, Duration.ZERO, false);
+ tester.controller().upgradeOsIn(cloud, version0, false);
// Latest release is not scheduled immediately
Version version1 = Version.fromString("8.1");
@@ -207,7 +207,6 @@ public class OsUpgradeSchedulerTest {
CloudName cloud = tester.controller().clouds().iterator().next();
OsVersionTarget target = tester.controller().osVersionTarget(cloud).get();
assertEquals(version, target.osVersion().version());
- assertEquals(Duration.ZERO, target.upgradeBudget(), "No budget when scheduling a tagged release");
}
private static ZoneApi zone(String id, CloudName cloud) {
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 dbe559de418..0f5bb605c37 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
@@ -72,8 +72,8 @@ public class OsUpgraderTest {
// New OS version released
Version version1 = Version.fromString("7.1");
- tester.controller().upgradeOsIn(cloud1, Version.fromString("7.0"), Duration.ZERO, false);
- tester.controller().upgradeOsIn(cloud1, version1, Duration.ZERO, false);
+ tester.controller().upgradeOsIn(cloud1, Version.fromString("7.0"), false);
+ tester.controller().upgradeOsIn(cloud1, version1, false);
assertEquals(1, tester.controller().osVersionTargets().size()); // Only allows one version per cloud
statusUpdater.maintain();
@@ -135,76 +135,6 @@ public class OsUpgraderTest {
}
@Test
- void upgrade_os_with_budget() {
- CloudName cloud = CloudName.from("cloud");
- ZoneApi zone0 = zone("prod.us-north-42", "prod.controller", cloud);
- ZoneApi zone1 = zone("dev.us-east-1", cloud);
- ZoneApi zone2 = zone("prod.us-west-1", cloud);
- ZoneApi zone3 = zone("prod.us-central-1", cloud);
- ZoneApi zone4 = zone("prod.eu-west-1", cloud);
- UpgradePolicy upgradePolicy = UpgradePolicy.builder()
- .upgrade(zone0)
- .upgrade(zone1)
- .upgradeInParallel(zone2, zone3)
- .upgrade(zone4)
- .build();
- OsUpgrader osUpgrader = osUpgrader(upgradePolicy, cloud, true);
-
- // Bootstrap system
- List<SystemApplication> nodeTypes = List.of(SystemApplication.configServerHost, SystemApplication.tenantHost);
- tester.configServer().bootstrap(List.of(zone1.getId(), zone2.getId(), zone3.getId(), zone4.getId()),
- nodeTypes);
- tester.configServer().addNodes(List.of(zone0.getVirtualId()), List.of(SystemApplication.controllerHost));
-
- // Upgrade with budget
- Version version = Version.fromString("7.1");
- tester.controller().upgradeOsIn(cloud, version, Duration.ofHours(12), false);
- assertEquals(Duration.ofHours(12), tester.controller().osVersionTarget(cloud).get().upgradeBudget());
- statusUpdater.maintain();
- osUpgrader.maintain();
-
- // Controllers upgrade first
- osUpgrader.maintain();
- assertWanted(version, SystemApplication.controllerHost, zone0);
- assertEquals(Duration.ZERO, upgradeBudget(zone0, SystemApplication.controllerHost, version), "Controller zone gets a zero budget");
- completeUpgrade(version, SystemApplication.controllerHost, zone0);
- statusUpdater.maintain();
- assertEquals(3, nodesOn(version).size());
-
- // First zone upgrades
- osUpgrader.maintain();
- for (var nodeType : nodeTypes) {
- assertEquals(Duration.ofHours(4), upgradeBudget(zone1, nodeType, version));
- completeUpgrade(version, nodeType, zone1);
- }
-
- // Next set of zones upgrade
- osUpgrader.maintain();
- for (var zone : List.of(zone1, zone2, zone3)) {
- for (var nodeType : nodeTypes) {
- assertEquals(Duration.ofHours(4),
- upgradeBudget(zone, nodeType, version),
- "Parallel prod zones share the budget of a single zone");
- completeUpgrade(version, nodeType, zone);
- }
- }
-
- // Last zone upgrades
- osUpgrader.maintain();
- for (var nodeType : nodeTypes) {
- assertEquals(Duration.ofHours(4),
- upgradeBudget(zone4, nodeType, version),
- nodeType + " in last prod zone gets the budget of a single zone");
- completeUpgrade(version, nodeType, zone4);
- }
-
- // All host applications upgraded
- statusUpdater.maintain();
- assertTrue(tester.controller().osVersionStatus().nodesIn(cloud).stream()
- .allMatch(node -> node.currentVersion().equals(version)), "All nodes on target version");
- }
-
- @Test
void upgrade_os_nodes_choose_newer_version() {
CloudName cloud = CloudName.from("cloud");
ZoneApi zone1 = zone("dev.us-east-1", cloud);
@@ -221,8 +151,8 @@ public class OsUpgraderTest {
// New OS version released
Version version = Version.fromString("7.1");
- tester.controller().upgradeOsIn(cloud, Version.fromString("7.0"), Duration.ZERO, false);
- tester.controller().upgradeOsIn(cloud, version, Duration.ZERO, false); // Replaces existing target
+ tester.controller().upgradeOsIn(cloud, Version.fromString("7.0"), false);
+ tester.controller().upgradeOsIn(cloud, version, false); // Replaces existing target
statusUpdater.maintain();
// zone 1 upgrades
@@ -247,13 +177,6 @@ public class OsUpgraderTest {
.noneMatch(node -> node.currentVersion().isBefore(version)), "All nodes on target version or newer");
}
- private Duration upgradeBudget(ZoneApi zone, SystemApplication application, Version version) {
- var upgradeBudget = tester.configServer().nodeRepository().osUpgradeBudget(zone.getVirtualId(), application.nodeType(), version);
- assertTrue(upgradeBudget.isPresent(),
- "Expected budget for upgrade to " + version + " of " + application.id() + " in " + zone.getVirtualId());
- return upgradeBudget.get();
- }
-
private List<NodeVersion> nodesOn(Version version) {
return tester.controller().osVersionStatus().versions().entrySet().stream()
.filter(entry -> entry.getKey().version().equals(version))
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 454a1ac9ee9..d4d146f0834 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
@@ -40,7 +40,7 @@ public class OsVersionStatusUpdaterTest {
// Setting a new target adds it to current status
Version version1 = Version.fromString("7.1");
CloudName cloud = CloudName.DEFAULT;
- tester.controller().upgradeOsIn(cloud, version1, Duration.ZERO, false);
+ tester.controller().upgradeOsIn(cloud, version1, false);
statusUpdater.maintain();
var osVersions = tester.controller().osVersionStatus().versions();
@@ -49,7 +49,7 @@ public class OsVersionStatusUpdaterTest {
assertTrue(osVersions.get(new OsVersion(version1, cloud)).isEmpty(), "No nodes on current target");
CloudName otherCloud = CloudName.AWS;
- tester.controller().upgradeOsIn(otherCloud, version1, Duration.ZERO, false);
+ tester.controller().upgradeOsIn(otherCloud, version1, false);
statusUpdater.maintain();
osVersions = tester.controller().osVersionStatus().versions();
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionTargetSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionTargetSerializerTest.java
index 0f8a1c1b056..55d940ca6f9 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionTargetSerializerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/OsVersionTargetSerializerTest.java
@@ -8,7 +8,6 @@ import com.yahoo.vespa.hosted.controller.versions.OsVersion;
import com.yahoo.vespa.hosted.controller.versions.OsVersionTarget;
import org.junit.jupiter.api.Test;
-import java.time.Duration;
import java.time.Instant;
import java.util.Set;
@@ -23,8 +22,8 @@ public class OsVersionTargetSerializerTest {
void serialization() {
OsVersionTargetSerializer serializer = new OsVersionTargetSerializer(new OsVersionSerializer());
Set<OsVersionTarget> targets = ImmutableSet.of(
- new OsVersionTarget(new OsVersion(Version.fromString("7.1"), CloudName.DEFAULT), Duration.ZERO, Instant.ofEpochMilli(123)),
- new OsVersionTarget(new OsVersion(Version.fromString("7.1"), CloudName.from("foo")), Duration.ofDays(1), Instant.ofEpochMilli(456))
+ new OsVersionTarget(new OsVersion(Version.fromString("7.1"), CloudName.DEFAULT), Instant.ofEpochMilli(123)),
+ new OsVersionTarget(new OsVersion(Version.fromString("7.1"), CloudName.from("foo")), Instant.ofEpochMilli(456))
);
Set<OsVersionTarget> serialized = serializer.fromSlime(serializer.toSlime(targets));
assertEquals(targets, serialized);
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 64bb6aeca04..1067db31473 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
@@ -80,10 +80,10 @@ public class OsApiTest extends ControllerContainerTest {
// All nodes are initially on empty version
upgradeAndUpdateStatus();
// Upgrade OS to a different version in each cloud
- assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"7.5.2\", \"cloud\": \"cloud1\", \"upgradeBudget\": \"PT0S\"}", Request.Method.PATCH),
- "{\"message\":\"Set target OS version for cloud 'cloud1' to 7.5.2 with upgrade budget PT0S\"}", 200);
- assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"8.2.1\", \"cloud\": \"cloud2\", \"upgradeBudget\": \"PT24H\"}", Request.Method.PATCH),
- "{\"message\":\"Set target OS version for cloud 'cloud2' to 8.2.1 with upgrade budget PT24H\"}", 200);
+ assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"7.5.2\", \"cloud\": \"cloud1\"}", Request.Method.PATCH),
+ "{\"message\":\"Set target OS version for cloud 'cloud1' to 7.5.2\"}", 200);
+ assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"8.2.1\", \"cloud\": \"cloud2\"}", Request.Method.PATCH),
+ "{\"message\":\"Set target OS version for cloud 'cloud2' to 8.2.1\"}", 200);
// Status is updated after some zones are upgraded
upgradeAndUpdateStatus();
@@ -96,8 +96,8 @@ public class OsApiTest extends ControllerContainerTest {
assertFile(new Request("http://localhost:8080/os/v1/"), "versions-all-upgraded.json");
// Downgrade with force is permitted
- assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"7.5.1\", \"cloud\": \"cloud1\", \"force\": true, \"upgradeBudget\": \"PT0S\"}", Request.Method.PATCH),
- "{\"message\":\"Set target OS version for cloud 'cloud1' to 7.5.1 with upgrade budget PT0S\"}", 200);
+ assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"7.5.1\", \"cloud\": \"cloud1\", \"force\": true}", Request.Method.PATCH),
+ "{\"message\":\"Set target OS version for cloud 'cloud1' to 7.5.1\"}", 200);
// Clear target for a given cloud
assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": null, \"cloud\": \"cloud2\"}", Request.Method.PATCH),
@@ -110,17 +110,17 @@ public class OsApiTest extends ControllerContainerTest {
"{\"error-code\":\"BAD_REQUEST\",\"message\":\"Field 'version' is required\"}", 400);
// Error: Invalid versions
- assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"0.0.0\", \"cloud\": \"cloud1\", \"upgradeBudget\": \"PT0S\"}", Request.Method.PATCH),
+ assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"0.0.0\", \"cloud\": \"cloud1\"}", Request.Method.PATCH),
"{\"error-code\":\"BAD_REQUEST\",\"message\":\"Invalid version '0.0.0'\"}", 400);
- assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"foo\", \"cloud\": \"cloud1\", \"upgradeBudget\": \"PT0S\"}", Request.Method.PATCH),
+ assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"foo\", \"cloud\": \"cloud1\"}", Request.Method.PATCH),
"{\"error-code\":\"BAD_REQUEST\",\"message\":\"Invalid version 'foo': For input string: \\\"foo\\\"\"}", 400);
// Error: Invalid cloud
- assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"7.6\", \"cloud\": \"foo\", \"upgradeBudget\": \"PT0S\"}", Request.Method.PATCH),
+ assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"7.6\", \"cloud\": \"foo\"}", Request.Method.PATCH),
"{\"error-code\":\"BAD_REQUEST\",\"message\":\"Cloud 'foo' does not exist in this system\"}", 400);
// Error: Downgrade OS
- assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"7.4.1\", \"cloud\": \"cloud1\", \"upgradeBudget\": \"PT0S\"}", Request.Method.PATCH),
+ assertResponse(new Request("http://localhost:8080/os/v1/", "{\"version\": \"7.4.1\", \"cloud\": \"cloud1\"}", Request.Method.PATCH),
"{\"error-code\":\"BAD_REQUEST\",\"message\":\"Cannot downgrade cloud 'cloud1' to version 7.4.1\"}", 400);
// Request firmware checks in all zones.
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/responses/versions-all-upgraded.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/responses/versions-all-upgraded.json
index 7f31b67d77b..92a2cad86f1 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/responses/versions-all-upgraded.json
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/responses/versions-all-upgraded.json
@@ -102,7 +102,7 @@
{
"version": "8.2.1",
"targetVersion": true,
- "upgradeBudget": "PT24H",
+ "upgradeBudget": "PT0S",
"scheduledAt": 1234,
"nextVersion": "8.2.1.20211228",
"nextScheduledAt": 1640743200000,
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/responses/versions-partially-upgraded.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/responses/versions-partially-upgraded.json
index 68ac684b0fb..662ff4bb373 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/responses/versions-partially-upgraded.json
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/responses/versions-partially-upgraded.json
@@ -161,7 +161,7 @@
{
"version": "8.2.1",
"targetVersion": true,
- "upgradeBudget": "PT24H",
+ "upgradeBudget": "PT0S",
"scheduledAt": 1234,
"nextVersion": "8.2.1.20211228",
"nextScheduledAt": 1640743200000,