You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by pz...@apache.org on 2021/01/21 17:27:33 UTC

[knox] branch master updated: KNOX-2530 - Support qualifying service params for CM discovery control (#398)

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 29011d0  KNOX-2530 - Support qualifying service params for CM discovery control (#398)
29011d0 is described below

commit 29011d06bd61145ca8e894b47a3ecc5b6dfdc565
Author: Phil Zampino <pz...@apache.org>
AuthorDate: Thu Jan 21 12:27:25 2021 -0500

    KNOX-2530 - Support qualifying service params for CM discovery control (#398)
---
 .../discovery/cm/ClouderaManagerCluster.java       | 26 +++++++++++++++++-----
 .../topology/discovery/cm/ServiceModel.java        | 21 +++++++++++++++++
 .../cm/model/hdfs/HdfsUIServiceModelGenerator.java | 23 +++++++++++++++++++
 .../model/hdfs/NameNodeServiceModelGenerator.java  |  7 +++++-
 .../model/hdfs/WebHdfsServiceModelGenerator.java   | 16 -------------
 .../cm/model/solr/SolrServiceModelGenerator.java   |  7 ++++++
 .../model/AbstractServiceModelGeneratorTest.java   | 17 +++++++++++---
 .../hdfs/HdfsUIServiceModelGeneratorTest.java      |  2 +-
 .../hdfs/NameNodeServiceModelGeneratorTest.java    | 13 ++++++++++-
 .../hdfs/WebHdfsServiceModelGeneratorTest.java     | 26 +++++++++++++++++++++-
 .../model/solr/SolrServiceModelGeneratorTest.java  | 16 ++++++++++++-
 11 files changed, 144 insertions(+), 30 deletions(-)

diff --git a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerCluster.java b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerCluster.java
index 168dca3..c26ee56 100644
--- a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerCluster.java
+++ b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ClouderaManagerCluster.java
@@ -45,11 +45,30 @@ public class ClouderaManagerCluster implements ServiceDiscovery.Cluster {
 
   @Override
   public List<String> getServiceURLs(String serviceName) {
+    return getServiceURLs(serviceName, null);
+  }
+
+  @Override
+  public List<String> getServiceURLs(String serviceName, Map<String, String> serviceParams) {
     List<String> urls = new ArrayList<>();
+
     if (serviceModels.containsKey(serviceName)) {
       Map<String, List<ServiceModel>> roleModels = new HashMap<>();
       for (ServiceModel model : serviceModels.get(serviceName)) {
-        roleModels.computeIfAbsent(model.getRoleType(), l -> new ArrayList<>()).add(model);
+
+        // Check for discovery qualifier attributes of the service model
+        boolean isMatchingModel = true;
+        if (serviceParams != null) {
+          for (Map.Entry<String, String> serviceParam : serviceParams.entrySet()) {
+            if (!serviceParam.getValue().equals(model.getQualifyingServiceParam(serviceParam.getKey()))) {
+              isMatchingModel = false;
+            }
+          }
+        }
+
+        if (isMatchingModel) {
+          roleModels.computeIfAbsent(model.getRoleType(), l -> new ArrayList<>()).add(model);
+        }
       }
 
       urls.addAll((ServiceURLCollectors.getCollector(serviceName)).collect(roleModels));
@@ -58,11 +77,6 @@ public class ClouderaManagerCluster implements ServiceDiscovery.Cluster {
   }
 
   @Override
-  public List<String> getServiceURLs(String serviceName, Map<String, String> serviceParams) {
-    return getServiceURLs(serviceName); // TODO: PJZ: Support things like HDFS nameservice params for providing the correct URL(s)?
-  }
-
-  @Override
   public ZooKeeperConfig getZooKeeperConfiguration(String serviceName) {
     return null;
   }
diff --git a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ServiceModel.java b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ServiceModel.java
index 96b0c31..0d379a0 100644
--- a/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ServiceModel.java
+++ b/gateway-discovery-cm/src/main/java/org/apache/knox/gateway/topology/discovery/cm/ServiceModel.java
@@ -37,6 +37,9 @@ public class ServiceModel {
   private final String roleType;
   private final String serviceUrl;
 
+  // Metadata for the model object, which is not directly from the service or role configuration
+  private final Map<String, String> qualifyingServiceParams = new ConcurrentHashMap<>();
+
   // The service configuration properties used to created the model
   private final Map<String, String> serviceConfigProperties = new ConcurrentHashMap<>();
 
@@ -62,6 +65,10 @@ public class ServiceModel {
     this.serviceUrl  = serviceUrl;
   }
 
+  public void addQualifyingServiceParam(final String name, final String value) {
+    qualifyingServiceParams.put(name, (value != null ? value : NULL_VALUE));
+  }
+
   public void addServiceProperty(final String name, final String value) {
     serviceConfigProperties.put(name, (value != null ? value : NULL_VALUE));
   }
@@ -71,6 +78,20 @@ public class ServiceModel {
   }
 
   /**
+   * @return The metadata properties associated with the model, which can be used to qualify service discovery.
+   */
+  public Map<String, String> getQualifyingServiceParams() {
+    return qualifyingServiceParams;
+  }
+
+  /**
+   * @return The value of the metadata property associated with the model, which can be used to qualify service discovery.
+   */
+  public String getQualifyingServiceParam(final String name) {
+    return qualifyingServiceParams.get(name);
+  }
+
+  /**
    * @return The service configuration properties employed by the model.
    */
   public Map<String, String> getServiceProperties() {
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 fe894fd..67e6ef6 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
@@ -24,6 +24,7 @@ import com.cloudera.api.swagger.model.ApiServiceConfig;
 import org.apache.knox.gateway.topology.discovery.cm.ServiceModel;
 
 import java.util.Locale;
+import java.util.Map;
 
 public class HdfsUIServiceModelGenerator extends NameNodeServiceModelGenerator {
   public static final String SERVICE = "HDFSUI";
@@ -65,7 +66,29 @@ public class HdfsUIServiceModelGenerator extends NameNodeServiceModelGenerator {
     model.addRoleProperty(role.getType(), HTTPS_PORT, getRoleConfigValue(roleConfig, HTTPS_PORT));
     model.addRoleProperty(role.getType(), HTTP_PORT, getRoleConfigValue(roleConfig, HTTP_PORT));
 
+    ServiceModel parent = super.generateService(service, serviceConfig, role, roleConfig);
+    addParentModelMetadata(model, parent);
+
     return model;
   }
 
+  protected void addParentModelMetadata(final ServiceModel model, final ServiceModel parent) {
+    // Add parent model properties
+    for (Map.Entry<String, String> parentProp : parent.getQualifyingServiceParams().entrySet()) {
+      model.addQualifyingServiceParam(parentProp.getKey(), parentProp.getValue());
+    }
+
+    // Add parent service properties
+    for (Map.Entry<String, String> parentProp : parent.getServiceProperties().entrySet()) {
+      model.addServiceProperty(parentProp.getKey(), parentProp.getValue());
+    }
+
+    // Add parent role properties
+    for (Map.Entry<String, Map<String, String>> parentProps : parent.getRoleProperties().entrySet()) {
+      for (Map.Entry<String, String> prop : parentProps.getValue().entrySet()) {
+        model.addRoleProperty(parentProps.getKey(), prop.getKey(), prop.getValue());
+      }
+    }
+  }
+
 }
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 f981344..c867809 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
@@ -31,6 +31,8 @@ public class NameNodeServiceModelGenerator extends AbstractServiceModelGenerator
   public static final String SERVICE_TYPE = "HDFS";
   public static final String ROLE_TYPE    = "NAMENODE";
 
+  static final String DISCOVERY_NAMESERVICE = "discovery-nameservice";
+
   static final String AUTOFAILOVER_ENABLED = "autofailover_enabled";
   static final String NN_NAMESERVICE       = "dfs_federation_namenode_nameservice";
   static final String NN_PORT              = "namenode_port";
@@ -62,7 +64,7 @@ public class NameNodeServiceModelGenerator extends AbstractServiceModelGenerator
                                       ApiConfigList    roleConfig) throws ApiException {
     boolean haEnabled = Boolean.parseBoolean(getRoleConfigValue(roleConfig, AUTOFAILOVER_ENABLED));
     String serviceUrl;
-    if(haEnabled) {
+    if (haEnabled) {
       String nameservice = getRoleConfigValue(roleConfig, NN_NAMESERVICE);
       serviceUrl = String.format(Locale.getDefault(), "hdfs://%s", nameservice);
     } else {
@@ -76,6 +78,9 @@ public class NameNodeServiceModelGenerator extends AbstractServiceModelGenerator
     model.addRoleProperty(getRoleType(), NN_PORT, getRoleConfigValue(roleConfig, NN_PORT));
     if (haEnabled) {
       model.addRoleProperty(getRoleType(), NN_NAMESERVICE, getRoleConfigValue(roleConfig, NN_NAMESERVICE));
+
+      // Add the nameservice metadata for qualifying the discovery process for this service
+      model.addQualifyingServiceParam(DISCOVERY_NAMESERVICE, model.getRoleProperties().get(getRoleType()).get(NN_NAMESERVICE));
     }
 
     return model;
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 1cc30f4..fdef01e 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
@@ -24,8 +24,6 @@ import com.cloudera.api.swagger.model.ApiServiceConfig;
 import org.apache.knox.gateway.topology.discovery.cm.ServiceModel;
 import org.apache.knox.gateway.topology.discovery.cm.ServiceModelGeneratorHandleResponse;
 
-import java.util.Map;
-
 public class WebHdfsServiceModelGenerator extends HdfsUIServiceModelGenerator {
   private static final String SERVICE = "WEBHDFS";
   private static final String WEBHDFS_SUFFIX = "/webhdfs";
@@ -70,18 +68,4 @@ public class WebHdfsServiceModelGenerator extends HdfsUIServiceModelGenerator {
     return model;
   }
 
-  private void addParentModelMetadata(final ServiceModel model, final ServiceModel parent) {
-    // Add parent model properties
-    for (Map.Entry<String, String> parentProp : parent.getServiceProperties().entrySet()) {
-      model.addServiceProperty(parentProp.getKey(), parentProp.getValue());
-    }
-
-    // Add parent role properties
-    for (Map.Entry<String, Map<String, String>> parentProps : parent.getRoleProperties().entrySet()) {
-      for (Map.Entry<String, String> prop : parentProps.getValue().entrySet()) {
-        model.addRoleProperty(parentProps.getKey(), prop.getKey(), prop.getValue());
-      }
-    }
-  }
-
 }
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 75ae53b..772d3d6 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
@@ -30,6 +30,9 @@ public class SolrServiceModelGenerator extends AbstractServiceModelGenerator {
   public static final String SERVICE_TYPE = "SOLR";
   public static final String ROLE_TYPE    = "SOLR_SERVER";
 
+  static final String DISCOVERY_SERVICE_NAME         = "discovery-service-name";
+  static final String DISCOVERY_SERVICE_DISPLAY_NAME = "discovery-service-display-name";
+
   static final String USE_SSL    = "solr_use_ssl";
   static final String HTTP_PORT  = "solr_http_port";
   static final String HTTPS_PORT = "solr_https_port";
@@ -77,6 +80,10 @@ public class SolrServiceModelGenerator extends AbstractServiceModelGenerator {
     model.addRoleProperty(getRoleType(), HTTP_PORT, getRoleConfigValue(roleConfig, HTTP_PORT));
     model.addRoleProperty(getRoleType(), HTTPS_PORT, getRoleConfigValue(roleConfig, HTTPS_PORT));
 
+    // Add some service details for qualifying the discovery process for this service
+    model.addQualifyingServiceParam(DISCOVERY_SERVICE_NAME, service.getName());
+    model.addQualifyingServiceParam(DISCOVERY_SERVICE_DISPLAY_NAME, service.getDisplayName());
+
     return model;
   }
 
diff --git a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/AbstractServiceModelGeneratorTest.java b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/AbstractServiceModelGeneratorTest.java
index 9b66a6e..e6b7abd 100644
--- a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/AbstractServiceModelGeneratorTest.java
+++ b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/AbstractServiceModelGeneratorTest.java
@@ -94,13 +94,16 @@ public abstract class AbstractServiceModelGeneratorTest extends AbstractCMDiscov
 
   protected void validateServiceModel(ServiceModel        candidate,
                                       Map<String, String> serviceConfig,
-                                      Map<String, String> roleConfig) {
+                                      Map<String, String> roleConfig,
+                                      boolean             validateCounts) {
 
     assertNotNull(candidate);
 
     // Validate the service configuration
     Map<String, String> modelServiceProps = candidate.getServiceProperties();
-    assertEquals(serviceConfig.size(), modelServiceProps.size());
+    if (validateCounts) {
+      assertEquals(serviceConfig.size(), modelServiceProps.size());
+    }
     for (Map.Entry<String, String> serviceProp : serviceConfig.entrySet()) {
       assertTrue(modelServiceProps.containsKey(serviceProp.getKey()));
       assertEquals(serviceConfig.get(serviceProp.getKey()), modelServiceProps.get(serviceProp.getKey()));
@@ -108,11 +111,19 @@ public abstract class AbstractServiceModelGeneratorTest extends AbstractCMDiscov
 
     // Validate the role configuration
     Map<String, String> modelRoleProperties = candidate.getRoleProperties().get(getRoleType());
-    assertEquals(roleConfig.size(), modelRoleProperties.size());
+    if (validateCounts) {
+      assertEquals(roleConfig.size(), modelRoleProperties.size());
+    }
     for (Map.Entry<String, String> roleProp : roleConfig.entrySet()) {
       assertTrue(modelRoleProperties.containsKey(roleProp.getKey()));
       assertEquals(roleConfig.get(roleProp.getKey()), modelRoleProperties.get(roleProp.getKey()));
     }
   }
 
+  protected void validateServiceModel(ServiceModel        candidate,
+                                      Map<String, String> serviceConfig,
+                                      Map<String, String> roleConfig) {
+    validateServiceModel(candidate, serviceConfig, roleConfig, true);
+  }
+
 }
diff --git a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/HdfsUIServiceModelGeneratorTest.java b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/HdfsUIServiceModelGeneratorTest.java
index 5879d65..4977bf3 100644
--- a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/HdfsUIServiceModelGeneratorTest.java
+++ b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/HdfsUIServiceModelGeneratorTest.java
@@ -33,7 +33,7 @@ public class HdfsUIServiceModelGeneratorTest extends AbstractServiceModelGenerat
     roleConfig.put(HdfsUIServiceModelGenerator.HTTP_PORT, "12345");
     roleConfig.put(HdfsUIServiceModelGenerator.HTTPS_PORT, "54321");
 
-    validateServiceModel(createServiceModel(serviceConfig, roleConfig), serviceConfig, roleConfig);
+    validateServiceModel(createServiceModel(serviceConfig, roleConfig), serviceConfig, roleConfig, false);
   }
 
   @Override
diff --git a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/NameNodeServiceModelGeneratorTest.java b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/NameNodeServiceModelGeneratorTest.java
index ef1848d..928e0d9 100644
--- a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/NameNodeServiceModelGeneratorTest.java
+++ b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/NameNodeServiceModelGeneratorTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.knox.gateway.topology.discovery.cm.model.hdfs;
 
+import org.apache.knox.gateway.topology.discovery.cm.ServiceModel;
 import org.apache.knox.gateway.topology.discovery.cm.ServiceModelGenerator;
 import org.apache.knox.gateway.topology.discovery.cm.model.AbstractServiceModelGeneratorTest;
 import org.junit.Test;
@@ -24,6 +25,8 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
+import static org.junit.Assert.assertEquals;
+
 public class NameNodeServiceModelGeneratorTest extends AbstractServiceModelGeneratorTest {
 
   @Test
@@ -34,7 +37,15 @@ public class NameNodeServiceModelGeneratorTest extends AbstractServiceModelGener
     roleConfig.put(NameNodeServiceModelGenerator.NN_NAMESERVICE, "myService");
     roleConfig.put(NameNodeServiceModelGenerator.NN_PORT, "12345");
 
-    validateServiceModel(createServiceModel(serviceConfig, roleConfig), serviceConfig, roleConfig);
+    ServiceModel generated = createServiceModel(serviceConfig, roleConfig);
+    validateServiceModel(generated, serviceConfig, roleConfig);
+
+    // Validate model metadata properties
+    Map<String, String> modelProps = generated.getQualifyingServiceParams();
+    assertEquals("Expected one service model properties", 1, modelProps.size());
+    assertEquals("Expected " + NameNodeServiceModelGenerator.DISCOVERY_NAMESERVICE + " model property.",
+                 roleConfig.get(NameNodeServiceModelGenerator.NN_NAMESERVICE),
+                 modelProps.get(NameNodeServiceModelGenerator.DISCOVERY_NAMESERVICE));
   }
 
   @Test
diff --git a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/WebHdfsServiceModelGeneratorTest.java b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/WebHdfsServiceModelGeneratorTest.java
index 4e90e77..12b33f5 100644
--- a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/WebHdfsServiceModelGeneratorTest.java
+++ b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/hdfs/WebHdfsServiceModelGeneratorTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.knox.gateway.topology.discovery.cm.model.hdfs;
 
+import org.apache.knox.gateway.topology.discovery.cm.ServiceModel;
 import org.apache.knox.gateway.topology.discovery.cm.ServiceModelGenerator;
 import org.apache.knox.gateway.topology.discovery.cm.model.AbstractServiceModelGeneratorTest;
 import org.junit.Test;
@@ -24,6 +25,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
@@ -54,7 +56,29 @@ public class WebHdfsServiceModelGeneratorTest extends AbstractServiceModelGenera
     roleConfig.put(WebHdfsServiceModelGenerator.HTTP_PORT, "12345");
     roleConfig.put(WebHdfsServiceModelGenerator.HTTPS_PORT, "54321");
 
-    validateServiceModel(createServiceModel(serviceConfig, roleConfig), serviceConfig, roleConfig);
+    validateServiceModel(createServiceModel(serviceConfig, roleConfig), serviceConfig, roleConfig, false);
+  }
+
+  @Test
+  public void testServiceModelMetadataWithNameService() {
+    final Map<String, String> serviceConfig = new HashMap<>();
+    serviceConfig.put(WebHdfsServiceModelGenerator.WEBHDFS_ENABLED, "true");
+    serviceConfig.put(WebHdfsServiceModelGenerator.SSL_ENABLED, "false");
+
+    final Map<String, String> roleConfig = new HashMap<>();
+    roleConfig.put(WebHdfsServiceModelGenerator.AUTOFAILOVER_ENABLED, "true");
+    roleConfig.put(WebHdfsServiceModelGenerator.NN_NAMESERVICE, "myService");
+    roleConfig.put(WebHdfsServiceModelGenerator.NN_PORT, "12345");
+
+    ServiceModel generated = createServiceModel(serviceConfig, roleConfig);
+    validateServiceModel(generated, serviceConfig, roleConfig, false);
+
+    // Validate model metadata properties
+    Map<String, String> modelProps = generated.getQualifyingServiceParams();
+    assertEquals("Expected one service model properties", 1, modelProps.size());
+    assertEquals("Expected " + NameNodeServiceModelGenerator.DISCOVERY_NAMESERVICE + " model property.",
+                 roleConfig.get(WebHdfsServiceModelGenerator.NN_NAMESERVICE),
+                 modelProps.get(WebHdfsServiceModelGenerator.DISCOVERY_NAMESERVICE));
   }
 
   @Override
diff --git a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/solr/SolrServiceModelGeneratorTest.java b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/solr/SolrServiceModelGeneratorTest.java
index e1eac9d..4c2d2fc 100644
--- a/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/solr/SolrServiceModelGeneratorTest.java
+++ b/gateway-discovery-cm/src/test/java/org/apache/knox/gateway/topology/discovery/cm/model/solr/SolrServiceModelGeneratorTest.java
@@ -16,6 +16,7 @@
  */
 package org.apache.knox.gateway.topology.discovery.cm.model.solr;
 
+import org.apache.knox.gateway.topology.discovery.cm.ServiceModel;
 import org.apache.knox.gateway.topology.discovery.cm.ServiceModelGenerator;
 import org.apache.knox.gateway.topology.discovery.cm.model.AbstractServiceModelGeneratorTest;
 import org.junit.Test;
@@ -23,6 +24,8 @@ import org.junit.Test;
 import java.util.HashMap;
 import java.util.Map;
 
+import static org.junit.Assert.assertEquals;
+
 public class SolrServiceModelGeneratorTest extends AbstractServiceModelGeneratorTest {
 
   @Test
@@ -33,7 +36,18 @@ public class SolrServiceModelGeneratorTest extends AbstractServiceModelGenerator
     roleConfig.put(SolrServiceModelGenerator.HTTP_PORT, "2468");
     roleConfig.put(SolrServiceModelGenerator.HTTPS_PORT, "1357");
 
-    validateServiceModel(createServiceModel(serviceConfig, roleConfig), serviceConfig, roleConfig);
+    ServiceModel generated = createServiceModel(serviceConfig, roleConfig);
+    validateServiceModel(generated, serviceConfig, roleConfig);
+
+    // Validate model metadata properties
+    Map<String, String> modelProps = generated.getQualifyingServiceParams();
+    assertEquals("Expected two service model properties", 2, modelProps.size());
+    assertEquals("Expected " + SolrServiceModelGenerator.DISCOVERY_SERVICE_NAME + " model property.",
+            getServiceType() + "-1",
+            modelProps.get(SolrServiceModelGenerator.DISCOVERY_SERVICE_NAME));
+    assertEquals("Expected " + SolrServiceModelGenerator.DISCOVERY_SERVICE_DISPLAY_NAME + " model property.",
+            "null",
+            modelProps.get(SolrServiceModelGenerator.DISCOVERY_SERVICE_DISPLAY_NAME));
   }
 
   @Override