From fab02119d34f9cdba4ad4bb3ba736b61f0d6e11d Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Fri, 12 Nov 2021 11:21:39 +0100 Subject: Account for instance when computing container endpoints --- .../vespa/hosted/controller/RoutingController.java | 8 ++- .../vespa/hosted/controller/ControllerTest.java | 62 +++++++++++++++------- .../maintenance/MetricsReporterTest.java | 2 +- 3 files changed, 47 insertions(+), 25 deletions(-) (limited to 'controller-server') diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java index be533b0c53b..a6edff86895 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java @@ -243,7 +243,8 @@ public class RoutingController { Instance instance = application.require(instanceName); boolean registerLegacyNames = requiresLegacyNames(application.deploymentSpec(), instanceName); Set containerEndpoints = new HashSet<>(); - EndpointList endpoints = declaredEndpointsOf(application); + DeploymentId deployment = new DeploymentId(instance.id(), zone); + EndpointList endpoints = declaredEndpointsOf(application).targets(deployment); EndpointList globalEndpoints = endpoints.scope(Endpoint.Scope.global); // Add endpoints backed by a rotation, and register them in DNS if necessary for (var assignedRotation : instance.rotations()) { @@ -280,9 +281,7 @@ public class RoutingController { } // Add endpoints not backed by a rotation (i.e. other routing methods so that the config server always knows // about global names, even when not using rotations) - DeploymentId deployment = new DeploymentId(instance.id(), zone); globalEndpoints.not().requiresRotation() - .targets(deployment) .groupingBy(Endpoint::cluster) .forEach((clusterId, clusterEndpoints) -> { containerEndpoints.add(new ContainerEndpoint(clusterId.value(), @@ -291,8 +290,7 @@ public class RoutingController { }); // Add application endpoints EndpointList applicationEndpoints = endpoints.scope(Endpoint.Scope.application) - .not().direct() // These are handled by RoutingPolicies - .targets(deployment); + .not().direct(); // These are handled by RoutingPolicies for (var endpoint : applicationEndpoints) { Set targetZones = endpoint.targets().stream() .map(t -> t.deployment().zoneId()) diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java index 1e8e444896f..9472801ef2c 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java @@ -6,6 +6,7 @@ import com.yahoo.component.Version; import com.yahoo.config.application.api.DeploymentSpec; import com.yahoo.config.application.api.ValidationId; import com.yahoo.config.application.api.ValidationOverrides; +import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.AthenzDomain; import com.yahoo.config.provision.AthenzService; import com.yahoo.config.provision.CloudName; @@ -233,35 +234,58 @@ public class ControllerTest { @Test public void testDnsUpdatesForGlobalEndpoint() { - var context = tester.newDeploymentContext("tenant1", "app1", "default"); + var betaContext = tester.newDeploymentContext("tenant1", "app1", "beta"); + var defaultContext = tester.newDeploymentContext("tenant1", "app1", "default"); ApplicationPackage applicationPackage = new ApplicationPackageBuilder() + .instances("beta,default") .endpoint("default", "foo") .region("us-west-1") .region("us-central-1") // Two deployments should result in each DNS alias being registered once .build(); - context.submit(applicationPackage).deploy(); + betaContext.submit(applicationPackage).deploy(); + + { // Expected rotation names are passed to beta instance deployments + Collection betaDeployments = betaContext.instance().deployments().values(); + assertFalse(betaDeployments.isEmpty()); + for (Deployment deployment : betaDeployments) { + assertEquals("Rotation names are passed to config server in " + deployment.zone(), + Set.of("rotation-id-01", + "beta--app1--tenant1.global.vespa.oath.cloud"), + tester.configServer().containerEndpointNames(betaContext.deploymentIdIn(deployment.zone()))); + } + betaContext.flushDnsUpdates(); + } - Collection deployments = context.instance().deployments().values(); - assertFalse(deployments.isEmpty()); - for (Deployment deployment : deployments) { - assertEquals("Rotation names are passed to config server in " + deployment.zone(), - Set.of("rotation-id-01", - "app1--tenant1.global.vespa.oath.cloud"), - tester.configServer().containerEndpointNames(context.deploymentIdIn(deployment.zone()))); + { // Expected rotation names are passed to default instance deployments + Collection defaultDeployments = defaultContext.instance().deployments().values(); + assertFalse(defaultDeployments.isEmpty()); + for (Deployment deployment : defaultDeployments) { + assertEquals("Rotation names are passed to config server in " + deployment.zone(), + Set.of("rotation-id-02", + "app1--tenant1.global.vespa.oath.cloud"), + tester.configServer().containerEndpointNames(defaultContext.deploymentIdIn(deployment.zone()))); + } + defaultContext.flushDnsUpdates(); } - context.flushDnsUpdates(); - assertEquals(1, tester.controllerTester().nameService().records().size()); + Map rotationCnames = Map.of("beta--app1--tenant1.global.vespa.oath.cloud", "rotation-fqdn-01.", + "app1--tenant1.global.vespa.oath.cloud", "rotation-fqdn-02."); + rotationCnames.forEach((cname, data) -> { + var record = tester.controllerTester().findCname(cname); + assertTrue(record.isPresent()); + assertEquals(cname, record.get().name().asString()); + assertEquals(data, record.get().data().asString()); + }); - var record = tester.controllerTester().findCname("app1--tenant1.global.vespa.oath.cloud"); - assertTrue(record.isPresent()); - assertEquals("app1--tenant1.global.vespa.oath.cloud", record.get().name().asString()); - assertEquals("rotation-fqdn-01.", record.get().data().asString()); + Map> globalDnsNamesByInstance = Map.of(betaContext.instanceId(), List.of("beta--app1--tenant1.global.vespa.oath.cloud"), + defaultContext.instanceId(), List.of("app1--tenant1.global.vespa.oath.cloud")); - List globalDnsNames = tester.controller().routing().readDeclaredEndpointsOf(context.instanceId()) - .scope(Endpoint.Scope.global) - .mapToList(Endpoint::dnsName); - assertEquals(List.of("app1--tenant1.global.vespa.oath.cloud"), globalDnsNames); + globalDnsNamesByInstance.forEach((instance, dnsNames) -> { + List actualDnsNames = tester.controller().routing().readDeclaredEndpointsOf(instance) + .scope(Endpoint.Scope.global) + .mapToList(Endpoint::dnsName); + assertEquals("Global DNS names for " + instance, dnsNames, actualDnsNames); + }); } @Test diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java index e65f6e087c5..7619cf71f1a 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java @@ -280,7 +280,7 @@ public class MetricsReporterTest { context.submit(applicationPackage).deploy(); reporter.maintain(); - assertEquals("Deployment queues name services requests", 15, metrics.getMetric(MetricsReporter.NAME_SERVICE_REQUESTS_QUEUED).intValue()); + assertEquals("Deployment queues name services requests", 6, metrics.getMetric(MetricsReporter.NAME_SERVICE_REQUESTS_QUEUED).intValue()); context.flushDnsUpdates(); reporter.maintain(); -- cgit v1.2.3