You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by ae...@apache.org on 2018/01/03 23:47:19 UTC

hadoop git commit: HDFS-12870. Ozone: Service Discovery: REST endpoint in KSM for getServiceList. Contributed by Nanda kumar.

Repository: hadoop
Updated Branches:
  refs/heads/HDFS-7240 ace9aece2 -> 45118257a


HDFS-12870. Ozone: Service Discovery: REST endpoint in KSM for getServiceList. Contributed by Nanda kumar.


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/45118257
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/45118257
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/45118257

Branch: refs/heads/HDFS-7240
Commit: 45118257aba4452ae337798269982153c046321b
Parents: ace9aec
Author: Anu Engineer <ae...@apache.org>
Authored: Wed Jan 3 15:31:27 2018 -0800
Committer: Anu Engineer <ae...@apache.org>
Committed: Wed Jan 3 15:31:27 2018 -0800

----------------------------------------------------------------------
 .../org/apache/hadoop/ozone/OzoneConsts.java    |   5 +
 .../hadoop/ozone/ksm/helpers/ServiceInfo.java   |  80 ++++++++++---
 .../hadoop/ozone/ksm/KeySpaceManager.java       |   7 +-
 .../ozone/ksm/KeySpaceManagerHttpServer.java    |   6 +-
 .../ozone/ksm/ServiceListJSONServlet.java       | 103 +++++++++++++++++
 .../hadoop/ozone/web/OzoneHttpServer.java       |  21 ++++
 .../ksm/TestKeySpaceManagerHttpServer.java      |   2 +-
 .../ksm/TestKeySpaceManagerRestInterface.java   | 113 +++++++++++++++++++
 8 files changed, 317 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/45118257/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java
