diff options
author | Martin Polden <mpolden@mpolden.no> | 2022-07-12 09:20:45 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2022-08-10 11:17:52 +0200 |
commit | 71d90780aee036c9969c8c5b14d452ebc771efa1 (patch) | |
tree | 6354a4e6bc634e36ffd25ad7ebaedd595914f15d | |
parent | 182091b999279c466334eafa2e010ef69f8235be (diff) |
Expose details of next change in /os/v1
4 files changed, 39 insertions, 20 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java index a259ed2fdef..ab2e0312b15 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ControllerMaintenance.java @@ -33,6 +33,7 @@ import static java.time.temporal.ChronoUnit.SECONDS; public class ControllerMaintenance extends AbstractComponent { private final Upgrader upgrader; + private final OsUpgradeScheduler osUpgradeScheduler; private final List<Maintainer> maintainers = new CopyOnWriteArrayList<>(); @Inject @@ -40,7 +41,9 @@ public class ControllerMaintenance extends AbstractComponent { public ControllerMaintenance(Controller controller, Metric metric, UserManagement userManagement, AthenzClientFactory athenzClientFactory) { Intervals intervals = new Intervals(controller.system()); upgrader = new Upgrader(controller, intervals.defaultInterval); + osUpgradeScheduler = new OsUpgradeScheduler(controller, intervals.osUpgradeScheduler); maintainers.add(upgrader); + maintainers.add(osUpgradeScheduler); maintainers.addAll(osUpgraders(controller, intervals.osUpgrader)); maintainers.add(new DeploymentExpirer(controller, intervals.defaultInterval)); maintainers.add(new DeploymentUpgrader(controller, intervals.defaultInterval)); @@ -54,7 +57,6 @@ public class ControllerMaintenance extends AbstractComponent { maintainers.add(new SystemUpgrader(controller, intervals.systemUpgrader)); maintainers.add(new JobRunner(controller, intervals.jobRunner)); maintainers.add(new OsVersionStatusUpdater(controller, intervals.osVersionStatusUpdater)); - maintainers.add(new OsUpgradeScheduler(controller, intervals.osUpgradeScheduler)); maintainers.add(new ContactInformationMaintainer(controller, intervals.contactInformationMaintainer)); maintainers.add(new NameServiceDispatcher(controller, intervals.nameServiceDispatcher)); maintainers.add(new CostReportMaintainer(controller, intervals.costReportMaintainer, controller.serviceRegistry().costReportConsumer())); @@ -80,6 +82,8 @@ public class ControllerMaintenance extends AbstractComponent { public Upgrader upgrader() { return upgrader; } + public OsUpgradeScheduler osUpgradeScheduler() { return osUpgradeScheduler; } + @Override public void deconstruct() { maintainers.forEach(Maintainer::shutdown); 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 853739ee9c3..0e764b98514 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 @@ -22,6 +22,9 @@ import com.yahoo.slime.SlimeUtils; import com.yahoo.slime.Type; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.auditlog.AuditLoggingRequestHandler; +import com.yahoo.vespa.hosted.controller.maintenance.ControllerMaintenance; +import com.yahoo.vespa.hosted.controller.maintenance.OsUpgradeScheduler; +import com.yahoo.vespa.hosted.controller.maintenance.OsUpgradeScheduler.Change; import com.yahoo.vespa.hosted.controller.versions.OsVersionTarget; import com.yahoo.yolean.Exceptions; @@ -47,22 +50,24 @@ import java.util.stream.Collectors; public class OsApiHandler extends AuditLoggingRequestHandler { private final Controller controller; + private final OsUpgradeScheduler osUpgradeScheduler; - public OsApiHandler(Context ctx, Controller controller) { + public OsApiHandler(Context ctx, Controller controller, ControllerMaintenance controllerMaintenance) { super(ctx, controller.auditLogger()); this.controller = controller; + this.osUpgradeScheduler = controllerMaintenance.osUpgradeScheduler(); } @Override public HttpResponse auditAndHandle(HttpRequest request) { try { - switch (request.getMethod()) { - case GET: return get(request); - case POST: return post(request); - case DELETE: return delete(request); - case PATCH: return patch(request); - default: return ErrorResponse.methodNotAllowed("Method '" + request.getMethod() + "' is unsupported"); - } + return switch (request.getMethod()) { + case GET -> get(request); + case POST -> post(request); + case DELETE -> delete(request); + case PATCH -> patch(request); + default -> ErrorResponse.methodNotAllowed("Method '" + request.getMethod() + "' is unsupported"); + }; } catch (IllegalArgumentException e) { return ErrorResponse.badRequest(Exceptions.toMessageString(e)); } catch (RuntimeException e) { @@ -159,8 +164,16 @@ public class OsApiHandler extends AuditLoggingRequestHandler { currentVersionObject.setString("version", osVersion.version().toFullString()); 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())); - target.ifPresent(t -> currentVersionObject.setLong("scheduledAt", t.scheduledAt().toEpochMilli())); + target.ifPresent(t -> { + currentVersionObject.setString("upgradeBudget", t.upgradeBudget().toString()); + currentVersionObject.setLong("scheduledAt", t.scheduledAt().toEpochMilli()); + Optional<Change> nextChange = osUpgradeScheduler.changeIn(t.osVersion().cloud()); + nextChange.ifPresent(c -> { + currentVersionObject.setString("nextVersion", c.version().toFullString()); + currentVersionObject.setLong("nextScheduledAt", c.scheduleAt().toEpochMilli()); + }); + }); + currentVersionObject.setString("cloud", osVersion.cloud().value()); Cursor nodesArray = currentVersionObject.setArray("nodes"); nodeVersions.forEach(nodeVersion -> { 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 6ddc58feaea..15f0100ade8 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 @@ -2,6 +2,7 @@ package com.yahoo.vespa.hosted.controller.restapi.os; import com.yahoo.application.container.handler.Request; +import com.yahoo.component.Version; import com.yahoo.config.provision.CloudName; import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.zone.UpgradePolicy; @@ -11,10 +12,10 @@ import com.yahoo.vespa.athenz.api.AthenzIdentity; import com.yahoo.vespa.athenz.api.AthenzUser; import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node; import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter; +import com.yahoo.vespa.hosted.controller.api.integration.deployment.OsRelease; import com.yahoo.vespa.hosted.controller.application.SystemApplication; import com.yahoo.vespa.hosted.controller.integration.NodeRepositoryMock; import com.yahoo.vespa.hosted.controller.integration.ZoneApiMock; -import com.yahoo.vespa.hosted.controller.integration.ZoneRegistryMock; import com.yahoo.vespa.hosted.controller.maintenance.ControllerMaintainer; import com.yahoo.vespa.hosted.controller.maintenance.OsUpgrader; import com.yahoo.vespa.hosted.controller.restapi.ContainerTester; @@ -57,10 +58,13 @@ public class OsApiTest extends ControllerContainerTest { tester = new ContainerTester(container, responses); tester.serviceRegistry().clock().setInstant(Instant.ofEpochMilli(1234)); addUserToHostedOperatorRole(operator); - zoneRegistryMock().setZones(zone1, zone2, zone3) - .reprovisionToUpgradeOsIn(zone3) - .setOsUpgradePolicy(cloud1, UpgradePolicy.builder().upgrade(zone1).upgrade(zone2).build()) - .setOsUpgradePolicy(cloud2, UpgradePolicy.builder().upgrade(zone3).build()); + tester.serviceRegistry().zoneRegistry().setZones(zone1, zone2, zone3) + .reprovisionToUpgradeOsIn(zone3) + .setOsUpgradePolicy(cloud1, UpgradePolicy.builder().upgrade(zone1).upgrade(zone2).build()) + .setOsUpgradePolicy(cloud2, UpgradePolicy.builder().upgrade(zone3).build()); + tester.serviceRegistry().artifactRepository().addRelease(new OsRelease(Version.fromString("7.0"), + OsRelease.Tag.latest, + Instant.EPOCH)); osUpgraders = List.of( new OsUpgrader(tester.controller(), Duration.ofDays(1), cloud1), @@ -160,10 +164,6 @@ public class OsApiTest extends ControllerContainerTest { updateVersionStatus(); } - private ZoneRegistryMock zoneRegistryMock() { - return tester.serviceRegistry().zoneRegistry(); - } - private NodeRepositoryMock nodeRepository() { return tester.serviceRegistry().configServerMock().nodeRepository(); } 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 a5af4f45370..be94b85f113 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 @@ -104,6 +104,8 @@ "targetVersion": true, "upgradeBudget": "PT24H", "scheduledAt": 1234, + "nextVersion": "8.2.1.20211227", + "nextScheduledAt": 7200000, "cloud": "cloud2", "nodes": [ { |