From 60f174c4f1a19a94ba896c4bad7a6df91198c78e Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Wed, 26 Jul 2023 16:23:50 +0200 Subject: Remove active attribute --- .../config/application/api/DeploymentSpec.java | 10 +- .../api/xml/DeploymentSpecXmlReader.java | 14 +-- .../config/application/api/DeploymentSpecTest.java | 132 ++++++++++----------- .../api/DeploymentSpecWithoutInstanceTest.java | 96 ++++++--------- .../model/container/xml/ContainerModelBuilder.java | 17 +-- .../app_complicated_deployment_spec/deployment.xml | 16 +-- .../validation/DeploymentSpecValidatorTest.java | 2 +- .../model/container/xml/IdentityBuilderTest.java | 2 +- .../model/container/xml/RoutingBuilderTest.java | 45 +++---- configserver/src/test/apps/zkapp/deployment.xml | 4 +- .../server/model/LbServicesProducerTest.java | 70 +++-------- .../resources/deploy/hosted-app/deployment.xml | 6 +- .../hosted/controller/routing/RoutingPolicies.java | 52 +++----- .../deployment/ApplicationPackageBuilder.java | 15 +-- .../deployment/DeploymentTriggerTest.java | 18 +-- .../controller/routing/RoutingPoliciesTest.java | 22 ---- 16 files changed, 183 insertions(+), 338 deletions(-) diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java index 797be652ebc..358744d40f7 100644 --- a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java +++ b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java @@ -1,7 +1,6 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.application.api; -import ai.vespa.validation.Validation; import com.yahoo.collections.Comparables; import com.yahoo.config.application.api.xml.DeploymentSpecXmlReader; import com.yahoo.config.provision.AthenzDomain; @@ -434,17 +433,16 @@ public class DeploymentSpec { private final Environment environment; private final Optional region; - private final boolean active; private final Optional athenzService; private final Optional testerFlavor; private final Map cloudAccounts; private final Optional hostTTL; public DeclaredZone(Environment environment) { - this(environment, Optional.empty(), false, Optional.empty(), Optional.empty(), Map.of(), Optional.empty()); + this(environment, Optional.empty(), Optional.empty(), Optional.empty(), Map.of(), Optional.empty()); } - public DeclaredZone(Environment environment, Optional region, boolean active, + public DeclaredZone(Environment environment, Optional region, Optional athenzService, Optional testerFlavor, Map cloudAccounts, Optional hostTTL) { if (environment != Environment.prod && region.isPresent()) @@ -454,7 +452,6 @@ public class DeploymentSpec { hostTTL.filter(Duration::isNegative).ifPresent(ttl -> illegal("Host TTL cannot be negative")); this.environment = Objects.requireNonNull(environment); this.region = Objects.requireNonNull(region); - this.active = active; this.athenzService = Objects.requireNonNull(athenzService); this.testerFlavor = Objects.requireNonNull(testerFlavor); this.cloudAccounts = Map.copyOf(cloudAccounts); @@ -466,9 +463,6 @@ public class DeploymentSpec { /** The region name, or empty if not declared */ public Optional region() { return region; } - /** Returns whether this zone should receive production traffic */ - public boolean active() { return active; } - public Optional testerFlavor() { return testerFlavor; } Optional athenzService() { return athenzService; } diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java b/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java index 13bc09883fa..4bfecabaf69 100644 --- a/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java +++ b/config-model-api/src/main/java/com/yahoo/config/application/api/xml/DeploymentSpecXmlReader.java @@ -273,7 +273,7 @@ public class DeploymentSpecXmlReader { return List.of(new DeclaredTest(RegionName.from(XML.getValue(stepTag).trim()), readHostTTL(stepTag))); // A production test } case devTag, perfTag, stagingTag: // Intentional fallthrough from test tag. - return List.of(new DeclaredZone(Environment.from(stepTag.getTagName()), Optional.empty(), false, athenzService, testerFlavor, readCloudAccounts(stepTag), readHostTTL(stepTag))); + return List.of(new DeclaredZone(Environment.from(stepTag.getTagName()), Optional.empty(), athenzService, testerFlavor, readCloudAccounts(stepTag), readHostTTL(stepTag))); case prodTag: // regions, delay and parallel may be nested within, but we can flatten them return XML.getChildren(stepTag).stream() .flatMap(child -> readNonInstanceSteps(child, prodAttributes, stepTag, defaultBcp).stream()) @@ -682,7 +682,7 @@ public class DeploymentSpecXmlReader { private DeclaredZone readDeclaredZone(Environment environment, Optional athenzService, Optional testerFlavor, Element regionTag) { return new DeclaredZone(environment, Optional.of(RegionName.from(XML.getValue(regionTag).trim())), - readActive(regionTag), athenzService, testerFlavor, + athenzService, testerFlavor, readCloudAccounts(regionTag), readHostTTL(regionTag)); } @@ -784,16 +784,6 @@ public class DeploymentSpecXmlReader { }; } - private boolean readActive(Element regionTag) { - String activeValue = regionTag.getAttribute("active"); - if ("".equals(activeValue)) return true; // Default to active - deprecate(regionTag, List.of("active"), 7, "See https://cloud.vespa.ai/en/reference/routing#deprecated-syntax"); - if ("true".equals(activeValue)) return true; - if ("false".equals(activeValue)) return false; - throw new IllegalArgumentException("Value of 'active' attribute in region tag must be 'true' or 'false' " + - "to control whether this region should receive traffic from the global endpoint of this application"); - } - private void deprecate(Element element, List attributes, int majorVersion, String message) { deprecatedElements.add(new DeprecatedElement(majorVersion, element.getTagName(), attributes, message)); } diff --git a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java index c33277dfc6f..134d45e35ab 100644 --- a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java +++ b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java @@ -116,8 +116,8 @@ public class DeploymentSpecTest { - us-east1 - us-west1 + us-east1 + us-west1 @@ -128,10 +128,8 @@ public class DeploymentSpecTest { assertEquals(2, spec.requireInstance("default").steps().size()); assertTrue(spec.requireInstance("default").steps().get(0).concerns(prod, Optional.of(RegionName.from("us-east1")))); - assertFalse(((DeploymentSpec.DeclaredZone)spec.requireInstance("default").steps().get(0)).active()); assertTrue(spec.requireInstance("default").steps().get(1).concerns(prod, Optional.of(RegionName.from("us-west1")))); - assertTrue(((DeploymentSpec.DeclaredZone)spec.requireInstance("default").steps().get(1)).active()); assertFalse(spec.requireInstance("default").concerns(test, Optional.empty())); assertFalse(spec.requireInstance("default").concerns(staging, Optional.empty())); @@ -154,14 +152,14 @@ public class DeploymentSpecTest { "" + " " + " " + - " us-east1" + - " us-west1" + + " us-east1" + + " us-west1" + " " + " " + " " + " " + - " us-east1" + - " us-west1" + + " us-east1" + + " us-west1" + " " + " " + "" @@ -179,9 +177,9 @@ public class DeploymentSpecTest { " " + " " + " " + - " us-east1" + + " us-east1" + " " + - " us-west1" + + " us-west1" + " " + " " + "" @@ -199,8 +197,8 @@ public class DeploymentSpecTest { " " + " " + " " + - " us-east-1" + - " us-west-1" + + " us-east-1" + + " us-west-1" + " " + " us-west-1" + " us-east-1" + @@ -227,7 +225,7 @@ public class DeploymentSpecTest { "" + " " + " " + - " us-east1" + + " us-east1" + " us-east1" + " us-east1" + " " + @@ -244,7 +242,7 @@ public class DeploymentSpecTest { " " + " " + " us-east1" + - " us-east1" + + " us-east1" + " " + " " + "" @@ -259,7 +257,7 @@ public class DeploymentSpecTest { " " + " " + " " + - " us-east1" + + " us-east1" + " us-east1" + " " + " " + @@ -277,14 +275,14 @@ public class DeploymentSpecTest { " " + " " + " " + - " us-east1" + + " us-east1" + " " + - " us-west1" + + " us-west1" + " " + " " + " " + " " + - " us-central1" + + " us-central1" + " " + " " + "" @@ -309,9 +307,9 @@ public class DeploymentSpecTest { " " + " " + " " + - " us-east1" + + " us-east1" + " " + - " us-west1" + + " us-west1" + " " + " " + "" @@ -332,13 +330,11 @@ public class DeploymentSpecTest { assertTrue(instance.steps().get(1).concerns(staging)); assertTrue(instance.steps().get(2).concerns(prod, Optional.of(RegionName.from("us-east1")))); - assertFalse(((DeploymentSpec.DeclaredZone)instance.steps().get(2)).active()); assertTrue(instance.steps().get(3) instanceof DeploymentSpec.Delay); assertEquals(3 * 60 * 60 + 30 * 60, instance.steps().get(3).delay().getSeconds()); assertTrue(instance.steps().get(4).concerns(prod, Optional.of(RegionName.from("us-west1")))); - assertTrue(((DeploymentSpec.DeclaredZone)instance.steps().get(4)).active()); assertTrue(instance.concerns(test, Optional.empty())); assertTrue(instance.concerns(test, Optional.of(RegionName.from("region1")))); // test steps specify no region @@ -474,11 +470,11 @@ public class DeploymentSpecTest { " " + " " + " " + - " us-west-1" + + " us-west-1" + " " + - " us-central-1" + + " us-central-1" + " " + - " us-east-3" + + " us-east-3" + " " + " " + "" @@ -515,10 +511,10 @@ public class DeploymentSpecTest { "" + " " + " " + - " us-west-1" + + " us-west-1" + " " + - " us-central-1" + - " us-east-3" + + " us-central-1" + + " us-east-3" + " " + " " + " " + @@ -539,14 +535,14 @@ public class DeploymentSpecTest { " " + " " + " " + - " us-west-1" + + " us-west-1" + " " + " " + " " + " " + " " + " " + - " us-west-1" + + " us-west-1" + " " + " " + "" @@ -579,25 +575,25 @@ public class DeploymentSpecTest { " " + " " + " " + - " us-west-1" + + " us-west-1" + " " + - " us-east-3" + + " us-east-3" + " " + - " eu-west-1" + + " eu-west-1" + " " + " " + " " + " " + - " aws-us-east-1a" + + " aws-us-east-1a" + " " + - " ap-northeast-1" + - " ap-southeast-2" + + " ap-northeast-1" + + " ap-southeast-2" + " aws-us-east-1a" + " " + " " + " " + " " + - " us-north-7" + + " us-north-7" + " " + " " + "" @@ -651,12 +647,12 @@ public class DeploymentSpecTest { " " + " " + " " + - " us-west-1" + + " us-west-1" + " " + " " + " " + " " + - " us-east-3" + + " us-east-3" + " " + " " + " " + @@ -679,13 +675,13 @@ public class DeploymentSpecTest { "" + " " + " " + - " us-west-1" + + " us-west-1" + " " + " " + " " + " " + " " + - " us-east-3" + + " us-east-3" + " " + " " + "" @@ -705,11 +701,11 @@ public class DeploymentSpecTest { "" + " " + " " + - " us-west-1" + + " us-west-1" + " " + - " us-west-1" + - " us-central-1" + - " us-east-3" + + " us-west-1" + + " us-central-1" + + " us-east-3" + " " + " " + " " + @@ -796,7 +792,7 @@ public class DeploymentSpecTest { " " + " " + " " + - " us-west-1" + + " us-west-1" + " " + " " + " " + @@ -813,7 +809,7 @@ public class DeploymentSpecTest { " " + " " + " " + - " us-west-1" + + " us-west-1" + " " + " " + "" @@ -830,7 +826,7 @@ public class DeploymentSpecTest { " " + " " + " " + - " us-west-1" + + " us-west-1" + " " + " " + "" @@ -891,7 +887,7 @@ public class DeploymentSpecTest { "" + " " + " " + - " us-west-1" + + " us-west-1" + " " + " " + "" @@ -909,10 +905,10 @@ public class DeploymentSpecTest { "" + " " + " " + - " us-central-1" + + " us-central-1" + " " + - " us-west-1" + - " us-east-3" + + " us-west-1" + + " us-east-3" + " " + " " + " " + @@ -939,16 +935,16 @@ public class DeploymentSpecTest { - us-west-1 - us-east-3 + us-west-1 + us-east-3 - us-west-1 - us-east-3 + us-west-1 + us-east-3 @@ -971,7 +967,7 @@ public class DeploymentSpecTest { "" + " " + " " + - " us-west-1" + + " us-west-1" + " " + " " + "" @@ -990,7 +986,7 @@ public class DeploymentSpecTest { " " + " " + " " + - " us-west-1" + + " us-west-1" + " " + " " + "" @@ -1013,7 +1009,7 @@ public class DeploymentSpecTest { "" + " " + " " + - " us-west-1" + + " us-west-1" + " " + " " + "" @@ -1027,7 +1023,7 @@ public class DeploymentSpecTest { "" + " " + " " + - " us-west-1" + + " us-west-1" + " " + " " + "" @@ -1356,14 +1352,14 @@ public class DeploymentSpecTest { - us-west-1 - us-east-3 + us-west-1 + us-east-3 - us-west-1 - us-east-3 + us-west-1 + us-east-3 @@ -1456,14 +1452,14 @@ public class DeploymentSpecTest { - us-west-1 - us-east-3 + us-west-1 + us-east-3 - us-west-1 - us-east-3 + us-west-1 + us-east-3 diff --git a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecWithoutInstanceTest.java b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecWithoutInstanceTest.java index a8c3913c498..3a8d7ae1703 100644 --- a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecWithoutInstanceTest.java +++ b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecWithoutInstanceTest.java @@ -96,8 +96,8 @@ public class DeploymentSpecWithoutInstanceTest { StringReader r = new StringReader( "" + " " + - " us-east1" + - " us-west1" + + " us-east1" + + " us-west1" + " " + "" ); @@ -107,10 +107,8 @@ public class DeploymentSpecWithoutInstanceTest { assertEquals(2, spec.requireInstance("default").steps().size()); assertTrue(spec.requireInstance("default").steps().get(0).concerns(prod, Optional.of(RegionName.from("us-east1")))); - assertFalse(((DeploymentSpec.DeclaredZone)spec.requireInstance("default").steps().get(0)).active()); assertTrue(spec.requireInstance("default").steps().get(1).concerns(prod, Optional.of(RegionName.from("us-west1")))); - assertTrue(((DeploymentSpec.DeclaredZone)spec.requireInstance("default").steps().get(1)).active()); assertFalse(spec.requireInstance("default").concerns(test, Optional.empty())); assertFalse(spec.requireInstance("default").concerns(Environment.staging, Optional.empty())); @@ -129,9 +127,9 @@ public class DeploymentSpecWithoutInstanceTest { " " + " " + " " + - " us-east1" + + " us-east1" + " " + - " us-west1" + + " us-west1" + " " + "" ); @@ -145,13 +143,11 @@ public class DeploymentSpecWithoutInstanceTest { assertTrue(spec.requireInstance("default").steps().get(1).concerns(Environment.staging)); assertTrue(spec.requireInstance("default").steps().get(2).concerns(prod, Optional.of(RegionName.from("us-east1")))); - assertFalse(((DeploymentSpec.DeclaredZone)spec.requireInstance("default").steps().get(2)).active()); assertTrue(spec.requireInstance("default").steps().get(3) instanceof DeploymentSpec.Delay); assertEquals(3 * 60 * 60 + 30 * 60, spec.requireInstance("default").steps().get(3).delay().getSeconds()); assertTrue(spec.requireInstance("default").steps().get(4).concerns(prod, Optional.of(RegionName.from("us-west1")))); - assertTrue(((DeploymentSpec.DeclaredZone)spec.requireInstance("default").steps().get(4)).active()); assertTrue(spec.requireInstance("default").concerns(test, Optional.empty())); assertTrue(spec.requireInstance("default").concerns(test, Optional.of(RegionName.from("region1")))); // test steps specify no region @@ -168,8 +164,8 @@ public class DeploymentSpecWithoutInstanceTest { " " + " " + " " + - " us-east-1" + - " us-west-1" + + " us-east-1" + + " us-west-1" + " " + " us-west-1" + " us-east-1" + @@ -194,7 +190,7 @@ public class DeploymentSpecWithoutInstanceTest { StringReader r = new StringReader( "" + " " + - " us-east1" + + " us-east1" + " us-east1" + " us-east1" + " " + @@ -209,7 +205,7 @@ public class DeploymentSpecWithoutInstanceTest { "" + " " + " us-east1" + - " us-east1" + + " us-east1" + " " + "" ); @@ -222,7 +218,7 @@ public class DeploymentSpecWithoutInstanceTest { "" + " " + " " + - " us-east1" + + " us-east1" + " us-east1" + " " + " " + @@ -231,26 +227,6 @@ public class DeploymentSpecWithoutInstanceTest { DeploymentSpec.fromXml(r); } - @Test(expected=IllegalArgumentException.class) - public void globalServiceIdInTest() { - StringReader r = new StringReader( - "" + - " " + - "" - ); - DeploymentSpec.fromXml(r); - } - - @Test(expected=IllegalArgumentException.class) - public void globalServiceIdInStaging() { - StringReader r = new StringReader( - "" + - " " + - "" - ); - DeploymentSpec.fromXml(r); - } - @Test public void productionSpecWithUpgradeRollout() { StringReader r = new StringReader( @@ -280,11 +256,11 @@ public class DeploymentSpecWithoutInstanceTest { "" + " " + " " + - " us-west-1" + + " us-west-1" + " " + - " us-central-1" + + " us-central-1" + " " + - " us-east-3" + + " us-east-3" + " " + "" ); @@ -323,10 +299,10 @@ public class DeploymentSpecWithoutInstanceTest { StringReader r = new StringReader( "\n" + " \n" + - " us-west-1\n" + + " us-west-1\n" + " \n" + - " us-central-1\n" + - " us-east-3\n" + + " us-central-1\n" + + " us-east-3\n" + " \n" + " \n" + "" @@ -345,25 +321,25 @@ public class DeploymentSpecWithoutInstanceTest { " " + " " + " " + - " us-west-1" + + " us-west-1" + " " + - " us-east-3" + + " us-east-3" + " " + - " eu-west-1" + + " eu-west-1" + " " + " " + " " + " " + - " aws-us-east-1a" + + " aws-us-east-1a" + " " + - " ap-northeast-1" + - " ap-southeast-2" + + " ap-northeast-1" + + " ap-southeast-2" + " aws-us-east-1a" + " " + " " + " " + " " + - " us-north-7" + + " us-north-7" + " " + "" ); @@ -414,11 +390,11 @@ public class DeploymentSpecWithoutInstanceTest { StringReader r = new StringReader( "\n" + " \n" + - " us-west-1\n" + + " us-west-1\n" + " \n" + - " us-west-1\n" + - " us-central-1\n" + - " us-east-3\n" + + " us-west-1\n" + + " us-central-1\n" + + " us-east-3\n" + " \n" + " \n" + "" @@ -437,7 +413,7 @@ public class DeploymentSpecWithoutInstanceTest { "\n" + " \n" + " \n" + - " us-west-1\n" + + " us-west-1\n" + " \n" + " \n" + "" @@ -452,7 +428,7 @@ public class DeploymentSpecWithoutInstanceTest { " \n" + " \n" + " \n" + - " us-west-1\n" + + " us-west-1\n" + " \n" + "" ); @@ -466,7 +442,7 @@ public class DeploymentSpecWithoutInstanceTest { " \n" + " \n" + " \n" + - " us-west-1\n" + + " us-west-1\n" + " \n" + "" ); @@ -495,7 +471,7 @@ public class DeploymentSpecWithoutInstanceTest { StringReader r = new StringReader( "\n" + " \n" + - " us-west-1\n" + + " us-west-1\n" + " \n" + "" ); @@ -509,10 +485,10 @@ public class DeploymentSpecWithoutInstanceTest { StringReader r = new StringReader( "" + " " + - " us-central-1" + + " us-central-1" + " " + - " us-west-1" + - " us-east-3" + + " us-west-1" + + " us-east-3" + " " + " " + "" @@ -535,7 +511,7 @@ public class DeploymentSpecWithoutInstanceTest { " \n" + " \n" + " \n" + - " us-west-1\n" + + " us-west-1\n" + " \n" + "" ); @@ -552,7 +528,7 @@ public class DeploymentSpecWithoutInstanceTest { StringReader r = new StringReader( "\n" + " \n" + - " us-west-1\n" + + " us-west-1\n" + " \n" + "" ); @@ -564,7 +540,7 @@ public class DeploymentSpecWithoutInstanceTest { StringReader r = new StringReader( "\n" + " \n" + - " us-west-1\n" + + " us-west-1\n" + " \n" + "" ); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java index 1036a615bb5..31f8eba48bf 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java @@ -10,7 +10,6 @@ import com.yahoo.config.application.Xml; import com.yahoo.config.application.api.ApplicationFile; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.config.application.api.DeployLogger; -import com.yahoo.config.application.api.DeploymentInstanceSpec; import com.yahoo.config.application.api.DeploymentSpec; import com.yahoo.config.model.ConfigModelContext; import com.yahoo.config.model.api.ApplicationClusterEndpoint; @@ -360,24 +359,16 @@ public class ContainerModelBuilder extends ConfigModelBuilder { context.getDeployState().getProperties().athenzDnsSuffix(), context.getDeployState().zone(), deploymentSpec); - addRotationProperties(cluster, context.getDeployState().zone(), context.getDeployState().getEndpoints(), deploymentSpec); + addRotationProperties(cluster, context.getDeployState().getEndpoints()); } - private void addRotationProperties(ApplicationContainerCluster cluster, Zone zone, Set endpoints, DeploymentSpec spec) { + private void addRotationProperties(ApplicationContainerCluster cluster, Set endpoints) { cluster.getContainers().forEach(container -> { setRotations(container, endpoints, cluster.getName()); - container.setProp("activeRotation", Boolean.toString(zoneHasActiveRotation(zone, spec))); + container.setProp("activeRotation", "true"); // TODO(mpolden): This is unused and should be removed }); } - private boolean zoneHasActiveRotation(Zone zone, DeploymentSpec spec) { - Optional instance = spec.instance(app.getApplicationId().instance()); - if (instance.isEmpty()) return false; - return instance.get().zones().stream() - .anyMatch(declaredZone -> declaredZone.concerns(zone.environment(), Optional.of(zone.region())) && - declaredZone.active()); - } - private void setRotations(Container container, Set endpoints, String containerClusterName) { var rotationsProperty = endpoints.stream() .filter(endpoint -> endpoint.clusterId().equals(containerClusterName)) @@ -594,7 +585,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder { private void addDefaultConnectorHostedFilterBinding(ApplicationContainerCluster cluster) { cluster.getHttp().getAccessControl() - .ifPresent(accessControl -> accessControl.configureDefaultHostedConnector(cluster.getHttp())); ; + .ifPresent(accessControl -> accessControl.configureDefaultHostedConnector(cluster.getHttp())); } private void addCloudMtlsConnector(DeployState state, ApplicationContainerCluster cluster) { diff --git a/config-model/src/test/cfg/application/app_complicated_deployment_spec/deployment.xml b/config-model/src/test/cfg/application/app_complicated_deployment_spec/deployment.xml index 3d3bfd35845..e30c02cdd84 100644 --- a/config-model/src/test/cfg/application/app_complicated_deployment_spec/deployment.xml +++ b/config-model/src/test/cfg/application/app_complicated_deployment_spec/deployment.xml @@ -5,24 +5,24 @@ - us-west-1 + us-west-1 - us-east-3 + us-east-3 - eu-west-1 + eu-west-1 - aws-us-east-1a + aws-us-east-1a - ap-northeast-1 - ap-southeast-2 + ap-northeast-1 + ap-southeast-2 - us-north-7 + us-north-7 @@ -30,7 +30,7 @@ - eu-central-2 + eu-central-2 diff --git a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/DeploymentSpecValidatorTest.java b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/DeploymentSpecValidatorTest.java index 92efac74530..9ce853ad0f2 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/application/validation/DeploymentSpecValidatorTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/application/validation/DeploymentSpecValidatorTest.java @@ -24,7 +24,7 @@ public class DeploymentSpecValidatorTest { "" + " " + " " + - " us-east" + + " us-east" + " " + " " + " " + diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/IdentityBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/IdentityBuilderTest.java index 78269d00cf3..08877b3d3a9 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/IdentityBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/IdentityBuilderTest.java @@ -24,7 +24,7 @@ public class IdentityBuilderTest extends ContainerModelBuilderTestBase { String deploymentXml = "\n" + " \n" + " \n" + - " default\n" + + " default\n" + " \n" + "\n"; diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/RoutingBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/RoutingBuilderTest.java index 58b9462978f..2bf50103b10 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/RoutingBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/RoutingBuilderTest.java @@ -10,14 +10,12 @@ import com.yahoo.config.model.test.MockRoot; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.Zone; -import com.yahoo.vespa.model.container.ApplicationContainerCluster; import com.yahoo.vespa.model.container.ApplicationContainer; +import com.yahoo.vespa.model.container.ApplicationContainerCluster; import org.junit.jupiter.api.Test; import org.w3c.dom.Element; -import org.xml.sax.SAXException; -import java.io.IOException; -import java.util.Arrays; +import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -27,43 +25,32 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class RoutingBuilderTest extends ContainerModelBuilderTestBase { @Test - void setsRotationActiveAccordingToDeploymentSpec() throws IOException, SAXException { + void setsRotationActive() { Element clusterElem = DomBuilderTest.parse( ""); - String deploymentSpec = "\n" + - " \n" + - " us-north-1\n" + - " \n" + - " us-north-2\n" + - " us-north-3\n" + - " \n" + - " us-north-4\n" + - " \n" + - ""; + String deploymentSpec = """ + + + us-north-1 + + us-north-2 + us-north-3 + + us-north-4 + + """; ApplicationPackage applicationPackage = new MockApplicationPackage.Builder() .withDeploymentSpec(deploymentSpec) .build(); - //root = new MockRoot("root", applicationPackage); - for (String region : Arrays.asList("us-north-1", "us-north-3")) { - ApplicationContainer container = getContainer(applicationPackage, region, clusterElem); + for (String region : List.of("us-north-1", "us-north-2", "us-north-3", "us-north-4")) { + ApplicationContainer container = getContainer(applicationPackage, region, clusterElem); assertEquals("true", container.getServicePropertyString("activeRotation"), "Region " + region + " is active"); } - for (String region : Arrays.asList("us-north-2", "us-north-4")) { - ApplicationContainer container = getContainer(applicationPackage, region, clusterElem); - - assertEquals("false", - container.getServicePropertyString("activeRotation"), - "Region " + region + " is inactive"); - } - ApplicationContainer container = getContainer(applicationPackage, "unknown", clusterElem); - assertEquals("false", - container.getServicePropertyString("activeRotation"), - "Unknown region is inactive"); } diff --git a/configserver/src/test/apps/zkapp/deployment.xml b/configserver/src/test/apps/zkapp/deployment.xml index c8b60f3aa8b..ba71f9c1e47 100644 --- a/configserver/src/test/apps/zkapp/deployment.xml +++ b/configserver/src/test/apps/zkapp/deployment.xml @@ -2,7 +2,7 @@ - - us-east + + us-east diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/model/LbServicesProducerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/model/LbServicesProducerTest.java index 4f52eede4e8..ca2f9da3273 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/model/LbServicesProducerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/model/LbServicesProducerTest.java @@ -22,8 +22,6 @@ import com.yahoo.vespa.config.ConfigPayload; import com.yahoo.vespa.flags.InMemoryFlagSource; import com.yahoo.vespa.model.VespaModel; import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.xml.sax.SAXException; import java.io.IOException; @@ -36,7 +34,6 @@ import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; -import java.util.stream.Collectors; import static com.yahoo.cloud.config.LbServicesConfig.Tenants.Applications.Endpoints.RoutingMethod.Enum.sharedLayer4; import static com.yahoo.cloud.config.LbServicesConfig.Tenants.Applications.Endpoints.Scope.Enum.application; @@ -46,12 +43,10 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import static org.junit.Assume.assumeFalse; /** * @author Ulf Lilleengen */ -@RunWith(Parameterized.class) public class LbServicesProducerTest { private static final Set endpoints = Set.of( @@ -61,16 +56,6 @@ public class LbServicesProducerTest { private static final List zoneDnsSuffixes = List.of(".endpoint1.suffix", ".endpoint2.suffix"); private final InMemoryFlagSource flagSource = new InMemoryFlagSource(); - private final boolean useGlobalServiceId; - - @Parameterized.Parameters - public static Object[] useGlobalServiceId() { - return new Object[] { true, false }; - } - - public LbServicesProducerTest(boolean useGlobalServiceId) { - this.useGlobalServiceId = useGlobalServiceId; - } @Test public void testDeterministicGetConfig() { @@ -88,17 +73,9 @@ public class LbServicesProducerTest { @Test public void testConfigActiveRotation() { - { - RegionName regionName = RegionName.from("us-east-1"); - LbServicesConfig conf = createModelAndGetLbServicesConfig(regionName); - assertTrue(conf.tenants("foo").applications("foo:prod:" + regionName.value() + ":default").activeRotation()); - } - - { - RegionName regionName = RegionName.from("us-east-2"); - LbServicesConfig conf = createModelAndGetLbServicesConfig(regionName); - assertFalse(conf.tenants("foo").applications("foo:prod:" + regionName.value() + ":default").activeRotation()); - } + RegionName regionName = RegionName.from("us-east-1"); + LbServicesConfig conf = createModelAndGetLbServicesConfig(regionName); + assertTrue(conf.tenants("foo").applications("foo:prod:" + regionName.value() + ":default").activeRotation()); } private LbServicesConfig createModelAndGetLbServicesConfig(RegionName regionName) { @@ -116,8 +93,6 @@ public class LbServicesProducerTest { @Test public void testConfigAliasesWithEndpoints() { - assumeFalse(useGlobalServiceId); - Map> testModel = createTestModel(new DeployState.Builder() .endpoints(endpoints) .properties(new TestProperties().setHostedVespa(true))); @@ -150,8 +125,6 @@ public class LbServicesProducerTest { @Test public void testRoutingConfigForTesterApplication() { - assumeFalse(useGlobalServiceId); - Map> testModel = createTestModel(new DeployState.Builder()); // No config for tester application @@ -227,32 +200,17 @@ public class LbServicesProducerTest { " " + ""; - String deploymentInfo; - - if (useGlobalServiceId) { - deploymentInfo ="" + - "" + - " " + - " " + - " us-east-1" + - " us-east-2" + - " " + - ""; - } else { - deploymentInfo ="" + - "" + - " " + - " " + - " us-east-1" + - " us-east-2" + - " " + - " " + - " " + - " " + - ""; - } - - + String deploymentInfo = "" + + "" + + " " + + " " + + " us-east-1" + + " us-east-2" + + " " + + " " + + " " + + " " + + ""; return new MockApplicationPackage.Builder().withServices(services).withDeploymentSpec(deploymentInfo).build(); } diff --git a/configserver/src/test/resources/deploy/hosted-app/deployment.xml b/configserver/src/test/resources/deploy/hosted-app/deployment.xml index f1ebbf7f968..cfd5c61069b 100644 --- a/configserver/src/test/resources/deploy/hosted-app/deployment.xml +++ b/configserver/src/test/resources/deploy/hosted-app/deployment.xml @@ -1,7 +1,7 @@ - - us-north-1 - us-north-2 + + us-north-1 + us-north-2 diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/routing/RoutingPolicies.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/routing/RoutingPolicies.java index 8fae3309f2b..c8c3d057ee3 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/routing/RoutingPolicies.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/routing/RoutingPolicies.java @@ -112,21 +112,20 @@ public class RoutingPolicies { List loadBalancers = controller.serviceRegistry().configServer() .getLoadBalancers(instance, deployment.zoneId()); LoadBalancerAllocation allocation = new LoadBalancerAllocation(deployment, deploymentSpec, loadBalancers); - Set inactiveZones = inactiveZones(instance, deploymentSpec); Optional owner = ownerOf(allocation); try (var lock = db.lockRoutingPolicies()) { RoutingPolicyList applicationPolicies = read(TenantAndApplicationId.from(instance)); RoutingPolicyList deploymentPolicies = applicationPolicies.deployment(allocation.deployment); - removeGlobalDnsUnreferencedBy(allocation, deploymentPolicies, inactiveZones, lock); + removeGlobalDnsUnreferencedBy(allocation, deploymentPolicies, lock); removeApplicationDnsUnreferencedBy(allocation, deploymentPolicies, lock); RoutingPolicyList instancePolicies = storePoliciesOf(allocation, applicationPolicies, generatedEndpoints, lock); instancePolicies = removePoliciesUnreferencedBy(allocation, instancePolicies, lock); RoutingPolicyList updatedApplicationPolicies = applicationPolicies.replace(instance, instancePolicies); - updateGlobalDnsOf(instancePolicies, Optional.of(deployment), inactiveZones, owner, lock); - updateApplicationDnsOf(updatedApplicationPolicies, inactiveZones, deployment, owner, lock); + updateGlobalDnsOf(instancePolicies, Optional.of(deployment), owner, lock); + updateApplicationDnsOf(updatedApplicationPolicies, deployment, owner, lock); } } @@ -137,7 +136,7 @@ public class RoutingPolicies { controller.clock().instant()))); Map allPolicies = readAll().groupingBy(policy -> policy.id().owner()); allPolicies.forEach((instance, policies) -> { - updateGlobalDnsOf(policies, Optional.empty(), Set.of(), Optional.of(TenantAndApplicationId.from(instance)), lock); + updateGlobalDnsOf(policies, Optional.empty(), Optional.of(TenantAndApplicationId.from(instance)), lock); }); } } @@ -157,17 +156,16 @@ public class RoutingPolicies { Map policiesByInstance = effectivePolicies.groupingBy(policy -> policy.id().owner()); policiesByInstance.forEach((ignored, instancePolicies) -> updateGlobalDnsOf(instancePolicies, Optional.of(deployment), - Set.of(), ownerOf(deployment), lock)); - updateApplicationDnsOf(effectivePolicies, Set.of(), deployment, ownerOf(deployment), lock); + updateApplicationDnsOf(effectivePolicies, deployment, ownerOf(deployment), lock); policiesByInstance.forEach((owner, instancePolicies) -> db.writeRoutingPolicies(owner, instancePolicies.asList())); } } /** Update global DNS records for given policies */ private void updateGlobalDnsOf(RoutingPolicyList instancePolicies, Optional deployment, - Set inactiveZones, Optional owner, + Optional owner, @SuppressWarnings("unused") Mutex lock) { Map> routingTable = instancePolicies.asInstanceRoutingTable(); for (Map.Entry> routeEntry : routingTable.entrySet()) { @@ -175,17 +173,17 @@ public class RoutingPolicies { controller.routing().readDeclaredEndpointsOf(routingId.instance()) .named(routingId.endpointId(), Endpoint.Scope.global) .not().requiresRotation() - .forEach(endpoint -> updateGlobalDnsOf(endpoint, inactiveZones, routeEntry.getValue(), deployment, owner)); + .forEach(endpoint -> updateGlobalDnsOf(endpoint, routeEntry.getValue(), deployment, owner)); } } /** Update global DNS records for given global endpoint */ - private void updateGlobalDnsOf(Endpoint endpoint, Set inactiveZones, List policies, + private void updateGlobalDnsOf(Endpoint endpoint, List policies, Optional deployment, Optional owner) { if (endpoint.scope() != Endpoint.Scope.global) throw new IllegalArgumentException("Endpoint " + endpoint + " is not global"); if (deployment.isPresent() && !endpoint.deployments().contains(deployment.get())) return; - Collection regionEndpoints = computeRegionEndpoints(endpoint, policies, inactiveZones); + Collection regionEndpoints = computeRegionEndpoints(endpoint, policies); Set latencyTargets = new LinkedHashSet<>(); Set inactiveLatencyTargets = new LinkedHashSet<>(); for (var regionEndpoint : regionEndpoints) { @@ -237,7 +235,7 @@ public class RoutingPolicies { } /** Compute region endpoints and their targets from given policies */ - private Collection computeRegionEndpoints(Endpoint parent, List policies, Set inactiveZones) { + private Collection computeRegionEndpoints(Endpoint parent, List policies) { if (!parent.scope().multiDeployment()) { throw new IllegalArgumentException(parent + " has unexpected scope"); } @@ -248,7 +246,7 @@ public class RoutingPolicies { Endpoint endpoint = policy.regionEndpointIn(controller.system(), RoutingMethod.exclusive, parent.generated()); var zonePolicy = db.readZoneRoutingPolicy(policy.id().zone()); long weight = 1; - if (isConfiguredOut(zonePolicy, policy, inactiveZones)) { + if (isConfiguredOut(zonePolicy, policy)) { weight = 0; // A record with 0 weight will not receive traffic. If all records within a group have 0 // weight, traffic is routed to all records with equal probability. } @@ -270,9 +268,8 @@ public class RoutingPolicies { } - private void updateApplicationDnsOf(RoutingPolicyList routingPolicies, Set inactiveZones, - DeploymentId deployment, Optional owner, - @SuppressWarnings("unused") Mutex lock) { + private void updateApplicationDnsOf(RoutingPolicyList routingPolicies, DeploymentId deployment, + Optional owner, @SuppressWarnings("unused") Mutex lock) { // In the context of single deployment (which this is) there is only one routing policy per routing ID. I.e. // there is no scenario where more than one deployment within an instance can be a member the same // application-level endpoint. However, to allow this in the future the routing table remains @@ -297,7 +294,7 @@ public class RoutingPolicies { Set activeTargets = targetsByEndpoint.computeIfAbsent(endpoint, (k) -> new LinkedHashSet<>()); Set inactiveTargets = inactiveTargetsByEndpoint.computeIfAbsent(endpoint, (k) -> new LinkedHashSet<>()); - if (isConfiguredOut(zonePolicy, policy, inactiveZones)) { + if (isConfiguredOut(zonePolicy, policy)) { inactiveTargets.add(Target.weighted(policy, target)); } else { activeTargets.add(Target.weighted(policy, target)); @@ -489,7 +486,7 @@ public class RoutingPolicies { } /** Remove unreferenced instance endpoints from DNS */ - private void removeGlobalDnsUnreferencedBy(LoadBalancerAllocation allocation, RoutingPolicyList deploymentPolicies, Set inactiveZones, @SuppressWarnings("unused") Mutex lock) { + private void removeGlobalDnsUnreferencedBy(LoadBalancerAllocation allocation, RoutingPolicyList deploymentPolicies, @SuppressWarnings("unused") Mutex lock) { Set removalCandidates = new HashSet<>(deploymentPolicies.asInstanceRoutingTable().keySet()); Set activeRoutingIds = instanceRoutingIds(allocation); removalCandidates.removeAll(activeRoutingIds); @@ -500,7 +497,7 @@ public class RoutingPolicies { // This removes all ALIAS records having this DNS name. There is no attempt to delete only the entry for the // affected zone. Instead, the correct set of records is (re)created by updateGlobalDnsOf for (var endpoint : endpoints) { - for (var regionEndpoint : computeRegionEndpoints(endpoint, deploymentPolicies.asList(), inactiveZones)) { + for (var regionEndpoint : computeRegionEndpoints(endpoint, deploymentPolicies.asList())) { Record.Type type = regionEndpoint.zoneDirectTargets().isEmpty() ? Record.Type.ALIAS : Record.Type.DIRECT; controller.nameServiceForwarder().removeRecords(type, RecordName.from(regionEndpoint.target().name().value()), @@ -571,14 +568,12 @@ public class RoutingPolicies { } /** Returns whether the endpoints of given policy are configured {@link RoutingStatus.Value#out} */ - private static boolean isConfiguredOut(ZoneRoutingPolicy zonePolicy, RoutingPolicy policy, Set inactiveZones) { + private static boolean isConfiguredOut(ZoneRoutingPolicy zonePolicy, RoutingPolicy policy) { // A deployment can be configured out from endpoints at any of the following levels: // - zone level (ZoneRoutingPolicy) // - deployment level (RoutingPolicy) - // - application package level (deployment.xml) return zonePolicy.routingStatus().value() == RoutingStatus.Value.out || - policy.routingStatus().value() == RoutingStatus.Value.out || - inactiveZones.contains(policy.id().zone()); + policy.routingStatus().value() == RoutingStatus.Value.out; } /** Represents records for a region-wide endpoint */ @@ -683,17 +678,6 @@ public class RoutingPolicies { } - /** Returns zones where global routing is declared inactive for instance through deploymentSpec */ - private static Set inactiveZones(ApplicationId instance, DeploymentSpec deploymentSpec) { - var instanceSpec = deploymentSpec.instance(instance.instance()); - if (instanceSpec.isEmpty()) return Set.of(); - return instanceSpec.get().zones().stream() - .filter(zone -> zone.environment().isProduction()) - .filter(zone -> !zone.active()) - .map(zone -> ZoneId.from(zone.environment(), zone.region().get())) - .collect(Collectors.toUnmodifiableSet()); - } - /** Returns the name updater to use for given endpoint */ private NameServiceForwarder nameServiceForwarder(Endpoint endpoint) { return switch (endpoint.routingMethod()) { diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/ApplicationPackageBuilder.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/ApplicationPackageBuilder.java index a70125815b1..fb3026e1d80 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/ApplicationPackageBuilder.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/ApplicationPackageBuilder.java @@ -156,15 +156,8 @@ public class ApplicationPackageBuilder { return this; } - public ApplicationPackageBuilder region(RegionName regionName) { - return region(regionName, true); - } - public ApplicationPackageBuilder region(String regionName) { - prodBody.append(" ") - .append(regionName) - .append("\n"); - return this; + return region(RegionName.from(regionName)); } public ApplicationPackageBuilder region(String regionName, String cloudAccount) { @@ -181,10 +174,8 @@ public class ApplicationPackageBuilder { return this; } - public ApplicationPackageBuilder region(RegionName regionName, boolean active) { - prodBody.append(" ") + public ApplicationPackageBuilder region(RegionName regionName) { + prodBody.append(" ") .append(regionName.value()) .append("\n"); return this; diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java index e5a10bb5889..3fb4a040e0d 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTriggerTest.java @@ -1312,19 +1312,19 @@ public class DeploymentTriggerTest { - us-west-1 + us-west-1 - us-east-3 + us-east-3 - eu-west-1 + eu-west-1 - us-central-1 + us-central-1 - ap-northeast-1 - ap-northeast-2 + ap-northeast-1 + ap-northeast-2 us-central-1 @@ -1335,7 +1335,7 @@ public class DeploymentTriggerTest { ap-northeast-1 us-east-3 - ap-southeast-1 + ap-southeast-1 @@ -1350,7 +1350,7 @@ public class DeploymentTriggerTest { - eu-west-1 + eu-west-1 eu-west-1 @@ -1363,7 +1363,7 @@ public class DeploymentTriggerTest { - eu-west-1 + eu-west-1 diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/routing/RoutingPoliciesTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/routing/RoutingPoliciesTest.java index e41856b0c3d..46ec42cab8f 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/routing/RoutingPoliciesTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/routing/RoutingPoliciesTest.java @@ -642,28 +642,6 @@ public class RoutingPoliciesTest { assertEquals(RoutingStatus.Value.in, policy1.routingStatus().value()); assertEquals(RoutingStatus.Agent.tenant, policy1.routingStatus().agent()); assertEquals(changedAt.truncatedTo(ChronoUnit.MILLIS), policy1.routingStatus().changedAt()); - - // Deployment is set out through a new deployment.xml - var applicationPackage2 = applicationPackageBuilder() - .region(zone1.region()) - .region(zone2.region(), false) - .endpoint("r0", "c0", zone1.region().value(), zone2.region().value()) - .endpoint("r1", "c0", zone1.region().value(), zone2.region().value()) - .build(); - context.submit(applicationPackage2).deferLoadBalancerProvisioningIn(Environment.prod).deploy(); - tester.assertTargets(context.instanceId(), EndpointId.of("r0"), 0, zone1); - tester.assertTargets(context.instanceId(), EndpointId.of("r1"), 0, zone1); - - // ... back in - var applicationPackage3 = applicationPackageBuilder() - .region(zone1.region()) - .region(zone2.region()) - .endpoint("r0", "c0", zone1.region().value(), zone2.region().value()) - .endpoint("r1", "c0", zone1.region().value(), zone2.region().value()) - .build(); - context.submit(applicationPackage3).deferLoadBalancerProvisioningIn(Environment.prod).deploy(); - tester.assertTargets(context.instanceId(), EndpointId.of("r0"), 0, zone1, zone2); - tester.assertTargets(context.instanceId(), EndpointId.of("r1"), 0, zone1, zone2); } @Test -- cgit v1.2.3