summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-05-29 14:44:31 +0200
committerGitHub <noreply@github.com>2020-05-29 14:44:31 +0200
commit96cf2ec4e8158b15e43e5dc51db7aecc50215ea9 (patch)
tree8d1916724e4a94ecdb719b719abbe767ea77d700 /node-repository
parent7f7ae6ce2f47ae66f40db75e79f86cbaad1e1d83 (diff)
parente1342f206667a9f695972d7c4e683b1f24cf2829 (diff)
Merge pull request #13436 from vespa-engine/mpolden/park-on-want-to-deprovision
Park inactive hosts marked for deprovisioning
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveExpirer.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java30
2 files changed, 27 insertions, 5 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveExpirer.java
index fc68deba957..b2c57e984eb 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveExpirer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveExpirer.java
@@ -39,7 +39,7 @@ public class InactiveExpirer extends Expirer {
@Override
protected void expire(List<Node> expired) {
expired.forEach(node -> {
- if (retiredByOperator(node)) {
+ if (node.status().wantToDeprovision() || retiredByOperator(node)) {
nodeRepository.park(node.hostname(), false, Agent.InactiveExpirer, "Expired by InactiveExpirer");
} else {
nodeRepository.setDirty(node, Agent.InactiveExpirer, "Expired by InactiveExpirer");
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java
index 4fcd5793b8a..e42e8e57b8c 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java
@@ -19,7 +19,6 @@ import com.yahoo.vespa.hosted.provision.node.Agent;
import com.yahoo.vespa.hosted.provision.node.History;
import com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester;
import com.yahoo.vespa.hosted.provision.testutils.MockDeployer;
-import com.yahoo.vespa.hosted.provision.testutils.MockNodeMetrics;
import com.yahoo.vespa.orchestrator.OrchestrationException;
import com.yahoo.vespa.orchestrator.Orchestrator;
import org.junit.Test;
@@ -52,7 +51,7 @@ public class InactiveAndFailedExpirerTest {
@Test
public void inactive_and_failed_times_out() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- List<Node> nodes = tester.makeReadyNodes(2, nodeResources);
+ tester.makeReadyNodes(2, nodeResources);
// Allocate then deallocate 2 nodes
ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test")).vespaVersion("6.42").build();
@@ -90,7 +89,7 @@ public class InactiveAndFailedExpirerTest {
@Test
public void reboot_generation_is_increased_when_node_moves_to_dirty() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
- List<Node> nodes = tester.makeReadyNodes(2, nodeResources);
+ tester.makeReadyNodes(2, nodeResources);
// Allocate and deallocate a single node
ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test")).vespaVersion("6.42").build();
@@ -164,7 +163,7 @@ public class InactiveAndFailedExpirerTest {
}
@Test
- public void testersExpireImmediately() {
+ public void tester_applications_expire_immediately() {
ApplicationId testerId = ApplicationId.from(applicationId.tenant().value(),
applicationId.application().value(),
applicationId.instance().value() + "-t");
@@ -189,4 +188,27 @@ public class InactiveAndFailedExpirerTest {
}
+ @Test
+ public void nodes_marked_for_deprovisioning_move_to_parked() {
+ ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
+ tester.makeReadyNodes(5, nodeResources);
+
+ // Activate and deallocate
+ ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test")).vespaVersion("6.42").build();
+ List<HostSpec> preparedNodes = tester.prepare(applicationId, cluster, Capacity.from(new ClusterResources(2, 1, nodeResources)));
+ tester.activate(applicationId, new HashSet<>(preparedNodes));
+ assertEquals(2, tester.getNodes(applicationId, Node.State.active).size());
+ tester.deactivate(applicationId);
+ List<Node> inactiveNodes = tester.getNodes(applicationId, Node.State.inactive).asList();
+ assertEquals(2, inactiveNodes.size());
+
+ // Nodes marked for deprovisioning are moved to parked
+ tester.nodeRepository().write(inactiveNodes.stream()
+ .map(node -> node.with(node.status().withWantToDeprovision(true)))
+ .collect(Collectors.toList()), () -> {});
+ tester.advanceTime(Duration.ofMinutes(11));
+ new InactiveExpirer(tester.nodeRepository(), tester.clock(), Duration.ofMinutes(10)).run();
+ assertEquals(2, tester.nodeRepository().getNodes(Node.State.parked).size());
+ }
+
}