diff options
Diffstat (limited to 'controller-server/src')
9 files changed, 83 insertions, 62 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java index 08a8440fbe2..eedc94c729c 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java @@ -10,6 +10,7 @@ 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.CloudAccount; +import com.yahoo.config.provision.CloudName; import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.InstanceName; import com.yahoo.config.provision.TenantName; @@ -694,24 +695,22 @@ public class ApplicationController { public Optional<CloudAccount> decideCloudAccountOf(DeploymentId deployment, DeploymentSpec spec) { ZoneId zoneId = deployment.zoneId(); - Optional<CloudAccount> requestedAccount = spec.instance(deployment.applicationId().instance()) - .flatMap(instanceSpec -> instanceSpec.cloudAccount(zoneId.environment(), - Optional.of(zoneId.region()))) - .or(spec::cloudAccount); - if (requestedAccount.isEmpty() || requestedAccount.get().isUnspecified()) { + CloudName cloud = controller.zoneRegistry().get(zoneId).getCloudName(); + CloudAccount requestedAccount = spec.cloudAccount(cloud, deployment.applicationId().instance(), deployment.zoneId()); + if (requestedAccount.isUnspecified()) return Optional.empty(); - } + TenantName tenant = deployment.applicationId().tenant(); Set<CloudAccount> tenantAccounts = accountsOf(tenant); - if (!tenantAccounts.contains(requestedAccount.get())) { - throw new IllegalArgumentException("Requested cloud account '" + requestedAccount.get().value() + + if ( ! tenantAccounts.contains(requestedAccount)) { + throw new IllegalArgumentException("Requested cloud account '" + requestedAccount.value() + "' is not valid for tenant '" + tenant + "'"); } - if ( ! controller.zoneRegistry().hasZone(zoneId, requestedAccount.get())) { + if ( ! controller.zoneRegistry().hasZone(zoneId, requestedAccount)) { throw new IllegalArgumentException("Zone " + zoneId + " is not configured in requested cloud account '" + - requestedAccount.get().value() + "'"); + requestedAccount.value() + "'"); } - return requestedAccount; + return Optional.of(requestedAccount); } private LockedApplication withoutDeletedDeployments(LockedApplication application, InstanceName instance) { @@ -948,7 +947,7 @@ public class ApplicationController { * @param applicationPackage application package * @param deployer principal initiating the deployment, possibly empty */ - public void verifyApplicationIdentityConfiguration(TenantName tenantName, Optional<InstanceName> instanceName, Optional<ZoneId> zoneId, ApplicationPackage applicationPackage, Optional<Principal> deployer) { + public void verifyApplicationIdentityConfiguration(TenantName tenantName, Optional<DeploymentId> deployment, ApplicationPackage applicationPackage, Optional<Principal> deployer) { Optional<AthenzDomain> identityDomain = applicationPackage.deploymentSpec().athenzDomain() .map(domain -> new AthenzDomain(domain.value())); if (identityDomain.isEmpty()) { @@ -969,14 +968,12 @@ public class ApplicationController { // Either the user is member of the domain admin role, or is given the "launch" privilege on the service. Optional<AthenzUser> athenzUser = getUser(deployer); if (athenzUser.isPresent()) { - // We only need to validate the root and instance in deployment.xml. Dev/perf entries are found at the instance level as well. - var zone = zoneId.orElseThrow(() -> new IllegalArgumentException("Unable to evaluate access, no zone provided in deployment")); - var serviceToLaunch = instanceName - .flatMap(instance -> applicationPackage.deploymentSpec().instance(instance)) - .flatMap(instanceSpec -> instanceSpec.athenzService(zone.environment(), zone.region())) - .or(() -> applicationPackage.deploymentSpec().athenzService()) - .map(service -> new AthenzService(identityDomain.get(), service.value())); - + // This is a direct deployment, and we need only validate what the configserver will actually launch. + DeploymentId id = deployment.orElseThrow(() -> new IllegalArgumentException("Unable to evaluate access, no zone provided in deployment")); + var serviceToLaunch = applicationPackage.deploymentSpec().athenzService(id.applicationId().instance(), + id.zoneId().environment(), + id.zoneId().region()) + .map(service -> new AthenzService(identityDomain.get(), service.value())); if (serviceToLaunch.isPresent()) { if ( ! ((AthenzFacade) accessControl).canLaunch(athenzUser.get(), serviceToLaunch.get()) && // launch privilege @@ -989,7 +986,7 @@ public class ApplicationController { } else { // This is a rare edge case where deployment.xml specifies athenz-service on each step, but not on the root. // It is undefined which service should be launched, so handle this as an error. - throw new IllegalArgumentException("Athenz domain configured, but no service defined for deployment to " + zone.value()); + throw new IllegalArgumentException("Athenz domain configured, but no service defined for deployment to " + id.zoneId().value()); } } else { // If this is a deployment pipeline, verify that the domain in deployment.xml is the same as the tenant domain. Access control is already validated before this step. diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/ApplicationPackageValidator.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/ApplicationPackageValidator.java index bd42587576d..0d8e7745f65 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/ApplicationPackageValidator.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/ApplicationPackageValidator.java @@ -67,11 +67,10 @@ public class ApplicationPackageValidator { private void validateCloudAccounts(Application application, ApplicationPackage applicationPackage) { Set<CloudAccount> tenantAccounts = new TreeSet<>(controller.applications().accountsOf(application.id().tenant())); - Set<CloudAccount> declaredAccounts = new TreeSet<>(); - applicationPackage.deploymentSpec().cloudAccount().ifPresent(declaredAccounts::add); + Set<CloudAccount> declaredAccounts = new TreeSet<>(applicationPackage.deploymentSpec().cloudAccounts().values()); for (DeploymentInstanceSpec instance : applicationPackage.deploymentSpec().instances()) for (ZoneId zone : controller.zoneRegistry().zones().controllerUpgraded().ids()) - instance.cloudAccount(zone.environment(), Optional.of(zone.region())).ifPresent(declaredAccounts::add); + declaredAccounts.addAll(instance.cloudAccounts(zone.environment(), zone.region()).values()); declaredAccounts.removeIf(tenantAccounts::contains); declaredAccounts.removeIf(CloudAccount::isUnspecified); diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackage.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackage.java index 7d4cd6b8747..eceaae80cef 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackage.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackage.java @@ -6,6 +6,7 @@ import com.yahoo.config.application.api.DeploymentSpec.Step; import com.yahoo.config.provision.AthenzDomain; import com.yahoo.config.provision.AthenzService; import com.yahoo.config.provision.CloudAccount; +import com.yahoo.config.provision.CloudName; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.InstanceName; import com.yahoo.config.provision.NodeResources; @@ -50,6 +51,7 @@ import java.util.jar.JarInputStream; import java.util.jar.Manifest; import java.util.regex.Pattern; +import static com.yahoo.vespa.hosted.controller.api.integration.deployment.TesterCloud.Suite.of; import static com.yahoo.vespa.hosted.controller.api.integration.deployment.TesterCloud.Suite.production; import static com.yahoo.vespa.hosted.controller.api.integration.deployment.TesterCloud.Suite.staging; import static com.yahoo.vespa.hosted.controller.api.integration.deployment.TesterCloud.Suite.staging_setup; @@ -78,7 +80,7 @@ public class TestPackage { private final ApplicationPackageStream applicationPackageStream; private final X509Certificate certificate; - public TestPackage(Supplier<InputStream> inZip, boolean isPublicSystem, RunId id, Testerapp testerApp, + public TestPackage(Supplier<InputStream> inZip, boolean isPublicSystem, CloudName cloud, RunId id, Testerapp testerApp, DeploymentSpec spec, Instant certificateValidFrom, Duration certificateValidDuration) { KeyPair keyPair; if (certificateValidFrom != null) { @@ -130,7 +132,7 @@ public class TestPackage { testerApp))); entries.put(deploymentFile, - __ -> new ByteArrayInputStream(deploymentXml(id.tester(), id.application().instance(), id.type().zone(), spec))); + __ -> new ByteArrayInputStream(deploymentXml(id.tester(), id.application().instance(), cloud, id.type().zone(), spec))); if (certificate != null) { entries.put("artifacts/key", __ -> new ByteArrayInputStream(KeyUtils.toPem(keyPair.getPrivate()).getBytes(UTF_8))); @@ -296,17 +298,18 @@ public class TestPackage { } /** Returns a dummy deployment xml which sets up the service identity for the tester, if present. */ - static byte[] deploymentXml(TesterId id, InstanceName instance, ZoneId zone, DeploymentSpec original) { + static byte[] deploymentXml(TesterId id, InstanceName instance, CloudName cloud, ZoneId zone, DeploymentSpec original) { Optional<AthenzDomain> athenzDomain = original.athenzDomain(); Optional<AthenzService> athenzService = original.requireInstance(instance) .athenzService(zone.environment(), zone.region()); - Optional<CloudAccount> cloudAccount = original.requireInstance(instance) - .cloudAccount(zone.environment(), Optional.of(zone.region())); - Optional<Duration> hostTTL = zone.environment().isProduction() - ? original.requireInstance(instance) - .steps().stream().filter(step -> step.isTest() && step.concerns(zone.environment(), Optional.of(zone.region()))) - .findFirst().flatMap(Step::hostTTL) - : original.requireInstance(instance).hostTTL(zone.environment(), Optional.of(zone.region())); + Optional<CloudAccount> cloudAccount = Optional.of(original.cloudAccount(cloud, instance, zone)) + .filter(account -> ! account.isUnspecified()); + Optional<Duration> hostTTL = (zone.environment().isProduction() + ? original.requireInstance(instance) + .steps().stream().filter(step -> step.isTest() && step.concerns(zone.environment(), Optional.of(zone.region()))) + .findFirst().flatMap(Step::hostTTL) + : original.requireInstance(instance).hostTTL(zone.environment(), Optional.of(zone.region()))) + .filter(__ -> cloudAccount.isPresent()); String deploymentSpec = "<?xml version='1.0' encoding='UTF-8'?>\n" + "<deployment version='1.0'" + diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java index 1441cc7a44e..59ebe0d07d3 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java @@ -912,6 +912,7 @@ public class InternalStepRunner implements StepRunner { TestPackage testPackage = new TestPackage(() -> controller.applications().applicationStore().streamTester(id.application().tenant(), id.application().application(), revision), controller.system().isPublic(), + controller.zoneRegistry().get(id.type().zone()).getCloudName(), id, controller.controllerConfig().steprunner().testerapp(), spec, diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java index 28b048613ef..4324b98acba 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java @@ -2436,8 +2436,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { ApplicationPackage applicationPackage = new ApplicationPackage(dataParts.get(APPLICATION_ZIP)); controller.applications().verifyApplicationIdentityConfiguration(id.tenant(), - Optional.of(id.instance()), - Optional.of(type.zone()), + Optional.of(new DeploymentId(id, type.zone())), applicationPackage, Optional.of(requireUserPrincipal(request))); @@ -3079,7 +3078,6 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { controller.applications().verifyApplicationIdentityConfiguration(tenantName, Optional.empty(), - Optional.empty(), applicationPackage, Optional.of(requireUserPrincipal(request))); 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 8e3ccca0dd1..9efdee28063 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 @@ -72,7 +72,9 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import static com.yahoo.config.provision.SystemName.main; +import static com.yahoo.vespa.hosted.controller.deployment.DeploymentContext.devAwsUsEast2a; import static com.yahoo.vespa.hosted.controller.deployment.DeploymentContext.devUsEast1; +import static com.yahoo.vespa.hosted.controller.deployment.DeploymentContext.productionAwsUsEast1a; import static com.yahoo.vespa.hosted.controller.deployment.DeploymentContext.productionUsEast3; import static com.yahoo.vespa.hosted.controller.deployment.DeploymentContext.productionUsWest1; import static com.yahoo.vespa.hosted.controller.deployment.DeploymentContext.stagingTest; @@ -1466,8 +1468,8 @@ public class ControllerTest { @Test void testCloudAccount() { DeploymentContext context = tester.newDeploymentContext(); - ZoneId devZone = devUsEast1.zone(); - ZoneId prodZone = productionUsWest1.zone(); + ZoneId devZone = devAwsUsEast2a.zone(); + ZoneId prodZone = productionAwsUsEast1a.zone(); String cloudAccount = "aws:012345678912"; var applicationPackage = new ApplicationPackageBuilder() .cloudAccount(cloudAccount) @@ -1481,25 +1483,24 @@ public class ControllerTest { .getMessage()); assertEquals("cloud accounts [aws:012345678912] are not valid for tenant tenant", assertThrows(IllegalArgumentException.class, - () -> context.runJob(devUsEast1, applicationPackage)) + () -> context.runJob(devZone, applicationPackage)) .getMessage()); // Deployment fails because zone is not configured in requested cloud account tester.controllerTester().flagSource().withListFlag(PermanentFlags.CLOUD_ACCOUNTS.id(), List.of(cloudAccount), String.class); - assertEquals("Zone test.us-east-1 is not configured in requested cloud account 'aws:012345678912'", + assertEquals("Zone prod.aws-us-east-1a is not configured in requested cloud account 'aws:012345678912'", assertThrows(IllegalArgumentException.class, () -> context.submit(applicationPackage)) .getMessage()); - assertEquals("Zone dev.us-east-1 is not configured in requested cloud account 'aws:012345678912'", + + context.runJob(devUsEast1, applicationPackage); // OK, because no special account is used. + assertEquals("Zone dev.aws-us-east-2a is not configured in requested cloud account 'aws:012345678912'", assertThrows(IllegalArgumentException.class, - () -> context.runJob(devUsEast1, applicationPackage)) + () -> context.runJob(devZone, applicationPackage)) .getMessage()); // Deployment to prod succeeds once all zones are configured in requested account - tester.controllerTester().zoneRegistry().configureCloudAccount(CloudAccount.from(cloudAccount), - systemTest.zone(), - stagingTest.zone(), - prodZone); + tester.controllerTester().zoneRegistry().configureCloudAccount(CloudAccount.from(cloudAccount), prodZone); context.submit(applicationPackage).deploy(); // Dev zone is added as a configured zone and deployment succeeds @@ -1507,17 +1508,22 @@ public class ControllerTest { context.runJob(devZone, applicationPackage); // All deployments use the custom account - for (var zoneId : List.of(systemTest.zone(), stagingTest.zone(), devZone, prodZone)) { + for (var zoneId : List.of(devZone, prodZone)) { assertEquals(cloudAccount, tester.controllerTester().configServer() .cloudAccount(context.deploymentIdIn(zoneId)) .get().value()); } + // Tests are run in the default cloud, however, where the default cloud account is used + for (var zoneId : List.of(systemTest.zone(), stagingTest.zone())) { + assertEquals(Optional.empty(), tester.controllerTester().configServer() + .cloudAccount(context.deploymentIdIn(zoneId))); + } } @Test void testCloudAccountWithDefaultOverride() { var context = tester.newDeploymentContext(); - var prodZone1 = productionUsEast3.zone(); + var prodZone1 = productionAwsUsEast1a.zone(); var prodZone2 = productionUsWest1.zone(); var cloudAccount = "aws:012345678912"; var application = new ApplicationPackageBuilder() diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackageTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackageTest.java index cfe740069db..e7109b551ed 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackageTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackageTest.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.hosted.controller.application.pkg; import com.yahoo.config.application.api.DeploymentSpec; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.CloudName; import com.yahoo.config.provision.InstanceName; import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.zone.ZoneId; @@ -24,6 +25,9 @@ import java.util.Set; import java.util.jar.JarOutputStream; import java.util.zip.ZipEntry; +import static com.yahoo.config.provision.CloudName.AWS; +import static com.yahoo.config.provision.CloudName.DEFAULT; +import static com.yahoo.config.provision.CloudName.GCP; import static com.yahoo.vespa.hosted.controller.api.integration.deployment.TesterCloud.Suite.production; import static com.yahoo.vespa.hosted.controller.api.integration.deployment.TesterCloud.Suite.staging; import static com.yahoo.vespa.hosted.controller.api.integration.deployment.TesterCloud.Suite.staging_setup; @@ -126,6 +130,7 @@ public class TestPackageTest { "artifacts/key", new byte[0])); TestPackage bundleTests = new TestPackage(() -> new ByteArrayInputStream(bundleZip), false, + CloudName.DEFAULT, new RunId(ApplicationId.defaultId(), JobType.dev("abc"), 123), new Testerapp.Builder().tenantCdBundle("foo").runtimeProviderClass("bar").build(), DeploymentSpec.fromXml(""" @@ -150,7 +155,7 @@ public class TestPackageTest { @Test void generates_correct_deployment_spec() { DeploymentSpec spec = DeploymentSpec.fromXml(""" - <deployment version='1.0' athenz-domain='domain' athenz-service='service' cloud-account='123123123123' empty-host-ttl='1h'> + <deployment version='1.0' athenz-domain='domain' athenz-service='service' cloud-account='123123123123,gcp:foobar' empty-host-ttl='1h'> <test empty-host-ttl='1d' /> <staging cloud-account='aws:321321321321'/> <prod> @@ -163,19 +168,31 @@ public class TestPackageTest { </prod> </deployment> """); - verifyAttributes("aws:123123123123", 1440, ZoneId.from("test", "us-east-1"), spec); - verifyAttributes("aws:321321321321", 60, ZoneId.from("staging", "us-east-2"), spec); - verifyAttributes("aws:123123123123", 60, ZoneId.from("prod", "us-east-3"), spec); - verifyAttributes("aws:123123123123", 0, ZoneId.from("prod", "us-west-1"), spec); - verifyAttributes("aws:123123123123", 60, ZoneId.from("prod", "us-central-1"), spec); + verifyAttributes("", 0, DEFAULT, ZoneId.from("test", "us-east-1"), spec); + verifyAttributes("", 0, DEFAULT, ZoneId.from("staging", "us-east-2"), spec); + verifyAttributes("", 0, DEFAULT, ZoneId.from("prod", "us-east-3"), spec); + verifyAttributes("", 0, DEFAULT, ZoneId.from("prod", "us-west-1"), spec); + verifyAttributes("", 0, DEFAULT, ZoneId.from("prod", "us-central-1"), spec); + + verifyAttributes("aws:123123123123", 1440, AWS, ZoneId.from("test", "us-east-1"), spec); + verifyAttributes("aws:321321321321", 60, AWS, ZoneId.from("staging", "us-east-2"), spec); + verifyAttributes("aws:123123123123", 60, AWS, ZoneId.from("prod", "us-east-3"), spec); + verifyAttributes("aws:123123123123", 0, AWS, ZoneId.from("prod", "us-west-1"), spec); + verifyAttributes("aws:123123123123", 60, AWS, ZoneId.from("prod", "us-central-1"), spec); + + verifyAttributes("gcp:foobar", 1440, GCP, ZoneId.from("test", "us-east-1"), spec); + verifyAttributes("", 0, GCP, ZoneId.from("staging", "us-east-2"), spec); + verifyAttributes("gcp:foobar", 60, GCP, ZoneId.from("prod", "us-east-3"), spec); + verifyAttributes("gcp:foobar", 0, GCP, ZoneId.from("prod", "us-west-1"), spec); + verifyAttributes("gcp:foobar", 60, GCP, ZoneId.from("prod", "us-central-1"), spec); } - private void verifyAttributes(String expectedAccount, int expectedTTL, ZoneId zone, DeploymentSpec spec) { + private void verifyAttributes(String expectedAccount, int expectedTTL, CloudName cloud, ZoneId zone, DeploymentSpec spec) { assertEquals("<?xml version='1.0' encoding='UTF-8'?>\n" + - "<deployment version='1.0' athenz-domain='domain' athenz-service='service' " + - "cloud-account='" + expectedAccount + "' empty-host-ttl='" + expectedTTL + "m'> " + + "<deployment version='1.0' athenz-domain='domain' athenz-service='service'" + + (expectedAccount.isEmpty() ? "" : " cloud-account='" + expectedAccount + "' empty-host-ttl='" + expectedTTL + "m'") + "> " + "<instance id='default-t' /></deployment>", - new String(TestPackage.deploymentXml(TesterId.of(ApplicationId.defaultId()), InstanceName.defaultName(), zone, spec))); + new String(TestPackage.deploymentXml(TesterId.of(ApplicationId.defaultId()), InstanceName.defaultName(), cloud, zone, spec))); } @Test diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ZoneRegistryMock.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ZoneRegistryMock.java index 76cf7c9a75c..e6a9014df94 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ZoneRegistryMock.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ZoneRegistryMock.java @@ -71,7 +71,7 @@ public class ZoneRegistryMock extends AbstractComponent implements ZoneRegistry this.zones = List.of(ZoneApiMock.fromId("test.us-east-1"), ZoneApiMock.fromId("staging.us-east-3"), ZoneApiMock.fromId("dev.us-east-1"), - ZoneApiMock.fromId("dev.aws-us-east-2a"), + ZoneApiMock.newBuilder().withId("dev.aws-us-east-2a").withCloud("aws").build(), ZoneApiMock.fromId("perf.us-east-3"), ZoneApiMock.newBuilder().withId("prod.aws-us-east-1a").withCloud("aws").build(), ZoneApiMock.newBuilder().withId("prod.aws-us-east-1b").withCloud("aws").build(), diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/routing/responses/recursion/environment.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/routing/responses/recursion/environment.json index 2d4553978c6..3b085162393 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/routing/responses/recursion/environment.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/routing/responses/recursion/environment.json @@ -25,11 +25,11 @@ "changedAt": 0 }, { - "routingMethod": "sharedLayer4", + "routingMethod": "exclusive", "environment": "dev", "region": "aws-us-east-2a", "status": "in", - "agent": "operator", + "agent": "system", "changedAt": 0 }, { |