summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2019-02-08 09:45:30 +0100
committerMartin Polden <mpolden@mpolden.no>2019-02-11 13:23:05 +0100
commit00d3c6b51494855b525ccb1084d0d65b8f8457cb (patch)
tree9981460192cf831a09245283f46976b97abbd1ab
parent3bf344f6a615e9e5e2e75391560bc679ff846906 (diff)
Refactor test
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainerTest.java189
1 files changed, 114 insertions, 75 deletions
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainerTest.java
index f1c571da451..654c0e803d9 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/RoutingPolicyMaintainerTest.java
@@ -9,8 +9,6 @@ import com.yahoo.config.provision.RotationName;
import com.yahoo.vespa.hosted.controller.Application;
import com.yahoo.vespa.hosted.controller.api.identifiers.DeploymentId;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.LoadBalancer;
-import com.yahoo.vespa.hosted.controller.api.integration.dns.Record;
-import com.yahoo.vespa.hosted.controller.api.integration.dns.RecordId;
import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneId;
import com.yahoo.vespa.hosted.controller.application.ApplicationPackage;
import com.yahoo.vespa.hosted.controller.application.RoutingPolicy;
@@ -26,7 +24,7 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
-import java.util.function.Supplier;
+import java.util.stream.Collectors;
import static org.junit.Assert.assertEquals;
@@ -35,99 +33,136 @@ import static org.junit.Assert.assertEquals;
*/
public class RoutingPolicyMaintainerTest {
- @Test
- public void maintains_routing_policies() {
- DeploymentTester tester = new DeploymentTester();
- Application application = tester.createApplication("app1", "tenant1", 1, 1L);
- RoutingPolicyMaintainer maintainer = new RoutingPolicyMaintainer(tester.controller(), Duration.ofHours(12),
- new JobControl(new MockCuratorDb()),
- tester.controllerTester().nameService(),
- tester.controllerTester().curator());
-
- ApplicationPackage applicationPackage = new ApplicationPackageBuilder()
- .environment(Environment.prod)
- .region("us-west-1")
- .region("us-central-1")
- .build();
-
- int numberOfClustersPerZone = 2;
+ private final DeploymentTester tester = new DeploymentTester();
+ private final Application app1 = tester.createApplication("app1", "tenant1", 1, 1L);
+ private final RoutingPolicyMaintainer maintainer = new RoutingPolicyMaintainer(tester.controller(), Duration.ofHours(12),
+ new JobControl(new MockCuratorDb()),
+ tester.controllerTester().nameService(),
+ tester.controllerTester().curator());
+ private final ApplicationPackage applicationPackage = new ApplicationPackageBuilder()
+ .environment(Environment.prod)
+ .region("us-west-1")
+ .region("us-central-1")
+ .build();
+ @Test
+ public void maintains_routing_policies_per_zone() {
// Deploy application
- tester.deployCompletely(application, applicationPackage);
- setupClustersWithLoadBalancers(tester, application, numberOfClustersPerZone);
+ int clustersPerZone = 2;
+ tester.deployCompletely(app1, applicationPackage);
+ provisionLoadBalancers(app1, clustersPerZone);
+ // Creates records and policies for all clusters in all zones
maintainer.maintain();
- Map<RecordId, Record> records = tester.controllerTester().nameService().records();
- Supplier<Long> recordCount = () -> records.entrySet().stream().filter(entry -> entry.getValue().data().asString().contains("loadbalancer")).count();
- assertEquals(4, (long) recordCount.get());
-
- Set<RoutingPolicy> policies = tester.controller().curator().readRoutingPolicies(application.id());
- assertEquals(4, policies.size());
-
-
- // no update
+ Set<String> expectedRecords = Set.of(
+ "c0--app1--tenant1.prod.us-west-1.vespa.oath.cloud",
+ "c1--app1--tenant1.prod.us-west-1.vespa.oath.cloud",
+ "c0--app1--tenant1.prod.us-central-1.vespa.oath.cloud",
+ "c1--app1--tenant1.prod.us-central-1.vespa.oath.cloud"
+ );
+ assertEquals(expectedRecords, records());
+ assertEquals(4, policies(app1).size());
+
+ // Next run does nothing
maintainer.maintain();
- Map<RecordId, Record> records2 = tester.controllerTester().nameService().records();
- assertEquals(4, (long) recordCount.get());
- assertEquals(records, records2);
-
-
- // add 1 cluster per zone
- setupClustersWithLoadBalancers(tester, application, numberOfClustersPerZone + 1);
+ assertEquals(expectedRecords, records());
+ assertEquals(4, policies(app1).size());
+ // Add 1 cluster in each zone
+ provisionLoadBalancers(app1, clustersPerZone + 1);
maintainer.maintain();
- assertEquals(6, (long) recordCount.get());
-
- Set<RoutingPolicy> policies2 = tester.controller().curator().readRoutingPolicies(application.id());
- assertEquals(6, policies2.size());
-
-
- // Add application
- Application application2 = tester.createApplication("app2", "tenant1", 1, 1L);
- tester.deployCompletely(application2, applicationPackage);
- setupClustersWithLoadBalancers(tester, application2, numberOfClustersPerZone);
-
+ expectedRecords = Set.of(
+ "c0--app1--tenant1.prod.us-west-1.vespa.oath.cloud",
+ "c1--app1--tenant1.prod.us-west-1.vespa.oath.cloud",
+ "c2--app1--tenant1.prod.us-west-1.vespa.oath.cloud",
+ "c0--app1--tenant1.prod.us-central-1.vespa.oath.cloud",
+ "c1--app1--tenant1.prod.us-central-1.vespa.oath.cloud",
+ "c2--app1--tenant1.prod.us-central-1.vespa.oath.cloud"
+ );
+ assertEquals(expectedRecords, records());
+ assertEquals(6, policies(app1).size());
+
+ // Add another application
+ Application app2 = tester.createApplication("app2", "tenant1", 1, 1L);
+ tester.deployCompletely(app2, applicationPackage);
+ provisionLoadBalancers(app2, clustersPerZone);
maintainer.maintain();
- assertEquals(10, (long) recordCount.get());
-
- Set<RoutingPolicy> aliases4 = tester.controller().curator().readRoutingPolicies(application2.id());
- assertEquals(4, aliases4.size());
-
-
- // Remove cluster in app1
- setupClustersWithLoadBalancers(tester, application, numberOfClustersPerZone);
-
+ expectedRecords = Set.of(
+ "c0--app1--tenant1.prod.us-west-1.vespa.oath.cloud",
+ "c1--app1--tenant1.prod.us-west-1.vespa.oath.cloud",
+ "c2--app1--tenant1.prod.us-west-1.vespa.oath.cloud",
+ "c0--app1--tenant1.prod.us-central-1.vespa.oath.cloud",
+ "c1--app1--tenant1.prod.us-central-1.vespa.oath.cloud",
+ "c2--app1--tenant1.prod.us-central-1.vespa.oath.cloud",
+ "c0--app2--tenant1.prod.us-central-1.vespa.oath.cloud",
+ "c1--app2--tenant1.prod.us-central-1.vespa.oath.cloud",
+ "c0--app2--tenant1.prod.us-west-1.vespa.oath.cloud",
+ "c1--app2--tenant1.prod.us-west-1.vespa.oath.cloud"
+ );
+ assertEquals(expectedRecords, records());
+ assertEquals(4, policies(app2).size());
+
+
+ // Remove cluster from app1
+ provisionLoadBalancers(app1, clustersPerZone);
+ maintainer.maintain();
+ expectedRecords = Set.of(
+ "c0--app1--tenant1.prod.us-west-1.vespa.oath.cloud",
+ "c1--app1--tenant1.prod.us-west-1.vespa.oath.cloud",
+ "c0--app1--tenant1.prod.us-central-1.vespa.oath.cloud",
+ "c1--app1--tenant1.prod.us-central-1.vespa.oath.cloud",
+ "c0--app2--tenant1.prod.us-central-1.vespa.oath.cloud",
+ "c1--app2--tenant1.prod.us-central-1.vespa.oath.cloud",
+ "c0--app2--tenant1.prod.us-west-1.vespa.oath.cloud",
+ "c1--app2--tenant1.prod.us-west-1.vespa.oath.cloud"
+ );
+ assertEquals(expectedRecords, records());
+
+ // Remove app2 completely
+ tester.controller().applications().require(app2.id()).deployments().keySet()
+ .forEach(zone -> tester.controller().applications().deactivate(app2.id(), zone));
maintainer.maintain();
- assertEquals(8, (long) recordCount.get());
+ expectedRecords = Set.of(
+ "c0--app1--tenant1.prod.us-west-1.vespa.oath.cloud",
+ "c1--app1--tenant1.prod.us-west-1.vespa.oath.cloud",
+ "c0--app1--tenant1.prod.us-central-1.vespa.oath.cloud",
+ "c1--app1--tenant1.prod.us-central-1.vespa.oath.cloud"
+ );
+ assertEquals(expectedRecords, records());
+ }
- // Remove application app2
- tester.controller().applications().get(application2.id())
- .map(app -> app.deployments().keySet())
- .orElse(Collections.emptySet())
- .forEach(zone -> tester.controller().applications().deactivate(application2.id(), zone));
+ private Set<RoutingPolicy> policies(Application application) {
+ return tester.controller().curator().readRoutingPolicies(application.id());
+ }
- maintainer.maintain();
- assertEquals(4, (long) recordCount.get());
+ private Set<String> records() {
+ return tester.controllerTester().nameService().records().values().stream()
+ .map(r -> r.name().asString())
+ .collect(Collectors.toSet());
}
- private void setupClustersWithLoadBalancers(DeploymentTester tester, Application application, int numberOfClustersPerZone) {
- tester.controller().applications().get(application.id()).orElseThrow(()->new RuntimeException("No deployments")).deployments().keySet()
- .forEach(zone -> tester.configServer()
- .removeLoadBalancers(new DeploymentId(application.id(), zone)));
- tester.controller().applications().get(application.id()).orElseThrow(()->new RuntimeException("No deployments")).deployments().keySet()
- .forEach(zone -> tester.configServer()
- .addLoadBalancers(zone, application.id(), makeLoadBalancers(zone, application.id(), numberOfClustersPerZone)));
+ private void provisionLoadBalancers(Application application, int numberOfClustersPerZone) {
+ tester.controller().applications().get(application.id())
+ .orElseThrow(() -> new RuntimeException("No deployments"))
+ .deployments().keySet()
+ .forEach(zone -> tester.configServer().removeLoadBalancers(new DeploymentId(application.id(), zone)));
+ tester.controller().applications().get(application.id())
+ .orElseThrow(() -> new RuntimeException("No deployments"))
+ .deployments().keySet()
+ .forEach(zone -> tester.configServer()
+ .addLoadBalancers(zone, application.id(), createLoadBalancers(zone, application.id(), numberOfClustersPerZone)));
}
- private List<LoadBalancer> makeLoadBalancers(ZoneId zone, ApplicationId application, int count) {
+ private static List<LoadBalancer> createLoadBalancers(ZoneId zone, ApplicationId application, int count,
+ Map<Integer, Set<RotationName>> clusterRotations) {
List<LoadBalancer> loadBalancers = new ArrayList<>();
- Set<RotationName> rotations = Collections.singleton(RotationName.from("r1"));
for (int i = 0; i < count; i++) {
+ Set<RotationName> rotations = clusterRotations.getOrDefault(i, Collections.emptySet());
loadBalancers.add(
new LoadBalancer("LB-" + i + "-Z-" + zone.value(),
application,
- ClusterSpec.Id.from("cluster-" + i),
+ ClusterSpec.Id.from("c" + i),
HostName.from("loadbalancer-" + i + "-" + application.serializedForm() +
"-zone-" + zone.value()),
Optional.of("dns-zone-1"),
@@ -136,4 +171,8 @@ public class RoutingPolicyMaintainerTest {
return loadBalancers;
}
+ private static List<LoadBalancer> createLoadBalancers(ZoneId zone, ApplicationId application, int count) {
+ return createLoadBalancers(zone, application, count, Collections.emptyMap());
+ }
+
}