summaryrefslogtreecommitdiffstats
path: root/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java
diff options
context:
space:
mode:
Diffstat (limited to 'node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/OsVersions.java24
1 files changed, 16 insertions, 8 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 daed86dc2ab..dc7e51caf4e 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
@@ -10,6 +10,7 @@ import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeRepository;
import com.yahoo.vespa.hosted.provision.node.Status;
import com.yahoo.vespa.hosted.provision.persistence.CuratorDb;
+import com.yahoo.vespa.hosted.provision.provisioning.HostProvisioner;
import java.util.List;
import java.util.Objects;
@@ -35,15 +36,17 @@ public class OsVersions {
private final NodeRepository nodeRepository;
private final CuratorDb db;
private final Cloud cloud;
+ private final Optional<HostProvisioner> hostProvisioner;
- public OsVersions(NodeRepository nodeRepository) {
- this(nodeRepository, nodeRepository.zone().cloud());
+ public OsVersions(NodeRepository nodeRepository, Optional<HostProvisioner> hostProvisioner) {
+ this(nodeRepository, nodeRepository.zone().cloud(), hostProvisioner);
}
- OsVersions(NodeRepository nodeRepository, Cloud cloud) {
+ OsVersions(NodeRepository nodeRepository, Cloud cloud, Optional<HostProvisioner> hostProvisioner) {
this.nodeRepository = Objects.requireNonNull(nodeRepository);
this.db = nodeRepository.database();
this.cloud = Objects.requireNonNull(cloud);
+ this.hostProvisioner = Objects.requireNonNull(hostProvisioner);
// Read and write all versions to make sure they are stored in the latest version of the serialized format
try (var lock = db.lockOsVersionChange()) {
@@ -126,19 +129,24 @@ public class OsVersions {
/** Returns whether node can be upgraded now */
public boolean canUpgrade(Node node) {
- return chooseUpgrader(node.type(), Optional.empty()).canUpgradeAt(nodeRepository.clock().instant(), node);
+ Optional<Version> wantedVersion = node.status().osVersion().wanted();
+ if (wantedVersion.isEmpty()) {
+ return false;
+ }
+ return chooseUpgrader(node.type(), Optional.empty()).canUpgradeTo(wantedVersion.get(), nodeRepository.clock().instant(), node);
}
/** Returns the upgrader to use when upgrading given node type to target */
private OsUpgrader chooseUpgrader(NodeType nodeType, Optional<Version> target) {
if (cloud.dynamicProvisioning()) {
boolean canSoftRebuild = cloud.name().equals(CloudName.AWS);
- RetiringOsUpgrader retiringOsUpgrader = new RetiringOsUpgrader(nodeRepository, canSoftRebuild);
+ RetiringOsUpgrader retiringOsUpgrader = new RetiringOsUpgrader(nodeRepository, hostProvisioner, 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(nodeRepository,
- List.of(new RebuildingOsUpgrader(nodeRepository, canSoftRebuild),
+ hostProvisioner,
+ List.of(new RebuildingOsUpgrader(nodeRepository, hostProvisioner, canSoftRebuild),
retiringOsUpgrader));
}
return retiringOsUpgrader;
@@ -151,9 +159,9 @@ public class OsVersions {
.anyMatch(osVersion -> osVersion.current().isPresent() &&
osVersion.current().get().getMajor() < target.get().getMajor());
if (rebuildRequired) {
- return new RebuildingOsUpgrader(nodeRepository, false);
+ return new RebuildingOsUpgrader(nodeRepository, hostProvisioner, false);
}
- return new DelegatingOsUpgrader(nodeRepository);
+ return new DelegatingOsUpgrader(nodeRepository, hostProvisioner);
}
private static void requireNonEmpty(Version version) {