summaryrefslogtreecommitdiffstats
path: root/node-repository/src/main/java
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-05-15 11:26:28 +0200
committerMartin Polden <mpolden@mpolden.no>2020-05-15 11:33:13 +0200
commita2843bab022dd8c653824c87fa1aaaf2c8dac205 (patch)
tree92165b9b01eb2c71d08efa91243d198c2291d3b4 /node-repository/src/main/java
parentcced9176c9b9dd591349262d3ea53cc7c15691ee (diff)
Explicitly retire children on host OS upgrade
Diffstat (limited to 'node-repository/src/main/java')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RetiringUpgrader.java32
1 files changed, 19 insertions, 13 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RetiringUpgrader.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RetiringUpgrader.java
index 2601060146b..8b11c10e3dd 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RetiringUpgrader.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/os/RetiringUpgrader.java
@@ -9,8 +9,10 @@ import com.yahoo.vespa.hosted.provision.NodeRepository;
import java.time.Duration;
import java.time.Instant;
+import java.util.List;
import java.util.Optional;
import java.util.logging.Logger;
+import java.util.stream.Collectors;
/**
* An upgrader that retires and deprovisions nodes on stale OS versions. Retirement of each node is spread out in time,
@@ -55,21 +57,25 @@ public class RetiringUpgrader implements Upgrader {
// No action needed in this implementation.
}
- /** Retire and deprovision given node */
- private void retire(Node node, Version target, Instant now) {
- try (var lock = nodeRepository.lock(node)) {
- Optional<Node> currentNode = nodeRepository.getNode(node.hostname());
+ /** Retire and deprovision given host and its children */
+ private void retire(Node host, Version target, Instant now) {
+ if (!host.type().isDockerHost()) throw new IllegalArgumentException("Cannot retire non-host " + host);
+ try (var lock = nodeRepository.lock(host)) {
+ Optional<Node> currentNode = nodeRepository.getNode(host.hostname());
if (currentNode.isEmpty()) return;
- node = currentNode.get();
- NodeType nodeType = node.type();
- LOG.info("Retiring and deprovisioning " + node + ": On stale OS version " +
- node.status().osVersion().current().map(Version::toFullString).orElse("<unset>") +
+ host = currentNode.get();
+ NodeType nodeType = host.type();
+ List<Node> nodesToRetire = nodeRepository.list().childrenOf(host).stream()
+ .map(child -> child.with(child.status().withWantToRetire(true)))
+ .collect(Collectors.toList());
+ LOG.info("Retiring and deprovisioning " + host + ": On stale OS version " +
+ host.status().osVersion().current().map(Version::toFullString).orElse("<unset>") +
", want " + target);
- nodeRepository.write(node.with(node.status()
- .withWantToRetire(true)
- .withWantToDeprovision(true)
- .withOsVersion(node.status().osVersion().withWanted(Optional.of(target)))),
- lock);
+ nodesToRetire.add(host.with(host.status()
+ .withWantToRetire(true)
+ .withWantToDeprovision(true)
+ .withOsVersion(host.status().osVersion().withWanted(Optional.of(target)))));
+ nodeRepository.write(nodesToRetire, lock);
nodeRepository.osVersions().writeChange((change) -> change.withRetirementAt(now, nodeType));
}
}