diff options
Diffstat (limited to 'node-repository/src')
15 files changed, 172 insertions, 158 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java index ee754b5d89c..866171b8b7f 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java @@ -79,7 +79,7 @@ public class GroupPreparer { } } - private String outOfCapacityDetails(NodeAllocation allocation) { + private static String outOfCapacityDetails(NodeAllocation allocation) { if (allocation.wouldBeFulfilledWithoutExclusivity()) return ": Not enough nodes available due to host exclusivity constraints."; else if (allocation.wouldBeFulfilledWithClashingParentHost()) diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java index 7a00665523c..89412fe6350 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java @@ -22,6 +22,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.function.Predicate; import java.util.stream.Collectors; /** @@ -315,24 +316,22 @@ class NodeAllocation { } List<Node> reservableNodes() { - return nodes.stream().map(n -> n.node) - .filter(n -> n.state() == Node.State.inactive || - n.state() == Node.State.ready) - .collect(Collectors.toList()); + return nodesFilter(n -> n.node.state() == Node.State.inactive || n.node.state() == Node.State.ready); } List<Node> surplusNodes() { - return nodes.stream() - .filter(n -> n.isSurplusNode) - .map(n -> n.node) - .collect(Collectors.toList()); + return nodesFilter(n -> n.isSurplusNode); } List<Node> newNodes() { + return nodesFilter(n -> n.isNewNode); + } + + private List<Node> nodesFilter(Predicate<PrioritizableNode> predicate) { return nodes.stream() - .filter(n -> n.isNewNode) - .map(n -> n.node) - .collect(Collectors.toList()); + .filter(predicate) + .map(n -> n.node) + .collect(Collectors.toList()); } private List<PrioritizableNode> byDecreasingIndex(Set<PrioritizableNode> nodes) { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java index bcb0f342fb8..c0479a054c6 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java @@ -72,10 +72,9 @@ public interface NodeSpec { private final boolean exclusive; private final boolean canFail; - public CountNodeSpec(int count, Flavor flavor, boolean exclusive, boolean canFail) { - Objects.requireNonNull(flavor, "A flavor must be specified"); + CountNodeSpec(int count, Flavor flavor, boolean exclusive, boolean canFail) { this.count = count; - this.requestedFlavor = flavor; + this.requestedFlavor = Objects.requireNonNull(flavor, "A flavor must be specified"); this.exclusive = exclusive; this.canFail = canFail; } 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 bde9c95391c..bb396026a43 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 @@ -47,7 +47,7 @@ public class InactiveAndFailedExpirerTest { @Test public void inactive_and_failed_times_out() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); List<Node> nodes = tester.makeReadyNodes(2, "default"); // Allocate then deallocate 2 nodes @@ -85,7 +85,7 @@ public class InactiveAndFailedExpirerTest { @Test public void reboot_generation_is_increased_when_node_moves_to_dirty() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); List<Node> nodes = tester.makeReadyNodes(2, "default"); // Allocate and deallocate a single node @@ -117,7 +117,7 @@ public class InactiveAndFailedExpirerTest { @Test public void node_that_wants_to_retire_is_moved_to_parked() throws OrchestrationException { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test"), Version.fromString("6.42"), false, Collections.emptySet()); tester.makeReadyNodes(5, "default"); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java index 7452216abab..5b373c735e4 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/LoadBalancerExpirerTest.java @@ -5,14 +5,12 @@ import com.yahoo.component.Vtag; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.HostSpec; -import com.yahoo.config.provision.Zone; import com.yahoo.transaction.NestedTransaction; import com.yahoo.vespa.hosted.provision.flag.FlagId; import com.yahoo.vespa.hosted.provision.lb.LoadBalancer; import com.yahoo.vespa.hosted.provision.lb.LoadBalancerId; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester; -import org.junit.Before; import org.junit.Test; import java.time.Duration; @@ -30,12 +28,7 @@ import static org.junit.Assert.assertTrue; */ public class LoadBalancerExpirerTest { - private ProvisioningTester tester; - - @Before - public void before() { - tester = new ProvisioningTester(Zone.defaultZone()); - } + private ProvisioningTester tester = new ProvisioningTester.Builder().build(); @Test public void test_maintain() { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java index e8b6751a154..8d8e0dea6fb 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java @@ -124,7 +124,7 @@ public class OperatorChangeApplicationMaintainerTest { Fixture(Zone zone, NodeRepository nodeRepository, NodeFlavors flavors, Curator curator) { this.nodeRepository = nodeRepository; this.curator = curator; - this.provisioner = new NodeRepositoryProvisioner(nodeRepository, flavors, zone, new MockProvisionServiceProvider()); + this.provisioner = new NodeRepositoryProvisioner(nodeRepository, flavors, zone, new MockProvisionServiceProvider()); } void activate() { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java index 6c844f2c1bb..46fd2183faa 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java @@ -8,11 +8,9 @@ import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.NodeType; -import com.yahoo.config.provision.Zone; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.flag.FlagId; import com.yahoo.vespa.hosted.provision.node.NodeAcl; -import org.junit.Before; import org.junit.Test; import java.util.Arrays; @@ -25,7 +23,6 @@ import java.util.Set; import java.util.function.Supplier; import java.util.stream.Collectors; -import static com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester.createConfig; import static java.util.Collections.emptySet; import static java.util.Collections.singleton; import static org.junit.Assert.assertEquals; @@ -36,12 +33,7 @@ import static org.junit.Assert.assertFalse; */ public class AclProvisioningTest { - private ProvisioningTester tester; - - @Before - public void before() { - this.tester = new ProvisioningTester(Zone.defaultZone(), createConfig()); - } + private ProvisioningTester tester = new ProvisioningTester.Builder().build(); @Test public void trusted_nodes_for_allocated_node() { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java index 00c77c6b06a..0fdf857e97f 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java @@ -23,7 +23,6 @@ import java.util.List; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; -import java.util.stream.Stream; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -41,7 +40,7 @@ public class DockerProvisioningTest { @Test public void docker_application_deployment() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application1 = tester.makeApplicationId(); for (int i = 1; i < 10; i++) @@ -72,7 +71,7 @@ public class DockerProvisioningTest { @Test public void refuses_to_activate_on_non_active_host() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId zoneApplication = tester.makeApplicationId(); List<Node> parents = tester.makeReadyVirtualDockerHosts(10, "large"); @@ -109,7 +108,7 @@ public class DockerProvisioningTest { /** Exclusive app first, then non-exclusive: Should give the same result as below */ @Test public void docker_application_deployment_with_exclusive_app_first() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); for (int i = 1; i <= 4; i++) tester.makeReadyVirtualDockerNode(i, dockerFlavor, "host1"); for (int i = 5; i <= 8; i++) @@ -121,18 +120,18 @@ public class DockerProvisioningTest { ApplicationId application1 = tester.makeApplicationId(); prepareAndActivate(application1, 2, true, tester); - assertEquals(setOf("host1", "host2"), hostsOf(tester.getNodes(application1, Node.State.active))); + assertEquals(Set.of("host1", "host2"), hostsOf(tester.getNodes(application1, Node.State.active))); ApplicationId application2 = tester.makeApplicationId(); prepareAndActivate(application2, 2, false, tester); assertEquals("Application is assigned to separate hosts", - setOf("host3", "host4"), hostsOf(tester.getNodes(application2, Node.State.active))); + Set.of("host3", "host4"), hostsOf(tester.getNodes(application2, Node.State.active))); } /** Non-exclusive app first, then an exclusive: Should give the same result as above */ @Test public void docker_application_deployment_with_exclusive_app_last() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); for (int i = 1; i <= 4; i++) tester.makeReadyVirtualDockerNode(i, dockerFlavor, "host1"); for (int i = 5; i <= 8; i++) @@ -144,18 +143,18 @@ public class DockerProvisioningTest { ApplicationId application1 = tester.makeApplicationId(); prepareAndActivate(application1, 2, false, tester); - assertEquals(setOf("host1", "host2"), hostsOf(tester.getNodes(application1, Node.State.active))); + assertEquals(Set.of("host1", "host2"), hostsOf(tester.getNodes(application1, Node.State.active))); ApplicationId application2 = tester.makeApplicationId(); prepareAndActivate(application2, 2, true, tester); assertEquals("Application is assigned to separate hosts", - setOf("host3", "host4"), hostsOf(tester.getNodes(application2, Node.State.active))); + Set.of("host3", "host4"), hostsOf(tester.getNodes(application2, Node.State.active))); } /** Test making an application exclusive */ @Test public void docker_application_deployment_change_to_exclusive_and_back() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); for (int i = 1; i <= 4; i++) tester.makeReadyVirtualDockerNode(i, dockerFlavor, "host1"); for (int i = 5; i <= 8; i++) @@ -171,12 +170,12 @@ public class DockerProvisioningTest { assertFalse(node.allocation().get().membership().cluster().isExclusive()); prepareAndActivate(application1, 2, true, tester); - assertEquals(setOf("host1", "host2"), hostsOf(tester.getNodes(application1, Node.State.active))); + assertEquals(Set.of("host1", "host2"), hostsOf(tester.getNodes(application1, Node.State.active))); for (Node node : tester.getNodes(application1, Node.State.active)) assertTrue(node.allocation().get().membership().cluster().isExclusive()); prepareAndActivate(application1, 2, false, tester); - assertEquals(setOf("host1", "host2"), hostsOf(tester.getNodes(application1, Node.State.active))); + assertEquals(Set.of("host1", "host2"), hostsOf(tester.getNodes(application1, Node.State.active))); for (Node node : tester.getNodes(application1, Node.State.active)) assertFalse(node.allocation().get().membership().cluster().isExclusive()); } @@ -184,7 +183,7 @@ public class DockerProvisioningTest { /** Non-exclusive app first, then an exclusive: Should give the same result as above */ @Test public void docker_application_deployment_with_exclusive_app_causing_allocation_failure() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); for (int i = 1; i <= 4; i++) tester.makeReadyVirtualDockerNode(i, dockerFlavor, "host1"); for (int i = 5; i <= 8; i++) @@ -196,7 +195,7 @@ public class DockerProvisioningTest { ApplicationId application1 = tester.makeApplicationId(); prepareAndActivate(application1, 2, true, tester); - assertEquals(setOf("host1", "host2"), hostsOf(tester.getNodes(application1, Node.State.active))); + assertEquals(Set.of("host1", "host2"), hostsOf(tester.getNodes(application1, Node.State.active))); try { ApplicationId application2 = ApplicationId.from("tenant1", "app1", "default"); @@ -217,7 +216,7 @@ public class DockerProvisioningTest { // In dev, test and staging you get nodes with default flavor, but we should get specified flavor for docker nodes @Test public void get_specified_flavor_not_default_flavor_for_docker() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.test, RegionName.from("corp-us-east-1"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.test, RegionName.from("corp-us-east-1"))).build(); ApplicationId application1 = tester.makeApplicationId(); tester.makeReadyVirtualDockerNodes(1, dockerFlavor, "dockerHost"); @@ -229,10 +228,6 @@ public class DockerProvisioningTest { assertEquals(dockerFlavor, nodes.asList().get(0).flavor().canonicalName()); } - private Set<String> setOf(String ... strings) { - return Stream.of(strings).collect(Collectors.toSet()); - } - private Set<String> hostsOf(NodeList nodes) { return nodes.asList().stream().map(Node::parentHostname).map(Optional::get).collect(Collectors.toSet()); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisioningTest.java index 86e926be6b7..11445a73477 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisioningTest.java @@ -60,7 +60,7 @@ public class DynamicDockerProvisioningTest { */ @Test public void relocate_nodes_from_spare_hosts() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east")), flavorsConfig()); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build(); tester.makeReadyNodes(4, "host-small", NodeType.host, 32); deployZoneApp(tester); List<Node> dockerHosts = tester.nodeRepository().getNodes(NodeType.host, Node.State.active); @@ -103,7 +103,7 @@ public class DynamicDockerProvisioningTest { */ @Test public void relocate_failed_nodes() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east")), flavorsConfig()); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build(); tester.makeReadyNodes(5, "host-small", NodeType.host, 32); deployZoneApp(tester); List<Node> dockerHosts = tester.nodeRepository().getNodes(NodeType.host, Node.State.active); @@ -160,7 +160,7 @@ public class DynamicDockerProvisioningTest { */ @Test public void do_not_relocate_nodes_from_spare_if_no_where_to_relocate_them() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east")), flavorsConfig()); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build(); tester.makeReadyNodes(2, "host-small", NodeType.host, 32); deployZoneApp(tester); List<Node> dockerHosts = tester.nodeRepository().getNodes(NodeType.host, Node.State.active); @@ -187,7 +187,7 @@ public class DynamicDockerProvisioningTest { @Test(expected = OutOfCapacityException.class) public void multiple_groups_are_on_separate_parent_hosts() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east")), flavorsConfig()); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build(); tester.makeReadyNodes(5, "host-small", NodeType.host, 32); deployZoneApp(tester); Flavor flavor = tester.nodeRepository().getAvailableFlavors().getFlavorOrThrow("d-1"); @@ -206,7 +206,7 @@ public class DynamicDockerProvisioningTest { // Test should allocate as much capacity as possible, verify that it is not possible to allocate one more unit // Verify that there is still capacity (available spare) // Fail one node and redeploy, Verify that one less node is empty. - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east")), flavorsConfig()); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build(); // Setup test ApplicationId application1 = tester.makeApplicationId(); @@ -242,7 +242,7 @@ public class DynamicDockerProvisioningTest { @Test public void non_prod_zones_do_not_have_spares() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.perf, RegionName.from("us-east")), flavorsConfig()); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.perf, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build(); tester.makeReadyNodes(3, "host-small", NodeType.host, 32); deployZoneApp(tester); Flavor flavor = tester.nodeRepository().getAvailableFlavors().getFlavorOrThrow("d-3"); @@ -257,7 +257,7 @@ public class DynamicDockerProvisioningTest { @Test(expected = OutOfCapacityException.class) public void allocation_should_fail_when_host_is_not_active() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east")), flavorsConfig()); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build(); tester.makeProvisionedNodes(3, "host-small", NodeType.host, 32); deployZoneApp(tester); @@ -268,7 +268,7 @@ public class DynamicDockerProvisioningTest { @Test public void provision_dual_stack_containers() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east")), flavorsConfig()); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build(); tester.makeReadyNodes(2, "host-large", NodeType.host, 10, true); deployZoneApp(tester); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java index 73b5f5e37e0..3bbb19a5917 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java @@ -8,14 +8,12 @@ import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.RotationName; -import com.yahoo.config.provision.Zone; import com.yahoo.transaction.NestedTransaction; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.flag.FlagId; import com.yahoo.vespa.hosted.provision.lb.LoadBalancer; import com.yahoo.vespa.hosted.provision.lb.Real; import com.yahoo.vespa.hosted.provision.node.Agent; -import org.junit.Before; import org.junit.Test; import java.util.Collections; @@ -36,12 +34,7 @@ public class LoadBalancerProvisionerTest { private final ApplicationId app1 = ApplicationId.from("tenant1", "application1", "default"); private final ApplicationId app2 = ApplicationId.from("tenant2", "application2", "default"); - private ProvisioningTester tester; - - @Before - public void before() { - tester = new ProvisioningTester(Zone.defaultZone()); - } + private ProvisioningTester tester = new ProvisioningTester.Builder().build(); @Test public void provision_load_balancer() { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java index e7ce09f94f2..aca3c884ffc 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java @@ -35,7 +35,7 @@ public class MultigroupProvisioningTest { @Test public void test_provisioning_of_multiple_groups() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application1 = tester.makeApplicationId(); @@ -67,7 +67,7 @@ public class MultigroupProvisioningTest { */ @Test @Ignore public void test_provisioning_of_groups_with_asymmetry() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application1 = tester.makeApplicationId(); @@ -80,7 +80,7 @@ public class MultigroupProvisioningTest { @Test public void test_provisioning_of_multiple_groups_after_flavor_migration() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application1 = tester.makeApplicationId(); @@ -94,7 +94,7 @@ public class MultigroupProvisioningTest { @Test public void test_one_node_and_group_to_two() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.perf, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.perf, RegionName.from("us-east"))).build(); ApplicationId application1 = tester.makeApplicationId(); @@ -106,7 +106,7 @@ public class MultigroupProvisioningTest { @Test public void test_one_node_and_group_to_two_with_flavor_migration() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.perf, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.perf, RegionName.from("us-east"))).build(); ApplicationId application1 = tester.makeApplicationId(); @@ -119,7 +119,7 @@ public class MultigroupProvisioningTest { @Test public void test_provisioning_of_multiple_groups_after_flavor_migration_and_exiration() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application1 = tester.makeApplicationId(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java index ef7a2b51108..d043d8b406c 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java @@ -5,11 +5,8 @@ import com.yahoo.component.Version; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.ClusterSpec; -import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.NodeType; -import com.yahoo.config.provision.RegionName; -import com.yahoo.config.provision.Zone; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.maintenance.JobControl; import com.yahoo.vespa.hosted.provision.maintenance.RetiredExpirer; @@ -35,7 +32,7 @@ import static org.junit.Assert.assertTrue; */ public class NodeTypeProvisioningTest { - private final ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + private final ProvisioningTester tester = new ProvisioningTester.Builder().build(); private final ApplicationId application = tester.makeApplicationId(); // application using proxy nodes private final Capacity capacity = Capacity.fromRequiredNodeType(NodeType.proxy); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java index 88922094ccc..0eca5e25d85 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java @@ -61,7 +61,7 @@ public class ProvisioningTest { @Test public void application_deployment_constant_application_size() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application1 = tester.makeApplicationId(); ApplicationId application2 = tester.makeApplicationId(); @@ -142,7 +142,7 @@ public class ProvisioningTest { @Test public void nodeVersionIsReturnedIfSet() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.dev, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build(); ApplicationId application1 = tester.makeApplicationId(); @@ -167,7 +167,7 @@ public class ProvisioningTest { @Test public void application_deployment_variable_application_size() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application1 = tester.makeApplicationId(); @@ -234,7 +234,7 @@ public class ProvisioningTest { @Test public void application_deployment_multiple_flavors() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application1 = tester.makeApplicationId(); @@ -265,7 +265,7 @@ public class ProvisioningTest { @Ignore @Test public void application_deployment_with_inplace_downsize() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application1 = tester.makeApplicationId(); @@ -294,8 +294,8 @@ public class ProvisioningTest { config.defaultFlavor("not-used"); config.defaultContainerFlavor("small"); config.defaultContentFlavor("large"); - ProvisioningTester tester = new ProvisioningTester(new Zone(new ConfigserverConfig(config), - new NodeFlavors(new FlavorsConfig(new FlavorsConfig.Builder())))); + ProvisioningTester tester = new ProvisioningTester.Builder() + .zone(new Zone(new ConfigserverConfig(config), new NodeFlavors(new FlavorsConfig.Builder().build()))).build(); ApplicationId application1 = tester.makeApplicationId(); @@ -313,7 +313,7 @@ public class ProvisioningTest { @Test public void application_deployment_multiple_flavors_with_replacement() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application1 = tester.makeApplicationId(); @@ -356,7 +356,7 @@ public class ProvisioningTest { @Test public void application_deployment_above_then_at_capacity_limit() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application1 = tester.makeApplicationId(); @@ -381,7 +381,7 @@ public class ProvisioningTest { @Test public void dev_deployment_size() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.dev, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build(); ApplicationId application = tester.makeApplicationId(); tester.makeReadyNodes(4, "default"); @@ -392,7 +392,7 @@ public class ProvisioningTest { @Test public void deploy_specific_vespa_version() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.dev, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build(); ApplicationId application = tester.makeApplicationId(); tester.makeReadyNodes(4, "default"); @@ -403,7 +403,7 @@ public class ProvisioningTest { @Test public void test_deployment_size() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.test, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.test, RegionName.from("us-east"))).build(); ApplicationId application = tester.makeApplicationId(); tester.makeReadyNodes(4, "default"); @@ -414,7 +414,7 @@ public class ProvisioningTest { @Test(expected = IllegalArgumentException.class) public void prod_deployment_requires_redundancy() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application = tester.makeApplicationId(); tester.makeReadyNodes(10, "default"); @@ -424,7 +424,7 @@ public class ProvisioningTest { /** Dev always uses the zone default flavor */ @Test public void dev_deployment_flavor() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.dev, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build(); ApplicationId application = tester.makeApplicationId(); tester.makeReadyNodes(4, "default"); @@ -436,7 +436,7 @@ public class ProvisioningTest { /** Test always uses the zone default flavor */ @Test public void test_deployment_flavor() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.test, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.test, RegionName.from("us-east"))).build(); ApplicationId application = tester.makeApplicationId(); tester.makeReadyNodes(4, "default"); @@ -447,7 +447,7 @@ public class ProvisioningTest { @Test public void staging_deployment_size() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.staging, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.staging, RegionName.from("us-east"))).build(); ApplicationId application = tester.makeApplicationId(); tester.makeReadyNodes(14, "default"); @@ -458,7 +458,7 @@ public class ProvisioningTest { @Test public void activate_after_reservation_timeout() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); tester.makeReadyNodes(10, "default"); ApplicationId application = tester.makeApplicationId(); @@ -480,7 +480,7 @@ public class ProvisioningTest { @Test public void out_of_capacity() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); tester.makeReadyNodes(9, "default"); // need 2+2+3+3=10 ApplicationId application = tester.makeApplicationId(); @@ -495,7 +495,7 @@ public class ProvisioningTest { @Test public void out_of_capacity_but_cannot_fail() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); tester.makeReadyNodes(4, "default"); ApplicationId application = tester.makeApplicationId(); ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, @@ -508,7 +508,7 @@ public class ProvisioningTest { @Test public void out_of_desired_flavor() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); tester.makeReadyNodes(10, "small"); // need 2+2+3+3=10 tester.makeReadyNodes( 9, "large"); // need 2+2+3+3=10 @@ -533,8 +533,8 @@ public class ProvisioningTest { Flavor.Type.BARE_METAL).cost(2); b.addReplaces(flavorToRetire, newDefault); - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east")), - b.build()); + ProvisioningTester tester = new ProvisioningTester.Builder() + .zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(b.build()).build(); ApplicationId application = tester.makeApplicationId(); try { @@ -548,7 +548,7 @@ public class ProvisioningTest { @Test public void out_of_capacity_all_nodes_want_to_retire() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application = tester.makeApplicationId(); // Flag all nodes for retirement @@ -565,7 +565,7 @@ public class ProvisioningTest { @Test public void nonexisting_flavor() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application = tester.makeApplicationId(); try { @@ -579,7 +579,7 @@ public class ProvisioningTest { @Test public void highest_node_indexes_are_retired_first() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application1 = tester.makeApplicationId(); @@ -630,10 +630,10 @@ public class ProvisioningTest { // Deploy with flavor that will eventually be retired { FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor("default", 1., 1., 10, Flavor.Type.BARE_METAL).cost(2); + b.addFlavor(flavorToRetire, 1., 1., 10, Flavor.Type.BARE_METAL).cost(2); - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east")), - b.build(), curator, nameResolver); + ProvisioningTester tester = new ProvisioningTester.Builder() + .flavorsConfig(b.build()).curator(curator).nameResolver(nameResolver).build(); tester.makeReadyNodes(4, flavorToRetire); SystemState state = prepare(application, 2, 0, 2, 0, flavorToRetire, tester); @@ -649,8 +649,8 @@ public class ProvisioningTest { Flavor.Type.BARE_METAL).cost(2); b.addReplaces(flavorToRetire, newDefault); - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east")), - b.build(), curator, nameResolver); + ProvisioningTester tester = new ProvisioningTester.Builder() + .flavorsConfig(b.build()).curator(curator).nameResolver(nameResolver).build(); // Add nodes with "new-default" flavor tester.makeReadyNodes(4, replacementFlavor); @@ -678,8 +678,8 @@ public class ProvisioningTest { Flavor.Type.BARE_METAL).cost(2); b.addReplaces(flavorToRetire, newDefault); - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east")), - b.build()); + ProvisioningTester tester = new ProvisioningTester.Builder() + .zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(b.build()).build(); ApplicationId application = tester.makeApplicationId(); // Add nodes @@ -698,7 +698,7 @@ public class ProvisioningTest { @Test public void application_deployment_retires_nodes_that_want_to_retire() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application = tester.makeApplicationId(); tester.makeReadyNodes(10, "default"); @@ -727,7 +727,7 @@ public class ProvisioningTest { @Test public void application_deployment_extends_existing_reservations_on_deploy() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application = tester.makeApplicationId(); tester.makeReadyNodes(2, "default"); @@ -771,7 +771,7 @@ public class ProvisioningTest { @Test public void required_capacity_respects_prod_redundancy_requirement() { - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); + ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId application = tester.makeApplicationId(); try { prepare(application, 1, 0, 1, 0, true, "default", Version.fromString("6.42"), tester); @@ -787,7 +787,8 @@ public class ProvisioningTest { FlavorsConfig.Flavor.Builder largeVariantVariant = b.addFlavor("large-variant-variant", 4., 9., 101, Flavor.Type.BARE_METAL).cost(11); b.addReplaces("large-variant", largeVariantVariant); - ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east")), b.build()); + ProvisioningTester tester = new ProvisioningTester.Builder() + .zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(b.build()).build(); tester.makeReadyNodes(6, "large"); //cost = 10 tester.makeReadyNodes(6, "large-variant"); //cost = 9 tester.makeReadyNodes(6, "large-variant-variant"); //cost = 11 diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java index 8fdaf6c9eaa..42ae95df2c0 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java @@ -31,6 +31,7 @@ import com.yahoo.vespa.hosted.provision.node.filter.NodeHostFilter; import com.yahoo.vespa.hosted.provision.persistence.NameResolver; import com.yahoo.vespa.hosted.provision.testutils.MockNameResolver; import com.yahoo.vespa.hosted.provision.testutils.MockProvisionServiceProvider; +import com.yahoo.vespa.orchestrator.OrchestrationException; import com.yahoo.vespa.orchestrator.Orchestrator; import com.yahoo.vespa.service.duper.ConfigServerApplication; @@ -75,33 +76,21 @@ public class ProvisioningTester { private int nextHost = 0; private int nextIP = 0; - public ProvisioningTester(Zone zone) { - this(zone, createConfig()); - } - - public ProvisioningTester(Zone zone, FlavorsConfig config) { - this(zone, config, new MockCurator(), new MockNameResolver().mockAnyLookup()); - } - - public ProvisioningTester(Zone zone, FlavorsConfig config, Curator curator, NameResolver nameResolver) { - try { - this.nodeFlavors = new NodeFlavors(config); - this.clock = new ManualClock(); - this.curator = curator; - this.nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, nameResolver, - new DockerImage("docker-registry.domain.tld:8080/dist/vespa"), true); - this.orchestrator = mock(Orchestrator.class); - doThrow(new RuntimeException()).when(orchestrator).acquirePermissionToRemove(any()); - this.loadBalancerService = new LoadBalancerServiceMock(); - ProvisionServiceProvider provisionServiceProvider = new MockProvisionServiceProvider( - loadBalancerService, null); - this.provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone, provisionServiceProvider); - this.capacityPolicies = new CapacityPolicies(zone, nodeFlavors); - this.provisionLogger = new NullProvisionLogger(); - } - catch (Exception e) { - throw new RuntimeException(e); - } + public ProvisioningTester( + Curator curator, NodeFlavors nodeFlavors, Zone zone, NameResolver nameResolver, + Orchestrator orchestrator, HostProvisioner hostProvisioner, + LoadBalancerServiceMock loadBalancerService) { + this.curator = curator; + this.nodeFlavors = nodeFlavors; + this.clock = new ManualClock(); + this.nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, nameResolver, + new DockerImage("docker-registry.domain.tld:8080/dist/vespa"), true); + this.orchestrator = orchestrator; + ProvisionServiceProvider provisionServiceProvider = new MockProvisionServiceProvider(loadBalancerService, hostProvisioner); + this.provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone, provisionServiceProvider); + this.capacityPolicies = new CapacityPolicies(zone, nodeFlavors); + this.provisionLogger = new NullProvisionLogger(); + this.loadBalancerService = loadBalancerService; } public static FlavorsConfig createConfig() { @@ -393,12 +382,75 @@ public class ProvisioningTester { return nodeRepository.getNode(hostname).map(Node::flavor).orElseThrow(() -> new RuntimeException("No flavor for host " + hostname)); } - private static class NullProvisionLogger implements ProvisionLogger { + public static final class Builder { + private Curator curator; + private FlavorsConfig flavorsConfig; + private Zone zone; + private NameResolver nameResolver; + private Orchestrator orchestrator; + private HostProvisioner hostProvisioner; + private LoadBalancerServiceMock loadBalancerService; + + public Builder curator(Curator curator) { + this.curator = curator; + return this; + } + + public Builder flavorsConfig(FlavorsConfig flavorsConfig) { + this.flavorsConfig = flavorsConfig; + return this; + } - @Override - public void log(Level level, String message) { + public Builder zone(Zone zone) { + this.zone = zone; + return this; } + public Builder nameResolver(NameResolver nameResolver) { + this.nameResolver = nameResolver; + return this; + } + + public Builder orchestrator(Orchestrator orchestrator) { + this.orchestrator = orchestrator; + return this; + } + + public Builder hostProvisioner(HostProvisioner hostProvisioner) { + this.hostProvisioner = hostProvisioner; + return this; + } + + public Builder loadBalancerService(LoadBalancerServiceMock loadBalancerService) { + this.loadBalancerService = loadBalancerService; + return this; + } + + public ProvisioningTester build() { + Orchestrator orchestrator = Optional.ofNullable(this.orchestrator) + .orElseGet(() -> { + Orchestrator orch = mock(Orchestrator.class); + try { + doThrow(new RuntimeException()).when(orch).acquirePermissionToRemove(any()); + } catch (OrchestrationException e) { + throw new RuntimeException(e); + } + return orch; + }); + + return new ProvisioningTester( + Optional.ofNullable(curator).orElseGet(MockCurator::new), + new NodeFlavors(Optional.ofNullable(flavorsConfig).orElseGet(ProvisioningTester::createConfig)), + Optional.ofNullable(zone).orElseGet(Zone::defaultZone), + Optional.ofNullable(nameResolver).orElseGet(() -> new MockNameResolver().mockAnyLookup()), + orchestrator, + Optional.ofNullable(hostProvisioner).orElseGet(() -> null), + Optional.ofNullable(loadBalancerService).orElseGet(LoadBalancerServiceMock::new)); + } + } + + private static class NullProvisionLogger implements ProvisionLogger { + @Override public void log(Level level, String message) { } } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java index 8e9572544a0..0d9ce179d5c 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java @@ -11,7 +11,6 @@ import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.Zone; import com.yahoo.vespa.hosted.provision.Node; -import org.junit.Before; import org.junit.Test; import java.util.ArrayList; @@ -39,14 +38,8 @@ public class VirtualNodeProvisioningTest { private static final ClusterSpec contentClusterSpec = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("myContent"), Version.fromString("6.42"), false, Collections.emptySet()); private static final ClusterSpec containerClusterSpec = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("myContainer"), Version.fromString("6.42"), false, Collections.emptySet()); - private ProvisioningTester tester; - private ApplicationId applicationId; - - @Before - public void setup() { - tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east"))); - applicationId = tester.makeApplicationId(); - } + private ProvisioningTester tester = new ProvisioningTester.Builder().build(); + private ApplicationId applicationId = tester.makeApplicationId(); @Test public void distinct_parent_host_for_each_node_in_a_cluster() { @@ -88,7 +81,7 @@ public class VirtualNodeProvisioningTest { // Allowed to use same parent host for several nodes in same cluster in dev { - tester = new ProvisioningTester(new Zone(Environment.dev, RegionName.from("us-east"))); + tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build(); tester.makeReadyVirtualDockerNodes(4, "default", "parentHost1"); List<HostSpec> containerHosts = prepare(containerClusterSpec, containerNodeCount, groups); @@ -101,7 +94,7 @@ public class VirtualNodeProvisioningTest { // Allowed to use same parent host for several nodes in same cluster in CD (even if prod env) { - tester = new ProvisioningTester(new Zone(SystemName.cd, Environment.prod, RegionName.from("us-east"))); + tester = new ProvisioningTester.Builder().zone(new Zone(SystemName.cd, Environment.prod, RegionName.from("us-east"))).build(); tester.makeReadyVirtualDockerNodes(4, flavor, "parentHost1"); List<HostSpec> containerHosts = prepare(containerClusterSpec, containerNodeCount, groups); |