diff options
author | Martin Polden <mpolden@mpolden.no> | 2021-02-09 13:58:24 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2021-02-09 15:13:19 +0100 |
commit | 9b80111064a0b44c5dc6ca24d26748e430609646 (patch) | |
tree | 415fdb80ec40a398b52980ce456464df64af25af /controller-server/src/test/java | |
parent | e11470603647ac5d41a19ad4b8a753a53e640df9 (diff) |
Schedule OS upgrades automatically in supported clouds
Diffstat (limited to 'controller-server/src/test/java')
2 files changed, 69 insertions, 0 deletions
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 new file mode 100644 index 00000000000..e8cdb6ec940 --- /dev/null +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java @@ -0,0 +1,66 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.controller.maintenance; + +import com.yahoo.component.Version; +import com.yahoo.config.provision.CloudName; +import com.yahoo.config.provision.zone.ZoneApi; +import com.yahoo.vespa.hosted.controller.ControllerTester; +import com.yahoo.vespa.hosted.controller.integration.ZoneApiMock; +import org.junit.Test; + +import java.time.Duration; +import java.time.Instant; +import java.util.List; +import java.util.Optional; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * @author mpolden + */ +public class OsUpgradeSchedulerTest { + + @Test + public void maintain() { + ControllerTester tester = new ControllerTester(); + OsUpgradeScheduler scheduler = new OsUpgradeScheduler(tester.controller(), Duration.ofDays(1)); + Instant initialTime = Instant.parse("2021-01-23T00:00:00.00Z"); + tester.clock().setInstant(initialTime); + + CloudName cloud = CloudName.from("cloud"); + ZoneApi zone = zone("prod.us-west-1", cloud); + tester.zoneRegistry().setZones(zone).reprovisionToUpgradeOsIn(zone); + + // Initial run does nothing as the cloud does not have a target + scheduler.maintain(); + assertTrue("No target set", tester.controller().osVersionTarget(cloud).isEmpty()); + + // Target is set + Version version0 = Version.fromString("7.0.0.20210123190005"); + tester.controller().upgradeOsIn(cloud, version0, Optional.of(Duration.ofDays(1)), false); + + // Target remains unchanged as it hasn't expired yet + for (var interval : List.of(Duration.ZERO, Duration.ofDays(15))) { + tester.clock().advance(interval); + scheduler.maintain(); + assertEquals(version0, tester.controller().osVersionTarget(cloud).get().osVersion().version()); + } + + // Just over 30 days pass, and a new target replaces the expired one + Version version1 = Version.fromString("7.0.0.20210222"); + tester.clock().advance(Duration.ofDays(15).plus(Duration.ofSeconds(1))); + scheduler.maintain(); + assertEquals("New target set", version1, tester.controller().osVersionTarget(cloud).get().osVersion().version()); + + // A few days pass and target remains unchanged + tester.clock().advance(Duration.ofDays(2)); + scheduler.maintain(); + assertEquals(version1, tester.controller().osVersionTarget(cloud).get().osVersion().version()); + } + + private static ZoneApi zone(String id, CloudName cloud) { + return ZoneApiMock.newBuilder().withId(id).with(cloud).build(); + } + +} diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/maintenance.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/maintenance.json index 14fd7abd96c..f8ae1cfefa0 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/maintenance.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/controller/responses/maintenance.json @@ -46,6 +46,9 @@ "name": "NameServiceDispatcher" }, { + "name": "OsUpgradeScheduler" + }, + { "name": "OsVersionStatusUpdater" }, { |