summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorten Tokle <mortent@oath.com>2018-10-01 14:35:21 +0200
committerMorten Tokle <mortent@oath.com>2018-10-02 09:19:24 +0200
commit365e753c53644910dca0825a8a339c130897ecb6 (patch)
tree31066caa486feff87455596d451ff0518ee26bb3
parentd659f7ba335fc70a0488304c4867c185a9759e97 (diff)
Add systemname to global rotation name
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java14
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java11
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java7
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/GlobalDnsName.java (renamed from controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/ApplicationRotation.java)31
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/DnsMaintainer.java6
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java5
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/rotation/RotationRepository.java6
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java3
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/rotation/RotationTest.java28
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());
+ }
}