diff options
author | Morten Tokle <mortent@oath.com> | 2018-10-01 14:35:21 +0200 |
---|---|---|
committer | Morten Tokle <mortent@oath.com> | 2018-10-02 09:19:24 +0200 |
commit | 365e753c53644910dca0825a8a339c130897ecb6 (patch) | |
tree | 31066caa486feff87455596d451ff0518ee26bb3 | |
parent | d659f7ba335fc70a0488304c4867c185a9759e97 (diff) |
Add systemname to global rotation name
11 files changed, 70 insertions, 45 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java index cd5178d80ac..366be35fe15 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java @@ -8,15 +8,16 @@ import com.yahoo.config.application.api.ValidationOverrides; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.HostName; +import com.yahoo.config.provision.SystemName; import com.yahoo.vespa.hosted.controller.api.integration.MetricsService.ApplicationMetrics; import com.yahoo.vespa.hosted.controller.api.integration.organization.IssueId; import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneId; import com.yahoo.vespa.hosted.controller.application.ApplicationActivity; -import com.yahoo.vespa.hosted.controller.application.ApplicationRotation; import com.yahoo.vespa.hosted.controller.application.ApplicationVersion; import com.yahoo.vespa.hosted.controller.application.Change; import com.yahoo.vespa.hosted.controller.application.Deployment; import com.yahoo.vespa.hosted.controller.application.DeploymentJobs; +import com.yahoo.vespa.hosted.controller.application.GlobalDnsName; import com.yahoo.vespa.hosted.controller.application.RotationStatus; import com.yahoo.vespa.hosted.controller.rotation.RotationId; @@ -184,9 +185,14 @@ public class Application { .min(Comparator.naturalOrder()); } - /** Returns the global rotation of this, if present */ - public Optional<ApplicationRotation> rotation() { - return rotation.map(rotation -> new ApplicationRotation(id, rotation)); + /** Returns the global rotation id of this, if present */ + public Optional<RotationId> rotation() { + return rotation; + } + + /** Returns the global rotation dns name, if present */ + public Optional<GlobalDnsName> globalDnsName(SystemName system) { + return rotation.map(rotation -> new GlobalDnsName(id, rotation, system)); } /** Returns the status of the global rotation assigned to this. Wil be empty if this does not have a global rotation. */ 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 b3158102182..c2dbc8bdc59 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 @@ -339,8 +339,9 @@ public class ApplicationController { application = withRotation(application, zone); Set<String> rotationNames = new HashSet<>(); Set<String> cnames = new HashSet<>(); - application.get().rotation().ifPresent(applicationRotation -> { - rotationNames.add(applicationRotation.id().asString()); + Application app = application.get(); + app.globalDnsName(controller.system()).ifPresent(applicationRotation -> { + rotationNames.add(app.rotation().orElseThrow(() -> new RuntimeException("Global Dns assigned, but no rotation id present")).asString()); cnames.add(applicationRotation.dnsName()); cnames.add(applicationRotation.secureDnsName()); cnames.add(applicationRotation.oathDnsName()); @@ -415,9 +416,9 @@ public class ApplicationController { application = application.with(rotation.id()); store(application); // store assigned rotation even if deployment fails - registerRotationInDns(rotation, application.get().rotation().get().dnsName()); - registerRotationInDns(rotation, application.get().rotation().get().secureDnsName()); - registerRotationInDns(rotation, application.get().rotation().get().oathDnsName()); + registerRotationInDns(rotation, application.get().globalDnsName(controller.system()).get().dnsName()); + registerRotationInDns(rotation, application.get().globalDnsName(controller.system()).get().secureDnsName()); + registerRotationInDns(rotation, application.get().globalDnsName(controller.system()).get().oathDnsName()); } } return application; diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java index 433a6d3ed38..eddf4e6b3a1 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java @@ -10,19 +10,18 @@ import com.yahoo.config.provision.HostName; import com.yahoo.vespa.curator.Lock; import com.yahoo.vespa.hosted.controller.api.integration.MetricsService; import com.yahoo.vespa.hosted.controller.api.integration.MetricsService.ApplicationMetrics; +import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType; import com.yahoo.vespa.hosted.controller.api.integration.organization.IssueId; -import com.yahoo.vespa.hosted.controller.application.RotationStatus; import com.yahoo.vespa.hosted.controller.api.integration.zone.ZoneId; -import com.yahoo.vespa.hosted.controller.application.ApplicationRotation; import com.yahoo.vespa.hosted.controller.application.ApplicationVersion; import com.yahoo.vespa.hosted.controller.application.Change; import com.yahoo.vespa.hosted.controller.application.ClusterInfo; import com.yahoo.vespa.hosted.controller.application.ClusterUtilization; import com.yahoo.vespa.hosted.controller.application.Deployment; import com.yahoo.vespa.hosted.controller.application.DeploymentJobs; -import com.yahoo.vespa.hosted.controller.api.integration.deployment.JobType; import com.yahoo.vespa.hosted.controller.application.DeploymentMetrics; import com.yahoo.vespa.hosted.controller.application.JobStatus; +import com.yahoo.vespa.hosted.controller.application.RotationStatus; import com.yahoo.vespa.hosted.controller.rotation.RotationId; import java.time.Instant; @@ -66,7 +65,7 @@ public class LockedApplication { application.deployments(), application.deploymentJobs(), application.change(), application.outstandingChange(), application.ownershipIssueId(), application.metrics(), - application.rotation().map(ApplicationRotation::id), + application.rotation(), application.rotationStatus()); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationRotation.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/GlobalDnsName.java index 7965bac9aca..18ec15d35ac 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationRotation.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/GlobalDnsName.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.hosted.controller.application; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.SystemName; import com.yahoo.vespa.hosted.controller.rotation.RotationId; import java.net.URI; @@ -11,7 +12,7 @@ import java.net.URI; * * @author mpolden */ -public class ApplicationRotation { +public class GlobalDnsName { // TODO: TLS: Remove all non-secure stuff when all traffic is on HTTPS. public static final String DNS_SUFFIX = "global.vespa.yahooapis.com"; @@ -22,30 +23,32 @@ public class ApplicationRotation { private final URI url; private final URI secureUrl; private final URI oathUrl; - private final RotationId id; - public ApplicationRotation(ApplicationId application, RotationId id) { - this.url = URI.create(String.format("http://%s.%s.%s:%d/", + public GlobalDnsName(ApplicationId application, RotationId id, SystemName system) { + this.url = URI.create(String.format("http://%s%s.%s.%s:%d/", + getSystemPart(system, "."), sanitize(application.application().value()), sanitize(application.tenant().value()), DNS_SUFFIX, port)); - this.secureUrl = URI.create(String.format("https://%s--%s.%s:%d/", + this.secureUrl = URI.create(String.format("https://%s%s--%s.%s:%d/", + getSystemPart(system, "--"), sanitize(application.application().value()), sanitize(application.tenant().value()), DNS_SUFFIX, securePort)); - this.oathUrl = URI.create(String.format("https://%s--%s.%s:%d/", - sanitize(application.application().value()), - sanitize(application.tenant().value()), - OATH_DNS_SUFFIX, - securePort)); - this.id = id; + this.oathUrl = URI.create(String.format("https://%s%s--%s.%s:%d/", + getSystemPart(system, "--"), + sanitize(application.application().value()), + sanitize(application.tenant().value()), + OATH_DNS_SUFFIX, + securePort)); } - /** ID of the rotation */ - public RotationId id() { - return id; + private String getSystemPart(SystemName system, String separator) { + return SystemName.main.equals(system) + ? "" + : system.name() + separator; } /** URL to this rotation */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DnsMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DnsMaintainer.java index 3a60239fb1d..df368c3c60c 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DnsMaintainer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DnsMaintainer.java @@ -5,7 +5,7 @@ import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.api.integration.dns.NameService; import com.yahoo.vespa.hosted.controller.api.integration.dns.Record; import com.yahoo.vespa.hosted.controller.api.integration.dns.RecordData; -import com.yahoo.vespa.hosted.controller.application.ApplicationRotation; +import com.yahoo.vespa.hosted.controller.application.GlobalDnsName; import com.yahoo.vespa.hosted.controller.rotation.Rotation; import com.yahoo.vespa.hosted.controller.rotation.RotationId; import com.yahoo.vespa.hosted.controller.rotation.RotationLock; @@ -60,8 +60,8 @@ public class DnsMaintainer extends Maintainer { /** Returns whether we can update the given record */ private static boolean canUpdate(Record record) { String recordName = record.name().asString(); - return recordName.endsWith(ApplicationRotation.DNS_SUFFIX) || - recordName.endsWith(ApplicationRotation.OATH_DNS_SUFFIX); + return recordName.endsWith(GlobalDnsName.DNS_SUFFIX) || + recordName.endsWith(GlobalDnsName.OATH_DNS_SUFFIX); } } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java index 3975613835b..1452e3aa61d 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java @@ -146,7 +146,7 @@ public class ApplicationSerializer { application.ownershipIssueId().ifPresent(issueId -> root.setString(ownershipIssueIdField, issueId.value())); root.setDouble(queryQualityField, application.metrics().queryServiceQuality()); root.setDouble(writeQualityField, application.metrics().writeServiceQuality()); - application.rotation().ifPresent(rotation -> root.setString(rotationField, rotation.id().asString())); + application.rotation().ifPresent(rotation -> root.setString(rotationField, rotation.asString())); toSlime(application.rotationStatus(), root.setArray(rotationStatusField)); return slime; } 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 808bb2e716a..57133986654 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 @@ -425,10 +425,11 @@ public class ApplicationApiHandler extends LoggingRequestHandler { // Rotation Cursor globalRotationsArray = object.setArray("globalRotations"); - application.rotation().ifPresent(rotation -> { + + application.globalDnsName(controller.system()).ifPresent(rotation -> { globalRotationsArray.addString(rotation.url().toString()); globalRotationsArray.addString(rotation.secureUrl().toString()); - object.setString("rotationId", rotation.id().asString()); + object.setString("rotationId", application.rotation().get().asString()); }); // Deployments sorted according to deployment spec diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/rotation/RotationRepository.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/rotation/RotationRepository.java index 08aedcd12b0..6daf86c78a2 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/rotation/RotationRepository.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/rotation/RotationRepository.java @@ -48,7 +48,7 @@ public class RotationRepository { /** Get rotation for given application */ public Optional<Rotation> getRotation(Application application) { - return application.rotation().map(r -> allRotations.get(r.id())); + return application.rotation().map(allRotations::get); } /** @@ -62,7 +62,7 @@ public class RotationRepository { */ public Rotation getOrAssignRotation(Application application, RotationLock lock) { if (application.rotation().isPresent()) { - return allRotations.get(application.rotation().get().id()); + return allRotations.get(application.rotation().get()); } if (!application.deploymentSpec().globalServiceId().isPresent()) { throw new IllegalArgumentException("global-service-id is not set in deployment spec"); @@ -85,7 +85,7 @@ public class RotationRepository { public Map<RotationId, Rotation> availableRotations(@SuppressWarnings("unused") RotationLock lock) { List<RotationId> assignedRotations = applications.asList().stream() .filter(application -> application.rotation().isPresent()) - .map(application -> application.rotation().get().id()) + .map(application -> application.rotation().get()) .collect(Collectors.toList()); Map<RotationId, Rotation> unassignedRotations = new LinkedHashMap<>(this.allRotations); assignedRotations.forEach(unassignedRotations::remove); 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 a9353af1b20..b96e2112a5c 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 @@ -391,7 +391,7 @@ public class ControllerTest { .build(); tester.deployCompletely(app1, applicationPackage); app1 = tester.applications().require(app1.id()); - assertEquals("rotation-id-02", app1.rotation().get().id().asString()); + assertEquals("rotation-id-02", app1.rotation().get().asString()); // Existing DNS records are updated to point to the newly assigned rotation assertEquals(6, tester.controllerTester().nameService().records().size()); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java index 3e09c9078a0..094f8989530 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java @@ -33,7 +33,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.time.Instant; import java.time.temporal.ChronoUnit; -import java.time.temporal.TemporalUnit; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -140,7 +139,7 @@ public class ApplicationSerializerTest { assertEquals(original.ownershipIssueId(), serialized.ownershipIssueId()); assertEquals(original.change(), serialized.change()); - assertEquals(original.rotation().get().id(), serialized.rotation().get().id()); + assertEquals(original.rotation().get(), serialized.rotation().get()); assertEquals(original.rotationStatus(), serialized.rotationStatus()); // Test cluster utilization diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/rotation/RotationTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/rotation/RotationTest.java index f13c65a06fe..e6c4f0d8e86 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/rotation/RotationTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/rotation/RotationTest.java @@ -1,9 +1,9 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.controller.rotation; +import com.yahoo.config.provision.SystemName; import com.yahoo.vespa.hosted.controller.Application; import com.yahoo.vespa.hosted.controller.ControllerTester; -import com.yahoo.vespa.hosted.controller.application.ApplicationRotation; import com.yahoo.vespa.hosted.controller.application.ApplicationPackage; import com.yahoo.vespa.hosted.controller.deployment.ApplicationPackageBuilder; import com.yahoo.vespa.hosted.controller.deployment.DeploymentTester; @@ -64,9 +64,9 @@ public class RotationTest { Rotation expected = new Rotation(new RotationId("foo-1"), "foo-1.com"); application = tester.applications().require(application.id()); - assertEquals(expected.id(), application.rotation().get().id()); + assertEquals(expected.id(), application.rotation().get()); assertEquals(URI.create("http://app1.tenant1.global.vespa.yahooapis.com:4080/"), - application.rotation().get().url()); + application.globalDnsName(SystemName.main).get().url()); try (RotationLock lock = repository.lock()) { Rotation rotation = repository.getOrAssignRotation(tester.applications().require(application.id()), lock); assertEquals(expected, rotation); @@ -80,7 +80,7 @@ public class RotationTest { .searchDefinition("search foo { }") // Update application package so there is something to deploy .build(); tester.deployCompletely(application, applicationPackage, 43); - assertEquals(expected.id(), tester.applications().require(application.id()).rotation().get().id()); + assertEquals(expected.id(), tester.applications().require(application.id()).rotation().get()); } @Test @@ -139,7 +139,7 @@ public class RotationTest { .build(); tester.deployCompletely(application, applicationPackage); Application app = tester.applications().require(application.id()); - Optional<ApplicationRotation> rotation = app.rotation(); + Optional<RotationId> rotation = app.rotation(); assertFalse(rotation.isPresent()); } @@ -169,7 +169,23 @@ public class RotationTest { 2L); tester.deployCompletely(application, applicationPackage); assertEquals(new RotationId("foo-1"), tester.applications().require(application.id()) - .rotation().get().id()); + .rotation().get()); } + @Test + public void prefixes_system_when_not_main() { + ApplicationPackage applicationPackage = new ApplicationPackageBuilder() + .globalServiceId("foo") + .region("us-east-3") + .region("corp-us-east-1") + .region("us-west-1") + .build(); + Application application = tester.createApplication("app2", "tenant2", 22L, + 2L); + tester.deployCompletely(application, applicationPackage); + assertEquals(new RotationId("foo-1"), tester.applications().require(application.id()) + .rotation().get()); + assertEquals("https://cd--app2--tenant2.global.vespa.yahooapis.com:4443/", tester.applications().require(application.id()) + .globalDnsName(SystemName.cd).get().secureUrl().toString()); + } } |