index fe8319c..8ea7a23 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/OzoneConsts.java
@@ -149,6 +149,11 @@ public final class OzoneConsts {
 
   public static final int INVALID_PORT = -1;
 
+
+  // The ServiceListJSONServlet context attribute where KeySpaceManager
+  // instance gets stored.
+  public static final String KSM_CONTEXT_ATTRIBUTE = "ozone.ksm";
+
   private OzoneConsts() {
     // Never Constructed
   }

http://git-wip-us.apache.org/repos/asf/hadoop/blob/45118257/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/ksm/helpers/ServiceInfo.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/ksm/helpers/ServiceInfo.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/ksm/helpers/ServiceInfo.java
index 375e78c..1c76b8a 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/ksm/helpers/ServiceInfo.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/ozone/ksm/helpers/ServiceInfo.java
@@ -19,12 +19,18 @@
 package org.apache.hadoop.ozone.ksm.helpers;
 
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectReader;
+import com.fasterxml.jackson.databind.ObjectWriter;
 import com.google.common.base.Preconditions;
+import org.apache.hadoop.ozone.client.rest.response.BucketInfo;
 import org.apache.hadoop.ozone.protocol.proto.KeySpaceManagerProtocolProtos;
 import org.apache.hadoop.ozone.protocol.proto.KeySpaceManagerProtocolProtos
     .ServicePort;
 import org.apache.hadoop.ozone.protocol.proto.OzoneProtos.NodeType;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -36,35 +42,45 @@ import java.util.stream.Collectors;
  */
 public final class ServiceInfo {
 
+  private static final ObjectReader READER =
+      new ObjectMapper().readerFor(ServiceInfo.class);
+  private static final ObjectWriter WRITER =
+      new ObjectMapper().writerWithDefaultPrettyPrinter();
+
   /**
    * Type of node/service.
    */
-  private final NodeType nodeType;
+  private NodeType nodeType;
   /**
    * Hostname of the node in which the service is running.
    */
-  private final String hostname;
+  private String hostname;
 
   /**
    * List of ports the service listens to.
    */
-  private final Map<ServicePort.Type, ServicePort> portsMap;
+  private Map<ServicePort.Type, Integer> ports;
+
+  /**
+   * Default constructor for JSON deserialization.
+   */
+  public ServiceInfo() {}
 
   /**
    * Constructs the ServiceInfo for the {@code nodeType}.
    * @param nodeType type of node/service
    * @param hostname hostname of the service
-   * @param ports list of ports the service listens to
+   * @param portList list of ports the service listens to
    */
   private ServiceInfo(
-      NodeType nodeType, String hostname, List<ServicePort> ports) {
+      NodeType nodeType, String hostname, List<ServicePort> portList) {
     Preconditions.checkNotNull(nodeType);
     Preconditions.checkNotNull(hostname);
     this.nodeType = nodeType;
     this.hostname = hostname;
-    this.portsMap = new HashMap<>();
-    for (ServicePort port : ports) {
-      portsMap.put(port.getType(), port);
+    this.ports = new HashMap<>();
+    for (ServicePort port : portList) {
+      ports.put(port.getType(), port.getValue());
     }
   }
 
@@ -85,11 +101,11 @@ public final class ServiceInfo {
   }
 
   /**
-   * Returns the list of port which the service listens to.
-   * @return List<ServicePort>
+   * Returns ServicePort.Type to port mappings.
+   * @return ports
    */
-  public List<ServicePort> getPorts() {
-    return portsMap.values().parallelStream().collect(Collectors.toList());
+  public Map<ServicePort.Type, Integer> getPorts() {
+    return ports;
   }
 
   /**
@@ -99,8 +115,9 @@ public final class ServiceInfo {
    * @param type the type of port.
    *             ex: RPC, HTTP, HTTPS, etc..
    */
+  @JsonIgnore
   public int getPort(ServicePort.Type type) {
-    return portsMap.get(type).getValue();
+    return ports.get(type);
   }
 
   /**
@@ -108,12 +125,20 @@ public final class ServiceInfo {
    *
    * @return KeySpaceManagerProtocolProtos.ServiceInfo
    */
+  @JsonIgnore
   public KeySpaceManagerProtocolProtos.ServiceInfo getProtobuf() {
     KeySpaceManagerProtocolProtos.ServiceInfo.Builder builder =
         KeySpaceManagerProtocolProtos.ServiceInfo.newBuilder();
     builder.setNodeType(nodeType)
         .setHostname(hostname)
-        .addAllServicePorts(portsMap.values());
+        .addAllServicePorts(
+            ports.entrySet().stream()
+                .map(
+                    entry ->
+                        ServicePort.newBuilder()
+                            .setType(entry.getKey())
+                            .setValue(entry.getValue()).build())
+                .collect(Collectors.toList()));
     return builder.build();
   }
 
@@ -122,6 +147,7 @@ public final class ServiceInfo {
    *
    * @return {@link ServiceInfo}
    */
+  @JsonIgnore
   public static ServiceInfo getFromProtobuf(
       KeySpaceManagerProtocolProtos.ServiceInfo serviceInfo) {
     return new ServiceInfo(serviceInfo.getNodeType(),
@@ -129,6 +155,26 @@ public final class ServiceInfo {
         serviceInfo.getServicePortsList());
   }
 
+  /**
+   * Returns a JSON string of this object.
+   *
+   * @return String - json string
+   * @throws IOException
+   */
+  public String toJsonString() throws IOException {
+    return WRITER.writeValueAsString(this);
+  }
+
+  /**
+   * Parse a JSON string into ServiceInfo Object.
+   *
+   * @param jsonString Json String
+   * @return BucketInfo
+   * @throws IOException
+   */
+  public static BucketInfo parse(String jsonString) throws IOException {
+    return READER.readValue(jsonString);
+  }
 
   /**
    * Creates a new builder to build {@link ServiceInfo}.
@@ -145,7 +191,7 @@ public final class ServiceInfo {
 
     private NodeType node;
     private String host;
-    private List<ServicePort> ports = new ArrayList<>();
+    private List<ServicePort> portList = new ArrayList<>();
 
 
     /**
@@ -174,7 +220,7 @@ public final class ServiceInfo {
      * @return the builder
      */
     public Builder addServicePort(ServicePort servicePort) {
-      ports.add(servicePort);
+      portList.add(servicePort);
       return this;
     }
 
@@ -184,7 +230,7 @@ public final class ServiceInfo {
      * @return {@link ServiceInfo}
      */
     public ServiceInfo build() {
-      return new ServiceInfo(node, host, ports);
+      return new ServiceInfo(node, host, portList);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hadoop/blob/45118257/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/ksm/KeySpaceManager.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/ksm/KeySpaceManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/ksm/KeySpaceManager.java
index 359dad7..cb960f5 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/ksm/KeySpaceManager.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/ksm/KeySpaceManager.java
@@ -173,7 +173,7 @@ public class KeySpaceManager extends ServiceRuntimeInfoImpl
     metrics = KSMMetrics.create();
     keyManager = new KeyManagerImpl(scmBlockClient, metadataManager,
         configuration);
-    httpServer = new KeySpaceManagerHttpServer(configuration);
+    httpServer = new KeySpaceManagerHttpServer(configuration, this);
   }
 
   /**
@@ -785,6 +785,11 @@ public class KeySpaceManager extends ServiceRuntimeInfoImpl
     return "" + ksmRpcAddress.getPort();
   }
 
+  @VisibleForTesting
+  public KeySpaceManagerHttpServer getHttpServer() {
+    return httpServer;
+  }
+
   @Override
   public List<ServiceInfo> getServiceList() throws IOException {
     // When we implement multi-home this call has to be handled properly.

http://git-wip-us.apache.org/repos/asf/hadoop/blob/45118257/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/ksm/KeySpaceManagerHttpServer.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/ksm/KeySpaceManagerHttpServer.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/ksm/KeySpaceManagerHttpServer.java
index 395c782..b229c89 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/ksm/KeySpaceManagerHttpServer.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/ksm/KeySpaceManagerHttpServer.java
@@ -19,6 +19,7 @@ package org.apache.hadoop.ozone.ksm;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.ozone.OzoneConfigKeys;
+import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.web.OzoneHttpServer;
 
 import java.io.IOException;
@@ -28,8 +29,11 @@ import java.io.IOException;
  */
 public class KeySpaceManagerHttpServer extends OzoneHttpServer {
 
-  public KeySpaceManagerHttpServer(Configuration conf) throws IOException {
+  public KeySpaceManagerHttpServer(Configuration conf, KeySpaceManager ksm)
+      throws IOException {
     super(conf, "ksm");
+    addServlet("serviceList", "/serviceList", ServiceListJSONServlet.class);
+    getWebAppContext().setAttribute(OzoneConsts.KSM_CONTEXT_ATTRIBUTE, ksm);
   }
 
   @Override protected String getHttpAddressKey() {

http://git-wip-us.apache.org/repos/asf/hadoop/blob/45118257/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/ksm/ServiceListJSONServlet.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/ksm/ServiceListJSONServlet.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/ksm/ServiceListJSONServlet.java
new file mode 100644
index 0000000..34a80ce
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/ksm/ServiceListJSONServlet.java
@@ -0,0 +1,103 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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 org.apache.hadoop.ozone.ksm;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+
+import org.apache.hadoop.ozone.OzoneConsts;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+
+/**
+ * Provides REST access to Ozone Service List.
+ * <p>
+ * This servlet generally will be placed under the /serviceList URL of
+ * KeySpaceManager HttpServer.
+ *
+ * The return format is of JSON and in the form
+ * <p>
+ *  <code><pre>
+ *  {
+ *    "services" : [
+ *      {
+ *        "NodeType":"KSM",
+ *        "Hostname" "$hostname",
+ *        "ports" : {
+ *          "$PortType" : "$port",
+ *          ...
+ *        }
+ *      }
+ *    ]
+ *  }
+ *  </pre></code>
+ *  <p>
+ *
+ */
+public class ServiceListJSONServlet  extends HttpServlet  {
+
+  private static final Logger LOG =
+      LoggerFactory.getLogger(ServiceListJSONServlet.class);
+  private static final long serialVersionUID = 1L;
+
+  private KeySpaceManager ksm;
+
+  public void init() throws ServletException {
+    this.ksm = (KeySpaceManager) getServletContext()
+        .getAttribute(OzoneConsts.KSM_CONTEXT_ATTRIBUTE);
+  }
+
+  /**
+   * Process a GET request for the specified resource.
+   *
+   * @param request
+   *          The servlet request we are processing
+   * @param response
+   *          The servlet response we are creating
+   */
+  @Override
+  public void doGet(HttpServletRequest request, HttpServletResponse response) {
+    try {
+      ObjectMapper objectMapper = new ObjectMapper();
+      objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
+      response.setContentType("application/json; charset=utf8");
+      PrintWriter writer = response.getWriter();
+      try {
+        writer.write(objectMapper.writeValueAsString(ksm.getServiceList()));
+      } finally {
+        if (writer != null) {
+          writer.close();
+        }
+      }
+    } catch (IOException e) {
+      LOG.error(
+          "Caught an exception while processing ServiceList request", e);
+      response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/45118257/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/web/OzoneHttpServer.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/web/OzoneHttpServer.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/web/OzoneHttpServer.java
index 74105aa..b6a8fda 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/web/OzoneHttpServer.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/ozone/web/OzoneHttpServer.java
@@ -25,9 +25,11 @@ import org.apache.hadoop.http.HttpConfig;
 import org.apache.hadoop.http.HttpServer2;
 import org.apache.hadoop.net.NetUtils;
 import org.apache.hadoop.ozone.client.OzoneClientUtils;
+import org.eclipse.jetty.webapp.WebAppContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.servlet.http.HttpServlet;
 import java.io.IOException;
 import java.net.InetSocketAddress;
 
@@ -80,6 +82,25 @@ public abstract class OzoneHttpServer {
 
   }
 
+  /**
+   * Add a servlet to OzoneHttpServer.
+   * @param servletName The name of the servlet
+   * @param pathSpec The path spec for the servlet
+   * @param clazz The servlet class
+   */
+  protected void addServlet(String servletName, String pathSpec,
+                            Class<? extends HttpServlet> clazz) {
+    httpServer.addServlet(servletName, pathSpec, clazz);
+  }
+
+  /**
+   * Returns the WebAppContext associated with this HttpServer.
+   * @return WebAppContext
+   */
+  protected WebAppContext getWebAppContext() {
+    return httpServer.getWebAppContext();
+  }
+
   protected InetSocketAddress getBindAddress(String bindHostKey,
       String addressKey, String bindHostDefault, int bindPortdefault) {
     final Optional<String> bindHost =

http://git-wip-us.apache.org/repos/asf/hadoop/blob/45118257/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/ksm/TestKeySpaceManagerHttpServer.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/ksm/TestKeySpaceManagerHttpServer.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/ksm/TestKeySpaceManagerHttpServer.java
index d16d251..c64f9e5 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/ksm/TestKeySpaceManagerHttpServer.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/ksm/TestKeySpaceManagerHttpServer.java
@@ -99,7 +99,7 @@ public class TestKeySpaceManagerHttpServer {
     InetSocketAddress addr = InetSocketAddress.createUnresolved("localhost", 0);
     KeySpaceManagerHttpServer server = null;
     try {
-      server = new KeySpaceManagerHttpServer(conf);
+      server = new KeySpaceManagerHttpServer(conf, null);
       server.start();
 
       Assert.assertTrue(implies(policy.isHttpEnabled(),

http://git-wip-us.apache.org/repos/asf/hadoop/blob/45118257/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/ksm/TestKeySpaceManagerRestInterface.java
----------------------------------------------------------------------
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/ksm/TestKeySpaceManagerRestInterface.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/ksm/TestKeySpaceManagerRestInterface.java
new file mode 100644
index 0000000..c719356
--- /dev/null
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/ozone/ksm/TestKeySpaceManagerRestInterface.java
@@ -0,0 +1,113 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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 org.apache.hadoop.ozone.ksm;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.hadoop.conf.OzoneConfiguration;
+import org.apache.hadoop.net.NetUtils;
+import org.apache.hadoop.ozone.MiniOzoneClassicCluster;
+import org.apache.hadoop.ozone.MiniOzoneCluster;
+import org.apache.hadoop.ozone.OzoneConsts;
+import org.apache.hadoop.ozone.client.OzoneClientUtils;
+import org.apache.hadoop.ozone.ksm.helpers.ServiceInfo;
+import org.apache.hadoop.ozone.protocol.proto.KeySpaceManagerProtocolProtos;
+import org.apache.hadoop.ozone.protocol.proto.OzoneProtos;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.net.InetSocketAddress;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * This class is to test the REST interface exposed by KeySpaceManager.
+ */
+public class TestKeySpaceManagerRestInterface {
+
+  private static MiniOzoneCluster cluster;
+  private static OzoneConfiguration conf;
+
+  @BeforeClass
+  public static void setUp() throws Exception {
+    conf = new OzoneConfiguration();
+    cluster = new MiniOzoneClassicCluster.Builder(conf)
+        .setHandlerType(OzoneConsts.OZONE_HANDLER_DISTRIBUTED)
+        .setClusterId(UUID.randomUUID().toString())
+        .setScmId(UUID.randomUUID().toString())
+        .build();
+  }
+
+  @AfterClass
+  public static void tearDown() throws Exception {
+    if (cluster != null) {
+      cluster.close();
+    }
+  }
+
+  @Test
+  public void testGetServiceList() throws Exception {
+    KeySpaceManagerHttpServer server =
+        cluster.getKeySpaceManager().getHttpServer();
+    HttpClient client = HttpClients.createDefault();
+    String connectionUri = "http://" +
+        NetUtils.getHostPortString(server.getHttpAddress());
+    HttpGet httpGet = new HttpGet(connectionUri + "/serviceList");
+    HttpResponse response = client.execute(httpGet);
+    String serviceListJson = EntityUtils.toString(response.getEntity());
+
+    ObjectMapper objectMapper = new ObjectMapper();
+    TypeReference<List<ServiceInfo>> serviceInfoReference =
+        new TypeReference<List<ServiceInfo>>() {};
+    List<ServiceInfo> serviceInfos = objectMapper.readValue(
+        serviceListJson, serviceInfoReference);
+    Map<OzoneProtos.NodeType, ServiceInfo> serviceMap = new HashMap<>();
+    for (ServiceInfo serviceInfo : serviceInfos) {
+      serviceMap.put(serviceInfo.getNodeType(), serviceInfo);
+    }
+
+    InetSocketAddress ksmAddress =
+        OzoneClientUtils.getKsmAddressForClients(conf);
+    ServiceInfo ksmInfo = serviceMap.get(OzoneProtos.NodeType.KSM);
+
+    Assert.assertEquals(ksmAddress.getHostName(), ksmInfo.getHostname());
+    Assert.assertEquals(ksmAddress.getPort(),
+        ksmInfo.getPort(KeySpaceManagerProtocolProtos.ServicePort.Type.RPC));
+    Assert.assertEquals(server.getHttpAddress().getPort(),
+        ksmInfo.getPort(KeySpaceManagerProtocolProtos.ServicePort.Type.HTTP));
+
+    InetSocketAddress scmAddress =
+        OzoneClientUtils.getScmAddressForClients(conf);
+    ServiceInfo scmInfo = serviceMap.get(OzoneProtos.NodeType.SCM);
+
+    Assert.assertEquals(scmAddress.getHostName(), scmInfo.getHostname());
+    Assert.assertEquals(scmAddress.getPort(),
+        scmInfo.getPort(KeySpaceManagerProtocolProtos.ServicePort.Type.RPC));
+  }
+
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org