summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2023-09-15 15:49:29 +0200
committerGitHub <noreply@github.com>2023-09-15 15:49:29 +0200
commit137c710f508a762ffffc000351e17e8b553b9c59 (patch)
tree31f4426dd4fb5088d2e722c09b7e966fb10f0b15
parent699ecbd2c056d95adbcd99a70e9169d12edb2ba4 (diff)
parenta11564b29887a3f11db934fe19ccfd1669be0613 (diff)
Merge pull request #28545 from vespa-engine/mpolden/expose-certified
Include certification status in /os/v1/
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeScheduler.java16
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/os/OsApiHandler.java1
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java17
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/responses/versions-all-upgraded.json1
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/os/responses/versions-partially-upgraded.json1
5 files changed, 25 insertions, 11 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 8d48576044b..dbca6681281 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
@@ -73,8 +73,10 @@ public class OsUpgradeScheduler extends ControllerMaintainer {
Change change = releaseIn(cloud).change(currentVersion, now);
if (!change.osVersion().version().isAfter(currentVersion)) return Optional.empty();
if (!future && !change.scheduleAt(now)) return Optional.empty();
- if (!certified(change)) return Optional.empty();
- return Optional.of(change);
+
+ boolean certified = certified(change);
+ if (!future && !certified) return Optional.empty();
+ return Optional.of(change.withCertified(certified));
}
private boolean certified(Change change) {
@@ -135,13 +137,17 @@ public class OsUpgradeScheduler extends ControllerMaintainer {
}
/** OS version change and the earliest time it can be scheduled */
- public record Change(OsVersion osVersion, Instant scheduleAt) {
+ public record Change(OsVersion osVersion, Instant scheduleAt, boolean certified) {
public Change {
Objects.requireNonNull(osVersion);
Objects.requireNonNull(scheduleAt);
}
+ public Change withCertified(boolean certified) {
+ return new Change(osVersion, scheduleAt, certified);
+ }
+
/** Returns whether this can be scheduled at given instant */
public boolean scheduleAt(Instant instant) {
return !instant.isBefore(scheduleAt);
@@ -163,7 +169,7 @@ public class OsUpgradeScheduler extends ControllerMaintainer {
OsRelease release = artifactRepository.osRelease(currentVersion.getMajor(), OsRelease.Tag.latest);
Duration cooldown = remainingCooldownOf(cooldown(), release.age(instant));
Instant scheduleAt = schedulingInstant(instant.plus(cooldown), system);
- return new Change(new OsVersion(release.version(), cloud), scheduleAt);
+ return new Change(new OsVersion(release.version(), cloud), scheduleAt, false);
}
/** The cool-down period that must pass before a release can be used */
@@ -204,7 +210,7 @@ public class OsUpgradeScheduler extends ControllerMaintainer {
}
Duration cooldown = remainingCooldownOf(COOLDOWN, version.age(instant));
Instant schedulingInstant = schedulingInstant(instant.plus(cooldown), system);
- return new Change(new OsVersion(version.version(), cloud), schedulingInstant);
+ return new Change(new OsVersion(version.version(), cloud), schedulingInstant, false);
}
/** Find the most recent version available according to the scheduling step, relative to now */
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 1639424b182..1efccb8afe4 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
@@ -214,6 +214,7 @@ public class OsApiHandler extends AuditLoggingRequestHandler {
nextChange.ifPresent(c -> {
currentVersionObject.setString("nextVersion", c.osVersion().version().toFullString());
currentVersionObject.setLong("nextScheduledAt", c.scheduleAt().toEpochMilli());
+ currentVersionObject.setBool("certified", c.certified());
});
});
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 8fe2ac914ef..dd3174fce56 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
@@ -64,13 +64,17 @@ public class OsUpgradeSchedulerTest {
assertEquals("2022-03-01T00:05:00", formatInstant(tester.clock().instant()));
// Change does not become available until certification
- assertFalse(scheduler.changeIn(cloud, tester.clock().instant(), true).isPresent());
+ Optional<OsUpgradeScheduler.Change> change = scheduler.changeIn(cloud, tester.clock().instant(), true);
+ assertTrue(change.isPresent());
+ assertFalse(change.get().certified());
Version systemVersion = tester.controller().readSystemVersion();
Version olderThanSystemVersion = new Version(systemVersion.getMajor(), systemVersion.getMinor() - 1, systemVersion.getMicro());
tester.controller().os().certify(version1, cloud, olderThanSystemVersion);
// Change is now certified
- assertEquals(version1, scheduler.changeIn(cloud, tester.clock().instant(), true).get().osVersion().version());
+ change = scheduler.changeIn(cloud, tester.clock().instant(), true);
+ assertTrue(change.isPresent() && change.get().certified());
+ assertEquals(version1, change.get().osVersion().version());
scheduler.maintain();
assertEquals(version0,
tester.controller().os().target(cloud).get().osVersion().version(),
@@ -86,8 +90,9 @@ public class OsUpgradeSchedulerTest {
// Time constraints have now passed, but the current target has been pinned in the meantime
tester.controller().os().upgradeTo(version0, cloud, false, true);
- Optional<OsUpgradeScheduler.Change> change = scheduler.changeIn(cloud, tester.clock().instant(), true);
+ change = scheduler.changeIn(cloud, tester.clock().instant(), true);
assertTrue(change.isPresent());
+ assertTrue(change.get().certified());
assertEquals(-1, scheduler.maintain());
assertEquals(version0,
tester.controller().os().target(cloud).get().osVersion().version(),
@@ -97,8 +102,8 @@ public class OsUpgradeSchedulerTest {
tester.controller().os().upgradeTo(version0, cloud, false, false);
scheduler.maintain();
assertEquals(version1,
- tester.controller().os().target(cloud).get().osVersion().version(),
- "New target set");
+ 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));
@@ -167,7 +172,7 @@ public class OsUpgradeSchedulerTest {
// No change yet because it hasn't been certified
Optional<OsUpgradeScheduler.Change> nextChange = scheduler.changeIn(cloud, tester.clock().instant(), true);
- assertFalse(nextChange.isPresent(), "No change");
+ assertFalse(nextChange.get().certified(), "No change");
// Change is certified and upgrade is scheduled
Version systemVersion = tester.controller().readSystemVersion();
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 63a85bc5aad..e3d8f877330 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
@@ -108,6 +108,7 @@
"pinned": false,
"nextVersion": "8.2.1.20211228",
"nextScheduledAt": 1640671200000,
+ "certified": true,
"cloud": "cloud2",
"nodes": [
{
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 75e68b00676..d3b5ac06982 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
@@ -167,6 +167,7 @@
"pinned": false,
"nextVersion": "8.2.1.20211228",
"nextScheduledAt": 1640671200000,
+ "certified": true,
"cloud": "cloud2",
"nodes": [ ]
}