diff options
author | Martin Polden <mpolden@mpolden.no> | 2021-06-22 08:49:05 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2021-06-23 09:05:03 +0200 |
commit | 6b06725c019e4c1e16f293de88ce21e4afc675f5 (patch) | |
tree | 76805ba40366247da9167c6c856079153e0a22a8 /controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java | |
parent | ed7bc94c5c184b1dc735d8db4f95894102cd46f2 (diff) |
Schedule upgrade to stable OS version
Diffstat (limited to 'controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java')
-rw-r--r-- | controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java | 71 |
1 files changed, 70 insertions, 1 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 index 7a0175845ca..18f03303eb0 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 @@ -5,12 +5,16 @@ 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.api.integration.deployment.StableOsVersion; import com.yahoo.vespa.hosted.controller.integration.ZoneApiMock; +import com.yahoo.vespa.hosted.controller.versions.OsVersion; +import com.yahoo.vespa.hosted.controller.versions.OsVersionTarget; import org.junit.Test; import java.time.Duration; import java.time.Instant; import java.util.List; +import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -21,7 +25,7 @@ import static org.junit.Assert.assertTrue; public class OsUpgradeSchedulerTest { @Test - public void maintain() { + public void schedule_calendar_versioned_release() { ControllerTester tester = new ControllerTester(); OsUpgradeScheduler scheduler = new OsUpgradeScheduler(tester.controller(), Duration.ofDays(1)); Instant t0 = Instant.parse("2021-01-23T00:00:00.00Z"); // Outside trigger period @@ -63,6 +67,71 @@ public class OsUpgradeSchedulerTest { assertEquals(version1, tester.controller().osVersionTarget(cloud).get().osVersion().version()); } + @Test // TODO(mpolden): Remove this after 2021-09-01 + public void schedule_calendar_versioned_without_scheduled_time() { + ControllerTester tester = new ControllerTester(); + OsUpgradeScheduler scheduler = new OsUpgradeScheduler(tester.controller(), Duration.ofDays(1)); + Instant t0 = Instant.parse("2021-01-23T07:00:00.00Z"); // Inside trigger period + tester.clock().setInstant(t0); + + 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"); + // Simulate setting target without scheduledAt, to force parsing scheduled time from version number + tester.curator().writeOsVersionTargets(Set.of(new OsVersionTarget(new OsVersion(version0, cloud), + Duration.ofDays(1), Instant.EPOCH))); + + // Just over 45 days pass, and a new target replaces the expired one + Version version1 = Version.fromString("7.0.0.20210302"); + tester.clock().advance(Duration.ofDays(45).plus(Duration.ofSeconds(1))); + scheduler.maintain(); + assertEquals("New target set", version1, + tester.controller().osVersionTarget(cloud).get().osVersion().version()); + } + + @Test + public void schedule_stable_release() { + ControllerTester tester = new ControllerTester(); + OsUpgradeScheduler scheduler = new OsUpgradeScheduler(tester.controller(), Duration.ofDays(1)); + Instant t0 = Instant.parse("2021-06-21T07:00:00.00Z"); // Inside trigger period + tester.clock().setInstant(t0); + + // Set initial target + CloudName cloud = tester.controller().clouds().iterator().next(); + Version version0 = Version.fromString("8.0"); + tester.controller().upgradeOsIn(cloud, version0, Duration.ZERO, false); + + // New version is promoted to stable + Version version1 = Version.fromString("8.1"); + tester.serviceRegistry().artifactRepository().promoteOsVersion(new StableOsVersion(version1, tester.clock().instant())); + scheduler.maintain(); + assertEquals("Target is unchanged as not enough time has passed", version0, + tester.controller().osVersionTarget(cloud).get().osVersion().version()); + + // Enough time passes since promotion of stable release + tester.clock().advance(Duration.ofDays(14).plus(Duration.ofSeconds(1))); + scheduler.maintain(); + OsVersionTarget target = tester.controller().osVersionTarget(cloud).get(); + assertEquals(version1, target.osVersion().version()); + assertEquals("No budget when upgrading to stable release", + Duration.ZERO, target.upgradeBudget()); + + // Another version is promoted, but target remains unchanged as the release hasn't aged enough + tester.clock().advance(Duration.ofDays(1)); + Version version2 = Version.fromString("8.2"); + tester.serviceRegistry().artifactRepository().promoteOsVersion(new StableOsVersion(version2, tester.clock().instant())); + scheduler.maintain(); + assertEquals("Target is unchanged as not enough time has passed", version1, + tester.controller().osVersionTarget(cloud).get().osVersion().version()); + } + private static ZoneApi zone(String id, CloudName cloud) { return ZoneApiMock.newBuilder().withId(id).with(cloud).build(); } |