aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeScheduler.java9
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java4
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java20
3 files changed, 17 insertions, 16 deletions
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 30a98cbfacd..702e7ac95f1 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
@@ -35,7 +35,7 @@ public class OsUpgradeScheduler extends ControllerMaintainer {
protected double maintain() {
Instant now = controller().clock().instant();
for (var cloud : controller().clouds()) {
- Optional<Change> change = changeIn(cloud);
+ 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);
@@ -43,15 +43,14 @@ public class OsUpgradeScheduler extends ControllerMaintainer {
return 1.0;
}
- /** Returns the wanted change for given cloud, if any */
- public Optional<Change> changeIn(CloudName cloud) {
+ /** 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);
if (currentTarget.isEmpty()) return Optional.empty();
if (upgradingToNewMajor(cloud)) return Optional.empty(); // Skip further upgrades until major version upgrade is complete
Release release = releaseIn(cloud);
- Instant now = controller().clock().instant();
- return release.change(currentTarget.get().version(), now);
+ return release.change(currentTarget.get().version(), instant);
}
private boolean upgradingToNewMajor(CloudName cloud) {
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 77d0e799101..704bafe7082 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
@@ -33,6 +33,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.time.Duration;
+import java.time.Instant;
import java.util.List;
import java.util.Optional;
import java.util.Set;
@@ -158,6 +159,7 @@ public class OsApiHandler extends AuditLoggingRequestHandler {
Set<OsVersionTarget> targets = controller.osVersionTargets();
Cursor versions = root.setArray("versions");
+ Instant now = controller.clock().instant();
controller.osVersionStatus().versions().forEach((osVersion, nodeVersions) -> {
Cursor currentVersionObject = versions.addObject();
currentVersionObject.setString("version", osVersion.version().toFullString());
@@ -166,7 +168,7 @@ public class OsApiHandler extends AuditLoggingRequestHandler {
target.ifPresent(t -> {
currentVersionObject.setString("upgradeBudget", t.upgradeBudget().toString());
currentVersionObject.setLong("scheduledAt", t.scheduledAt().toEpochMilli());
- Optional<Change> nextChange = osUpgradeScheduler.changeIn(t.osVersion().cloud());
+ Optional<Change> nextChange = osUpgradeScheduler.changeIn(t.osVersion().cloud(), now);
nextChange.ifPresent(c -> {
currentVersionObject.setString("nextVersion", c.version().toFullString());
currentVersionObject.setLong("nextScheduledAt", c.scheduleAt().toEpochMilli());
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 39264286e44..d6c49fb38e0 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
@@ -60,7 +60,7 @@ public class OsUpgradeSchedulerTest {
Version version1 = Version.fromString("7.0.0.20220301");
tester.clock().advance(Duration.ofDays(16));
assertEquals("2022-03-03T09:05:00", formatInstant(tester.clock().instant()));
- assertEquals(version1, scheduler.changeIn(cloud).get().version());
+ assertEquals(version1, scheduler.changeIn(cloud, tester.clock().instant()).get().version());
scheduler.maintain();
assertEquals(version0,
tester.controller().osVersionTarget(cloud).get().osVersion().version(),
@@ -75,7 +75,7 @@ public class OsUpgradeSchedulerTest {
"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()));
- Optional<OsUpgradeScheduler.Change> change = scheduler.changeIn(cloud);
+ Optional<OsUpgradeScheduler.Change> change = scheduler.changeIn(cloud, tester.clock().instant());
assertTrue(change.isPresent());
scheduler.maintain();
assertEquals(version1,
@@ -88,7 +88,7 @@ public class OsUpgradeSchedulerTest {
assertEquals(version1, tester.controller().osVersionTarget(cloud).get().osVersion().version());
// Estimate next change
- Optional<OsUpgradeScheduler.Change> nextChange = scheduler.changeIn(cloud);
+ Optional<OsUpgradeScheduler.Change> nextChange = scheduler.changeIn(cloud, tester.clock().instant());
assertTrue(nextChange.isPresent());
assertEquals("7.0.0.20220426", nextChange.get().version().toFullString());
assertEquals("2022-05-02T07:00:00", formatInstant(nextChange.get().scheduleAt()));
@@ -116,12 +116,12 @@ public class OsUpgradeSchedulerTest {
assertEquals(version0, tester.controller().osVersionTarget(cloud).get().osVersion().version());
// Cool-down passes
tester.clock().advance(Duration.ofDays(1));
- assertEquals(version1, scheduler.changeIn(cloud).get().version());
+ assertEquals(version1, scheduler.changeIn(cloud, tester.clock().instant()).get().version());
scheduler.maintain();
assertEquals(version1, tester.controller().osVersionTarget(cloud).get().osVersion().version());
// Estimate next change
- Optional<OsUpgradeScheduler.Change> nextChange = scheduler.changeIn(cloud);
+ Optional<OsUpgradeScheduler.Change> nextChange = scheduler.changeIn(cloud, tester.clock().instant());
assertTrue(nextChange.isPresent());
assertEquals("7.0.0.20220426", nextChange.get().version().toFullString());
assertEquals("2022-04-27T02:00:00", formatInstant(nextChange.get().scheduleAt()));
@@ -144,7 +144,7 @@ public class OsUpgradeSchedulerTest {
tester.serviceRegistry().artifactRepository().addRelease(new OsRelease(version1, OsRelease.Tag.stable,
Instant.parse("2021-06-21T23:59:00.00Z")));
scheduleUpgradeAfter(Duration.ZERO, version0, scheduler, tester);
- OsUpgradeScheduler.Change nextChange = scheduler.changeIn(cloud).get();
+ OsUpgradeScheduler.Change nextChange = scheduler.changeIn(cloud, tester.clock().instant()).get();
assertEquals(version1, nextChange.version());
assertEquals("2021-06-22T07:00:00", formatInstant(nextChange.scheduleAt()));
scheduleUpgradeAfter(Duration.ofHours(7), version1, scheduler, tester); // Inside trigger period
@@ -155,7 +155,7 @@ public class OsUpgradeSchedulerTest {
// Nothing happens in next iteration as tagged release is older than manually triggered version
scheduleUpgradeAfter(Duration.ofDays(7), version3, scheduler, tester);
- assertTrue(scheduler.changeIn(cloud).isEmpty());
+ assertTrue(scheduler.changeIn(cloud, tester.clock().instant()).isEmpty());
}
@Test
@@ -174,13 +174,13 @@ public class OsUpgradeSchedulerTest {
Version version1 = Version.fromString("8.1");
tester.serviceRegistry().artifactRepository().addRelease(new OsRelease(version1, OsRelease.Tag.latest,
tester.clock().instant()));
- assertEquals(version1, scheduler.changeIn(cloud).get().version());
- assertEquals("2021-06-22T07:05:00", formatInstant(scheduler.changeIn(cloud).get().scheduleAt()),
+ assertEquals(version1, scheduler.changeIn(cloud, tester.clock().instant()).get().version());
+ assertEquals("2021-06-22T07:05:00", formatInstant(scheduler.changeIn(cloud, tester.clock().instant()).get().scheduleAt()),
"Not valid until cool-down period passes");
scheduleUpgradeAfter(Duration.ZERO, version0, scheduler, tester);
// Cooldown period passes and latest release is scheduled
- scheduleUpgradeAfter(Duration.ofDays(1), version1, scheduler, tester);
+ scheduleUpgradeAfter(Duration.ofDays(1).plusMinutes(3), version1, scheduler, tester);
}
@Test