summaryrefslogtreecommitdiffstats
path: root/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java')
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java75
1 files changed, 40 insertions, 35 deletions
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java
index 931f2a8f275..9cecb160fd2 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java
@@ -6,6 +6,7 @@ import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ApplicationName;
import com.yahoo.config.provision.Capacity;
import com.yahoo.config.provision.ClusterSpec;
+import com.yahoo.config.provision.Deployer;
import com.yahoo.config.provision.DockerImage;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.HostSpec;
@@ -50,17 +51,19 @@ import static org.mockito.Mockito.verify;
public class RetiredExpirerTest {
private Curator curator = new MockCurator();
+ private final ManualClock clock = new ManualClock();
+ private final Zone zone = new Zone(Environment.prod, RegionName.from("us-east"));
+ private final NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("default");
+ private final NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone,
+ new MockNameResolver().mockAnyLookup(),
+ new DockerImage("docker-registry.domain.tld:8080/dist/vespa"));
+ private final NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone);
+ private final Orchestrator orchestrator = mock(Orchestrator.class);
+
+ private static final Duration RETIRED_EXPIRATION = Duration.ofHours(12);
@Test
public void ensure_retired_nodes_time_out() {
- ManualClock clock = new ManualClock();
- Zone zone = new Zone(Environment.prod, RegionName.from("us-east"));
- NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("default");
- NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone,
- new MockNameResolver().mockAnyLookup(),
- new DockerImage("docker-registry.domain.tld:8080/dist/vespa"));
- NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone);
-
createReadyNodes(7, nodeRepository, nodeFlavors);
createHostNodes(4, nodeRepository, nodeFlavors);
@@ -81,7 +84,7 @@ public class RetiredExpirerTest {
MockDeployer deployer =
new MockDeployer(provisioner,
Collections.singletonMap(applicationId, new MockDeployer.ApplicationContext(applicationId, cluster, Capacity.fromNodeCount(wantedNodes, Optional.of("default")), 1)));
- new RetiredExpirer(nodeRepository, deployer, clock, Duration.ofHours(12), new JobControl(nodeRepository.database())).run();
+ createRetiredExpirer(deployer).run();
assertEquals(3, nodeRepository.getNodes(applicationId, Node.State.active).size());
assertEquals(4, nodeRepository.getNodes(applicationId, Node.State.inactive).size());
assertEquals(1, deployer.redeployments);
@@ -93,14 +96,6 @@ public class RetiredExpirerTest {
@Test
public void ensure_retired_groups_time_out() {
- ManualClock clock = new ManualClock();
- Zone zone = new Zone(Environment.prod, RegionName.from("us-east"));
- NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("default");
- NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone,
- new MockNameResolver().mockAnyLookup(),
- new DockerImage("docker-registry.domain.tld:8080/dist/vespa"));
- NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone);
-
createReadyNodes(8, nodeRepository, nodeFlavors);
createHostNodes(4, nodeRepository, nodeFlavors);
@@ -117,7 +112,7 @@ public class RetiredExpirerTest {
MockDeployer deployer =
new MockDeployer(provisioner,
Collections.singletonMap(applicationId, new MockDeployer.ApplicationContext(applicationId, cluster, Capacity.fromNodeCount(2, Optional.of("default")), 1)));
- new RetiredExpirer(nodeRepository, deployer, clock, Duration.ofHours(12), new JobControl(nodeRepository.database())).run();
+ createRetiredExpirer(deployer).run();
assertEquals(2, nodeRepository.getNodes(applicationId, Node.State.active).size());
assertEquals(6, nodeRepository.getNodes(applicationId, Node.State.inactive).size());
assertEquals(1, deployer.redeployments);
@@ -129,14 +124,6 @@ public class RetiredExpirerTest {
@Test
public void ensure_early_inactivation() throws OrchestrationException {
- ManualClock clock = new ManualClock();
- Zone zone = new Zone(Environment.prod, RegionName.from("us-east"));
- NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("default");
- NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone,
- new MockNameResolver().mockAnyLookup(),
- new DockerImage("docker-registry.domain.tld:8080/dist/vespa"));
- NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone);
-
createReadyNodes(7, nodeRepository, nodeFlavors);
createHostNodes(4, nodeRepository, nodeFlavors);
@@ -153,14 +140,13 @@ public class RetiredExpirerTest {
assertEquals(0, nodeRepository.getNodes(applicationId, Node.State.inactive).size());
// Cause inactivation of retired nodes
- clock.advance(Duration.ofHours(30)); // Retire period spent
MockDeployer deployer =
new MockDeployer(provisioner,
Collections.singletonMap(
applicationId,
new MockDeployer.ApplicationContext(applicationId, cluster, Capacity.fromNodeCount(wantedNodes, Optional.of("default")), 1)));
- Orchestrator orchestrator = mock(Orchestrator.class);
+
// Allow the 1st and 3rd retired nodes permission to inactivate
doNothing()
.doThrow(new OrchestrationException("Permission not granted 1"))
@@ -168,18 +154,27 @@ public class RetiredExpirerTest {
.doThrow(new OrchestrationException("Permission not granted 2"))
.when(orchestrator).acquirePermissionToRemove(any());
- new RetiredEarlyExpirer(
- nodeRepository,
- Duration.ofDays(30),
- new JobControl(nodeRepository.database()),
- deployer,
- orchestrator).run();
+ RetiredEarlyExpirer retiredExpirer = createRetiredExpirer(deployer);
+ retiredExpirer.run();
assertEquals(5, nodeRepository.getNodes(applicationId, Node.State.active).size());
assertEquals(2, nodeRepository.getNodes(applicationId, Node.State.inactive).size());
assertEquals(1, deployer.redeployments);
-
verify(orchestrator, times(4)).acquirePermissionToRemove(any());
+ // Running it again has no effect
+ retiredExpirer.run();
+ assertEquals(5, nodeRepository.getNodes(applicationId, Node.State.active).size());
+ assertEquals(2, nodeRepository.getNodes(applicationId, Node.State.inactive).size());
+ assertEquals(1, deployer.redeployments);
+ verify(orchestrator, times(6)).acquirePermissionToRemove(any());
+
+ clock.advance(RETIRED_EXPIRATION.plusMinutes(1));
+ retiredExpirer.run();
+ assertEquals(3, nodeRepository.getNodes(applicationId, Node.State.active).size());
+ assertEquals(4, nodeRepository.getNodes(applicationId, Node.State.inactive).size());
+ assertEquals(2, deployer.redeployments);
+ verify(orchestrator, times(6)).acquirePermissionToRemove(any());
+
// inactivated nodes are not retired
for (Node node : nodeRepository.getNodes(applicationId, Node.State.inactive))
assertFalse(node.allocation().get().membership().retired());
@@ -210,4 +205,14 @@ public class RetiredExpirerTest {
nodeRepository.setReady(nodes);
}
+ private RetiredEarlyExpirer createRetiredExpirer(Deployer deployer) {
+ return new RetiredEarlyExpirer(
+ nodeRepository,
+ Duration.ofDays(30), /* Maintenance interval, use large value so it never runs by itself */
+ RETIRED_EXPIRATION,
+ clock,
+ new JobControl(nodeRepository.database()),
+ deployer,
+ orchestrator);
+ }
}