diff options
author | Martin Polden <mpolden@mpolden.no> | 2022-11-15 13:52:08 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2022-11-15 14:03:57 +0100 |
commit | 328dd453bd91dc15b1cc733bce5ef895b8d4091e (patch) | |
tree | c8676688ecd7c13ed7194fdd376517fa8ade67a1 /controller-server/src | |
parent | 1b538760a2e23a2ca81bda94b6bda26eab40a191 (diff) |
Stop setting OS upgrade budget
Diffstat (limited to 'controller-server/src')
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, |