summaryrefslogtreecommitdiffstats
path: root/config-model-api
diff options
context:
space:
mode:
authorMorten Tokle <mortent@verizonmedia.com>2021-11-10 13:52:23 +0100
committerMorten Tokle <mortent@verizonmedia.com>2021-11-10 15:30:05 +0100
commitffb034aa6605c46fd52a00acdc74a7140269e3f5 (patch)
treea11317585b55070584b26cdedec3f353ee7af1e8 /config-model-api
parent58607cf37f94f150c42d68854c19d1a8ad50a92d (diff)
Let config model generate endpoints
Diffstat (limited to 'config-model-api')
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/model/api/ApplicationClusterEndpoint.java177
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/model/api/ApplicationClusterInfo.java9
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/model/api/Model.java2
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java2
4 files changed, 190 insertions, 0 deletions
diff --git a/config-model-api/src/main/java/com/yahoo/config/model/api/ApplicationClusterEndpoint.java b/config-model-api/src/main/java/com/yahoo/config/model/api/ApplicationClusterEndpoint.java
new file mode 100644
index 00000000000..7593969ab61
--- /dev/null
+++ b/config-model-api/src/main/java/com/yahoo/config/model/api/ApplicationClusterEndpoint.java
@@ -0,0 +1,177 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+package com.yahoo.config.model.api;
+
+import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.ClusterSpec;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * Represents one endpoint for an application cluster
+ *
+ * @author mortent
+ */
+public class ApplicationClusterEndpoint {
+ public enum Scope {APPLICATION, GLOBAL, ZONE}
+
+ public enum RoutingMethod {SHARED, SHAREDLAYER4}
+
+ private final DnsName dnsName;
+ private final Scope scope;
+ private final RoutingMethod routingMethod;
+ private final int weight;
+ private final List<String> hosts;
+
+ public ApplicationClusterEndpoint(DnsName dnsName, Scope scope, RoutingMethod routingMethod, int weight, List<String> hosts) {
+ this.dnsName = dnsName;
+ this.scope = scope;
+ this.routingMethod = routingMethod;
+ this.weight = weight;
+ this.hosts = List.copyOf(hosts);
+ }
+
+ public DnsName dnsName() {
+ return dnsName;
+ }
+
+ public Scope scope() {
+ return scope;
+ }
+
+ public RoutingMethod routingMethod() {
+ return routingMethod;
+ }
+
+ public int weight() {
+ return weight;
+ }
+
+ public List<String> hosts() {
+ return hosts;
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ public static class Builder {
+
+ private DnsName dnsName;
+ private Scope scope;
+ private RoutingMethod routingMethod;
+ private int weigth = 0;
+ private List<String> hosts;
+
+ public Builder dnsName(DnsName name) {
+ this.dnsName = name;
+ return this;
+ }
+
+ public Builder zoneScope() {
+ this.scope = Scope.ZONE;
+ return this;
+ }
+
+ public Builder applicationScope() {
+ this.scope = Scope.APPLICATION;
+ return this;
+ }
+
+ public Builder globalScope() {
+ this.scope = Scope.GLOBAL;
+ return this;
+ }
+
+ public Builder sharedRouting() {
+ this.routingMethod = RoutingMethod.SHARED;
+ return this;
+ }
+
+ public Builder sharedL4Routing() {
+ this.routingMethod = RoutingMethod.SHAREDLAYER4;
+ return this;
+ }
+
+ public Builder weight(int weigth) {
+ this.weigth = weigth;
+ return this;
+ }
+
+ public Builder hosts(List<String> hosts) {
+ this.hosts = List.copyOf(hosts);
+ return this;
+ }
+
+ public ApplicationClusterEndpoint build() {
+ return new ApplicationClusterEndpoint(dnsName, scope, routingMethod, weigth, hosts);
+ }
+ }
+
+ public static class DnsName {
+ private static final int MAX_LABEL_LENGTH = 63;
+
+ private final String name;
+
+ private DnsName(String name) {
+ this.name = name;
+ }
+
+ public String value() {
+ return name;
+ }
+
+ // TODO: remove
+ public static DnsName sharedNameFrom(ClusterSpec.Id cluster, ApplicationId applicationId, String suffix) {
+ String name = dnsParts(cluster, applicationId)
+ .filter(Objects::nonNull) // remove null values that were "default"
+ .collect(Collectors.joining("--"));
+ return new DnsName(sanitize(name) + suffix); // Need to sanitize name since it is considered one label
+ }
+
+ public static DnsName sharedL4NameFrom(ClusterSpec.Id cluster, ApplicationId applicationId, String suffix) {
+ String name = dnsParts(cluster, applicationId)
+ .filter(Objects::nonNull) // remove null values that were "default"
+ .map(DnsName::sanitize)
+ .collect(Collectors.joining("."));
+ return new DnsName(name + suffix);
+ }
+
+ public static DnsName from(String name) {
+ return new DnsName(name);
+ }
+
+ private static Stream<String> dnsParts(ClusterSpec.Id cluster, ApplicationId applicationId) {
+ return Stream.of(
+ nullIfDefault(cluster.value()),
+ nullIfDefault(applicationId.instance().value()),
+ applicationId.application().value(),
+ applicationId.tenant().value()
+ );
+ }
+
+ /**
+ * Remove any invalid characters from the hostnames
+ */
+ private static String sanitize(String id) {
+ return shortenIfNeeded(id.toLowerCase()
+ .replace('_', '-')
+ .replaceAll("[^a-z0-9-]*", ""));
+ }
+
+ /**
+ * Truncate the given string at the front so its length does not exceed 63 characters.
+ */
+ private static String shortenIfNeeded(String id) {
+ return id.substring(Math.max(0, id.length() - MAX_LABEL_LENGTH));
+ }
+
+ private static String nullIfDefault(String string) {
+ return Optional.of(string).filter(s -> !s.equals("default")).orElse(null);
+ }
+ }
+}
diff --git a/config-model-api/src/main/java/com/yahoo/config/model/api/ApplicationClusterInfo.java b/config-model-api/src/main/java/com/yahoo/config/model/api/ApplicationClusterInfo.java
new file mode 100644
index 00000000000..2cd2e980761
--- /dev/null
+++ b/config-model-api/src/main/java/com/yahoo/config/model/api/ApplicationClusterInfo.java
@@ -0,0 +1,9 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+package com.yahoo.config.model.api;
+
+import java.util.List;
+
+public interface ApplicationClusterInfo {
+ List<ApplicationClusterEndpoint> endpoints();
+}
diff --git a/config-model-api/src/main/java/com/yahoo/config/model/api/Model.java b/config-model-api/src/main/java/com/yahoo/config/model/api/Model.java
index c1248ff556c..a7fd48bfea8 100644
--- a/config-model-api/src/main/java/com/yahoo/config/model/api/Model.java
+++ b/config-model-api/src/main/java/com/yahoo/config/model/api/Model.java
@@ -79,4 +79,6 @@ public interface Model {
/** Returns the set of document types in each cluster, that have an index for one of more fields. */
default Map<String, Set<String>> indexedDocumentTypesByCluster() { return Map.of(); }
+ /** Returns the set of container clusters */
+ default Set<ApplicationClusterInfo> applicationClusterInfo() { return Set.of(); }
}
diff --git a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java
index ff612ffc2b0..c5781c2805d 100644
--- a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java
+++ b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java
@@ -148,6 +148,8 @@ public interface ModelContext {
default List<X509Certificate> operatorCertificates() { return List.of(); }
default List<String> tlsCiphersOverride() { return List.of(); }
+
+ default List<String> zoneDnsSuffixes() { return List.of(); }
}
@Retention(RetentionPolicy.RUNTIME)