diff options
author | Morten Tokle <mortent@verizonmedia.com> | 2021-11-10 13:52:23 +0100 |
---|---|---|
committer | Morten Tokle <mortent@verizonmedia.com> | 2021-11-10 15:30:05 +0100 |
commit | ffb034aa6605c46fd52a00acdc74a7140269e3f5 (patch) | |
tree | a11317585b55070584b26cdedec3f353ee7af1e8 /config-model-api | |
parent | 58607cf37f94f150c42d68854c19d1a8ad50a92d (diff) |
Let config model generate endpoints
Diffstat (limited to 'config-model-api')
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) |