summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java39
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/ApplicationPackageValidator.java5
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackage.java23
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java1
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java4
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java30
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackageTest.java37
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ZoneRegistryMock.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/routing/responses/recursion/environment.json4
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
},
{