From 5bac9206a675f57d90fbf7d1ff6f6143c3e7fe07 Mon Sep 17 00:00:00 2001 From: Rodolfo Ribeiro Silva Date: Mon, 2 Jan 2017 18:47:52 -0200 Subject: [PATCH 1/4] Added constructor with localdatacenter and localrack --- .../impl/lb/AbstractTokenMapSupplier.java | 8 +++++- .../lb/HttpEndpointBasedTokenMapSupplier.java | 26 ++++++++++++------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/AbstractTokenMapSupplier.java b/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/AbstractTokenMapSupplier.java index 4f2a1dbd..68989d3f 100644 --- a/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/AbstractTokenMapSupplier.java +++ b/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/AbstractTokenMapSupplier.java @@ -123,6 +123,12 @@ public AbstractTokenMapSupplier(int port) { localDatacenter = ConfigUtils.getDataCenter(); unsuppliedPort = port; } + + public AbstractTokenMapSupplier(int port,String localZone,String localDatacenter) { + this.localZone = localZone; + this.localDatacenter = localDatacenter; + unsuppliedPort = port; + } public abstract String getTopologyJsonPayload(Set activeHosts); @@ -238,4 +244,4 @@ List parseTokenListFromJson(String json) { return hostTokens; } -} +} \ No newline at end of file diff --git a/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/HttpEndpointBasedTokenMapSupplier.java b/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/HttpEndpointBasedTokenMapSupplier.java index 99696f35..2cd2ce86 100644 --- a/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/HttpEndpointBasedTokenMapSupplier.java +++ b/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/HttpEndpointBasedTokenMapSupplier.java @@ -55,16 +55,24 @@ public HttpEndpointBasedTokenMapSupplier() { public HttpEndpointBasedTokenMapSupplier(int port) { this(DefaultServerUrl, port); } + + public HttpEndpointBasedTokenMapSupplier(String url, int port,String localDatacenter,String localRack) { + super(port,localDatacenter,localRack); + serverUrl = transformUrl(url,port); + } public HttpEndpointBasedTokenMapSupplier(String url, int port) { super(port); - - /** - * If no port is passed means -1 then we will substitute to defaultPort - * else the passed one. - */ - url = url.replace("{port}", (port > -1) ? Integer.toString(port) : Integer.toString(defaultPort)); - serverUrl = url; + serverUrl = transformUrl(url,port); + } + + /** + * If no port is passed means -1 then we will substitute to defaultPort + * else the passed one. + */ + private static String transformUrl(String url,int port){ + url = url.replace("{port}", (port > -1) ? Integer.toString(port) : Integer.toString(defaultPort)); + return url; } @Override @@ -75,7 +83,7 @@ public String getTopologyJsonPayload(String hostname) { throw new RuntimeException(e); } } - + /** * Tries to get topology information by randomly trying across nodes. */ @@ -209,4 +217,4 @@ private String getTopologyWithNodeRetry(Set activeHosts) { } -} +} \ No newline at end of file From 3a129b9298b0a3768d3c306e10405f4fd4259638 Mon Sep 17 00:00:00 2001 From: Rodolfo Ribeiro Silva Date: Mon, 2 Jan 2017 18:48:06 -0200 Subject: [PATCH 2/4] Added support to Dynomite rest api to discovery all tokens. --- ...miteHttpEndpointBasedTokenMapSupplier.java | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/DynomiteHttpEndpointBasedTokenMapSupplier.java diff --git a/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/DynomiteHttpEndpointBasedTokenMapSupplier.java b/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/DynomiteHttpEndpointBasedTokenMapSupplier.java new file mode 100644 index 00000000..925ff152 --- /dev/null +++ b/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/DynomiteHttpEndpointBasedTokenMapSupplier.java @@ -0,0 +1,120 @@ +package com.netflix.dyno.connectionpool.impl.lb; + +import java.util.Iterator; +import java.util.Set; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.netflix.dyno.connectionpool.Host; +import com.netflix.dyno.connectionpool.exception.DynoException; +import com.netflix.dyno.connectionpool.impl.lb.HttpEndpointBasedTokenMapSupplier; + +/** + * + * Class to dynomite api REST + * + */ +public class DynomiteHttpEndpointBasedTokenMapSupplier extends HttpEndpointBasedTokenMapSupplier { + + private static final Logger Logger = LoggerFactory.getLogger(DynomiteHttpEndpointBasedTokenMapSupplier.class); + + private static final String DEFAULT_URL = "http://{hostname}:{port}/cluster_describe"; + private static final Integer DEFAULT_PORT = 22222; + + public DynomiteHttpEndpointBasedTokenMapSupplier() { + super(DEFAULT_URL,DEFAULT_PORT); + } + + public DynomiteHttpEndpointBasedTokenMapSupplier(String localDatacenter, String localRack) { + super(DEFAULT_URL,DEFAULT_PORT,localDatacenter,localRack); + } + + public DynomiteHttpEndpointBasedTokenMapSupplier(int port) { + super(port); + } + + public DynomiteHttpEndpointBasedTokenMapSupplier(String url, int port) { + super(url, port); + } + + public DynomiteHttpEndpointBasedTokenMapSupplier(String url, int port, String localDatacenter, String localRack) { + super(url, port,localDatacenter,localRack); + } + + @Override + public String getTopologyJsonPayload(String hostname) { + return dynomiteTrans(super.getTopologyJsonPayload(hostname)); + } + + @Override + public String getTopologyJsonPayload(Set activeHosts) { + return dynomiteTrans(super.getTopologyJsonPayload(activeHosts)); + } + + @SuppressWarnings("unchecked") + public String dynomiteTrans(String json) { + JSONArray ja = new JSONArray(); + + JSONParser parser = new JSONParser(); + try { + JSONObject jitem = (JSONObject) parser.parse(json); + JSONArray arr = (JSONArray) jitem.get("dcs"); + Iterator iter = arr.iterator(); + while (iter.hasNext()) { + Object item = iter.next(); + if (!(item instanceof JSONObject)) { + continue; + } + JSONObject jItem = (JSONObject) item; + String datacenter = (String) jItem.get("name"); + JSONArray racks = (JSONArray) jItem.get("racks"); + + Iterator racksI = racks.iterator(); + while (racksI.hasNext()) { + Object rackItem = racksI.next(); + if (!(rackItem instanceof JSONObject)) { + continue; + } + JSONObject jRackItem = (JSONObject) rackItem; + String rackName = (String) jRackItem.get("name"); + JSONArray servers = (JSONArray) jRackItem.get("servers"); + + Iterator serversI = servers.iterator(); + while (serversI.hasNext()) { + Object serverItem = serversI.next(); + if (!(serverItem instanceof JSONObject)) { + continue; + } + JSONObject JServerItem = (JSONObject) serverItem; + String serverName = (String) JServerItem.get("name"); + String serverHost = (String) JServerItem.get("host"); + String serverPort = String.valueOf((Long) JServerItem.get("port")); + String serverToken = String.valueOf((Long) JServerItem.get("token")); + + JSONObject jnode = new JSONObject(); + jnode.put("token", serverToken); + jnode.put("serverName", serverName); + jnode.put("serverPort", serverPort); + jnode.put("hostname", serverHost); + jnode.put("rack", rackName); + jnode.put("ip", serverHost); + jnode.put("zone", rackName); + jnode.put("dc", datacenter); + ja.add(jnode); + } + + } + + } + } catch (Exception lastEx) { + Logger.error("Process error on dynomite rest json = [ " + json + " ]", lastEx); + throw new DynoException(lastEx); + } + return ja.toJSONString(); + } + +} \ No newline at end of file From 8a0fc4743615d4c34dd57d462f23ba5b9d7ff313 Mon Sep 17 00:00:00 2001 From: Rodolfo Ribeiro Silva Date: Mon, 2 Jan 2017 19:05:20 -0200 Subject: [PATCH 3/4] Added netflix header to source code. --- ...DynomiteHttpEndpointBasedTokenMapSupplier.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/DynomiteHttpEndpointBasedTokenMapSupplier.java b/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/DynomiteHttpEndpointBasedTokenMapSupplier.java index 925ff152..dee7f982 100644 --- a/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/DynomiteHttpEndpointBasedTokenMapSupplier.java +++ b/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/DynomiteHttpEndpointBasedTokenMapSupplier.java @@ -1,3 +1,18 @@ +/******************************************************************************* + * Copyright 2011 Netflix + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ******************************************************************************/ package com.netflix.dyno.connectionpool.impl.lb; import java.util.Iterator; From 6f1c9f8fcd808fb3d06634ac9779118480c138d4 Mon Sep 17 00:00:00 2001 From: Rodolfo Ribeiro Silva Date: Tue, 3 Jan 2017 21:03:54 -0200 Subject: [PATCH 4/4] Change header --- .../impl/lb/DynomiteHttpEndpointBasedTokenMapSupplier.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/DynomiteHttpEndpointBasedTokenMapSupplier.java b/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/DynomiteHttpEndpointBasedTokenMapSupplier.java index dee7f982..bcedaec9 100644 --- a/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/DynomiteHttpEndpointBasedTokenMapSupplier.java +++ b/dyno-core/src/main/java/com/netflix/dyno/connectionpool/impl/lb/DynomiteHttpEndpointBasedTokenMapSupplier.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright 2011 Netflix + * Copyright 2017 Netflix * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License.