Repository: knox
Updated Branches:
  refs/heads/master 165ea0fde -> d402f6d23


http://git-wip-us.apache.org/repos/asf/knox/blob/d402f6d2/gateway-server/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptor.java
----------------------------------------------------------------------
diff --git 
a/gateway-server/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptor.java
 
b/gateway-server/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptor.java
index 7d25286..a27adc8 100644
--- 
a/gateway-server/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptor.java
+++ 
b/gateway-server/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptor.java
@@ -43,6 +43,8 @@ public interface SimpleDescriptor {
     interface Service {
         String getName();
 
+        String getVersion();
+
         Map<String, String> getParams();
 
         List<String> getURLs();

http://git-wip-us.apache.org/repos/asf/knox/blob/d402f6d2/gateway-server/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorHandler.java
----------------------------------------------------------------------
diff --git 
a/gateway-server/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorHandler.java
 
b/gateway-server/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorHandler.java
index 01e6d43..d24a6cf 100644
--- 
a/gateway-server/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorHandler.java
+++ 
b/gateway-server/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorHandler.java
@@ -103,6 +103,7 @@ public class SimpleDescriptorHandler {
     public static Map<String, File> handle(SimpleDescriptor desc, File 
srcDirectory, File destDirectory, Service...gatewayServices) {
 
         List<String>                     validServiceNames = new ArrayList<>();
+        Map<String, String>              serviceVersions   = new HashMap<>();
         Map<String, Map<String, String>> serviceParams     = new HashMap<>();
         Map<String, List<String>>        serviceURLs       = new HashMap<>();
 
@@ -112,6 +113,11 @@ public class SimpleDescriptorHandler {
             for (SimpleDescriptor.Service descService : desc.getServices()) {
                 String serviceName = descService.getName();
 
+                String serviceVer = descService.getVersion();
+                if (serviceVer != null) {
+                    serviceVersions.put(serviceName, serviceVer);
+                }
+
                 List<String> descServiceURLs = descService.getURLs();
                 if (descServiceURLs == null || descServiceURLs.isEmpty()) {
                     descServiceURLs = cluster.getServiceURLs(serviceName, 
descService.getParams());
@@ -160,7 +166,7 @@ public class SimpleDescriptorHandler {
         }
 
         // Generate the topology file
-        return generateTopology(desc, srcDirectory, destDirectory, cluster, 
validServiceNames, serviceURLs, serviceParams);
+        return generateTopology(desc, srcDirectory, destDirectory, cluster, 
validServiceNames, serviceVersions, serviceURLs, serviceParams);
     }
 
 
@@ -316,6 +322,7 @@ public class SimpleDescriptorHandler {
      * @param destDirectory     The destination directory for the generated 
topology file.
      * @param cluster           The discovery details for the referenced 
cluster.
      * @param validServiceNames The validated service names.
+     * @param serviceVersions   The versions of the services; optional 
attribute.
      * @param serviceURLs       The URLs associated with the valid service 
names.
      * @param serviceParams     The params associated with the valid service 
names.
      *
@@ -326,6 +333,7 @@ public class SimpleDescriptorHandler {
                                                       final File destDirectory,
                                                       final 
ServiceDiscovery.Cluster cluster,
                                                       final List<String> 
validServiceNames,
+                                                      final Map<String, 
String> serviceVersions,
                                                       final Map<String, 
List<String>> serviceURLs,
                                                       final Map<String, 
Map<String, String>> serviceParams) {
         Map<String, File> result = new HashMap<>();
@@ -413,6 +421,10 @@ public class SimpleDescriptorHandler {
                 sw.write("    <service>\n");
                 sw.write("        <role>" + serviceName + "</role>\n");
 
+                if (serviceVersions.containsKey(serviceName)) {
+                    sw.write("        <version>" + 
serviceVersions.get(serviceName) + "</version>\n");
+                }
+
                 // If the service is configured for ZooKeeper-based HA
                 ServiceDiscovery.Cluster.ZooKeeperConfig zkConf = 
haServiceParams.get(serviceName);
                 if (zkConf != null && zkConf.isEnabled() && 
zkConf.getEnsemble() != null) {

http://git-wip-us.apache.org/repos/asf/knox/blob/d402f6d2/gateway-server/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorImpl.java
----------------------------------------------------------------------
diff --git 
a/gateway-server/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorImpl.java
 
b/gateway-server/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorImpl.java
index f3288fd..3ad2f88 100644
--- 
a/gateway-server/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorImpl.java
+++ 
b/gateway-server/src/main/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorImpl.java
@@ -112,6 +112,9 @@ class SimpleDescriptorImpl implements SimpleDescriptor {
         @JsonProperty("name")
         private String name;
 
+        @JsonProperty("version")
+        private String version;
+
         @JsonProperty("params")
         private Map<String, String> params;
 
@@ -124,6 +127,11 @@ class SimpleDescriptorImpl implements SimpleDescriptor {
         }
 
         @Override
+        public String getVersion() {
+            return version;
+        }
+
+        @Override
         public Map<String, String> getParams() {
             return params;
         }

http://git-wip-us.apache.org/repos/asf/knox/blob/d402f6d2/gateway-server/src/test/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorFactoryTest.java
----------------------------------------------------------------------
diff --git 
a/gateway-server/src/test/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorFactoryTest.java
 
b/gateway-server/src/test/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorFactoryTest.java
index 2622f13..0fdabee 100644
--- 
a/gateway-server/src/test/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorFactoryTest.java
+++ 
b/gateway-server/src/test/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorFactoryTest.java
@@ -45,6 +45,17 @@ public class SimpleDescriptorFactoryTest {
     }
 
     @Test
+    public void testParseJSONSimpleDescriptorWithServiceVersions() throws 
Exception {
+        testParseSimpleDescriptorWithServiceVersions(FileType.JSON);
+    }
+
+    @Test
+    public void testParseYAMLSimpleDescriptorWithServiceVersions() throws 
Exception {
+        testParseSimpleDescriptorWithServiceVersions(FileType.YML);
+        testParseSimpleDescriptorWithServiceVersions(FileType.YAML);
+    }
+
+    @Test
     public void testParseJSONSimpleDescriptorWithServiceParams() throws 
Exception {
         testParseSimpleDescriptorWithServiceParams(FileType.JSON);
     }
@@ -90,7 +101,9 @@ public class SimpleDescriptorFactoryTest {
         services.put("NODEMANAGER", null);
         services.put("JOBTRACKER", null);
         services.put("RESOURCEMANAGER", null);
-        services.put("HIVE", Arrays.asList("http://c6401.ambari.apache.org";, 
"http://c6402.ambari.apache.org";, "http://c6403.ambari.apache.org";));
+        services.put("HIVE", Arrays.asList("http://c6401.ambari.apache.org";,
+                                           "http://c6402.ambari.apache.org";,
+                                           "http://c6403.ambari.apache.org";));
         services.put("AMBARIUI", 
Collections.singletonList("http://c6401.ambari.apache.org:8080";));
 
         String fileName = "test-topology." + getFileExtensionForType(type);
@@ -119,6 +132,55 @@ public class SimpleDescriptorFactoryTest {
         }
     }
 
+    private void testParseSimpleDescriptorWithServiceVersions(FileType type) 
throws Exception {
+        final String   discoveryType    = "AMBARI";
+        final String   discoveryAddress = 
"http://c6401.ambari.apache.org:8080";;
+        final String   discoveryUser    = "joeblow";
+        final String   providerConfig   = "ambari-cluster-policy.xml";
+        final String   clusterName      = "myCluster";
+
+        final Map<String, List<String>> services = new HashMap<>();
+        services.put("NODEMANAGER", null);
+        services.put("JOBTRACKER", null);
+        services.put("RESOURCEMANAGER", null);
+        services.put("WEBHDFS", null);
+        services.put("HIVE", Arrays.asList("http://c6401.ambari.apache.org";,
+                                           "http://c6402.ambari.apache.org";,
+                                           "http://c6403.ambari.apache.org";));
+        services.put("AMBARIUI", 
Collections.singletonList("http://c6401.ambari.apache.org:8080";));
+
+        Map<String, String> serviceVersions = new HashMap<>();
+        serviceVersions.put("HIVE", "0.13.0");
+        serviceVersions.put("WEBHDFS", "2.4.0");
+
+        String fileName = "test-topology." + getFileExtensionForType(type);
+        File testFile = null;
+        try {
+            testFile = writeDescriptorFile(type,
+                                           fileName,
+                                           discoveryType,
+                                           discoveryAddress,
+                                           discoveryUser,
+                                           providerConfig,
+                                           clusterName,
+                                           services,
+                                           serviceVersions);
+            SimpleDescriptor sd = 
SimpleDescriptorFactory.parse(testFile.getAbsolutePath());
+            validateSimpleDescriptor(sd, discoveryType, discoveryAddress, 
providerConfig, clusterName, services, serviceVersions);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (testFile != null) {
+                try {
+                    testFile.delete();
+                } catch (Exception e) {
+                    // Ignore
+                }
+            }
+        }
+    }
+
+
     private void testParseSimpleDescriptorWithServiceParams(FileType type) 
throws Exception {
 
         final String   discoveryType    = "AMBARI";
@@ -165,9 +227,10 @@ public class SimpleDescriptorFactoryTest {
                                            providerConfig,
                                            clusterName,
                                            services,
+                                           null,
                                            serviceParams);
             SimpleDescriptor sd = 
SimpleDescriptorFactory.parse(testFile.getAbsolutePath());
-            validateSimpleDescriptor(sd, discoveryType, discoveryAddress, 
providerConfig, clusterName, services, serviceParams);
+            validateSimpleDescriptor(sd, discoveryType, discoveryAddress, 
providerConfig, clusterName, services, null, serviceParams);
         } finally {
             if (testFile != null) {
                 try {
@@ -216,6 +279,7 @@ public class SimpleDescriptorFactoryTest {
                                            clusterName,
                                            null,
                                            null,
+                                           null,
                                            apps,
                                            appParams);
             SimpleDescriptor sd = 
SimpleDescriptorFactory.parse(testFile.getAbsolutePath());
@@ -226,6 +290,7 @@ public class SimpleDescriptorFactoryTest {
                                      clusterName,
                                      null,
                                      null,
+                                     null,
                                      apps,
                                      appParams);
         } finally {
@@ -302,6 +367,7 @@ public class SimpleDescriptorFactoryTest {
                                            providerConfig,
                                            clusterName,
                                            services,
+                                           null,
                                            serviceParams,
                                            apps,
                                            appParams);
@@ -312,6 +378,7 @@ public class SimpleDescriptorFactoryTest {
                                      providerConfig,
                                      clusterName,
                                      services,
+                                     null,
                                      serviceParams,
                                      apps,
                                      appParams);
@@ -342,14 +409,14 @@ public class SimpleDescriptorFactoryTest {
         return extension;
     }
 
-    private File writeDescriptorFile(FileType type,
-                                     String                           path,
-                                     String                           
discoveryType,
-                                     String                           
discoveryAddress,
-                                     String                           
discoveryUser,
-                                     String                           
providerConfig,
-                                     String                           
clusterName,
-                                     Map<String, List<String>>        
services) throws Exception {
+    private File writeDescriptorFile(FileType                  type,
+                                     String                    path,
+                                     String                    discoveryType,
+                                     String                    
discoveryAddress,
+                                     String                    discoveryUser,
+                                     String                    providerConfig,
+                                     String                    clusterName,
+                                     Map<String, List<String>> services) 
throws Exception {
         return writeDescriptorFile(type,
                                    path,
                                    discoveryType,
@@ -361,7 +428,28 @@ public class SimpleDescriptorFactoryTest {
                                    null);
     }
 
-    private File writeDescriptorFile(FileType type,
+    private File writeDescriptorFile(FileType                  type,
+                                     String                    path,
+                                     String                    discoveryType,
+                                     String                    
discoveryAddress,
+                                     String                    discoveryUser,
+                                     String                    providerConfig,
+                                     String                    clusterName,
+                                     Map<String, List<String>> services,
+                                     Map<String, String>       
serviceVersions) throws Exception {
+        return writeDescriptorFile(type,
+                                   path,
+                                   discoveryType,
+                                   discoveryAddress,
+                                   discoveryUser,
+                                   providerConfig,
+                                   clusterName,
+                                   services,
+                                   serviceVersions,
+                                   null);
+    }
+
+    private File writeDescriptorFile(FileType                         type,
                                      String                           path,
                                      String                           
discoveryType,
                                      String                           
discoveryAddress,
@@ -369,6 +457,7 @@ public class SimpleDescriptorFactoryTest {
                                      String                           
providerConfig,
                                      String                           
clusterName,
                                      Map<String, List<String>>        services,
+                                     Map<String, String>              
serviceVersions,
                                      Map<String, Map<String, String>> 
serviceParams) throws Exception {
         return writeDescriptorFile(type,
                                    path,
@@ -378,13 +467,14 @@ public class SimpleDescriptorFactoryTest {
                                    providerConfig,
                                    clusterName,
                                    services,
+                                   serviceVersions,
                                    serviceParams,
                                    null,
                                    null);
     }
 
 
-    private File writeDescriptorFile(FileType type,
+    private File writeDescriptorFile(FileType                         type,
                                      String                           path,
                                      String                           
discoveryType,
                                      String                           
discoveryAddress,
@@ -392,6 +482,7 @@ public class SimpleDescriptorFactoryTest {
                                      String                           
providerConfig,
                                      String                           
clusterName,
                                      Map<String, List<String>>        services,
+                                     Map<String, String>              
serviceVersions,
                                      Map<String, Map<String, String>> 
serviceParams,
                                      Map<String, List<String>>        apps,
                                      Map<String, Map<String, String>> 
appParams) throws Exception {
@@ -405,6 +496,7 @@ public class SimpleDescriptorFactoryTest {
                                    providerConfig,
                                    clusterName,
                                    services,
+                                   serviceVersions,
                                    serviceParams,
                                    apps,
                                    appParams);
@@ -418,6 +510,7 @@ public class SimpleDescriptorFactoryTest {
                                    providerConfig,
                                    clusterName,
                                    services,
+                                   serviceVersions,
                                    serviceParams,
                                    apps,
                                    appParams);
@@ -427,15 +520,16 @@ public class SimpleDescriptorFactoryTest {
     }
 
 
-    private File writeJSON(String path,
-                           String discoveryType,
-                           String discoveryAddress,
-                           String discoveryUser,
-                           String providerConfig,
-                           String clusterName,
-                           Map<String, List<String>> services,
+    private File writeJSON(String                           path,
+                           String                           discoveryType,
+                           String                           discoveryAddress,
+                           String                           discoveryUser,
+                           String                           providerConfig,
+                           String                           clusterName,
+                           Map<String, List<String>>        services,
+                           Map<String, String>              serviceVersions,
                            Map<String, Map<String, String>> serviceParams,
-                           Map<String, List<String>> apps,
+                           Map<String, List<String>>        apps,
                            Map<String, Map<String, String>> appParams) throws 
Exception {
         File f = new File(path);
 
@@ -449,13 +543,13 @@ public class SimpleDescriptorFactoryTest {
 
         if (services != null && !services.isEmpty()) {
             fw.write(",\n\"services\":[\n");
-            writeServiceOrApplicationJSON(fw, services, serviceParams);
+            writeServiceOrApplicationJSON(fw, services, serviceParams, 
serviceVersions);
             fw.write("]\n");
         }
 
         if (apps != null && !apps.isEmpty()) {
             fw.write(",\n\"applications\":[\n");
-            writeServiceOrApplicationJSON(fw, apps, appParams);
+            writeServiceOrApplicationJSON(fw, apps, appParams, null);
             fw.write("]\n");
         }
 
@@ -467,13 +561,21 @@ public class SimpleDescriptorFactoryTest {
     }
 
     private void writeServiceOrApplicationJSON(Writer fw,
-                                               Map<String, List<String>> 
elementURLs,
-                                               Map<String, Map<String, 
String>> elementParams) throws Exception {
+                                               Map<String, List<String>>       
 elementURLs,
+                                               Map<String, Map<String, 
String>> elementParams,
+                                               Map<String, String>             
 serviceVersions) throws Exception {
         if (elementURLs != null) {
             int i = 0;
             for (String name : elementURLs.keySet()) {
                 fw.write("{\"name\":\"" + name + "\"");
 
+                if (serviceVersions != null) {
+                    String ver = serviceVersions.get(name);
+                    if (ver != null) {
+                        fw.write(",\n\"version\":\"" + ver + "\"");
+                    }
+                }
+
                 // Service params
                 if (elementParams != null && !elementParams.isEmpty()) {
                     Map<String, String> params = elementParams.get(name);
@@ -520,6 +622,7 @@ public class SimpleDescriptorFactoryTest {
                            String                           providerConfig,
                            String                           clusterName,
                            Map<String, List<String>>        services,
+                           Map<String, String>              serviceVersions,
                            Map<String, Map<String, String>> serviceParams,
                            Map<String, List<String>>        apps,
                            Map<String, Map<String, String>> appParams) throws 
Exception {
@@ -536,12 +639,12 @@ public class SimpleDescriptorFactoryTest {
 
         if (services != null && !services.isEmpty()) {
             fw.write("services:\n");
-            writeServiceOrApplicationYAML(fw, services, serviceParams);
+            writeServiceOrApplicationYAML(fw, services, serviceParams, 
serviceVersions);
         }
 
         if (apps != null && !apps.isEmpty()) {
             fw.write("applications:\n");
-            writeServiceOrApplicationYAML(fw, apps, appParams);
+            writeServiceOrApplicationYAML(fw, apps, appParams, null);
         }
 
         fw.flush();
@@ -552,10 +655,18 @@ public class SimpleDescriptorFactoryTest {
 
     private void writeServiceOrApplicationYAML(Writer                          
 fw,
                                                Map<String, List<String>>       
 elementURLs,
-                                               Map<String, Map<String, 
String>> elementParams) throws Exception {
+                                               Map<String, Map<String, 
String>> elementParams,
+                                               Map<String, String>             
 serviceVersions) throws Exception {
         for (String name : elementURLs.keySet()) {
             fw.write("    - name: " + name + "\n");
 
+            if (serviceVersions != null) {
+                String ver = serviceVersions.get(name);
+                if (ver != null) {
+                    fw.write("      version: " + ver + "\n");
+                }
+            }
+
             // Service params
             if (elementParams != null && !elementParams.isEmpty()) {
                 if (elementParams.containsKey(name)) {
@@ -589,12 +700,24 @@ public class SimpleDescriptorFactoryTest {
     }
 
 
+    private void validateSimpleDescriptor(SimpleDescriptor          sd,
+                                          String                    
discoveryType,
+                                          String                    
discoveryAddress,
+                                          String                    
providerConfig,
+                                          String                    
clusterName,
+                                          Map<String, List<String>> 
expectedServices,
+                                          Map<String, String>       
expectedServiceVersions) {
+        validateSimpleDescriptor(sd, discoveryType, discoveryAddress, 
providerConfig, clusterName, expectedServices, expectedServiceVersions, null);
+    }
+
+
     private void validateSimpleDescriptor(SimpleDescriptor                 sd,
                                           String                           
discoveryType,
                                           String                           
discoveryAddress,
                                           String                           
providerConfig,
                                           String                           
clusterName,
                                           Map<String, List<String>>        
expectedServices,
+                                          Map<String, String>              
expectedServiceVersions,
                                           Map<String, Map<String, String>> 
expectedServiceParameters) {
         validateSimpleDescriptor(sd,
                                  discoveryType,
@@ -602,6 +725,7 @@ public class SimpleDescriptorFactoryTest {
                                  providerConfig,
                                  clusterName,
                                  expectedServices,
+                                 expectedServiceVersions,
                                  expectedServiceParameters,
                                  null,
                                  null);
@@ -613,6 +737,7 @@ public class SimpleDescriptorFactoryTest {
                                           String                           
providerConfig,
                                           String                           
clusterName,
                                           Map<String, List<String>>        
expectedServices,
+                                          Map<String, String>              
expectedServiceVersions,
                                           Map<String, Map<String, String>> 
expectedServiceParameters,
                                           Map<String, List<String>>        
expectedApps,
                                           Map<String, Map<String, String>> 
expectedAppParameters) {
@@ -633,6 +758,17 @@ public class SimpleDescriptorFactoryTest {
                 
assertTrue(expectedServices.containsKey(actualService.getName()));
                 assertEquals(expectedServices.get(actualService.getName()), 
actualService.getURLs());
 
+                if (expectedServiceVersions != null) {
+                    String expectedVersion = 
expectedServiceVersions.get(actualService.getName());
+                    if (expectedVersion != null) {
+                        String actualVersion = actualService.getVersion();
+                        assertNotNull(actualVersion);
+                        assertEquals("Unexpected version for " + 
actualService.getName(),
+                                     expectedVersion,
+                                     actualVersion);
+                    }
+                }
+
                 // Validate service parameters
                 if (expectedServiceParameters != null) {
                     if 
(expectedServiceParameters.containsKey(actualService.getName())) {

http://git-wip-us.apache.org/repos/asf/knox/blob/d402f6d2/gateway-server/src/test/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorHandlerTest.java
----------------------------------------------------------------------
diff --git 
a/gateway-server/src/test/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorHandlerTest.java
 
b/gateway-server/src/test/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorHandlerTest.java
index 0a64e60..6850bb6 100644
--- 
a/gateway-server/src/test/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorHandlerTest.java
+++ 
b/gateway-server/src/test/java/org/apache/knox/gateway/topology/simple/SimpleDescriptorHandlerTest.java
@@ -187,6 +187,7 @@ public class SimpleDescriptorHandlerTest {
             for (String serviceName : serviceURLs.keySet()) {
                 SimpleDescriptor.Service svc = 
EasyMock.createNiceMock(SimpleDescriptor.Service.class);
                 
EasyMock.expect(svc.getName()).andReturn(serviceName).anyTimes();
+                
EasyMock.expect(svc.getVersion()).andReturn("WEBHDFS".equals(serviceName) ? 
"2.4.0" : null).anyTimes();
                 
EasyMock.expect(svc.getURLs()).andReturn(serviceURLs.get(serviceName)).anyTimes();
                 
EasyMock.expect(svc.getParams()).andReturn(serviceParameters.get(serviceName)).anyTimes();
                 EasyMock.replay(svc);
@@ -240,6 +241,14 @@ public class SimpleDescriptorHandlerTest {
                 assertNotNull(roleNode);
                 String role = roleNode.getNodeValue();
 
+                // Validate the explicit version for the WEBHDFS service
+                if ("WEBHDFS".equals(role)) {
+                    Node versionNode = (Node) 
xpath.compile("version/text()").evaluate(serviceNode, XPathConstants.NODE);
+                    assertNotNull(versionNode);
+                    String version = versionNode.getNodeValue();
+                    assertEquals("2.4.0", version);
+                }
+
                 // Validate the URLs
                 NodeList urlNodes = (NodeList) 
xpath.compile("url/text()").evaluate(serviceNode, XPathConstants.NODESET);
                 for(int urlNodeIndex = 0 ; urlNodeIndex < 
urlNodes.getLength(); urlNodeIndex++) {

Reply via email to