aboutsummaryrefslogtreecommitdiffstats
path: root/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2021-06-22 08:49:05 +0200
committerMartin Polden <mpolden@mpolden.no>2021-06-23 09:05:03 +0200
commit6b06725c019e4c1e16f293de88ce21e4afc675f5 (patch)
tree76805ba40366247da9167c6c856079153e0a22a8 /controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/OsUpgradeSchedulerTest.java
parented7bc94c5c184b1dc735d8db4f95894102cd46f2 (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.java71
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();
}