diff --git a/meta-grpc-client/src/main/java/net/opentsdb/aura/metrics/meta/endpoints/ShardEndPoint.java b/meta-grpc-client/src/main/java/net/opentsdb/aura/metrics/meta/endpoints/ShardEndPoint.java new file mode 100644 index 00000000..8cd9d00c --- /dev/null +++ b/meta-grpc-client/src/main/java/net/opentsdb/aura/metrics/meta/endpoints/ShardEndPoint.java @@ -0,0 +1,16 @@ +package net.opentsdb.aura.metrics.meta.endpoints; + +public interface ShardEndPoint { + + String getHost(); + + int getPort(); + + Protocol getProtocol(); + + boolean mtls(); + + enum Protocol { + http1_1, http2_0, https1_1, https_2_0 + } +} diff --git a/meta-grpc-client/src/main/java/net/opentsdb/aura/metrics/meta/endpoints/ShardedServiceRegistry.java b/meta-grpc-client/src/main/java/net/opentsdb/aura/metrics/meta/endpoints/ShardedServiceRegistry.java new file mode 100644 index 00000000..b6e5fa3e --- /dev/null +++ b/meta-grpc-client/src/main/java/net/opentsdb/aura/metrics/meta/endpoints/ShardedServiceRegistry.java @@ -0,0 +1,11 @@ +package net.opentsdb.aura.metrics.meta.endpoints; + +import java.util.List; +import java.util.Map; + +public interface ShardedServiceRegistry { + + Map> getEndpoints(String namespace); + + Map> getEndpoints(String namespace, long epoch); +} diff --git a/meta-grpc-client/src/main/java/net/opentsdb/aura/metrics/meta/endpoints/impl/KubernetesStatefulRegistry.java b/meta-grpc-client/src/main/java/net/opentsdb/aura/metrics/meta/endpoints/impl/KubernetesStatefulRegistry.java new file mode 100644 index 00000000..3ae5f22a --- /dev/null +++ b/meta-grpc-client/src/main/java/net/opentsdb/aura/metrics/meta/endpoints/impl/KubernetesStatefulRegistry.java @@ -0,0 +1,41 @@ +package net.opentsdb.aura.metrics.meta.endpoints.impl; + +import net.opentsdb.aura.metrics.meta.endpoints.ShardedServiceRegistry; + +//TODO: +// Parse the yaml file. +// Look at Plugin implementation. +// if it is too complicated, then parse the file yourself. +// Parsing the file should use ObjectMapper. +public abstract class KubernetesStatefulRegistry implements ShardedServiceRegistry { + + private String type; + private final String[] replicas = {"a", "b", "c", "d", "e"}; + protected static final String NUM_SHARDS = "num-shards"; + protected static final String REPLICAS = "replicas"; + protected static final String K8S_NAMESPACE = "k8s_namespace"; + + public KubernetesStatefulRegistry(final String type) { + this.type = type; + } + + protected int getNumShards(String namespace) { + return 0; + } + + protected int getNumReplicas(String namespace) { + return 0; + } + + protected String getReplica(int replicaId) { + return replicas[replicaId]; + } + + protected int getPort(String namespace) { + return 0; + } + + protected String getDomain(String namespace) { + return null; + } +} diff --git a/meta-grpc-client/src/main/java/net/opentsdb/aura/metrics/meta/endpoints/impl/MystEndpoint.java b/meta-grpc-client/src/main/java/net/opentsdb/aura/metrics/meta/endpoints/impl/MystEndpoint.java new file mode 100644 index 00000000..fc997172 --- /dev/null +++ b/meta-grpc-client/src/main/java/net/opentsdb/aura/metrics/meta/endpoints/impl/MystEndpoint.java @@ -0,0 +1,59 @@ +package net.opentsdb.aura.metrics.meta.endpoints.impl; + +import net.opentsdb.aura.metrics.meta.endpoints.ShardEndPoint; +//TODO: Make a builder +public class MystEndpoint implements ShardEndPoint { + + private final String host; + private final int port; + + public MystEndpoint(String host, int port) { + this.host = host; + this.port = port; + } + + + @Override + public String getHost() { + return this.host; + } + + @Override + public int getPort() { + return this.port; + } + + @Override + public Protocol getProtocol() { + return Protocol.http2_0; + } + + @Override + public boolean mtls() { + return false; + } + + public static class Builder { + private String l_host; + private int l_port; + + public Builder withHost(String host) { + this.l_host = host; + return this; + } + + public Builder withPort(int port) { + this.l_port = port; + return this; + } + + public MystEndpoint build() { + return new MystEndpoint(l_host, l_port); + } + + public static Builder newBuilder() { + return new Builder(); + } + + } +} diff --git a/meta-grpc-client/src/main/java/net/opentsdb/aura/metrics/meta/endpoints/impl/MystStatefulSetRegistry.java b/meta-grpc-client/src/main/java/net/opentsdb/aura/metrics/meta/endpoints/impl/MystStatefulSetRegistry.java new file mode 100644 index 00000000..c1b4b77b --- /dev/null +++ b/meta-grpc-client/src/main/java/net/opentsdb/aura/metrics/meta/endpoints/impl/MystStatefulSetRegistry.java @@ -0,0 +1,52 @@ +package net.opentsdb.aura.metrics.meta.endpoints.impl; + +import net.opentsdb.aura.metrics.meta.endpoints.ShardEndPoint; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +//TODO: +// make a cache +// Refetch for a namespace only if things have changed +// Write testcases using Mocks (jmockit or mockito) +public class MystStatefulSetRegistry extends KubernetesStatefulRegistry { + + private static final String pod_name_pattern = "%s-myst-%s-%s.svc.%s"; + + public MystStatefulSetRegistry() { + super("myst"); + } + + @Override + public Map> getEndpoints(String namespace) { + Map> endpointsMap = new HashMap<>(); + + final int numShards = getNumShards(namespace); + final int numReplicas = getNumReplicas(namespace); + for(int i = 0; i < numReplicas; i++) { + String replica = getReplica(i); + List shardEndPoints = new ArrayList<>(); + endpointsMap.put(replica, shardEndPoints); + for (int j = 0; j < numShards; i++) { + final MystEndpoint endpoint = MystEndpoint.Builder.newBuilder() + .withHost( + String.format( + pod_name_pattern, + namespace, + replica, + j, + getDomain(namespace))) + .withPort(getPort(namespace)) + .build(); + shardEndPoints.add(endpoint); + } + } + return endpointsMap; + } + + @Override + public Map> getEndpoints(String namespace, long epoch) { + return getEndpoints(namespace); + } +}