This is an automated email from the ASF dual-hosted git repository.

pzampino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git


The following commit(s) were added to refs/heads/master by this push:
     new 3be8d5d  KNOX-1949 - CM discovery - Improve efficiency of discovery
3be8d5d is described below

commit 3be8d5d0642f957601f70ffd8180f0fd3fa64a49
Author: pzampino <[email protected]>
AuthorDate: Wed Jul 24 13:57:50 2019 -0400

    KNOX-1949 - CM discovery - Improve efficiency of discovery
---
 .../cm/ClouderaManagerServiceDiscovery.java        |  26 +-
 .../discovery/cm/ServiceModelGenerator.java        |  17 +
 .../cm/model/AbstractServiceModelGenerator.java    |   5 +
 .../model/atlas/AtlasAPIServiceModelGenerator.java |  19 +-
 .../cm/model/atlas/AtlasServiceModelGenerator.java |  26 +-
 .../model/hbase/HBaseUIServiceModelGenerator.java  |  28 +-
 .../model/hbase/WebHBaseServiceModelGenerator.java |  26 +-
 .../cm/model/hdfs/HdfsUIServiceModelGenerator.java |  12 +-
 .../model/hdfs/NameNodeServiceModelGenerator.java  |  24 +-
 .../model/hdfs/WebHdfsServiceModelGenerator.java   |  12 +-
 .../cm/model/hive/HiveServiceModelGenerator.java   |  26 +-
 .../cm/model/hue/HueLBServiceModelGenerator.java   |  26 +-
 .../cm/model/hue/HueServiceModelGenerator.java     |  26 +-
 .../cm/model/livy/LivyServiceModelGenerator.java   |  26 +-
 .../cm/model/livy/LivyUIServiceModelGenerator.java |  39 --
 .../cm/model/oozie/OozieServiceModelGenerator.java |  26 +-
 .../model/oozie/OozieUIServiceModelGenerator.java  |  17 +-
 .../model/ranger/RangerServiceModelGenerator.java  |  26 +-
 .../ranger/RangerUIServiceModelGenerator.java      |  16 +-
 .../cm/model/solr/SolrServiceModelGenerator.java   |  26 +-
 .../spark/SparkHistoryUIServiceModelGenerator.java |  26 +-
 .../yarn/JobHistoryUIServiceModelGenerator.java    |  26 +-
 .../ResourceManagerUIServiceModelGenerator.java    |  19 +-
 .../cm/model/yarn/YarnUIServiceModelGenerator.java |  34 +-
 .../model/yarn/YarnUIv2ServiceModelGenerator.java  |  15 +-
 .../zeppelin/ZeppelinServiceModelGenerator.java    |  46 +-
 .../zeppelin/ZeppelinUIServiceModelGenerator.java  |  13 +-
 .../zeppelin/ZeppelinWSServiceModelGenerator.java  |  21 +-
 ...way.topology.discovery.cm.ServiceModelGenerator |   1 -
 .../cm/ClouderaManagerServiceDiscoveryTest.java    | 629 ++++++++++++++++++---
 30 files changed, 1007 insertions(+), 272 deletions(-)

diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java
index 6b53095..0a7ba47 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscovery.java
@@ -63,6 +63,16 @@ public class ClouderaManagerServiceDiscovery implements 
ServiceDiscovery {
   static final String DEFAULT_USER_ALIAS = "cm.discovery.user";
   static final String DEFAULT_PWD_ALIAS  = "cm.discovery.password";
 
+  private static Map<String, List<ServiceModelGenerator>> 
serviceModelGenerators = new HashMap<>();
+  static {
+    ServiceLoader<ServiceModelGenerator> loader = 
ServiceLoader.load(ServiceModelGenerator.class);
+    for (ServiceModelGenerator serviceModelGenerator : loader) {
+      List<ServiceModelGenerator> smgList =
+          
serviceModelGenerators.computeIfAbsent(serviceModelGenerator.getServiceType(), 
k -> new ArrayList<>());
+      smgList.add(serviceModelGenerator);
+    }
+  }
+
   private boolean debug;
 
   @GatewayService
@@ -162,7 +172,6 @@ public class ClouderaManagerServiceDiscovery implements 
ServiceDiscovery {
     cluster = new ClouderaManagerCluster(clusterName);
 
     Set<ServiceModel> serviceModels = new HashSet<>();
-    ServiceLoader<ServiceModelGenerator> loader = 
ServiceLoader.load(ServiceModelGenerator.class);
 
     ApiServiceList serviceList = getClusterServices(servicesResourceApi, 
clusterName);
     if (serviceList != null) {
@@ -179,11 +188,16 @@ public class ClouderaManagerServiceDiscovery implements 
ServiceDiscovery {
             ApiConfigList roleConfig =
                 getRoleConfig(rolesResourceApi, clusterName, serviceName, 
roleName);
 
-            for (ServiceModelGenerator serviceModelGenerator : loader) {
-              if (serviceModelGenerator.handles(service, serviceConfig, role, 
roleConfig)) {
-                serviceModelGenerator.setApiClient(client);
-                ServiceModel serviceModel = 
serviceModelGenerator.generateService(service, serviceConfig, role, roleConfig);
-                serviceModels.add(serviceModel);
+            List<ServiceModelGenerator> smgList = 
serviceModelGenerators.get(service.getType());
+            if (smgList != null) {
+              for (ServiceModelGenerator serviceModelGenerator : smgList) {
+                if (serviceModelGenerator != null) {
+                  if (serviceModelGenerator.handles(service, serviceConfig, 
role, roleConfig)) {
+                    serviceModelGenerator.setApiClient(client);
+                    ServiceModel serviceModel = 
serviceModelGenerator.generateService(service, serviceConfig, role, roleConfig);
+                    serviceModels.add(serviceModel);
+                  }
+                }
               }
             }
           }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ServiceModelGenerator.java
index 6c0cdc8..6249174 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ServiceModelGenerator.java
@@ -24,6 +24,23 @@ import com.cloudera.api.swagger.model.ApiServiceConfig;
 
 public interface ServiceModelGenerator {
 
+  /**
+   * @return The name of the Knox service for which the implementation will 
generate a model.
+   */
+  String getService();
+
+  /**
+   * @return The Cloudera Manager configuration service type.
+   */
+  String getServiceType();
+
+  /**
+   * @return The Cloudera Manager configuration role type.
+   */
+  String getRoleType();
+
+  ServiceModel.Type getModelType();
+
   void setApiClient(DiscoveryApiClient client);
 
   boolean handles(ApiService       service,
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/AbstractServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/AbstractServiceModelGenerator.java
index e4badc9..95d1bfd 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/AbstractServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/AbstractServiceModelGenerator.java
@@ -21,6 +21,7 @@ import com.cloudera.api.swagger.model.ApiConfig;
 import com.cloudera.api.swagger.model.ApiConfigList;
 import com.cloudera.api.swagger.model.ApiServiceConfig;
 import org.apache.knox.gateway.topology.discovery.cm.DiscoveryApiClient;
+import org.apache.knox.gateway.topology.discovery.cm.ServiceModel;
 import org.apache.knox.gateway.topology.discovery.cm.ServiceModelGenerator;
 
 import java.util.List;
@@ -73,4 +74,8 @@ public abstract class AbstractServiceModelGenerator 
implements ServiceModelGener
     return val;
   }
 
+  protected ServiceModel createServiceModel(final String url) {
+    return new ServiceModel(getModelType(), getService(), url);
+  }
+
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/atlas/AtlasAPIServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/atlas/AtlasAPIServiceModelGenerator.java
index 32edd66..d4ae063 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/atlas/AtlasAPIServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/atlas/AtlasAPIServiceModelGenerator.java
@@ -16,24 +16,19 @@
  */
 package org.apache.knox.gateway.topology.discovery.cm.model.atlas;
 
-import com.cloudera.api.swagger.client.ApiException;
-import com.cloudera.api.swagger.model.ApiConfigList;
-import com.cloudera.api.swagger.model.ApiRole;
-import com.cloudera.api.swagger.model.ApiService;
-import com.cloudera.api.swagger.model.ApiServiceConfig;
 import org.apache.knox.gateway.topology.discovery.cm.ServiceModel;
 
 public class AtlasAPIServiceModelGenerator extends AtlasServiceModelGenerator {
   private static final String SERVICE = "ATLAS-API";
 
   @Override
-  public ServiceModel generateService(ApiService       service,
-                                      ApiServiceConfig serviceConfig,
-                                      ApiRole          role,
-                                      ApiConfigList    roleConfig) throws 
ApiException {
-    return new ServiceModel(ServiceModel.Type.API,
-                           SERVICE,
-                           super.generateService(service, serviceConfig, role, 
roleConfig).getServiceUrl());
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.API;
   }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/atlas/AtlasServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/atlas/AtlasServiceModelGenerator.java
index 3888d2e..415a9c8 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/atlas/AtlasServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/atlas/AtlasServiceModelGenerator.java
@@ -32,8 +32,28 @@ public class AtlasServiceModelGenerator extends 
AbstractServiceModelGenerator {
   private static final String ROLE_TYPE = "ATLAS_SERVER";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public String getServiceType() {
+    return SERVICE_TYPE;
+  }
+
+  @Override
+  public String getRoleType() {
+    return ROLE_TYPE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.UI;
+  }
+
+  @Override
   public boolean handles(ApiService service, ApiServiceConfig serviceConfig, 
ApiRole role, ApiConfigList roleConfig) {
-    return SERVICE_TYPE.equals(service.getType()) && 
ROLE_TYPE.equals(role.getType());
+    return getServiceType().equals(service.getType()) && 
getRoleType().equals(role.getType());
   }
 
   @Override
@@ -52,8 +72,8 @@ public class AtlasServiceModelGenerator extends 
AbstractServiceModelGenerator {
       scheme = "http";
       port = getRoleConfigValue(roleConfig, "atlas_server_http_port");
     }
-    return new ServiceModel(ServiceModel.Type.UI,
-                            SERVICE,
+    return new ServiceModel(getModelType(),
+                            getService(),
                             String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
   }
 
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hbase/HBaseUIServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hbase/HBaseUIServiceModelGenerator.java
index 59fbf7d..55e631f 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hbase/HBaseUIServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hbase/HBaseUIServiceModelGenerator.java
@@ -32,8 +32,28 @@ public class HBaseUIServiceModelGenerator extends 
AbstractServiceModelGenerator
   private static final String ROLE_TYPE = "MASTER";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public String getServiceType() {
+    return SERVICE_TYPE;
+  }
+
+  @Override
+  public String getRoleType() {
+    return ROLE_TYPE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.UI;
+  }
+
+  @Override
   public boolean handles(ApiService service, ApiServiceConfig serviceConfig, 
ApiRole role, ApiConfigList roleConfig) {
-    return SERVICE_TYPE.equals(service.getType()) && 
ROLE_TYPE.equals(role.getType());
+    return getServiceType().equals(service.getType()) && 
getRoleType().equals(role.getType());
   }
 
   @Override
@@ -43,16 +63,14 @@ public class HBaseUIServiceModelGenerator extends 
AbstractServiceModelGenerator
                                       ApiConfigList    roleConfig) {
     String hostname = role.getHostRef().getHostname();
     String scheme;
-    String port = getRoleConfigValue(roleConfig, "hbase_master_info_port");
+    String port = getRoleConfigValue(roleConfig, "hbase_master_info_port"); // 
TODO: Is there an SSL port, or is this property re-used?
     boolean sslEnabled = 
Boolean.parseBoolean(getServiceConfigValue(serviceConfig, 
"hbase_hadoop_ssl_enabled"));
     if(sslEnabled) {
       scheme = "https";
     } else {
       scheme = "http";
     }
-    return new ServiceModel(ServiceModel.Type.UI,
-                            SERVICE,
-                            String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
+    return createServiceModel(String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
   }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hbase/WebHBaseServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hbase/WebHBaseServiceModelGenerator.java
index c47babd..f38d7a5 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hbase/WebHBaseServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hbase/WebHBaseServiceModelGenerator.java
@@ -32,8 +32,28 @@ public class WebHBaseServiceModelGenerator extends 
AbstractServiceModelGenerator
   private static final String ROLE_TYPE = "HBASERESTSERVER";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public String getServiceType() {
+    return SERVICE_TYPE;
+  }
+
+  @Override
+  public String getRoleType() {
+    return ROLE_TYPE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.API;
+  }
+
+  @Override
   public boolean handles(ApiService service, ApiServiceConfig serviceConfig, 
ApiRole role, ApiConfigList roleConfig) {
-    return SERVICE_TYPE.equals(service.getType()) && 
ROLE_TYPE.equals(role.getType());
+    return getServiceType().equals(service.getType()) && 
getRoleType().equals(role.getType());
   }
 
   @Override
@@ -50,9 +70,7 @@ public class WebHBaseServiceModelGenerator extends 
AbstractServiceModelGenerator
     } else {
       scheme = "http";
     }
-    return new ServiceModel(ServiceModel.Type.API,
-                            SERVICE,
-                            String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
+    return createServiceModel(String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
   }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/HdfsUIServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/HdfsUIServiceModelGenerator.java
index 522f958..19d74b0 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/HdfsUIServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/HdfsUIServiceModelGenerator.java
@@ -29,6 +29,16 @@ public class HdfsUIServiceModelGenerator extends 
NameNodeServiceModelGenerator {
   private static final String SERVICE = "HDFSUI";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.UI;
+  }
+
+  @Override
   public ServiceModel generateService(ApiService       service,
                                       ApiServiceConfig serviceConfig,
                                       ApiRole          role,
@@ -45,7 +55,7 @@ public class HdfsUIServiceModelGenerator extends 
NameNodeServiceModelGenerator {
       port = getRoleConfigValue(roleConfig, "dfs_http_port");
     }
     String namenodeUrl = String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port);
-    return new ServiceModel(ServiceModel.Type.UI, SERVICE, namenodeUrl);
+    return createServiceModel(namenodeUrl);
   }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/NameNodeServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/NameNodeServiceModelGenerator.java
index 230a1f3..075c94e 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/NameNodeServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/NameNodeServiceModelGenerator.java
@@ -32,11 +32,31 @@ public class NameNodeServiceModelGenerator extends 
AbstractServiceModelGenerator
   private static final String ROLE_TYPE    = "NAMENODE";
 
   @Override
+  public String getServiceType() {
+    return SERVICE_TYPE;
+  }
+
+  @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public String getRoleType() {
+    return ROLE_TYPE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.API;
+  }
+
+  @Override
   public boolean handles(ApiService       service,
                          ApiServiceConfig serviceConfig,
                          ApiRole          role,
                          ApiConfigList    roleConfig) {
-    return SERVICE_TYPE.equals(service.getType()) && 
ROLE_TYPE.equals(role.getType());
+    return getServiceType().equals(service.getType()) && 
getRoleType().equals(role.getType());
   }
 
   @Override
@@ -54,7 +74,7 @@ public class NameNodeServiceModelGenerator extends 
AbstractServiceModelGenerator
       String port = getRoleConfigValue(roleConfig, "namenode_port");
       serviceUrl = String.format(Locale.getDefault(), "hdfs://%s:%s", 
hostname, port);
     }
-    return new ServiceModel(ServiceModel.Type.API, SERVICE, serviceUrl);
+    return createServiceModel(serviceUrl);
   }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/WebHdfsServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/WebHdfsServiceModelGenerator.java
index 469ac39..62909ec 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/WebHdfsServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/WebHdfsServiceModelGenerator.java
@@ -28,6 +28,16 @@ public class WebHdfsServiceModelGenerator extends 
HdfsUIServiceModelGenerator {
   private static final String WEBHDFS_SUFFIX = "/webhdfs";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.API;
+  }
+
+  @Override
   public boolean handles(ApiService       service,
                          ApiServiceConfig serviceConfig,
                          ApiRole          role,
@@ -43,7 +53,7 @@ public class WebHdfsServiceModelGenerator extends 
HdfsUIServiceModelGenerator {
                                       ApiConfigList    roleConfig) throws 
ApiException {
     String serviceUrl =
         super.generateService(service, serviceConfig, role, 
roleConfig).getServiceUrl() + WEBHDFS_SUFFIX;
-    return new ServiceModel(ServiceModel.Type.API, SERVICE, serviceUrl);
+    return createServiceModel(serviceUrl);
   }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hive/HiveServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hive/HiveServiceModelGenerator.java
index f01ff02..7cb787d 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hive/HiveServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hive/HiveServiceModelGenerator.java
@@ -33,8 +33,28 @@ public class HiveServiceModelGenerator extends 
AbstractServiceModelGenerator {
   private static final String ROLE_TYPE    = "HIVESERVER2";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public String getServiceType() {
+    return SERVICE_TYPE;
+  }
+
+  @Override
+  public String getRoleType() {
+    return ROLE_TYPE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.API;
+  }
+
+  @Override
   public boolean handles(ApiService service, ApiServiceConfig serviceConfig, 
ApiRole role, ApiConfigList roleConfig) {
-    return SERVICE_TYPE.equals(service.getType()) && 
ROLE_TYPE.equals(role.getType()) && checkHiveServer2HTTPMode(roleConfig);
+    return getServiceType().equals(service.getType()) && 
getRoleType().equals(role.getType()) && checkHiveServer2HTTPMode(roleConfig);
   }
 
   @Override
@@ -48,9 +68,7 @@ public class HiveServiceModelGenerator extends 
AbstractServiceModelGenerator {
     String httpPath = getSafetyValveValue(hs2SafetyValve, 
"hive.server2.thrift.http.path");
     boolean sslEnabled = Boolean.parseBoolean(getRoleConfigValue(roleConfig, 
"hive.server2.use.SSL"));
     String scheme = sslEnabled ? "https" : "http";
-    return new ServiceModel(ServiceModel.Type.API,
-                            SERVICE,
-                            String.format(Locale.getDefault(), 
"%s://%s:%s/%s", scheme, hostname, port, httpPath));
+    return createServiceModel(String.format(Locale.getDefault(), 
"%s://%s:%s/%s", scheme, hostname, port, httpPath));
   }
 
   private boolean checkHiveServer2HTTPMode(ApiConfigList roleConfig) {
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hue/HueLBServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hue/HueLBServiceModelGenerator.java
index 63eb0b6..19a4647 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hue/HueLBServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hue/HueLBServiceModelGenerator.java
@@ -32,8 +32,28 @@ public class HueLBServiceModelGenerator extends 
AbstractServiceModelGenerator {
   private static final String ROLE_TYPE = "HUE_LOAD_BALANCER";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public String getServiceType() {
+    return SERVICE_TYPE;
+  }
+
+  @Override
+  public String getRoleType() {
+    return ROLE_TYPE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.UI;
+  }
+
+  @Override
   public boolean handles(ApiService service, ApiServiceConfig serviceConfig, 
ApiRole role, ApiConfigList roleConfig) {
-    return SERVICE_TYPE.equals(service.getType()) && 
ROLE_TYPE.equals(role.getType());
+    return getServiceType().equals(service.getType()) && 
getRoleType().equals(role.getType());
   }
 
   @Override
@@ -44,9 +64,7 @@ public class HueLBServiceModelGenerator extends 
AbstractServiceModelGenerator {
     String hostname = role.getHostRef().getHostname();
     String scheme = "http";
     String port = getRoleConfigValue(roleConfig, "listen");
-    return new ServiceModel(ServiceModel.Type.UI,
-                            SERVICE,
-                            String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
+    return createServiceModel(String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
   }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hue/HueServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hue/HueServiceModelGenerator.java
index 12e4eb3..adf70fa 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hue/HueServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/hue/HueServiceModelGenerator.java
@@ -32,8 +32,28 @@ public class HueServiceModelGenerator extends 
AbstractServiceModelGenerator {
   private static final String ROLE_TYPE = "HUE_SERVER";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public String getServiceType() {
+    return SERVICE_TYPE;
+  }
+
+  @Override
+  public String getRoleType() {
+    return ROLE_TYPE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.UI;
+  }
+
+  @Override
   public boolean handles(ApiService service, ApiServiceConfig serviceConfig, 
ApiRole role, ApiConfigList roleConfig) {
-    return SERVICE_TYPE.equals(service.getType()) && 
ROLE_TYPE.equals(role.getType());
+    return getServiceType().equals(service.getType()) && 
getRoleType().equals(role.getType());
   }
 
   @Override
@@ -50,9 +70,7 @@ public class HueServiceModelGenerator extends 
AbstractServiceModelGenerator {
     } else {
       scheme = "http";
     }
-    return new ServiceModel(ServiceModel.Type.UI,
-                            SERVICE,
-                            String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
+    return createServiceModel(String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
   }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/livy/LivyServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/livy/LivyServiceModelGenerator.java
index 48c3f9d..99b4b7b 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/livy/LivyServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/livy/LivyServiceModelGenerator.java
@@ -32,8 +32,28 @@ public class LivyServiceModelGenerator extends 
AbstractServiceModelGenerator {
   private static final String ROLE_TYPE = "LIVY_SERVER";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public String getServiceType() {
+    return SERVICE_TYPE;
+  }
+
+  @Override
+  public String getRoleType() {
+    return ROLE_TYPE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.API;
+  }
+
+  @Override
   public boolean handles(ApiService service, ApiServiceConfig serviceConfig, 
ApiRole role, ApiConfigList roleConfig) {
-    return SERVICE_TYPE.equals(service.getType()) && 
ROLE_TYPE.equals(role.getType());
+    return getServiceType().equals(service.getType()) && 
getRoleType().equals(role.getType());
   }
 
   @Override
@@ -50,9 +70,7 @@ public class LivyServiceModelGenerator extends 
AbstractServiceModelGenerator {
     } else {
       scheme = "http";
     }
-    return new ServiceModel(ServiceModel.Type.API,
-                            SERVICE,
-                            String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
+    return createServiceModel(String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
   }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/livy/LivyUIServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/livy/LivyUIServiceModelGenerator.java
deleted file mode 100644
index 3c8160a..0000000
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/livy/LivyUIServiceModelGenerator.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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
- *
- * 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 org.apache.knox.gateway.topology.discovery.cm.model.livy;
-
-import com.cloudera.api.swagger.model.ApiConfigList;
-import com.cloudera.api.swagger.model.ApiRole;
-import com.cloudera.api.swagger.model.ApiService;
-import com.cloudera.api.swagger.model.ApiServiceConfig;
-import org.apache.knox.gateway.topology.discovery.cm.ServiceModel;
-
-public class LivyUIServiceModelGenerator extends LivyServiceModelGenerator {
-
-  private static final String SERVICE = "LIVYSERVER";
-
-  @Override
-  public ServiceModel generateService(ApiService       service,
-                                      ApiServiceConfig serviceConfig,
-                                      ApiRole          role,
-                                      ApiConfigList    roleConfig) {
-    String serviceUrl = super.generateService(service, serviceConfig, role, 
roleConfig).getServiceUrl();
-    return new ServiceModel(ServiceModel.Type.UI, SERVICE, serviceUrl);
-  }
-
-
-}
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/oozie/OozieServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/oozie/OozieServiceModelGenerator.java
index d31c020..17a1c1f 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/oozie/OozieServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/oozie/OozieServiceModelGenerator.java
@@ -32,8 +32,28 @@ public class OozieServiceModelGenerator extends 
AbstractServiceModelGenerator {
   private static final String ROLE_TYPE = "OOZIE_SERVER";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public String getServiceType() {
+    return SERVICE_TYPE;
+  }
+
+  @Override
+  public String getRoleType() {
+    return ROLE_TYPE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.API;
+  }
+
+  @Override
   public boolean handles(ApiService service, ApiServiceConfig serviceConfig, 
ApiRole role, ApiConfigList roleConfig) {
-    return SERVICE_TYPE.equals(service.getType()) && 
ROLE_TYPE.equals(role.getType());
+    return getServiceType().equals(service.getType()) && 
getRoleType().equals(role.getType());
   }
 
   @Override
@@ -52,9 +72,7 @@ public class OozieServiceModelGenerator extends 
AbstractServiceModelGenerator {
       scheme = "http";
       port = getRoleConfigValue(roleConfig, "oozie_http_port");
     }
-    return new ServiceModel(ServiceModel.Type.API,
-                            SERVICE,
-                            String.format(Locale.getDefault(), 
"%s://%s:%s/oozie/", scheme, hostname, port));
+    return createServiceModel(String.format(Locale.getDefault(), 
"%s://%s:%s/oozie/", scheme, hostname, port));
   }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/oozie/OozieUIServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/oozie/OozieUIServiceModelGenerator.java
index d5d8b27..e07c586 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/oozie/OozieUIServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/oozie/OozieUIServiceModelGenerator.java
@@ -16,24 +16,19 @@
  */
 package org.apache.knox.gateway.topology.discovery.cm.model.oozie;
 
-import com.cloudera.api.swagger.model.ApiConfigList;
-import com.cloudera.api.swagger.model.ApiRole;
-import com.cloudera.api.swagger.model.ApiService;
-import com.cloudera.api.swagger.model.ApiServiceConfig;
 import org.apache.knox.gateway.topology.discovery.cm.ServiceModel;
 
 public class OozieUIServiceModelGenerator extends OozieServiceModelGenerator {
   private static final String SERVICE = "OOZIEUI";
 
   @Override
-  public ServiceModel generateService(ApiService       service,
-                                      ApiServiceConfig serviceConfig,
-                                      ApiRole          role,
-                                      ApiConfigList    roleConfig) {
-    return new ServiceModel(ServiceModel.Type.UI,
-                            SERVICE,
-                            super.generateService(service, serviceConfig, 
role, roleConfig).getServiceUrl());
+  public String getService() {
+    return SERVICE;
   }
 
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.UI;
+  }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/ranger/RangerServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/ranger/RangerServiceModelGenerator.java
index f39f707..edb9621 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/ranger/RangerServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/ranger/RangerServiceModelGenerator.java
@@ -31,8 +31,28 @@ public class RangerServiceModelGenerator extends 
AbstractServiceModelGenerator {
   private static final String ROLE_TYPE = "RANGER_ADMIN";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public String getServiceType() {
+    return SERVICE_TYPE;
+  }
+
+  @Override
+  public String getRoleType() {
+    return ROLE_TYPE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.API;
+  }
+
+  @Override
   public boolean handles(ApiService service, ApiServiceConfig serviceConfig, 
ApiRole role, ApiConfigList roleConfig) {
-    return SERVICE_TYPE.equals(service.getType()) && 
ROLE_TYPE.equals(role.getType());
+    return getServiceType().equals(service.getType()) && 
getRoleType().equals(role.getType());
   }
 
   @Override
@@ -51,9 +71,7 @@ public class RangerServiceModelGenerator extends 
AbstractServiceModelGenerator {
       scheme = "http";
       port = getServiceConfigValue(serviceConfig, "ranger_service_http_port");
     }
-    return new ServiceModel(ServiceModel.Type.API,
-                            SERVICE,
-                            String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
+    return createServiceModel(String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
   }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/ranger/RangerUIServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/ranger/RangerUIServiceModelGenerator.java
index 5ffd097..d1ef9b3 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/ranger/RangerUIServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/ranger/RangerUIServiceModelGenerator.java
@@ -16,23 +16,19 @@
  */
 package org.apache.knox.gateway.topology.discovery.cm.model.ranger;
 
-import com.cloudera.api.swagger.model.ApiConfigList;
-import com.cloudera.api.swagger.model.ApiRole;
-import com.cloudera.api.swagger.model.ApiService;
-import com.cloudera.api.swagger.model.ApiServiceConfig;
 import org.apache.knox.gateway.topology.discovery.cm.ServiceModel;
 
 public class RangerUIServiceModelGenerator extends RangerServiceModelGenerator 
{
   private static final String SERVICE = "RANGERUI";
 
   @Override
-  public ServiceModel generateService(ApiService       service,
-                                      ApiServiceConfig serviceConfig,
-                                      ApiRole          role,
-                                      ApiConfigList    roleConfig) {
-    String serviceUrl = super.generateService(service, serviceConfig, role, 
roleConfig).getServiceUrl();
-    return new ServiceModel(ServiceModel.Type.UI, SERVICE, serviceUrl);
+  public String getService() {
+    return SERVICE;
   }
 
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.UI;
+  }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/solr/SolrServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/solr/SolrServiceModelGenerator.java
index bc6472b..7f19653 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/solr/SolrServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/solr/SolrServiceModelGenerator.java
@@ -31,8 +31,28 @@ public class SolrServiceModelGenerator extends 
AbstractServiceModelGenerator {
   private static final String ROLE_TYPE = "SOLR_SERVER";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public String getServiceType() {
+    return SERVICE_TYPE;
+  }
+
+  @Override
+  public String getRoleType() {
+    return ROLE_TYPE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.API;
+  }
+
+  @Override
   public boolean handles(ApiService service, ApiServiceConfig serviceConfig, 
ApiRole role, ApiConfigList roleConfig) {
-    return SERVICE_TYPE.equals(service.getType()) && 
ROLE_TYPE.equals(role.getType());
+    return getServiceType().equals(service.getType()) && 
getRoleType().equals(role.getType());
   }
 
   @Override
@@ -51,9 +71,7 @@ public class SolrServiceModelGenerator extends 
AbstractServiceModelGenerator {
       scheme = "http";
       port = getRoleConfigValue(roleConfig, "solr_http_port");
     }
-    return new ServiceModel(ServiceModel.Type.API,
-                            SERVICE,
-                            String.format(Locale.getDefault(), 
"%s://%s:%s/solr/", scheme, hostname, port));
+    return createServiceModel(String.format(Locale.getDefault(), 
"%s://%s:%s/solr/", scheme, hostname, port));
   }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/spark/SparkHistoryUIServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/spark/SparkHistoryUIServiceModelGenerator.java
index 62b122c..89d9d41 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/spark/SparkHistoryUIServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/spark/SparkHistoryUIServiceModelGenerator.java
@@ -31,8 +31,28 @@ public class SparkHistoryUIServiceModelGenerator extends 
AbstractServiceModelGen
   private static final String ROLE_TYPE = "SPARK_YARN_HISTORY_SERVER";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public String getServiceType() {
+    return SERVICE_TYPE;
+  }
+
+  @Override
+  public String getRoleType() {
+    return ROLE_TYPE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.UI;
+  }
+
+  @Override
   public boolean handles(ApiService service, ApiServiceConfig serviceConfig, 
ApiRole role, ApiConfigList roleConfig) {
-    return SERVICE_TYPE.equals(service.getType()) && 
ROLE_TYPE.equals(role.getType());
+    return getServiceType().equals(service.getType()) && 
getRoleType().equals(role.getType());
   }
 
   @Override
@@ -51,9 +71,7 @@ public class SparkHistoryUIServiceModelGenerator extends 
AbstractServiceModelGen
       scheme = "http";
       port = getRoleConfigValue(roleConfig, "history_server_web_port");
     }
-    return new ServiceModel(ServiceModel.Type.UI,
-                            SERVICE,
-                            String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
+    return createServiceModel(String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
   }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/JobHistoryUIServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/JobHistoryUIServiceModelGenerator.java
index b9f5609..5dfdeab 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/JobHistoryUIServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/JobHistoryUIServiceModelGenerator.java
@@ -33,8 +33,28 @@ public class JobHistoryUIServiceModelGenerator extends 
AbstractServiceModelGener
   private static final String ROLE_TYPE = "JOBHISTORY";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public String getServiceType() {
+    return SERVICE_TYPE;
+  }
+
+  @Override
+  public String getRoleType() {
+    return ROLE_TYPE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.UI;
+  }
+
+  @Override
   public boolean handles(ApiService service, ApiServiceConfig serviceConfig, 
ApiRole role, ApiConfigList roleConfig) {
-    return SERVICE_TYPE.equals(service.getType()) && 
ROLE_TYPE.equals(role.getType());
+    return getServiceType().equals(service.getType()) && 
getRoleType().equals(role.getType());
   }
 
   @Override
@@ -53,9 +73,7 @@ public class JobHistoryUIServiceModelGenerator extends 
AbstractServiceModelGener
       scheme = "http";
       port = getRoleConfigValue(roleConfig, 
"mapreduce_jobhistory_webapp_address");
     }
-    return new ServiceModel(ServiceModel.Type.UI,
-                            SERVICE,
-                            String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
+    return createServiceModel(String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
   }
 
   private boolean isSSLEnabled(ApiService service, ApiServiceConfig 
serviceConfig)
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/ResourceManagerUIServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/ResourceManagerUIServiceModelGenerator.java
index 6954045..e05b80d 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/ResourceManagerUIServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/ResourceManagerUIServiceModelGenerator.java
@@ -28,13 +28,20 @@ public class ResourceManagerUIServiceModelGenerator extends 
YarnUIServiceModelGe
   private static final String RM_WS_SUFFIX = "/ws";
 
   @Override
-  public ServiceModel generateService(ApiService       service,
-                                      ApiServiceConfig serviceConfig,
-                                      ApiRole          role,
-                                      ApiConfigList    roleConfig) throws 
ApiException {
-    String url =  super.generateService(service, serviceConfig, role, 
roleConfig).getServiceUrl() + RM_WS_SUFFIX;
-    return new ServiceModel(ServiceModel.Type.API, SERVICE, url);
+  public String getService() {
+    return SERVICE;
   }
 
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.API;
+  }
 
+  @Override
+  protected String generateURL(ApiService       service,
+                               ApiServiceConfig serviceConfig,
+                               ApiRole          role,
+                               ApiConfigList    roleConfig) throws 
ApiException {
+    return (super.generateURL(service, serviceConfig, role, roleConfig) + 
RM_WS_SUFFIX);
+  }
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/YarnUIServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/YarnUIServiceModelGenerator.java
index 25136cb..3f060c1 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/YarnUIServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/YarnUIServiceModelGenerator.java
@@ -33,8 +33,28 @@ public class YarnUIServiceModelGenerator extends 
AbstractServiceModelGenerator {
   private static final String ROLE_TYPE = "RESOURCEMANAGER";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public String getServiceType() {
+    return SERVICE_TYPE;
+  }
+
+  @Override
+  public String getRoleType() {
+    return ROLE_TYPE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.UI;
+  }
+
+  @Override
   public boolean handles(ApiService service, ApiServiceConfig serviceConfig, 
ApiRole role, ApiConfigList roleConfig) {
-    return SERVICE_TYPE.equals(service.getType()) && 
ROLE_TYPE.equals(role.getType());
+    return getServiceType().equals(service.getType()) && 
getRoleType().equals(role.getType());
   }
 
   @Override
@@ -42,6 +62,14 @@ public class YarnUIServiceModelGenerator extends 
AbstractServiceModelGenerator {
                                       ApiServiceConfig serviceConfig,
                                       ApiRole          role,
                                       ApiConfigList    roleConfig) throws 
ApiException {
+    return createServiceModel(generateURL(service, serviceConfig, role, 
roleConfig));
+  }
+
+  protected String generateURL(ApiService       service,
+                               ApiServiceConfig serviceConfig,
+                               ApiRole          role,
+                               ApiConfigList    roleConfig) throws 
ApiException {
+
     String hostname = role.getHostRef().getHostname();
     String scheme;
     String port;
@@ -53,9 +81,7 @@ public class YarnUIServiceModelGenerator extends 
AbstractServiceModelGenerator {
       scheme = "http";
       port = getRoleConfigValue(roleConfig, "resourcemanager_webserver_port");
     }
-    return new ServiceModel(ServiceModel.Type.UI,
-                            SERVICE,
-                            String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
+    return String.format(Locale.getDefault(), "%s://%s:%s", scheme, hostname, 
port);
   }
 
   private boolean isSSLEnabled(ApiService service, ApiServiceConfig 
serviceConfig)
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/YarnUIv2ServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/YarnUIv2ServiceModelGenerator.java
index b71a7fe..101737d 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/YarnUIv2ServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/yarn/YarnUIv2ServiceModelGenerator.java
@@ -16,23 +16,12 @@
  */
 package org.apache.knox.gateway.topology.discovery.cm.model.yarn;
 
-import com.cloudera.api.swagger.client.ApiException;
-import com.cloudera.api.swagger.model.ApiConfigList;
-import com.cloudera.api.swagger.model.ApiRole;
-import com.cloudera.api.swagger.model.ApiService;
-import com.cloudera.api.swagger.model.ApiServiceConfig;
-import org.apache.knox.gateway.topology.discovery.cm.ServiceModel;
-
 public class YarnUIv2ServiceModelGenerator extends YarnUIServiceModelGenerator 
{
   private static final String SERVICE = "YARNUIV2";
 
   @Override
-  public ServiceModel generateService(ApiService       service,
-                                      ApiServiceConfig serviceConfig,
-                                      ApiRole          role,
-                                      ApiConfigList    roleConfig) throws 
ApiException {
-    String serviceUrl = super.generateService(service, serviceConfig, role, 
roleConfig).getServiceUrl();
-    return new ServiceModel(ServiceModel.Type.UI, SERVICE, serviceUrl);
+  public String getService() {
+    return SERVICE;
   }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/zeppelin/ZeppelinServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/zeppelin/ZeppelinServiceModelGenerator.java
index b6a4f9e..bd0789b 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/zeppelin/ZeppelinServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/zeppelin/ZeppelinServiceModelGenerator.java
@@ -32,8 +32,28 @@ public class ZeppelinServiceModelGenerator extends 
AbstractServiceModelGenerator
   protected static final String ROLE_TYPE = "ZEPPELIN_SERVER";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public String getServiceType() {
+    return SERVICE_TYPE;
+  }
+
+  @Override
+  public String getRoleType() {
+    return ROLE_TYPE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.UI;
+  }
+
+  @Override
   public boolean handles(ApiService service, ApiServiceConfig serviceConfig, 
ApiRole role, ApiConfigList roleConfig) {
-    return SERVICE_TYPE.equals(service.getType()) && 
ROLE_TYPE.equals(role.getType());
+    return getServiceType().equals(service.getType()) && 
getRoleType().equals(role.getType());
   }
 
   @Override
@@ -44,16 +64,26 @@ public class ZeppelinServiceModelGenerator extends 
AbstractServiceModelGenerator
     String hostname = role.getHostRef().getHostname();
     String scheme;
     String port;
-    boolean sslEnabled = Boolean.parseBoolean(getRoleConfigValue(roleConfig, 
"ssl_enabled"));
-    if(sslEnabled) {
+    if(isSSL(roleConfig)) {
       scheme = "https";
-      port = getRoleConfigValue(roleConfig, "zeppelin_server_ssl_port");
+      port = getSSLPort(roleConfig);
     } else {
       scheme = "http";
-      port = getRoleConfigValue(roleConfig, "zeppelin_server_port");
+      port = getPort(roleConfig);
     }
-    return new ServiceModel(ServiceModel.Type.UI,
-                            SERVICE,
-                            String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
+    return createServiceModel(String.format(Locale.getDefault(), "%s://%s:%s", 
scheme, hostname, port));
   }
+
+  protected boolean isSSL(ApiConfigList roleConfig) {
+    return Boolean.parseBoolean(getRoleConfigValue(roleConfig, "ssl_enabled"));
+  }
+
+  protected String getPort(ApiConfigList roleConfig) {
+    return getRoleConfigValue(roleConfig, "zeppelin_server_port");
+  }
+
+  protected String getSSLPort(ApiConfigList roleConfig) {
+    return getRoleConfigValue(roleConfig, "zeppelin_server_ssl_port");
+  }
+
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/zeppelin/ZeppelinUIServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/zeppelin/ZeppelinUIServiceModelGenerator.java
index 1f2b2d8..3c43b69 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/zeppelin/ZeppelinUIServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/zeppelin/ZeppelinUIServiceModelGenerator.java
@@ -17,19 +17,12 @@
 package org.apache.knox.gateway.topology.discovery.cm.model.zeppelin;
 
 
-import com.cloudera.api.swagger.client.ApiException;
-import com.cloudera.api.swagger.model.ApiConfigList;
-import com.cloudera.api.swagger.model.ApiRole;
-import com.cloudera.api.swagger.model.ApiService;
-import com.cloudera.api.swagger.model.ApiServiceConfig;
-import org.apache.knox.gateway.topology.discovery.cm.ServiceModel;
-
 public class ZeppelinUIServiceModelGenerator extends 
ZeppelinServiceModelGenerator {
   private static final String SERVICE = "ZEPPELINUI";
 
   @Override
-  public ServiceModel generateService(ApiService service, ApiServiceConfig 
serviceConfig, ApiRole role, ApiConfigList roleConfig) throws ApiException {
-    ServiceModel sm = super.generateService(service, serviceConfig, role, 
roleConfig);
-    return new ServiceModel(sm.getType(), SERVICE, sm.getServiceUrl());
+  public String getService() {
+    return SERVICE;
   }
+
 }
diff --git 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/zeppelin/ZeppelinWSServiceModelGenerator.java
 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/zeppelin/ZeppelinWSServiceModelGenerator.java
index 9f89412..5b5f526 100644
--- 
a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/zeppelin/ZeppelinWSServiceModelGenerator.java
+++ 
b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/model/zeppelin/ZeppelinWSServiceModelGenerator.java
@@ -28,6 +28,16 @@ public class ZeppelinWSServiceModelGenerator extends 
ZeppelinServiceModelGenerat
   private static final String SERVICE = "ZEPPELINWS";
 
   @Override
+  public String getService() {
+    return SERVICE;
+  }
+
+  @Override
+  public ServiceModel.Type getModelType() {
+    return ServiceModel.Type.API;
+  }
+
+  @Override
   public ServiceModel generateService(ApiService       service,
                                       ApiServiceConfig serviceConfig,
                                       ApiRole          role,
@@ -35,17 +45,14 @@ public class ZeppelinWSServiceModelGenerator extends 
ZeppelinServiceModelGenerat
     String hostname = role.getHostRef().getHostname();
     String scheme;
     String port;
-    boolean sslEnabled = Boolean.parseBoolean(getRoleConfigValue(roleConfig, 
"ssl_enabled"));
-    if(sslEnabled) {
+    if(isSSL(roleConfig)) {
       scheme = "wss";
-      port = getRoleConfigValue(roleConfig, "zeppelin_server_ssl_port");
+      port = getSSLPort(roleConfig);
     } else {
       scheme = "ws";
-      port = getRoleConfigValue(roleConfig, "zeppelin_server_port");
+      port = getPort(roleConfig);
     }
-    return new ServiceModel(ServiceModel.Type.API,
-                            SERVICE,
-                            String.format(Locale.getDefault(), 
"%s://%s:%s/ws", scheme, hostname, port));
+    return createServiceModel(String.format(Locale.getDefault(), 
"%s://%s:%s/ws", scheme, hostname, port));
   }
 
 }
diff --git 
a/gateway-discovery-cm/src/main/resources/META-INF/services/org.apache.knox.gateway.topology.discovery.cm.ServiceModelGenerator
 
b/gateway-discovery-cm/src/main/resources/META-INF/services/org.apache.knox.gateway.topology.discovery.cm.ServiceModelGenerator
index 4835681..64f56ad 100644
--- 
a/gateway-discovery-cm/src/main/resources/META-INF/services/org.apache.knox.gateway.topology.discovery.cm.ServiceModelGenerator
+++ 
b/gateway-discovery-cm/src/main/resources/META-INF/services/org.apache.knox.gateway.topology.discovery.cm.ServiceModelGenerator
@@ -27,7 +27,6 @@ 
org.apache.knox.gateway.topology.discovery.cm.model.hive.HiveServiceModelGenerat
 
org.apache.knox.gateway.topology.discovery.cm.model.hue.HueServiceModelGenerator
 
org.apache.knox.gateway.topology.discovery.cm.model.hue.HueLBServiceModelGenerator
 
org.apache.knox.gateway.topology.discovery.cm.model.livy.LivyServiceModelGenerator
-org.apache.knox.gateway.topology.discovery.cm.model.livy.LivyUIServiceModelGenerator
 
org.apache.knox.gateway.topology.discovery.cm.model.oozie.OozieServiceModelGenerator
 
org.apache.knox.gateway.topology.discovery.cm.model.oozie.OozieUIServiceModelGenerator
 
org.apache.knox.gateway.topology.discovery.cm.model.ranger.RangerServiceModelGenerator
diff --git 
a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryTest.java
 
b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryTest.java
index e7dcfc4..fa520be 100644
--- 
a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryTest.java
+++ 
b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerServiceDiscoveryTest.java
@@ -49,6 +49,48 @@ import static org.junit.Assert.assertNotNull;
 public class ClouderaManagerServiceDiscoveryTest {
 
   @Test
+  public void testAtlasDiscovery() {
+    doTestAtlasDiscovery(false);
+  }
+
+  @Test
+  public void testAtlasDiscoverySSL() {
+    doTestAtlasDiscovery(true);
+  }
+
+  @Test
+  public void testAtlasAPIDiscovery() {
+    doTestAtlasAPIDiscovery(false);
+  }
+
+  @Test
+  public void testAtlasAPIDiscoverySSL() {
+    doTestAtlasAPIDiscovery(true);
+  }
+
+  private void doTestAtlasDiscovery(final boolean isSSL) {
+    final String hostName       = "atlas-host-1";
+    final String port           = "21000";
+    final String sslPort        = "21003";
+    ServiceDiscovery.Cluster cluster = doTestAtlasDiscovery(hostName, port, 
sslPort, isSSL);
+    List<String> atlastURLs = cluster.getServiceURLs("ATLAS");
+    assertEquals(1, atlastURLs.size());
+    assertEquals((isSSL ? "https" : "http") + "://" + hostName + ":" + (isSSL 
? sslPort : port),
+                 atlastURLs.get(0));
+  }
+
+  private void doTestAtlasAPIDiscovery(final boolean isSSL) {
+    final String hostName       = "atlas-host-1";
+    final String port           = "21000";
+    final String sslPort        = "21003";
+    ServiceDiscovery.Cluster cluster = doTestAtlasDiscovery(hostName, port, 
sslPort, isSSL);
+    List<String> atlastURLs = cluster.getServiceURLs("ATLAS-API");
+    assertEquals(1, atlastURLs.size());
+    assertEquals((isSSL ? "https" : "http") + "://" + hostName + ":" + (isSSL 
? sslPort : port),
+        atlastURLs.get(0));
+  }
+
+  @Test
   public void testHiveServiceDiscovery() {
     doTestHiveServiceDiscovery(false);
   }
@@ -59,15 +101,13 @@ public class ClouderaManagerServiceDiscoveryTest {
   }
 
   private void doTestHiveServiceDiscovery(final boolean enableSSL) {
-    final String clusterName    = "test-cluster-1";
     final String hostName       = "test-host-1";
     final String thriftPort     = "10001";
     final String thriftPath     = "cliService";
     final String expectedScheme = (enableSSL ? "https" : "http");
 
     ServiceDiscovery.Cluster cluster =
-        doTestHiveServiceDiscovery(clusterName, hostName, thriftPort, 
thriftPath, enableSSL);
-    assertEquals(clusterName, cluster.getName());
+        doTestHiveServiceDiscovery(hostName, thriftPort, thriftPath, 
enableSSL);
     List<String> hiveURLs = cluster.getServiceURLs("HIVE");
     assertNotNull(hiveURLs);
     assertEquals(1, hiveURLs.size());
@@ -76,14 +116,12 @@ public class ClouderaManagerServiceDiscoveryTest {
 
   @Test
   public void testWebHDFSServiceDiscovery() {
-    final String clusterName = "test-cluster-1";
     final String hostName    = "test-host-1";
     final String nameService = "nameservice1";
     final String nnPort      = "50070";
     final String dfsHttpPort = "50075";
 
-    ServiceDiscovery.Cluster cluster = doTestHDFSDiscovery(clusterName, 
hostName, nameService, nnPort, dfsHttpPort);
-    assertEquals(clusterName, cluster.getName());
+    ServiceDiscovery.Cluster cluster = doTestHDFSDiscovery(hostName, 
nameService, nnPort, dfsHttpPort);
     List<String> webhdfsURLs = cluster.getServiceURLs("WEBHDFS");
     assertNotNull(webhdfsURLs);
     assertEquals(1, webhdfsURLs.size());
@@ -93,7 +131,6 @@ public class ClouderaManagerServiceDiscoveryTest {
 
   @Test
   public void testWebHDFSServiceDiscoveryWithSSL() {
-    final String clusterName  = "test-cluster-1";
     final String hostName     = "test-host-1";
     final String nameService  = "nameservice1";
     final String nnPort       = "50070";
@@ -101,8 +138,7 @@ public class ClouderaManagerServiceDiscoveryTest {
     final String dfsHttpsPort = "50079";
 
     ServiceDiscovery.Cluster cluster =
-        doTestHDFSDiscovery(clusterName, hostName, nameService, nnPort, 
dfsHttpPort, dfsHttpsPort);
-    assertEquals(clusterName, cluster.getName());
+        doTestHDFSDiscovery(hostName, nameService, nnPort, dfsHttpPort, 
dfsHttpsPort);
     List<String> webhdfsURLs = cluster.getServiceURLs("WEBHDFS");
     assertNotNull(webhdfsURLs);
     assertEquals(1, webhdfsURLs.size());
@@ -112,14 +148,12 @@ public class ClouderaManagerServiceDiscoveryTest {
 
   @Test
   public void testNameNodeServiceDiscovery() {
-    final String clusterName = "test-cluster-2";
     final String hostName    = "test-host-2";
     final String nameService = "nameservice2";
     final String nnPort      = "50070";
     final String dfsHttpPort = "50071";
 
-    ServiceDiscovery.Cluster cluster = doTestHDFSDiscovery(clusterName, 
hostName, nameService, nnPort, dfsHttpPort);
-    assertEquals(clusterName, cluster.getName());
+    ServiceDiscovery.Cluster cluster = doTestHDFSDiscovery(hostName, 
nameService, nnPort, dfsHttpPort);
     List<String> nnURLs = cluster.getServiceURLs("NAMENODE");
     assertNotNull(nnURLs);
     assertEquals(1, nnURLs.size());
@@ -128,15 +162,13 @@ public class ClouderaManagerServiceDiscoveryTest {
 
   @Test
   public void testNameNodeServiceDiscoveryHA() {
-    final String clusterName = "test-cluster-2";
     final String hostName    = "test-host-2";
     final String nameService = "nameservice2";
     final String nnPort      = "50070";
     final String dfsHttpPort = "50071";
 
     ServiceDiscovery.Cluster cluster =
-        doTestHDFSDiscovery(clusterName, hostName, nameService, nnPort, 
dfsHttpPort, null, true);
-    assertEquals(clusterName, cluster.getName());
+        doTestHDFSDiscovery(hostName, nameService, nnPort, dfsHttpPort, null, 
true);
     List<String> nnURLs = cluster.getServiceURLs("NAMENODE");
     assertNotNull(nnURLs);
     assertEquals(1, nnURLs.size());
@@ -145,22 +177,384 @@ public class ClouderaManagerServiceDiscoveryTest {
 
   @Test
   public void testHdfsUIServiceDiscovery() {
-    final String clusterName = "test-cluster-3";
     final String hostName    = "test-host-3";
     final String nameService = "nameservice3";
     final String nnPort      = "50070";
     final String dfsHttpPort = "50071";
 
-    ServiceDiscovery.Cluster cluster = doTestHDFSDiscovery(clusterName, 
hostName, nameService, nnPort, dfsHttpPort);
-    assertEquals(clusterName, cluster.getName());
+    ServiceDiscovery.Cluster cluster = doTestHDFSDiscovery(hostName, 
nameService, nnPort, dfsHttpPort);
     List<String> hdfsUIURLs = cluster.getServiceURLs("HDFSUI");
     assertNotNull(hdfsUIURLs);
     assertEquals(1, hdfsUIURLs.size());
     assertEquals(("http://"; + hostName + ":" + dfsHttpPort), 
hdfsUIURLs.get(0));
   }
 
-  private ServiceDiscovery.Cluster doTestHiveServiceDiscovery(final String  
clusterName,
-                                                              final String  
hostName,
+  @Test
+  public void testHBaseUIDiscovery() {
+    final String hostName    = "hbase-host";
+    final String port        = "22002";
+    ServiceDiscovery.Cluster cluster = doTestHBaseUIDiscovery(hostName, port, 
false);
+    assertNotNull(cluster);
+    List<String> hbaseURLs = cluster.getServiceURLs("HBASEUI");
+    assertNotNull(hbaseURLs);
+    assertEquals(1, hbaseURLs.size());
+    assertEquals("http://"; + hostName + ":" + port, hbaseURLs.get(0));
+  }
+
+  @Test
+  public void testHBaseUIDiscoverySSL() {
+    final String hostName    = "hbase-host";
+    final String port        = "22003";
+    ServiceDiscovery.Cluster cluster = doTestHBaseUIDiscovery(hostName, port, 
true);
+    assertNotNull(cluster);
+    List<String> hbaseURLs = cluster.getServiceURLs("HBASEUI");
+    assertNotNull(hbaseURLs);
+    assertEquals(1, hbaseURLs.size());
+    assertEquals("https://"; + hostName + ":" + port, hbaseURLs.get(0));
+  }
+
+  @Test
+  public void testWebHBaseDiscovery() {
+    final String hostName    = "hbase-host";
+    final String port        = "22008";
+    ServiceDiscovery.Cluster cluster = doTestWebHBaseDiscovery(hostName, port, 
false);
+    assertNotNull(cluster);
+    List<String> hbaseURLs = cluster.getServiceURLs("WEBHBASE");
+    assertNotNull(hbaseURLs);
+    assertEquals(1, hbaseURLs.size());
+    assertEquals("http://"; + hostName + ":" + port, hbaseURLs.get(0));
+  }
+
+  @Test
+  public void testWebHBaseDiscoverySSL() {
+    final String hostName    = "hbase-host";
+    final String port        = "22009";
+    ServiceDiscovery.Cluster cluster = doTestWebHBaseDiscovery(hostName, port, 
true);
+    assertNotNull(cluster);
+    List<String> hbaseURLs = cluster.getServiceURLs("WEBHBASE");
+    assertNotNull(hbaseURLs);
+    assertEquals(1, hbaseURLs.size());
+    assertEquals("https://"; + hostName + ":" + port, hbaseURLs.get(0));
+  }
+
+  @Test
+  public void testLivyDiscovery() {
+    final String hostName    = "livy-host";
+    final String port        = "8998";
+    ServiceDiscovery.Cluster cluster = doTestLivyDiscovery(hostName, port, 
false);
+    assertNotNull(cluster);
+    List<String> livyURLs = cluster.getServiceURLs("LIVYSERVER");
+    assertNotNull(livyURLs);
+    assertEquals(1, livyURLs.size());
+    assertEquals("http://"; + hostName + ":" + port, livyURLs.get(0));
+  }
+
+  @Test
+  public void testLivyDiscoverySSL() {
+    final String hostName    = "livy-host";
+    final String port        = "8998";
+    ServiceDiscovery.Cluster cluster = doTestLivyDiscovery(hostName, port, 
true);
+    assertNotNull(cluster);
+    List<String> livyURLs = cluster.getServiceURLs("LIVYSERVER");
+    assertNotNull(livyURLs);
+    assertEquals(1, livyURLs.size());
+    assertEquals("https://"; + hostName + ":" + port, livyURLs.get(0));
+  }
+
+
+  @Test
+  public void testOozieDiscovery() {
+    doTestOozieDiscovery("OOZIE", false);
+  }
+
+  @Test
+  public void testOozieDiscoverySSL() {
+    doTestOozieDiscovery("OOZIE", true);
+  }
+
+
+  @Test
+  public void testOozieUIDiscovery() {
+    doTestOozieDiscovery("OOZIEUI", false);
+  }
+
+  @Test
+  public void testOozieUIDiscoverySSL() {
+    doTestOozieDiscovery("OOZIEUI", true);
+  }
+
+  @Test
+  public void testRangerDiscovery() {
+    doTestRangerDiscovery("RANGER", false);
+  }
+
+  @Test
+  public void testRangerDiscoverySSL() {
+    doTestRangerDiscovery("RANGER", true);
+  }
+
+  @Test
+  public void testRangerUIDiscovery() {
+    doTestRangerDiscovery("RANGERUI", false);
+  }
+
+  @Test
+  public void testRangerUIDiscoverySSL() {
+    doTestRangerDiscovery("RANGERUI", true);
+  }
+
+  @Test
+  public void testSolrDiscovery() {
+    doTestSolrDiscovery(false);
+  }
+
+  @Test
+  public void testSolrDiscoverySSL() {
+    doTestSolrDiscovery(true);
+  }
+
+  @Test
+  public void testSparkHistoryUIDiscovery() {
+    doTestSparkHistoryUIDiscovery("spark-history-host", "18088", "18083", 
false);
+  }
+
+  @Test
+  public void testSparkHistoryUIDiscoverySSL() {
+    doTestSparkHistoryUIDiscovery("spark-history-host", "18088", "18083", 
true);
+  }
+
+  @Test
+  public void testZeppelinDiscovery() {
+    doTestZeppelinDiscovery("ZEPPELIN", false);
+  }
+
+  @Test
+  public void testZeppelinDiscoverySSL() {
+    doTestZeppelinDiscovery("ZEPPELIN", true);
+  }
+
+  @Test
+  public void testZeppelinUIDiscovery() {
+    doTestZeppelinDiscovery("ZEPPELINUI", false);
+  }
+
+  @Test
+  public void testZeppelinUIDiscoverySSL() {
+    doTestZeppelinDiscovery("ZEPPELINUI", true);
+  }
+
+  @Test
+  public void testZeppelinWSDiscovery() {
+    doTestZeppelinDiscovery("ZEPPELINWS", false);
+  }
+
+  @Test
+  public void testZeppelinWSDiscoverySSL() {
+    doTestZeppelinDiscovery("ZEPPELINWS", true);
+  }
+
+
+  private void doTestOozieDiscovery(final String serviceName, final boolean 
isSSL) {
+    final String hostName = "oozie-host";
+    final String port        = "11000";
+    final String sslPort     = "11003";
+    final String expectedURL =
+            (isSSL ? "https" : "http") + "://" + hostName + ":" + (isSSL ? 
sslPort : port) + "/oozie/";
+    ServiceDiscovery.Cluster cluster = doTestOozieDiscovery(hostName, port, 
sslPort, isSSL);
+    assertNotNull(cluster);
+    List<String> oozieURLs = cluster.getServiceURLs(serviceName);
+    assertNotNull(oozieURLs);
+    assertEquals(1, oozieURLs.size());
+    assertEquals(expectedURL, oozieURLs.get(0));
+  }
+
+  private ServiceDiscovery.Cluster doTestOozieDiscovery(final String  hostName,
+                                                        final String  port,
+                                                        final String  sslPort,
+                                                        final boolean isSSL) {
+    Map<String, String> serviceProperties = new HashMap<>();
+    serviceProperties.put("oozie_use_ssl", String.valueOf(isSSL));
+
+    // Configure the role
+    Map<String, String> roleProperties = new HashMap<>();
+    roleProperties.put("oozie_http_port", port);
+    roleProperties.put("oozie_https_port", sslPort);
+
+    return doTestDiscovery(hostName,
+                           "OOZIE-1",
+                           "OOZIE",
+                           "OOZIE-1-OOZIE_SERVER-12345",
+                           "OOZIE_SERVER",
+                           serviceProperties,
+                           roleProperties);
+  }
+
+
+  private void doTestZeppelinDiscovery(final String serviceName, final boolean 
isSSL) {
+    final String hostName = "zeppelin-host";
+    final String port     = "8886";
+    final String sslPort  = "8887";
+
+    String expectedScheme;
+    String expectedContextPath;
+
+    if ("ZEPPELINWS".equals(serviceName)) {
+      expectedScheme = "ws";
+      expectedContextPath = "/ws";
+    } else {
+      expectedScheme = "http";
+      expectedContextPath = "";
+    }
+    if (isSSL) {
+      expectedScheme += "s";
+    }
+
+    final String expectedURL =
+        expectedScheme + "://" + hostName + ":" + (isSSL ? sslPort : port) + 
expectedContextPath;
+    ServiceDiscovery.Cluster cluster = doTestZeppelinDiscovery(hostName, port, 
sslPort, isSSL);
+    assertNotNull(cluster);
+    List<String> zeppelinURLs = cluster.getServiceURLs(serviceName);
+    assertNotNull(zeppelinURLs);
+    assertEquals(1, zeppelinURLs.size());
+    assertEquals(expectedURL, zeppelinURLs.get(0));
+  }
+
+
+  private ServiceDiscovery.Cluster doTestZeppelinDiscovery(final String  
hostName,
+                                                           final String  port,
+                                                           final String  
sslPort,
+                                                           final boolean 
isSSL) {
+    // Configure the role
+    Map<String, String> roleProperties = new HashMap<>();
+    roleProperties.put("zeppelin_server_port", port);
+    roleProperties.put("zeppelin_server_ssl_port", sslPort);
+    roleProperties.put("ssl_enabled", String.valueOf(isSSL));
+
+    return doTestDiscovery(hostName,
+                           "ZEPPELIN-1",
+                           "ZEPPELIN",
+                           "ZEPPELIN-ZEPPELIN_SERVER-1",
+                           "ZEPPELIN_SERVER",
+                           Collections.emptyMap(),
+                           roleProperties);
+  }
+
+
+  private void doTestRangerDiscovery(final String serviceName, final boolean 
isSSL) {
+    final String hostName    = "ranger-host";
+    final String port        = "6080";
+    final String sslPort     = "6083";
+    final String expectedURL =
+        (isSSL ? "https" : "http") + "://" + hostName + ":" + (isSSL ? sslPort 
: port);
+    ServiceDiscovery.Cluster cluster = doTestRangerDiscovery(hostName, port, 
sslPort, isSSL);
+    assertNotNull(cluster);
+    List<String> rangerURLs = cluster.getServiceURLs(serviceName);
+    assertNotNull(rangerURLs);
+    assertEquals(1, rangerURLs.size());
+    assertEquals(expectedURL, rangerURLs.get(0));
+  }
+
+
+  private void doTestSolrDiscovery(final boolean isSSL) {
+    final String hostName    = "solr-host";
+    final String port        = "8983";
+    final String sslPort     = "8985";
+    final String expectedURL =
+        (isSSL ? "https" : "http") + "://" + hostName + ":" + (isSSL ? sslPort 
: port) + "/solr/";
+    ServiceDiscovery.Cluster cluster = doTestSolrDiscovery(hostName, port, 
sslPort, isSSL);
+    assertNotNull(cluster);
+    List<String> solrURLs = cluster.getServiceURLs("SOLR");
+    assertNotNull(solrURLs);
+    assertEquals(1, solrURLs.size());
+    assertEquals(expectedURL, solrURLs.get(0));
+  }
+
+
+  private ServiceDiscovery.Cluster doTestRangerDiscovery(final String  
hostName,
+                                                         final String  port,
+                                                         final String  sslPort,
+                                                         final boolean isSSL) {
+    Map<String, String> serviceProperties = new HashMap<>();
+    serviceProperties.put("ranger_service_http_port", port);
+    serviceProperties.put("ranger_service_https_port", sslPort);
+
+    // Configure the role
+    Map<String, String> roleProperties = new HashMap<>();
+    roleProperties.put("ssl_enabled", String.valueOf(isSSL));
+
+    return doTestDiscovery(hostName,
+                           "RANGER-1",
+                           "RANGER",
+                           "RANGER-RANGER_ADMIN-1",
+                           "RANGER_ADMIN",
+                           serviceProperties,
+                           roleProperties);
+  }
+
+
+  private ServiceDiscovery.Cluster doTestSolrDiscovery(final String  hostName,
+                                                       final String  port,
+                                                       final String  sslPort,
+                                                       final boolean isSSL) {
+    Map<String, String> serviceProperties = new HashMap<>();
+    serviceProperties.put("solr_use_ssl", String.valueOf(isSSL));
+
+    // Configure the role
+    Map<String, String> roleProperties = new HashMap<>();
+    roleProperties.put("solr_http_port", port);
+    roleProperties.put("solr_https_port", sslPort);
+
+    return doTestDiscovery(hostName,
+                           "SOLR-1",
+                           "SOLR",
+                           "SOLR-SOLR_SERVER-1",
+                           "SOLR_SERVER",
+                           serviceProperties,
+                           roleProperties);
+  }
+
+
+  private ServiceDiscovery.Cluster doTestSparkHistoryUIDiscovery(final String  
hostName,
+                                                                 final String  
port,
+                                                                 final String  
sslPort,
+                                                                 final boolean 
isSSL) {
+    // Configure the role
+    Map<String, String> roleProperties = new HashMap<>();
+    roleProperties.put("ssl_enabled", String.valueOf(isSSL));
+    roleProperties.put("history_server_web_port", port);
+    roleProperties.put("ssl_server_port", sslPort);
+
+    return doTestDiscovery(hostName,
+                           "SPARK_ON_YARN-1",
+                           "SPARK_ON_YARN",
+                           "SPAR4fcf419a-SPARK_YARN_HISTORY_SERVER-12345",
+                           "SPARK_YARN_HISTORY_SERVER",
+                           Collections.emptyMap(),
+                           roleProperties);
+  }
+
+
+  private ServiceDiscovery.Cluster doTestAtlasDiscovery(final String  
atlasHost,
+                                                        final String  port,
+                                                        final String  sslPort,
+                                                        final boolean isSSL) {
+    // Configure the role
+    Map<String, String> roleProperties = new HashMap<>();
+    roleProperties.put("atlas_server_http_port", port);
+    roleProperties.put("atlas_server_https_port", sslPort);
+    roleProperties.put("ssl_enabled", String.valueOf(isSSL));
+
+    return doTestDiscovery(atlasHost,
+                           "ATLAS-1",
+                           "ATLAS",
+                           "ATLAS-ATLAS_SERVER-1",
+                           "ATLAS_SERVER",
+                           Collections.emptyMap(),
+                           roleProperties);
+  }
+
+
+  private ServiceDiscovery.Cluster doTestHiveServiceDiscovery(final String  
hostName,
                                                               final String  
thriftPort,
                                                               final String  
thriftPath,
                                                               final boolean 
enableSSL) {
@@ -169,73 +563,136 @@ public class ClouderaManagerServiceDiscoveryTest {
           "<property><name>hive.server2.thrift.http.port</name><value>" + 
thriftPort + "</value></property>\n" +
           "<property><name>hive.server2.thrift.http.path</name><value>" + 
thriftPath + "</value></property>";
 
-    GatewayConfig gwConf = EasyMock.createNiceMock(GatewayConfig.class);
-    EasyMock.replay(gwConf);
-
-    ServiceDiscoveryConfig sdConfig = createMockDiscoveryConfig();
-
-    // Create the test client for providing test response content
-    TestDiscoveryApiClient mockClient = new TestDiscoveryApiClient(sdConfig, 
null);
-
-    // Prepare the service list response for the cluster
-    ApiServiceList serviceList = EasyMock.createNiceMock(ApiServiceList.class);
-    EasyMock.expect(serviceList.getItems())
-        .andReturn(Collections.singletonList(createMockApiService("HIVE-1", 
"HIVE")))
-        .anyTimes();
-    EasyMock.replay(serviceList);
-    mockClient.addResponse(ApiServiceList.class, new 
TestApiServiceListResponse(serviceList));
-
-    // Prepare the HIVE service config response for the cluster
-    ApiServiceConfig hiveServiceConfig = createMockApiServiceConfig();
-    mockClient.addResponse(ApiServiceConfig.class, new 
TestApiServiceConfigResponse(hiveServiceConfig));
-
-    // Prepare the HS2 role
-    ApiRole hs2Role =
-        
createMockApiRole("HIVE-1-HIVESERVER2-d0b64dd7b7611e22bc976ede61678d9e", 
"HIVESERVER2", hostName);
-    ApiRoleList hiveRoleList = EasyMock.createNiceMock(ApiRoleList.class);
-    
EasyMock.expect(hiveRoleList.getItems()).andReturn(Collections.singletonList(hs2Role)).anyTimes();
-    EasyMock.replay(hiveRoleList);
-    mockClient.addResponse(ApiRoleList.class, new 
TestApiRoleListResponse(hiveRoleList));
-
-    // Configure the HS2 role
+    // Configure the role
     Map<String, String> roleProperties = new HashMap<>();
     roleProperties.put("hive_hs2_config_safety_valve", hs2SafetyValveValue);
     roleProperties.put("hive.server2.use.SSL", String.valueOf(enableSSL));
-    ApiConfigList hiveRoleConfigList = createMockApiConfigList(roleProperties);
-    mockClient.addResponse(ApiConfigList.class, new 
TestApiConfigListResponse(hiveRoleConfigList));
 
-    // Invoke the service discovery
-    ClouderaManagerServiceDiscovery cmsd = new 
ClouderaManagerServiceDiscovery(true);
-    ServiceDiscovery.Cluster cluster = cmsd.discover(gwConf, sdConfig, 
clusterName, mockClient);
-    assertNotNull(cluster);
-    return cluster;
+    return doTestDiscovery(hostName,
+                           "HIVE-1",
+                           "HIVE",
+                           "HIVE-1-HIVESERVER2-12345",
+                           "HIVESERVER2",
+                           Collections.emptyMap(),
+                           roleProperties);
   }
 
-  private ServiceDiscovery.Cluster doTestHDFSDiscovery(final String 
clusterName,
-                                                       final String hostName,
+
+  private ServiceDiscovery.Cluster doTestHDFSDiscovery(final String hostName,
                                                        final String 
nameService,
                                                        final String nnPort,
                                                        final String 
dfsHttpPort) {
-    return doTestHDFSDiscovery(clusterName, hostName, nameService, nnPort, 
dfsHttpPort, null);
+    return doTestHDFSDiscovery(hostName, nameService, nnPort, dfsHttpPort, 
null);
   }
 
-  private ServiceDiscovery.Cluster doTestHDFSDiscovery(final String 
clusterName,
-                                                       final String hostName,
+
+  private ServiceDiscovery.Cluster doTestHDFSDiscovery(final String hostName,
                                                        final String 
nameService,
                                                        final String nnPort,
                                                        final String 
dfsHttpPort,
                                                        final String 
dfsHttpsPort) {
-    return doTestHDFSDiscovery(clusterName, hostName, nameService, nnPort, 
dfsHttpPort, dfsHttpsPort, false);
+    return doTestHDFSDiscovery(hostName, nameService, nnPort, dfsHttpPort, 
dfsHttpsPort, false);
   }
 
-  private ServiceDiscovery.Cluster doTestHDFSDiscovery(final String  
clusterName,
-                                                       final String  hostName,
+
+  private ServiceDiscovery.Cluster doTestHDFSDiscovery(final String  hostName,
                                                        final String  
nameService,
                                                        final String  nnPort,
                                                        final String  
dfsHttpPort,
                                                        final String  
dfsHttpsPort,
                                                        final boolean enableHA) 
{
 
+    // Prepare the HDFS service config response for the cluster
+    Map<String, String> serviceProps = new HashMap<>();
+    serviceProps.put("hdfs_hadoop_ssl_enabled", String.valueOf(dfsHttpsPort != 
null && !dfsHttpsPort.isEmpty()));
+    serviceProps.put("dfs_webhdfs_enabled", "true");
+
+    // Configure the role
+    Map<String, String> roleProperties = new HashMap<>();
+    roleProperties.put("dfs_federation_namenode_nameservice", nameService);
+    roleProperties.put("autofailover_enabled", String.valueOf(enableHA));
+    roleProperties.put("namenode_port", nnPort);
+    roleProperties.put("dfs_http_port", dfsHttpPort);
+    if (dfsHttpsPort != null && !dfsHttpsPort.isEmpty()) {
+      roleProperties.put("dfs_https_port", dfsHttpsPort);
+    }
+
+    return doTestDiscovery(hostName,
+                           "NAMENODE-1",
+                           "HDFS",
+                           "HDFS-1-NAMENODE-12345",
+                           "NAMENODE",
+                           serviceProps,
+                           roleProperties);
+  }
+
+
+  private ServiceDiscovery.Cluster doTestHBaseUIDiscovery(final String  
hostName,
+                                                          final String  port,
+                                                          final boolean isSSL) 
{
+    // Prepare the HBase service config response for the cluster
+    Map<String, String> serviceProps = new HashMap<>();
+    serviceProps.put("hbase_hadoop_ssl_enabled", String.valueOf(isSSL));
+
+    // Configure the role
+    Map<String, String> roleProperties = new HashMap<>();
+    roleProperties.put("hbase_master_info_port", port);
+
+    return doTestDiscovery(hostName,
+                           "HBASE-1",
+                           "HBASE",
+                           "HBASE-1-MASTER-12345",
+                           "MASTER",
+                           serviceProps,
+                           roleProperties);
+  }
+
+
+  private ServiceDiscovery.Cluster doTestWebHBaseDiscovery(final String  
hostName,
+                                                           final String  port,
+                                                           final boolean 
isSSL) {
+    // Configure the role
+    Map<String, String> roleProperties = new HashMap<>();
+    roleProperties.put("hbase_restserver_port", port);
+    roleProperties.put("hbase_restserver_ssl_enable", String.valueOf(isSSL));
+
+    return doTestDiscovery(hostName,
+                           "HBASE-1",
+                           "HBASE",
+                           "HBASE-1-RESTSERVER",
+                           "HBASERESTSERVER",
+                           Collections.emptyMap(),
+                           roleProperties);
+  }
+
+
+  private ServiceDiscovery.Cluster doTestLivyDiscovery(final String  hostName,
+                                                       final String  port,
+                                                       final boolean isSSL) {
+    // Configure the role
+    Map<String, String> roleProperties = new HashMap<>();
+    roleProperties.put("livy_server_port", port);
+    roleProperties.put("ssl_enabled", String.valueOf(isSSL));
+
+    return doTestDiscovery(hostName,
+                           "LIVY-1",
+                           "LIVY",
+                           "LIVY-LIVY_SERVER-1",
+                           "LIVY_SERVER",
+                           Collections.emptyMap(),
+                           roleProperties);
+  }
+
+
+  private ServiceDiscovery.Cluster doTestDiscovery(final String hostName,
+                                                   final String serviceName,
+                                                   final String serviceType,
+                                                   final String roleName,
+                                                   final String roleType,
+                                                   final Map<String, String> 
serviceProperties,
+                                                   final Map<String, String> 
roleProperties) {
+    final String clusterName = "cluster-1";
+
     GatewayConfig gwConf = EasyMock.createNiceMock(GatewayConfig.class);
     EasyMock.replay(gwConf);
 
@@ -247,36 +704,25 @@ public class ClouderaManagerServiceDiscoveryTest {
     // Prepare the service list response for the cluster
     ApiServiceList serviceList = EasyMock.createNiceMock(ApiServiceList.class);
     EasyMock.expect(serviceList.getItems())
-        
.andReturn(Collections.singletonList(createMockApiService("NAMENODE-1", 
"HDFS")))
-        .anyTimes();
+            
.andReturn(Collections.singletonList(createMockApiService(serviceName, 
serviceType)))
+            .anyTimes();
     EasyMock.replay(serviceList);
     mockClient.addResponse(ApiServiceList.class, new 
TestApiServiceListResponse(serviceList));
 
-    // Prepare the HDFS service config response for the cluster
-    Map<String, String> serviceProps = new HashMap<>();
-    serviceProps.put("hdfs_hadoop_ssl_enabled", String.valueOf(dfsHttpsPort != 
null && !dfsHttpsPort.isEmpty()));
-    serviceProps.put("dfs_webhdfs_enabled", "true");
-    ApiServiceConfig hdfsServiceConfig = 
createMockApiServiceConfig(serviceProps);
-    mockClient.addResponse(ApiServiceConfig.class, new 
TestApiServiceConfigResponse(hdfsServiceConfig));
+    // Prepare the Livy service config response for the cluster
+    ApiServiceConfig hbase = createMockApiServiceConfig(serviceProperties);
+    mockClient.addResponse(ApiServiceConfig.class, new 
TestApiServiceConfigResponse(hbase));
 
-    // Prepare the NameNode role
-    ApiRole nnRole = 
createMockApiRole("HDFS-1-NAMENODE-d0b64dd7b7611e22bc976ede61678d9e", 
"NAMENODE", hostName);
-    ApiRoleList nnRoleList = EasyMock.createNiceMock(ApiRoleList.class);
-    
EasyMock.expect(nnRoleList.getItems()).andReturn(Collections.singletonList(nnRole)).anyTimes();
-    EasyMock.replay(nnRoleList);
-    mockClient.addResponse(ApiRoleList.class, new 
TestApiRoleListResponse(nnRoleList));
+    // Prepare the Livy Server role
+    ApiRole livyServerRole = createMockApiRole(roleName, roleType, hostName);
+    ApiRoleList livyServerRoleList = 
EasyMock.createNiceMock(ApiRoleList.class);
+    
EasyMock.expect(livyServerRoleList.getItems()).andReturn(Collections.singletonList(livyServerRole)).anyTimes();
+    EasyMock.replay(livyServerRoleList);
+    mockClient.addResponse(ApiRoleList.class, new 
TestApiRoleListResponse(livyServerRoleList));
 
-    // Configure the NameNode role
-    Map<String, String> roleProperties = new HashMap<>();
-    roleProperties.put("dfs_federation_namenode_nameservice", nameService);
-    roleProperties.put("autofailover_enabled", String.valueOf(enableHA));
-    roleProperties.put("namenode_port", nnPort);
-    roleProperties.put("dfs_http_port", dfsHttpPort);
-    if (dfsHttpsPort != null && !dfsHttpsPort.isEmpty()) {
-      roleProperties.put("dfs_https_port", dfsHttpsPort);
-    }
-    ApiConfigList nnRoleConfigList = createMockApiConfigList(roleProperties);
-    mockClient.addResponse(ApiConfigList.class, new 
TestApiConfigListResponse(nnRoleConfigList));
+    // Configure the Livy Server role
+    ApiConfigList atlasServerRoleConfigList = 
createMockApiConfigList(roleProperties);
+    mockClient.addResponse(ApiConfigList.class, new 
TestApiConfigListResponse(atlasServerRoleConfigList));
 
     // Invoke the service discovery
     ClouderaManagerServiceDiscovery cmsd = new 
ClouderaManagerServiceDiscovery(true);
@@ -286,6 +732,7 @@ public class ClouderaManagerServiceDiscoveryTest {
     return cluster;
   }
 
+
   private static ServiceDiscoveryConfig createMockDiscoveryConfig() {
     return createMockDiscoveryConfig("http://localhost:1234";, "itsme");
   }
@@ -319,10 +766,6 @@ public class ClouderaManagerServiceDiscoveryTest {
     return r;
   }
 
-  private static ApiServiceConfig createMockApiServiceConfig() {
-    return createMockApiServiceConfig(Collections.emptyMap());
-  }
-
   private static ApiServiceConfig createMockApiServiceConfig(Map<String, 
String> properties) {
     ApiServiceConfig serviceConfig = 
EasyMock.createNiceMock(ApiServiceConfig.class);
     List<ApiConfig> serviceConfigs = new ArrayList<>();

Reply via email to