diff options
author | Martin Polden <mpolden@mpolden.no> | 2022-10-07 10:57:10 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2022-10-07 11:17:42 +0200 |
commit | f2361c82dda7cf2b51556ce2f1e2b8e4e0a36804 (patch) | |
tree | 019dc596746643743644def03ef38255c37d0767 | |
parent | 7438b33d2447f5348e25c18160a592924130ee25 (diff) |
Limit soft rebuilds to supported cloud
-rw-r--r-- | node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java | 20 | ||||
-rw-r--r-- | node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java | 18 |
2 files changed, 21 insertions, 17 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java index 89fdf9d4b2a..91219ed0ce2 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java @@ -2,6 +2,8 @@ package com.yahoo.vespa.hosted.provision.os; import com.yahoo.component.Version; +import com.yahoo.config.provision.Cloud; +import com.yahoo.config.provision.CloudName; import com.yahoo.config.provision.NodeType; import com.yahoo.vespa.curator.Lock; import com.yahoo.vespa.flags.BooleanFlag; @@ -38,20 +40,20 @@ public class OsVersions { private final NodeRepository nodeRepository; private final CuratorDatabaseClient db; - private final boolean dynamicProvisioning; private final int maxDelegatedUpgrades; private final BooleanFlag softRebuildFlag; + private final Cloud cloud; public OsVersions(NodeRepository nodeRepository) { - this(nodeRepository, nodeRepository.zone().getCloud().dynamicProvisioning(), MAX_DELEGATED_UPGRADES); + this(nodeRepository, nodeRepository.zone().getCloud(), MAX_DELEGATED_UPGRADES); } - OsVersions(NodeRepository nodeRepository, boolean dynamicProvisioning, int maxDelegatedUpgrades) { + OsVersions(NodeRepository nodeRepository, Cloud cloud, int maxDelegatedUpgrades) { this.nodeRepository = Objects.requireNonNull(nodeRepository); this.db = nodeRepository.database(); - this.dynamicProvisioning = dynamicProvisioning; this.maxDelegatedUpgrades = maxDelegatedUpgrades; this.softRebuildFlag = Flags.SOFT_REBUILD.bindTo(nodeRepository.flagSource()); + this.cloud = Objects.requireNonNull(cloud); // Read and write all versions to make sure they are stored in the latest version of the serialized format try (var lock = db.lockOsVersionChange()) { @@ -141,13 +143,13 @@ public class OsVersions { /** Returns the upgrader to use when upgrading given node type to target */ private OsUpgrader chooseUpgrader(NodeType nodeType, Optional<Version> target) { - if (dynamicProvisioning) { - boolean softRebuild = softRebuildFlag.value(); - RetiringOsUpgrader retiringOsUpgrader = new RetiringOsUpgrader(nodeRepository, softRebuild); - if (softRebuild) { + if (cloud.dynamicProvisioning()) { + boolean canSoftRebuild = cloud.name().equals(CloudName.AWS) && softRebuildFlag.value(); + RetiringOsUpgrader retiringOsUpgrader = new RetiringOsUpgrader(nodeRepository, canSoftRebuild); + if (canSoftRebuild) { // If soft rebuild is enabled, we can use RebuildingOsUpgrader for hosts with remote storage. // RetiringOsUpgrader is then only used for hosts with local storage. - return new CompositeOsUpgrader(List.of(new RebuildingOsUpgrader(nodeRepository, softRebuild), + return new CompositeOsUpgrader(List.of(new RebuildingOsUpgrader(nodeRepository, canSoftRebuild), retiringOsUpgrader)); } return retiringOsUpgrader; diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java index 4d75b8a5acc..adcd40866d0 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java @@ -3,6 +3,8 @@ package com.yahoo.vespa.hosted.provision.os; import com.yahoo.component.Version; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.Cloud; +import com.yahoo.config.provision.CloudName; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.NodeResources; @@ -96,7 +98,7 @@ public class OsVersionsTest { public void max_active_upgrades() { int totalNodes = 20; int maxActiveUpgrades = 5; - var versions = new OsVersions(tester.nodeRepository(), false, maxActiveUpgrades); + var versions = new OsVersions(tester.nodeRepository(), Cloud.defaultCloud(), maxActiveUpgrades); provisionInfraApplication(totalNodes); Supplier<NodeList> hostNodes = () -> tester.nodeRepository().nodes().list().state(Node.State.active).hosts(); @@ -161,7 +163,7 @@ public class OsVersionsTest { @Test public void upgrade_by_retiring() { - var versions = new OsVersions(tester.nodeRepository(), true, Integer.MAX_VALUE); + var versions = new OsVersions(tester.nodeRepository(), Cloud.builder().dynamicProvisioning(true).build(), Integer.MAX_VALUE); var clock = (ManualClock) tester.nodeRepository().clock(); int hostCount = 10; // Provision hosts and children @@ -229,7 +231,7 @@ public class OsVersionsTest { @Test public void upgrade_by_retiring_everything_at_once() { - var versions = new OsVersions(tester.nodeRepository(), true, Integer.MAX_VALUE); + var versions = new OsVersions(tester.nodeRepository(), Cloud.builder().dynamicProvisioning(true).build(), Integer.MAX_VALUE); int hostCount = 3; provisionInfraApplication(hostCount, infraApplication, NodeType.confighost); Supplier<NodeList> hostNodes = () -> tester.nodeRepository().nodes().list() @@ -254,7 +256,7 @@ public class OsVersionsTest { @Test public void upgrade_by_rebuilding() { tester.flagSource().withIntFlag(PermanentFlags.MAX_REBUILDS.id(), 1); - var versions = new OsVersions(tester.nodeRepository(), false, Integer.MAX_VALUE); + var versions = new OsVersions(tester.nodeRepository(), Cloud.defaultCloud(), Integer.MAX_VALUE); int hostCount = 10; provisionInfraApplication(hostCount + 1); Supplier<NodeList> hostNodes = () -> tester.nodeRepository().nodes().list().nodeType(NodeType.host); @@ -333,7 +335,7 @@ public class OsVersionsTest { tester.flagSource().withIntFlag(PermanentFlags.MAX_REBUILDS.id(), maxRebuilds); tester.flagSource().withBooleanFlag(Flags.SOFT_REBUILD.id(), softRebuild); - var versions = new OsVersions(tester.nodeRepository(), true, Integer.MAX_VALUE); + var versions = new OsVersions(tester.nodeRepository(), Cloud.builder().dynamicProvisioning(true).name(CloudName.AWS).build(), Integer.MAX_VALUE); provisionInfraApplication(hostCount, infraApplication, NodeType.host, NodeResources.StorageType.remote); Supplier<NodeList> hostNodes = () -> tester.nodeRepository().nodes().list().nodeType(NodeType.host); @@ -378,7 +380,7 @@ public class OsVersionsTest { @Test public void upgrade_by_rebuilding_multiple_host_types() { tester.flagSource().withIntFlag(PermanentFlags.MAX_REBUILDS.id(), 1); - var versions = new OsVersions(tester.nodeRepository(), false, Integer.MAX_VALUE); + var versions = new OsVersions(tester.nodeRepository(), Cloud.defaultCloud(), Integer.MAX_VALUE); int hostCount = 3; provisionInfraApplication(hostCount, infraApplication, NodeType.host); provisionInfraApplication(hostCount, ApplicationId.from("hosted-vespa", "confighost", "default"), NodeType.confighost); @@ -411,7 +413,7 @@ public class OsVersionsTest { @Test public void upgrade_by_rebuilding_is_limited_by_stateful_clusters() { tester.flagSource().withIntFlag(PermanentFlags.MAX_REBUILDS.id(), 3); - var versions = new OsVersions(tester.nodeRepository(), false, Integer.MAX_VALUE); + var versions = new OsVersions(tester.nodeRepository(), Cloud.defaultCloud(), Integer.MAX_VALUE); int hostCount = 5; ApplicationId app1 = ApplicationId.from("t1", "a1", "i1"); ApplicationId app2 = ApplicationId.from("t2", "a2", "i2"); @@ -489,7 +491,7 @@ public class OsVersionsTest { public void upgrade_by_rebuilding_limits_infrastructure_host() { int hostCount = 3; tester.flagSource().withIntFlag(PermanentFlags.MAX_REBUILDS.id(), hostCount); - var versions = new OsVersions(tester.nodeRepository(), false, Integer.MAX_VALUE); + var versions = new OsVersions(tester.nodeRepository(), Cloud.defaultCloud(), Integer.MAX_VALUE); provisionInfraApplication(hostCount, infraApplication, NodeType.proxyhost); Supplier<NodeList> hosts = () -> tester.nodeRepository().nodes().list().nodeType(NodeType.proxyhost); |