diff options
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.java | 75 |
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); + } } |