diff options
author | Martin Polden <mpolden@mpolden.no> | 2021-05-10 11:35:21 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2021-06-02 14:21:09 +0200 |
commit | 6a49bbba29431dd50a425706f4dbb4aae7eecf1d (patch) | |
tree | 2b95053579a2fcf69f7e819edc839b24b13c844d | |
parent | 2162af381b69e68c68960d228ca439336ca74f67 (diff) |
Default to new endpoints in public
4 files changed, 63 insertions, 41 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java index abdb394c278..1b1df28c201 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/RoutingController.java @@ -180,11 +180,11 @@ public class RoutingController { builder = builder.routingMethod(RoutingMethod.exclusive) .on(Port.tls()); Endpoint endpoint = builder.in(controller.system()); - endpointDnsNames.add(endpoint.dnsName()); if (controller.system().isPublic() && vespaAppDomainInCertificate.with(FetchVector.Dimension.APPLICATION_ID, deployment.applicationId().serializedForm()).value()) { Endpoint legacyEndpoint = builder.legacy().in(controller.system()); endpointDnsNames.add(legacyEndpoint.dnsName()); } + endpointDnsNames.add(endpoint.dnsName()); } return Collections.unmodifiableList(endpointDnsNames); } @@ -393,7 +393,7 @@ public class RoutingController { private static String commonNameHashOf(ApplicationId application, SystemName system) { HashCode sha1 = Hashing.sha1().hashString(application.serializedForm(), StandardCharsets.UTF_8); String base32 = BaseEncoding.base32().omitPadding().lowerCase().encode(sha1.asBytes()); - return 'v' + base32 + Endpoint.dnsSuffix(system); + return 'v' + base32 + Endpoint.dnsSuffix(system, system.isPublic()); } /** Returns direct routing endpoints if any exist and feature flag is set for given application */ diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Endpoint.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Endpoint.java index 3f079a5fb9b..2132f731280 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Endpoint.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/Endpoint.java @@ -26,12 +26,10 @@ public class Endpoint { private static final String YAHOO_DNS_SUFFIX = ".vespa.yahooapis.com"; private static final String OATH_DNS_SUFFIX = ".vespa.oath.cloud"; - private static final String PUBLIC_DNS_SUFFIX = ".public.vespa.oath.cloud"; - private static final String PUBLIC_CD_DNS_SUFFIX = ".public-cd.vespa.oath.cloud"; - // TODO(mpolden): New domain is considered "legacy" for the time being, until it's ready for use. Once it's ready - // we'll make the vespa.oath.cloud variant legacy and this non-legacy. - private static final String PUBLIC_DNS_LEGACY_SUFFIX = ".vespa-app.cloud"; - private static final String PUBLIC_CD_LEGACY_DNS_SUFFIX = ".cd.vespa-app.cloud"; + private static final String PUBLIC_DNS_SUFFIX = ".vespa-app.cloud"; + private static final String PUBLIC_CD_DNS_SUFFIX = ".cd.vespa-app.cloud"; + private static final String PUBLIC_DNS_LEGACY_SUFFIX = ".public.vespa.oath.cloud"; + private static final String PUBLIC_CD_LEGACY_DNS_SUFFIX = ".public-cd.vespa.oath.cloud"; private final EndpointId id; private final ClusterSpec.Id cluster; @@ -161,11 +159,6 @@ public class Endpoint { return String.format("endpoint %s [scope=%s, legacy=%s, routingMethod=%s]", url, scope, legacy, routingMethod); } - /** Returns the DNS suffix used for endpoints in given system */ - public static String dnsSuffix(SystemName system) { - return dnsSuffix(system, false); - } - private static String endpointOrClusterAsString(EndpointId id, ClusterSpec.Id cluster) { return id == null ? cluster.value() : id.id(); } @@ -206,7 +199,7 @@ public class Endpoint { } private static String scopePart(Scope scope, List<ZoneId> zones, boolean legacy, SystemName system) { - if (system.isPublic() && legacy) { + if (system.isPublic() && !legacy) { if (scope == Scope.global) return "g"; var zone = zones.get(0); var region = zone.region().value(); @@ -218,7 +211,7 @@ public class Endpoint { var zone = zones.get(0); var region = zone.region().value(); if (scope == Scope.region) region += "-w"; - if (!legacy && zone.environment().isProduction()) return region; // Skip prod environment for non-legacy endpoints + if ((system.isPublic() || !legacy) && zone.environment().isProduction()) return region; return region + "." + zone.environment().value(); } @@ -229,11 +222,12 @@ public class Endpoint { private static String systemPart(SystemName system, String separator, boolean legacy) { if (!system.isCd()) return ""; - if (system.isPublic() && legacy) return ""; + if (system.isPublic() && !legacy) return ""; return system.value() + separator; } - private static String dnsSuffix(SystemName system, boolean legacy) { + /** Returns the DNS suffix used for endpoints in given system */ + public static String dnsSuffix(SystemName system, boolean legacy) { switch (system) { case cd: case main: diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/EndpointTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/EndpointTest.java index 468c92d3539..da641d17a8a 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/EndpointTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/EndpointTest.java @@ -64,24 +64,28 @@ public class EndpointTest { "https://r2.i2.a2.t2.global.vespa.oath.cloud/", Endpoint.of(app2).target(EndpointId.of("r2")).on(Port.tls()).routingMethod(RoutingMethod.exclusive).in(SystemName.main), - // Main endpoint in public system + // Main endpoint in public system (legacy) "https://a1.t1.global.public.vespa.oath.cloud/", - Endpoint.of(app1).target(endpointId).on(Port.tls()).routingMethod(RoutingMethod.exclusive).in(SystemName.Public) + Endpoint.of(app1).target(endpointId).on(Port.tls()).routingMethod(RoutingMethod.exclusive).legacy().in(SystemName.Public) ); tests.forEach((expected, endpoint) -> assertEquals(expected, endpoint.url().toString())); Map<String, Endpoint> tests2 = Map.of( - // Default endpoint in public system using new domain + // Main endpoint in public CD system (legacy) + "https://publiccd.a1.t1.global.public-cd.vespa.oath.cloud/", + Endpoint.of(app1).target(endpointId).on(Port.tls()).routingMethod(RoutingMethod.exclusive).legacy().in(SystemName.PublicCd), + + // Default endpoint in public system "https://a1.t1.g.vespa-app.cloud/", - Endpoint.of(app1).target(endpointId).on(Port.tls()).routingMethod(RoutingMethod.exclusive).legacy().in(SystemName.Public), + Endpoint.of(app1).target(endpointId).on(Port.tls()).routingMethod(RoutingMethod.exclusive).in(SystemName.Public), - // Default endpoint in public CD system using new domain + // Default endpoint in public CD system "https://a1.t1.g.cd.vespa-app.cloud/", - Endpoint.of(app1).target(endpointId).on(Port.tls()).routingMethod(RoutingMethod.exclusive).legacy().in(SystemName.PublicCd), + Endpoint.of(app1).target(endpointId).on(Port.tls()).routingMethod(RoutingMethod.exclusive).in(SystemName.PublicCd), - // Custom instance in public system, using new domain + // Custom instance in public system "https://i2.a2.t2.g.vespa-app.cloud/", - Endpoint.of(app2).target(endpointId).on(Port.tls()).routingMethod(RoutingMethod.exclusive).legacy().in(SystemName.Public) + Endpoint.of(app2).target(endpointId).on(Port.tls()).routingMethod(RoutingMethod.exclusive).in(SystemName.Public) ); tests2.forEach((expected, endpoint) -> assertEquals(expected, endpoint.url().toString())); } @@ -127,16 +131,20 @@ public class EndpointTest { "https://r2.i2.a2.t2.global.vespa.oath.cloud/", Endpoint.of(app2).target(EndpointId.of("r2")).on(Port.tls()).routingMethod(RoutingMethod.exclusive).in(SystemName.main), - // Main endpoint in public system + // Main endpoint in public system (legacy) "https://a1.t1.global.public.vespa.oath.cloud/", - Endpoint.of(app1).target(endpointId).on(Port.tls()).routingMethod(RoutingMethod.exclusive).in(SystemName.Public) + Endpoint.of(app1).target(endpointId).on(Port.tls()).routingMethod(RoutingMethod.exclusive).legacy().in(SystemName.Public) ); tests.forEach((expected, endpoint) -> assertEquals(expected, endpoint.url().toString())); Map<String, Endpoint> tests2 = Map.of( - // Custom endpoint and instance in public system, using new domain + // Custom endpoint and instance in public CD system (legacy) + "https://foo.publiccd.i2.a2.t2.global.public-cd.vespa.oath.cloud/", + Endpoint.of(app2).target(EndpointId.of("foo")).on(Port.tls()).routingMethod(RoutingMethod.exclusive).legacy().in(SystemName.PublicCd), + + // Custom endpoint and instance in public system "https://foo.i2.a2.t2.g.vespa-app.cloud/", - Endpoint.of(app2).target(EndpointId.of("foo")).on(Port.tls()).routingMethod(RoutingMethod.exclusive).legacy().in(SystemName.Public) + Endpoint.of(app2).target(EndpointId.of("foo")).on(Port.tls()).routingMethod(RoutingMethod.exclusive).in(SystemName.Public) ); tests2.forEach((expected, endpoint) -> assertEquals(expected, endpoint.url().toString())); } @@ -176,13 +184,13 @@ public class EndpointTest { "https://i2--a2--t2.us-north-1.vespa.oath.cloud:4443/", Endpoint.of(app2).target(cluster, prodZone).on(Port.tls(4443)).in(SystemName.main), - // Non-default cluster in public + // Non-default cluster in public (legacy) "https://c1.a1.t1.us-north-1.public.vespa.oath.cloud/", - Endpoint.of(app1).target(ClusterSpec.Id.from("c1"), prodZone).on(Port.tls()).routingMethod(RoutingMethod.exclusive).in(SystemName.Public), + Endpoint.of(app1).target(ClusterSpec.Id.from("c1"), prodZone).on(Port.tls()).routingMethod(RoutingMethod.exclusive).legacy().in(SystemName.Public), - // Non-default cluster and instance in public + // Non-default cluster and instance in public (legacy) "https://c2.i2.a2.t2.us-north-1.public.vespa.oath.cloud/", - Endpoint.of(app2).target(ClusterSpec.Id.from("c2"), prodZone).on(Port.tls()).routingMethod(RoutingMethod.exclusive).in(SystemName.Public), + Endpoint.of(app2).target(ClusterSpec.Id.from("c2"), prodZone).on(Port.tls()).routingMethod(RoutingMethod.exclusive).legacy().in(SystemName.Public), // Endpoint in main using shared layer 4 "https://a1.t1.us-north-1.vespa.oath.cloud/", @@ -191,17 +199,21 @@ public class EndpointTest { tests.forEach((expected, endpoint) -> assertEquals(expected, endpoint.url().toString())); Map<String, Endpoint> tests2 = Map.of( - // Custom cluster name in public, using new domain + // Non-default cluster and instance in public CD (legacy) + "https://c2.publiccd.i2.a2.t2.us-north-1.public-cd.vespa.oath.cloud/", + Endpoint.of(app2).target(ClusterSpec.Id.from("c2"), prodZone).on(Port.tls()).routingMethod(RoutingMethod.exclusive).legacy().in(SystemName.PublicCd), + + // Custom cluster name in public "https://c1.a1.t1.us-north-1.z.vespa-app.cloud/", - Endpoint.of(app1).target(ClusterSpec.Id.from("c1"), prodZone).on(Port.tls()).routingMethod(RoutingMethod.exclusive).legacy().in(SystemName.Public), + Endpoint.of(app1).target(ClusterSpec.Id.from("c1"), prodZone).on(Port.tls()).routingMethod(RoutingMethod.exclusive).in(SystemName.Public), - // Default cluster name in non-production zone in public, using new domain + // Default cluster name in non-production zone in public "https://a1.t1.us-north-2.test.z.vespa-app.cloud/", - Endpoint.of(app1).target(ClusterSpec.Id.from("default"), testZone).on(Port.tls()).routingMethod(RoutingMethod.exclusive).legacy().in(SystemName.Public), + Endpoint.of(app1).target(ClusterSpec.Id.from("default"), testZone).on(Port.tls()).routingMethod(RoutingMethod.exclusive).in(SystemName.Public), - // Default cluster name in public CD, using new domain + // Default cluster name in public CD "https://a1.t1.us-north-1.z.cd.vespa-app.cloud/", - Endpoint.of(app1).target(ClusterSpec.Id.from("default"), prodZone).on(Port.tls()).routingMethod(RoutingMethod.exclusive).legacy().in(SystemName.PublicCd) + Endpoint.of(app1).target(ClusterSpec.Id.from("default"), prodZone).on(Port.tls()).routingMethod(RoutingMethod.exclusive).in(SystemName.PublicCd) ); tests2.forEach((expected, endpoint) -> assertEquals(expected, endpoint.url().toString())); } @@ -219,6 +231,7 @@ public class EndpointTest { .target(EndpointId.defaultId()) .routingMethod(RoutingMethod.exclusive) .on(Port.tls()) + .legacy() .in(SystemName.Public), // Wildcard to match other rotations @@ -227,6 +240,7 @@ public class EndpointTest { .wildcard() .routingMethod(RoutingMethod.exclusive) .on(Port.tls()) + .legacy() .in(SystemName.Public), // Default cluster in zone @@ -235,6 +249,7 @@ public class EndpointTest { .target(defaultCluster, prodZone) .routingMethod(RoutingMethod.exclusive) .on(Port.tls()) + .legacy() .in(SystemName.Public), // Wildcard to match other clusters in zone @@ -243,6 +258,7 @@ public class EndpointTest { .wildcard(prodZone) .routingMethod(RoutingMethod.exclusive) .on(Port.tls()) + .legacy() .in(SystemName.Public), // Default cluster in test zone @@ -251,6 +267,7 @@ public class EndpointTest { .target(defaultCluster, testZone) .routingMethod(RoutingMethod.exclusive) .on(Port.tls()) + .legacy() .in(SystemName.Public), // Wildcard to match other clusters in test zone @@ -259,6 +276,15 @@ public class EndpointTest { .wildcard(testZone) .routingMethod(RoutingMethod.exclusive) .on(Port.tls()) + .legacy() + .in(SystemName.Public), + + // Wildcard to match other clusters in zone + "https://*.a1.t1.us-north-1.z.vespa-app.cloud/", + Endpoint.of(app1) + .wildcard(prodZone) + .routingMethod(RoutingMethod.exclusive) + .on(Port.tls()) .in(SystemName.Public) ); @@ -275,25 +301,27 @@ public class EndpointTest { .targetRegion(cluster, ZoneId.from("prod", "us-north-1a")) .routingMethod(RoutingMethod.exclusive) .on(Port.tls()) + .legacy() .in(SystemName.Public), "https://a1.t1.us-north-2-w.public.vespa.oath.cloud/", Endpoint.of(app1) .targetRegion(cluster, prodZone) .routingMethod(RoutingMethod.exclusive) .on(Port.tls()) + .legacy() .in(SystemName.Public), "https://a1.t1.us-north-2-w.test.public.vespa.oath.cloud/", Endpoint.of(app1) .targetRegion(cluster, ZoneId.from("test", "us-north-2")) .routingMethod(RoutingMethod.exclusive) .on(Port.tls()) + .legacy() .in(SystemName.Public), "https://c1.a1.t1.us-north-2.r.vespa-app.cloud/", Endpoint.of(app1) .targetRegion(ClusterSpec.Id.from("c1"), prodZone) .routingMethod(RoutingMethod.exclusive) .on(Port.tls()) - .legacy() .in(SystemName.Public) ); tests.forEach((expected, endpoint) -> assertEquals(expected, endpoint.url().toString())); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-cloud.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-cloud.json index 3a3fdfbf6c7..a214969485d 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-cloud.json +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/deployment-cloud.json @@ -8,7 +8,7 @@ { "cluster": "default", "tls": true, - "url": "https://albums.scoober.aws-us-east-1c.public.vespa.oath.cloud/", + "url": "https://albums.scoober.aws-us-east-1c.z.vespa-app.cloud/", "scope": "zone", "routingMethod": "exclusive", "legacy": false |