diff options
author | Martin Polden <mpolden@mpolden.no> | 2023-07-19 15:54:29 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2023-07-20 09:33:49 +0200 |
commit | 05b89413eb8a47a24b8e16255d68b42f0f5549b3 (patch) | |
tree | ecf9afca82c19487952cbbb7afe34b23ef84207a | |
parent | 14295d7f9618f7a80adbb155b0303a08d008d9d7 (diff) |
Extract OsController
16 files changed, 192 insertions, 152 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java index 54dcfa46188..bac2c0ab9d7 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java @@ -126,7 +126,7 @@ import static java.util.stream.Collectors.toMap; import static java.util.stream.Collectors.toSet; /** - * A singleton owned by the Controller which contains the methods and state for controlling applications. + * A singleton owned by {@link Controller} which contains the methods and state for controlling applications. * * @author bratseth */ 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 7da67227095..6cbcc64cf33 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 @@ -30,9 +30,6 @@ import com.yahoo.vespa.hosted.controller.persistence.JobControlFlags; import com.yahoo.vespa.hosted.controller.restapi.dataplanetoken.DataplaneTokenService; import com.yahoo.vespa.hosted.controller.security.AccessControl; import com.yahoo.vespa.hosted.controller.support.access.SupportAccessControl; -import com.yahoo.vespa.hosted.controller.versions.OsVersion; -import com.yahoo.vespa.hosted.controller.versions.OsVersionStatus; -import com.yahoo.vespa.hosted.controller.versions.OsVersionTarget; import com.yahoo.vespa.hosted.controller.versions.VersionStatus; import com.yahoo.vespa.hosted.controller.versions.VespaVersion; import com.yahoo.vespa.hosted.rotation.config.RotationsConfig; @@ -40,15 +37,12 @@ import com.yahoo.yolean.concurrent.Sleeper; import java.security.SecureRandom; import java.time.Clock; -import java.time.Instant; import java.util.LinkedHashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Random; import java.util.Set; -import java.util.TreeSet; -import java.util.function.Function; import java.util.function.Predicate; import java.util.logging.Logger; import java.util.stream.Collectors; @@ -85,6 +79,7 @@ public class Controller extends AbstractComponent { private final MavenRepository mavenRepository; private final Metric metric; private final RoutingController routingController; + private final OsController osController; private final ControllerConfig controllerConfig; private final SecretStore secretStore; private final CuratorArchiveBucketDb archiveBucketDb; @@ -132,6 +127,7 @@ public class Controller extends AbstractComponent { applicationController = new ApplicationController(this, curator, accessControl, clock, flagSource, serviceRegistry.billingController()); tenantController = new TenantController(this, curator, accessControl); routingController = new RoutingController(this, rotationsConfig); + osController = new OsController(this); auditLogger = new AuditLogger(curator, clock); jobControl = new JobControl(new JobControlFlags(curator, flagSource)); archiveBucketDb = new CuratorArchiveBucketDb(this); @@ -161,6 +157,11 @@ public class Controller extends AbstractComponent { return routingController; } + /** Returns the instance controlling OS upgrades */ + public OsController os() { + return osController; + } + /** Returns the service registry of this */ public ServiceRegistry serviceRegistry() { return serviceRegistry; @@ -232,96 +233,6 @@ public class Controller extends AbstractComponent { .orElse(Vtag.currentVersion); } - /** Returns the target OS version for infrastructure in this system. The controller will drive infrastructure OS - * upgrades to this version */ - public Optional<OsVersionTarget> osVersionTarget(CloudName cloud) { - return osVersionTargets().stream().filter(target -> target.osVersion().cloud().equals(cloud)).findFirst(); - } - - /** Returns all target OS versions in this system */ - public Set<OsVersionTarget> osVersionTargets() { - return curator.readOsVersionTargets(); - } - - /** - * Set the target OS version for given cloud in this system. - * - * @param cloud The cloud to upgrade - * @param version The target OS version - * @param force Allow downgrades, and override pinned target (if any) - * @param pin Pin this version. This prevents automatic scheduling of upgrades until version is unpinned - */ - public void upgradeOsIn(CloudName cloud, Version version, boolean force, boolean pin) { - if (version.isEmpty()) { - throw new IllegalArgumentException("Invalid version '" + version.toFullString() + "'"); - } - if (!clouds().contains(cloud)) { - throw new IllegalArgumentException("Cloud '" + cloud + "' does not exist in this system"); - } - Instant scheduledAt = clock.instant(); - try (Mutex lock = curator.lockOsVersions()) { - Map<CloudName, OsVersionTarget> targets = curator.readOsVersionTargets().stream() - .collect(Collectors.toMap(t -> t.osVersion().cloud(), - Function.identity())); - - OsVersionTarget currentTarget = targets.get(cloud); - boolean downgrade = false; - if (currentTarget != null) { - boolean versionChange = !currentTarget.osVersion().version().equals(version); - downgrade = version.isBefore(currentTarget.osVersion().version()); - if (versionChange && currentTarget.pinned() && !force) { - throw new IllegalArgumentException("Cannot " + (downgrade ? "downgrade" : "upgrade") + " cloud " + - cloud.value() + "' to version " + version.toFullString() + - ": Current target is pinned. Add 'force' parameter to override"); - } - if (downgrade && !force) { - throw new IllegalArgumentException("Cannot downgrade cloud '" + cloud.value() + "' to version " + - version.toFullString() + ": Missing 'force' parameter"); - } - if (!versionChange && currentTarget.pinned() == pin) return; // No change - } - - OsVersionTarget newTarget = new OsVersionTarget(new OsVersion(version, cloud), scheduledAt, pin, downgrade); - targets.put(cloud, newTarget); - curator.writeOsVersionTargets(new TreeSet<>(targets.values())); - log.info("Triggered OS " + (downgrade ? "downgrade" : "upgrade") + " to " + version.toFullString() + - " in cloud " + cloud.value()); - } - } - - /** Clear the target OS version for given cloud in this system */ - public void cancelOsUpgradeIn(CloudName cloudName) { - try (Mutex lock = curator.lockOsVersions()) { - Map<CloudName, OsVersionTarget> targets = curator.readOsVersionTargets().stream() - .collect(Collectors.toMap(t -> t.osVersion().cloud(), - Function.identity())); - if (targets.remove(cloudName) == null) { - throw new IllegalArgumentException("Cloud '" + cloudName.value() + " has no OS upgrade target"); - } - curator.writeOsVersionTargets(new TreeSet<>(targets.values())); - } - } - - /** Returns the current OS version status */ - public OsVersionStatus osVersionStatus() { - return curator.readOsVersionStatus(); - } - - /** Replace the current OS version status with a new one */ - public void updateOsVersionStatus(OsVersionStatus newStatus) { - try (Mutex lock = curator.lockOsVersionStatus()) { - OsVersionStatus currentStatus = curator.readOsVersionStatus(); - for (CloudName cloud : clouds()) { - Set<Version> newVersions = newStatus.versionsIn(cloud); - if (currentStatus.versionsIn(cloud).size() > 1 && newVersions.size() == 1) { - log.info("All nodes in " + cloud + " cloud upgraded to OS version " + - newVersions.iterator().next().toFullString()); - } - } - curator.writeOsVersionStatus(newStatus); - } - } - /** Returns the hostname of this controller */ public HostName hostname() { return serviceRegistry.getHostname(); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/OsController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/OsController.java new file mode 100644 index 00000000000..9d480c57c7a --- /dev/null +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/OsController.java @@ -0,0 +1,129 @@ +// 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.Version; +import com.yahoo.config.provision.CloudName; +import com.yahoo.transaction.Mutex; +import com.yahoo.vespa.hosted.controller.persistence.CuratorDb; +import com.yahoo.vespa.hosted.controller.versions.OsVersion; +import com.yahoo.vespa.hosted.controller.versions.OsVersionStatus; +import com.yahoo.vespa.hosted.controller.versions.OsVersionTarget; + +import java.time.Instant; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.TreeSet; +import java.util.function.Function; +import java.util.logging.Logger; +import java.util.stream.Collectors; + +/** + * A singleton owned by {@link Controller} which contains the methods and state for controlling OS upgrades. + * + * @author mpolden + */ +public record OsController(Controller controller) { + + private static final Logger LOG = Logger.getLogger(OsController.class.getName()); + + public OsController { + Objects.requireNonNull(controller); + } + + /** Returns the target OS version for infrastructure in this system. The controller will drive infrastructure OS + * upgrades to this version */ + public Optional<OsVersionTarget> target(CloudName cloud) { + return targets().stream().filter(target -> target.osVersion().cloud().equals(cloud)).findFirst(); + } + + /** Returns all target OS versions in this system */ + public Set<OsVersionTarget> targets() { + return curator().readOsVersionTargets(); + } + + /** + * Set the target OS version for given cloud in this system. + * + * @param version The target OS version + * @param cloud The cloud to upgrade + * @param force Allow downgrades, and override pinned target (if any) + * @param pin Pin this version. This prevents automatic scheduling of upgrades until version is unpinned + */ + public void upgradeTo(Version version, CloudName cloud, boolean force, boolean pin) { + if (version.isEmpty()) { + throw new IllegalArgumentException("Invalid version '" + version.toFullString() + "'"); + } + if (!controller.clouds().contains(cloud)) { + throw new IllegalArgumentException("Cloud '" + cloud + "' does not exist in this system"); + } + Instant scheduledAt = controller.clock().instant(); + try (Mutex lock = curator().lockOsVersions()) { + Map<CloudName, OsVersionTarget> targets = curator().readOsVersionTargets().stream() + .collect(Collectors.toMap(t -> t.osVersion().cloud(), + Function.identity())); + + OsVersionTarget currentTarget = targets.get(cloud); + boolean downgrade = false; + if (currentTarget != null) { + boolean versionChange = !currentTarget.osVersion().version().equals(version); + downgrade = version.isBefore(currentTarget.osVersion().version()); + if (versionChange && currentTarget.pinned() && !force) { + throw new IllegalArgumentException("Cannot " + (downgrade ? "downgrade" : "upgrade") + " cloud " + + cloud.value() + "' to version " + version.toFullString() + + ": Current target is pinned. Add 'force' parameter to override"); + } + if (downgrade && !force) { + throw new IllegalArgumentException("Cannot downgrade cloud '" + cloud.value() + "' to version " + + version.toFullString() + ": Missing 'force' parameter"); + } + if (!versionChange && currentTarget.pinned() == pin) return; // No change + } + + OsVersionTarget newTarget = new OsVersionTarget(new OsVersion(version, cloud), scheduledAt, pin, downgrade); + targets.put(cloud, newTarget); + curator().writeOsVersionTargets(new TreeSet<>(targets.values())); + LOG.info("Triggered OS " + (downgrade ? "downgrade" : "upgrade") + " to " + version.toFullString() + + " in cloud " + cloud.value()); + } + } + + /** Clear the target OS version for given cloud in this system */ + public void cancelUpgrade(CloudName cloudName) { + try (Mutex lock = curator().lockOsVersions()) { + Map<CloudName, OsVersionTarget> targets = curator().readOsVersionTargets().stream() + .collect(Collectors.toMap(t -> t.osVersion().cloud(), + Function.identity())); + if (targets.remove(cloudName) == null) { + throw new IllegalArgumentException("Cloud '" + cloudName.value() + " has no OS upgrade target"); + } + curator().writeOsVersionTargets(new TreeSet<>(targets.values())); + } + } + + /** Returns the current OS version status */ + public OsVersionStatus status() { + return curator().readOsVersionStatus(); + } + + /** Replace the current OS version status with a new one */ + public void updateStatus(OsVersionStatus newStatus) { + try (Mutex lock = curator().lockOsVersionStatus()) { + OsVersionStatus currentStatus = curator().readOsVersionStatus(); + for (CloudName cloud : controller.clouds()) { + Set<Version> newVersions = newStatus.versionsIn(cloud); + if (currentStatus.versionsIn(cloud).size() > 1 && newVersions.size() == 1) { + LOG.info("All nodes in " + cloud + " cloud upgraded to OS version " + + newVersions.iterator().next().toFullString()); + } + } + curator().writeOsVersionStatus(newStatus); + } + } + + private CuratorDb curator() { + return controller.curator(); + } + +} diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java index a635d512054..3d550973f22 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java @@ -66,8 +66,8 @@ import java.util.stream.Collectors; import static java.util.stream.Collectors.toMap; /** - * The routing controller encapsulates state and methods for inspecting and manipulating deployment endpoints in a - * hosted Vespa system. + * The routing controller is owned by {@link Controller} and encapsulates state and methods for inspecting and + * manipulating deployment endpoints in a hosted Vespa system. * * The one-stop shop for all your routing needs! * diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/TenantController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/TenantController.java index b6a645d96d2..bf2f2ab90eb 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/TenantController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/TenantController.java @@ -27,7 +27,7 @@ import java.util.logging.Level; import java.util.logging.Logger; /** - * A singleton owned by the Controller which contains the methods and state for controlling tenants. + * A singleton owned by the {@link Controller} which contains the methods and state for controlling tenants. * * @author bratseth * @author mpolden 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 67188eb5e3a..98de84216e0 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 @@ -276,7 +276,7 @@ public class MetricsReporter extends ControllerMaintainer { } private Map<NodeVersion, Duration> osChangeDurations() { - return changeDurations(controller().osVersionStatus().versions().values(), Function.identity()); + return changeDurations(controller().os().status().versions().values(), Function.identity()); } private <V> Map<NodeVersion, Duration> changeDurations(Collection<V> versions, Function<V, List<NodeVersion>> versionsGetter) { 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 18e5b9388b3..ac76ecf4b2a 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 @@ -47,7 +47,7 @@ public class OsUpgradeScheduler extends ControllerMaintainer { if (!change.get().scheduleAt(now)) continue; try { attempts++; - controller().upgradeOsIn(cloud, change.get().version(), false, false); + controller().os().upgradeTo(change.get().version(), cloud, false, false); } catch (IllegalArgumentException e) { failures++; LOG.log(Level.WARNING, "Failed to schedule OS upgrade: " + Exceptions.toMessageString(e) + @@ -59,7 +59,7 @@ public class OsUpgradeScheduler extends ControllerMaintainer { /** Returns the wanted change for cloud at given instant, if any */ public Optional<Change> changeIn(CloudName cloud, Instant instant) { - Optional<OsVersionTarget> currentTarget = controller().osVersionTarget(cloud); + Optional<OsVersionTarget> currentTarget = controller().os().target(cloud); if (currentTarget.isEmpty()) return Optional.empty(); if (upgradingToNewMajor(cloud)) return Optional.empty(); // Skip further upgrades until major version upgrade is complete @@ -68,7 +68,7 @@ public class OsUpgradeScheduler extends ControllerMaintainer { } private boolean upgradingToNewMajor(CloudName cloud) { - return controller().osVersionStatus().versionsIn(cloud).stream() + return controller().os().status().versionsIn(cloud).stream() .filter(version -> !version.isEmpty()) // Ignore empty/unknown versions .map(Version::getMajor) .distinct() 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 a2b4d95775e..4df40850cc9 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 @@ -68,8 +68,8 @@ public class OsUpgrader extends InfrastructureUpgrader<OsVersionTarget> { @Override protected Optional<OsVersionTarget> target() { // Return target if we have nodes in this cloud on the wrong version - return controller().osVersionTarget(cloud) - .filter(target -> controller().osVersionStatus().nodesIn(cloud).stream() + return controller().os().target(cloud) + .filter(target -> controller().os().status().nodesIn(cloud).stream() .anyMatch(node -> !satisfiedBy(node.currentVersion(), target))); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdater.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdater.java index c643df6af68..831b4275422 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdater.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdater.java @@ -21,7 +21,7 @@ public class OsVersionStatusUpdater extends ControllerMaintainer { protected double maintain() { try { OsVersionStatus newStatus = OsVersionStatus.compute(controller()); - controller().updateOsVersionStatus(newStatus); + controller().os().updateStatus(newStatus); return 0.0; } catch (Exception e) { log.log(Level.WARNING, "Failed to compute OS version status: " + Exceptions.toMessageString(e) + 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 dace7b7be8f..0fa2dc492c2 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 @@ -141,13 +141,13 @@ public class OsApiHandler extends AuditLoggingRequestHandler { Inspector root = requestData.get(); CloudName cloud = parseStringField("cloud", root, CloudName::from); if (requireField("version", root).type() == Type.NIX) { - controller.cancelOsUpgradeIn(cloud); + controller.os().cancelUpgrade(cloud); return new MessageResponse("Cleared target OS version for cloud '" + cloud.value() + "'"); } Version target = parseStringField("version", root, Version::fromString); boolean force = root.field("force").asBool(); boolean pin = root.field("pin").asBool(); - controller.upgradeOsIn(cloud, target, force, pin); + controller.os().upgradeTo(target, cloud, force, pin); return new MessageResponse("Set target OS version for cloud '" + cloud.value() + "' to " + target.toFullString() + (pin ? " (pinned)" : "")); } @@ -155,11 +155,11 @@ public class OsApiHandler extends AuditLoggingRequestHandler { private Slime osVersions() { Slime slime = new Slime(); Cursor root = slime.setObject(); - Set<OsVersionTarget> targets = controller.osVersionTargets(); + Set<OsVersionTarget> targets = controller.os().targets(); Cursor versions = root.setArray("versions"); Instant now = controller.clock().instant(); - controller.osVersionStatus().versions().forEach((osVersion, nodeVersions) -> { + controller.os().status().versions().forEach((osVersion, nodeVersions) -> { Cursor currentVersionObject = versions.addObject(); currentVersionObject.setString("version", osVersion.version().toFullString()); Optional<OsVersionTarget> target = targets.stream().filter(t -> t.osVersion().equals(osVersion)).findFirst(); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersionStatus.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersionStatus.java index a06f26b1fdf..f90cee65058 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersionStatus.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersionStatus.java @@ -59,7 +59,7 @@ public record OsVersionStatus(Map<OsVersion, List<NodeVersion>> versions) { /** Compute the current OS versions in this system. This is expensive and should be called infrequently */ public static OsVersionStatus compute(Controller controller) { Map<OsVersion, List<NodeVersion>> osVersions = new HashMap<>(); - controller.osVersionTargets().forEach(target -> osVersions.put(target.osVersion(), new ArrayList<>())); + controller.os().targets().forEach(target -> osVersions.put(target.osVersion(), new ArrayList<>())); for (var application : SystemApplication.all()) { for (var zone : zonesToUpgrade(controller)) { 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 49e647904cd..53f2e85ad31 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, false, false); + tester.controller().os().upgradeTo(version0, cloud, false, 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, false, false); + tester.controller().os().upgradeTo(nextVersion, cloud, false, 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 4cec38c456e..27cdd847fb9 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 @@ -43,17 +43,17 @@ public class OsUpgradeSchedulerTest { // Initial run does nothing as the cloud does not have a target scheduler.maintain(); - assertTrue(tester.controller().osVersionTarget(cloud).isEmpty(), "No target set"); + assertTrue(tester.controller().os().target(cloud).isEmpty(), "No target set"); // Target is set manually Version version0 = Version.fromString("7.0.0.20220101"); - tester.controller().upgradeOsIn(cloud, version0, false, false); + tester.controller().os().upgradeTo(version0, cloud, false, false); // Target remains unchanged as it hasn't expired yet for (var interval : List.of(Duration.ZERO, Duration.ofDays(30))) { tester.clock().advance(interval); scheduler.maintain(); - assertEquals(version0, tester.controller().osVersionTarget(cloud).get().osVersion().version()); + assertEquals(version0, tester.controller().os().target(cloud).get().osVersion().version()); } // New release becomes available, but is not triggered until cool-down period has passed, and we're inside a @@ -64,37 +64,37 @@ public class OsUpgradeSchedulerTest { assertEquals(version1, scheduler.changeIn(cloud, tester.clock().instant()).get().version()); scheduler.maintain(); assertEquals(version0, - tester.controller().osVersionTarget(cloud).get().osVersion().version(), + tester.controller().os().target(cloud).get().osVersion().version(), "Target is unchanged because cooldown hasn't passed"); tester.clock().advance(Duration.ofDays(3).plusHours(18)); assertEquals("2022-03-07T03:05:00", formatInstant(tester.clock().instant())); scheduler.maintain(); assertEquals(version0, - tester.controller().osVersionTarget(cloud).get().osVersion().version(), + tester.controller().os().target(cloud).get().osVersion().version(), "Target is unchanged because we're outside trigger period"); tester.clock().advance(Duration.ofHours(5)); assertEquals("2022-03-07T08:05:00", formatInstant(tester.clock().instant())); // Time constraints have now passed, but the current target has been pinned in the meantime - tester.controller().upgradeOsIn(cloud, version0, false, true); + tester.controller().os().upgradeTo(version0, cloud, false, true); Optional<OsUpgradeScheduler.Change> change = scheduler.changeIn(cloud, tester.clock().instant()); assertTrue(change.isPresent()); assertEquals(-1, scheduler.maintain()); assertEquals(version0, - tester.controller().osVersionTarget(cloud).get().osVersion().version(), + tester.controller().os().target(cloud).get().osVersion().version(), "Target is unchanged because it's pinned"); // Target is unpinned and new version is allowed to be scheduled - tester.controller().upgradeOsIn(cloud, version0, false, false); + tester.controller().os().upgradeTo(version0, cloud, false, false); scheduler.maintain(); assertEquals(version1, - tester.controller().osVersionTarget(cloud).get().osVersion().version(), + tester.controller().os().target(cloud).get().osVersion().version(), "New target set"); // A few more days pass and target remains unchanged tester.clock().advance(Duration.ofDays(2)); scheduler.maintain(); - assertEquals(version1, tester.controller().osVersionTarget(cloud).get().osVersion().version()); + assertEquals(version1, tester.controller().os().target(cloud).get().osVersion().version()); // Estimate next change Optional<OsUpgradeScheduler.Change> nextChange = scheduler.changeIn(cloud, tester.clock().instant()); @@ -115,19 +115,19 @@ public class OsUpgradeSchedulerTest { // Set initial target Version version0 = Version.fromString("7.0.0.20220101"); - tester.controller().upgradeOsIn(cloud, version0, false, false); + tester.controller().os().upgradeTo(version0, cloud, false, false); // Next version is triggered Version version1 = Version.fromString("7.0.0.20220301"); tester.clock().advance(Duration.ofDays(44)); assertEquals("2022-03-01T02:05:00", formatInstant(tester.clock().instant())); scheduler.maintain(); - assertEquals(version0, tester.controller().osVersionTarget(cloud).get().osVersion().version()); + assertEquals(version0, tester.controller().os().target(cloud).get().osVersion().version()); // Cool-down passes tester.clock().advance(Duration.ofDays(1)); assertEquals(version1, scheduler.changeIn(cloud, tester.clock().instant()).get().version()); scheduler.maintain(); - assertEquals(version1, tester.controller().osVersionTarget(cloud).get().osVersion().version()); + assertEquals(version1, tester.controller().os().target(cloud).get().osVersion().version()); // Estimate next change Optional<OsUpgradeScheduler.Change> nextChange = scheduler.changeIn(cloud, tester.clock().instant()); @@ -146,7 +146,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, false, false); + tester.controller().os().upgradeTo(version0, cloud, false, false); // Stable release (tagged outside trigger period) is scheduled once trigger period opens Version version1 = Version.fromString("8.1"); @@ -160,7 +160,7 @@ public class OsUpgradeSchedulerTest { // A newer version is triggered manually Version version3 = Version.fromString("8.3"); - tester.controller().upgradeOsIn(cloud, version3, false, false); + tester.controller().os().upgradeTo(version3, cloud, false, false); // Nothing happens in next iteration as tagged release is older than manually triggered version scheduleUpgradeAfter(Duration.ofDays(7), version3, scheduler, tester); @@ -177,7 +177,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, false, false); + tester.controller().os().upgradeTo(version0, cloud, false, false); // Latest release is not scheduled immediately Version version1 = Version.fromString("8.1"); @@ -214,7 +214,7 @@ public class OsUpgradeSchedulerTest { tester.clock().advance(duration); scheduler.maintain(); CloudName cloud = tester.controller().clouds().iterator().next(); - OsVersionTarget target = tester.controller().osVersionTarget(cloud).get(); + OsVersionTarget target = tester.controller().os().target(cloud).get(); assertEquals(version, target.osVersion().version()); } 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 cc9df6b38e6..056db4f119c 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 @@ -71,9 +71,9 @@ public class OsUpgraderTest { // New OS version released Version version1 = Version.fromString("7.1"); - tester.controller().upgradeOsIn(cloud1, Version.fromString("7.0"), false, false); - tester.controller().upgradeOsIn(cloud1, version1, false, false); - assertEquals(1, tester.controller().osVersionTargets().size()); // Only allows one version per cloud + tester.controller().os().upgradeTo(Version.fromString("7.0"), cloud1, false, false); + tester.controller().os().upgradeTo(version1, cloud1, false, false); + assertEquals(1, tester.controller().os().targets().size()); // Only allows one version per cloud statusUpdater.maintain(); // zone 0: controllers upgrade first @@ -127,9 +127,9 @@ public class OsUpgraderTest { osUpgrader.maintain(); assertWanted(version1, SystemApplication.tenantHost, zone1, zone2, zone3, zone4); statusUpdater.maintain(); - assertTrue(tester.controller().osVersionStatus().nodesIn(cloud1).stream() - .filter(node -> !node.hostname().equals(nodeDeferringOsUpgrade.hostname())) - .allMatch(node -> node.currentVersion().equals(version1)), + assertTrue(tester.controller().os().status().nodesIn(cloud1).stream() + .filter(node -> !node.hostname().equals(nodeDeferringOsUpgrade.hostname())) + .allMatch(node -> node.currentVersion().equals(version1)), "All non-deferring nodes are on target version"); } @@ -150,8 +150,8 @@ public class OsUpgraderTest { // New OS version released Version version = Version.fromString("7.1"); - tester.controller().upgradeOsIn(cloud, Version.fromString("7.0"), false, false); - tester.controller().upgradeOsIn(cloud, version, false, false); // Replaces existing target + tester.controller().os().upgradeTo(Version.fromString("7.0"), cloud, false, false); + tester.controller().os().upgradeTo(version, cloud, false, false); // Replaces existing target statusUpdater.maintain(); // zone 1 upgrades @@ -172,8 +172,8 @@ public class OsUpgraderTest { // No more upgrades osUpgrader.maintain(); assertWanted(version, SystemApplication.tenantHost, zone1, zone2); - assertTrue(tester.controller().osVersionStatus().nodesIn(cloud).stream() - .noneMatch(node -> node.currentVersion().isBefore(version)), "All nodes on target version or newer"); + assertTrue(tester.controller().os().status().nodesIn(cloud).stream() + .noneMatch(node -> node.currentVersion().isBefore(version)), "All nodes on target version or newer"); } @Test @@ -194,7 +194,7 @@ public class OsUpgraderTest { // New OS version released Version version0 = Version.fromString("1.0"); Version version1 = Version.fromString("2.0"); - tester.controller().upgradeOsIn(cloud, version1, false, false); + tester.controller().os().upgradeTo(version1, cloud, false, false); statusUpdater.maintain(); // All zones upgrade @@ -203,11 +203,11 @@ public class OsUpgraderTest { completeUpgrade(version1, SystemApplication.tenantHost, zone); statusUpdater.maintain(); } - assertTrue(tester.controller().osVersionStatus().nodesIn(cloud).stream() + assertTrue(tester.controller().os().status().nodesIn(cloud).stream() .allMatch(node -> node.currentVersion().equals(version1)), "All nodes on target version"); // Downgrade is triggered - tester.controller().upgradeOsIn(cloud, version0, true, false); + tester.controller().os().upgradeTo(version0, cloud, true, false); // All zones downgrade, in reverse order for (var zone : List.of(zone2, zone1)) { @@ -215,12 +215,12 @@ public class OsUpgraderTest { completeUpgrade(version0, SystemApplication.tenantHost, zone); statusUpdater.maintain(); } - assertTrue(tester.controller().osVersionStatus().nodesIn(cloud).stream() + assertTrue(tester.controller().os().status().nodesIn(cloud).stream() .allMatch(node -> node.currentVersion().equals(version0)), "All nodes on target version"); } private List<NodeVersion> nodesOn(Version version) { - return tester.controller().osVersionStatus().versions().entrySet().stream() + return tester.controller().os().status().versions().entrySet().stream() .filter(entry -> entry.getKey().version().equals(version)) .flatMap(entry -> entry.getValue().stream()) .toList(); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdaterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsVersionStatusUpdaterTest.java index 92be999e508..f45c7bfcdfb 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 @@ -35,24 +35,24 @@ public class OsVersionStatusUpdaterTest { tester.zoneRegistry().setOsUpgradePolicy(CloudName.DEFAULT, upgradePolicy.build()); // Initially empty - assertSame(OsVersionStatus.empty, tester.controller().osVersionStatus()); + assertSame(OsVersionStatus.empty, tester.controller().os().status()); // Setting a new target adds it to current status Version version1 = Version.fromString("7.1"); CloudName cloud = CloudName.DEFAULT; - tester.controller().upgradeOsIn(cloud, version1, false, false); + tester.controller().os().upgradeTo(version1, cloud, false, false); statusUpdater.maintain(); - var osVersions = tester.controller().osVersionStatus().versions(); + var osVersions = tester.controller().os().status().versions(); assertEquals(3, osVersions.size()); assertFalse(osVersions.get(new OsVersion(Version.emptyVersion, cloud)).isEmpty(), "All nodes on unknown version"); assertTrue(osVersions.get(new OsVersion(version1, cloud)).isEmpty(), "No nodes on current target"); CloudName otherCloud = CloudName.AWS; - tester.controller().upgradeOsIn(otherCloud, version1, false, false); + tester.controller().os().upgradeTo(version1, otherCloud, false, false); statusUpdater.maintain(); - osVersions = tester.controller().osVersionStatus().versions(); + osVersions = tester.controller().os().status().versions(); assertEquals(4, osVersions.size()); // 2 in cloud, 2 in otherCloud. assertFalse(osVersions.get(new OsVersion(Version.emptyVersion, cloud)).isEmpty(), "All nodes on unknown version"); assertTrue(osVersions.get(new OsVersion(version1, cloud)).isEmpty(), "No nodes on current target"); 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 d6edb90d149..e569e0aca5b 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 @@ -160,7 +160,7 @@ public class OsApiTest extends ControllerContainerTest { } private void updateVersionStatus() { - tester.controller().updateOsVersionStatus(OsVersionStatus.compute(tester.controller())); + tester.controller().os().updateStatus(OsVersionStatus.compute(tester.controller())); } private void completeUpgrade(ZoneId... zones) { |