Repository: knox
Updated Branches:
  refs/heads/master 0deafca6c -> 7025086a8


http://git-wip-us.apache.org/repos/asf/knox/blob/7025086a/gateway-server/src/test/java/org/apache/knox/gateway/topology/simple/ProviderConfigurationParserTest.java
----------------------------------------------------------------------
diff --git 
a/gateway-server/src/test/java/org/apache/knox/gateway/topology/simple/ProviderConfigurationParserTest.java
 
b/gateway-server/src/test/java/org/apache/knox/gateway/topology/simple/ProviderConfigurationParserTest.java
new file mode 100644
index 0000000..e8f0a42
--- /dev/null
+++ 
b/gateway-server/src/test/java/org/apache/knox/gateway/topology/simple/ProviderConfigurationParserTest.java
@@ -0,0 +1,336 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations 
under
+ * the License.
+ */
+package org.apache.knox.gateway.topology.simple;
+
+
+import org.apache.knox.test.TestUtils;
+import org.apache.tools.ant.util.FileUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+public class ProviderConfigurationParserTest {
+
+  private static File tmpDir = null;
+
+  @BeforeClass
+  public static void createTempDir() {
+    try {
+      tmpDir = 
TestUtils.createTempDir(ProviderConfigurationParser.class.getName());
+    } catch (IOException e) {
+      e.printStackTrace();
+    }
+  }
+
+  @AfterClass
+  public static void removeTempDir() {
+    if (tmpDir != null) {
+      FileUtils.delete(tmpDir);
+    }
+  }
+
+  @Test
+  public void testParseProviderConfigurationXML() throws Exception {
+    final String XML =
+    "<gateway>\n" +
+    "  <provider>\n" +
+    "    <role>TestNotEnabled</role>\n" +
+    "    <name>TestProviderNotEnabled</name>\n" +
+    "    <enabled>false</enabled>\n" +
+    "  </provider>\n" +
+    "  <provider>\n" +
+    "    <role>TestEnabledNoParams</role>\n" +
+    "    <name>TestProviderEnabledNoParams</name>\n" +
+    "    <enabled>true</enabled>\n" +
+    "  </provider>\n" +
+    "  <provider>\n" +
+    "    <role>TestEnabledWithParams</role>\n" +
+    "    <name>TestProviderEnabledWithParams</name>\n" +
+    "    <enabled>true</enabled>\n" +
+    "    <param><name>param1</name><value>param1-value</value></param>\n" +
+    "    <param><name>param2</name><value>param2-value</value></param>\n" +
+    "    <param><name>param3</name><value>param3-value</value></param>\n" +
+    "  </provider>\n" +
+    "</gateway>\n";
+
+    ProviderConfiguration pc = doTestParseProviderConfiguration(XML, 
"my-providers.xml");
+    assertNotNull(pc);
+
+    List<ProviderConfiguration.Provider> providers = pc.getProviders();
+    assertNotNull(providers);
+    assertFalse(providers.isEmpty());
+    assertEquals(3, providers.size());
+
+    // Validate providers
+    for (ProviderConfiguration.Provider provider : providers) {
+      String role = provider.getRole();
+      if ("TestNotEnabled".equals(role)) {
+        assertEquals("TestProviderNotEnabled", provider.getName());
+        assertFalse(provider.isEnabled());
+        assertNotNull(provider.getParams());
+        assertTrue(provider.getParams().isEmpty());
+      } else if ("TestEnabledNoParams".equals(role)) {
+        assertEquals("TestProviderEnabledNoParams", provider.getName());
+        assertTrue(provider.isEnabled());
+        assertNotNull(provider.getParams());
+        assertTrue(provider.getParams().isEmpty());
+      } else if ("TestEnabledWithParams".equals(role)) {
+        assertEquals("TestProviderEnabledWithParams", provider.getName());
+        assertTrue(provider.isEnabled());
+        Map<String, String> params = provider.getParams();
+        assertNotNull(params);
+        assertEquals(3, params.size());
+        for (String name : params.keySet()) {
+          assertEquals(name + "-value", params.get(name));
+        }
+      }
+    }
+  }
+
+
+  @Test
+  public void testParseProviderConfigurationJSON() throws Exception {
+    final String JSON =
+    "{\n" +
+    "    \"providers\": [\n" +
+    "    {\n" +
+    "      \"role\":\"authentication\",\n" +
+    "      \"name\":\"ShiroProvider\",\n" +
+    "      \"enabled\":\"true\",\n" +
+    "      \"params\":{\n" +
+    "        \"sessionTimeout\":\"30\",\n" +
+    "        
\"main.ldapRealm\":\"org.apache.hadoop.gateway.shirorealm.KnoxLdapRealm\",\n" +
+    "        
\"main.ldapContextFactory\":\"org.apache.hadoop.gateway.shirorealm.KnoxLdapContextFactory\",\n"
 +
+    "        \"main.ldapRealm.contextFactory\":\"$ldapContextFactory\",\n" +
+    "        
\"main.ldapRealm.userDnTemplate\":\"uid={0},ou=people,dc=hadoop,dc=apache,dc=org\",\n"
 +
+    "        
\"main.ldapRealm.contextFactory.url\":\"ldap://localhost:33389\",\n"; +
+    "        
\"main.ldapRealm.contextFactory.authenticationMechanism\":\"simple\",\n" +
+    "        \"urls./**\":\"authcBasic\"\n" +
+    "      }\n" +
+    "    },\n" +
+    "    {\n" +
+    "      \"role\":\"hostmap\",\n" +
+    "      \"name\":\"static\",\n" +
+    "      \"enabled\":\"true\",\n" +
+    "      \"params\":{\n" +
+    "        \"localhost\":\"sandbox,sandbox.hortonworks.com\"\n" +
+    "      }\n" +
+    "    },\n" +
+    "    {\n" +
+    "      \"role\":\"dummy\",\n" +
+    "      \"name\":\"NoParamsDummyProvider\",\n" +
+    "      \"enabled\":\"true\"\n" +
+    "    },\n" +
+    "    {\n" +
+    "      \"role\":\"ha\",\n" +
+    "      \"name\":\"HaProvider\",\n" +
+    "      \"enabled\":\"false\",\n" +
+    "      \"params\":{\n" +
+    "        
\"WEBHDFS\":\"maxFailoverAttempts=3;failoverSleep=1000;maxRetryAttempts=300;retrySleep=1000;enabled=true\",\n"
 +
+    "        
\"HIVE\":\"maxFailoverAttempts=3;failoverSleep=1000;enabled=true\"\n" +
+    "      }\n" +
+    "    }\n" +
+    "  ]\n" +
+    "}";
+
+    ProviderConfiguration pc = doTestParseProviderConfiguration(JSON, 
"my-providers." + "json");
+    assertNotNull(pc);
+
+    List<ProviderConfiguration.Provider> providers = pc.getProviders();
+    assertNotNull(providers);
+    assertFalse(providers.isEmpty());
+    assertEquals(4, providers.size());
+
+    // Validate the providers
+    for (ProviderConfiguration.Provider provider : providers) {
+      String role = provider.getRole();
+      if ("authentication".equals(role)) {
+        assertEquals("ShiroProvider", provider.getName());
+        assertTrue(provider.isEnabled());
+        Map<String, String> params = provider.getParams();
+        assertNotNull(params);
+        assertEquals(8, params.size());
+        assertEquals(params.get("sessionTimeout"), "30");
+        assertEquals(params.get("main.ldapRealm"), 
"org.apache.hadoop.gateway.shirorealm.KnoxLdapRealm");
+        assertEquals(params.get("main.ldapContextFactory"), 
"org.apache.hadoop.gateway.shirorealm.KnoxLdapContextFactory");
+        assertEquals(params.get("main.ldapRealm.contextFactory"), 
"$ldapContextFactory");
+        assertEquals(params.get("main.ldapRealm.userDnTemplate"), 
"uid={0},ou=people,dc=hadoop,dc=apache,dc=org");
+        assertEquals(params.get("main.ldapRealm.contextFactory.url"), 
"ldap://localhost:33389";);
+        
assertEquals(params.get("main.ldapRealm.contextFactory.authenticationMechanism"),
 "simple");
+        assertEquals(params.get("urls./**"), "authcBasic");
+      } else if ("hostmap".equals(role)) {
+        assertEquals("static", provider.getName());
+        assertTrue(provider.isEnabled());
+        Map<String, String> params = provider.getParams();
+        assertNotNull(params);
+        assertEquals(1, params.size());
+        assertEquals(params.get("localhost"), 
"sandbox,sandbox.hortonworks.com");
+      } else if ("ha".equals(role)) {
+        assertEquals("HaProvider", provider.getName());
+        assertFalse(provider.isEnabled());
+        Map<String, String> params = provider.getParams();
+        assertNotNull(params);
+        assertEquals(2, params.size());
+        assertEquals(params.get("WEBHDFS"), 
"maxFailoverAttempts=3;failoverSleep=1000;maxRetryAttempts=300;retrySleep=1000;enabled=true");
+        assertEquals(params.get("HIVE"), 
"maxFailoverAttempts=3;failoverSleep=1000;enabled=true");
+      } else if ("dummy".equals(provider.getRole())) {
+        assertEquals("NoParamsDummyProvider", provider.getName());
+        assertTrue(provider.isEnabled());
+        Map<String, String> params = provider.getParams();
+        assertNotNull(params);
+        assertTrue(params.isEmpty());
+      }
+    }
+  }
+
+
+  @Test
+  public void testParseProviderConfigurationYAML() throws Exception {
+    doTestParseProviderConfigurationYAML("yaml");
+  }
+
+
+  @Test
+  public void testParseProviderConfigurationYML() throws Exception {
+    doTestParseProviderConfigurationYAML("yml");
+  }
+
+
+  // Common test for both YAML and YML file extensions
+  private void doTestParseProviderConfigurationYAML(String extension) throws 
Exception {
+    final String YAML =
+        "---\n" +
+        "providers: \n" +
+        "  - role: authentication\n" +
+        "    name: ShiroProvider\n" +
+        "    enabled: true\n" +
+        "    params:\n" +
+        "      sessionTimeout: 30\n" +
+        "      main.ldapRealm: 
org.apache.hadoop.gateway.shirorealm.KnoxLdapRealm\n" +
+        "      main.ldapContextFactory: 
org.apache.hadoop.gateway.shirorealm.KnoxLdapContextFactory\n" +
+        "      main.ldapRealm.contextFactory: $ldapContextFactory\n" +
+        "      main.ldapRealm.userDnTemplate: 
uid={0},ou=people,dc=hadoop,dc=apache,dc=org\n" +
+        "      main.ldapRealm.contextFactory.url: ldap://localhost:33389\n"; +
+        "      main.ldapRealm.contextFactory.authenticationMechanism: 
simple\n" +
+        "      urls./**: authcBasic\n" +
+        "  - role: hostmap\n" +
+        "    name: static\n" +
+        "    enabled: true\n" +
+        "    params:\n" +
+        "      localhost: sandbox,sandbox.hortonworks.com\n" +
+        "  - role: dummy\n" +
+        "    name: NoParamsDummyProvider\n" +
+        "    enabled: true\n" +
+        "  - role: ha\n" +
+        "    name: HaProvider\n" +
+        "    enabled: false\n" +
+        "    params:\n" +
+        "      WEBHDFS: 
maxFailoverAttempts=3;failoverSleep=1000;maxRetryAttempts=300;retrySleep=1000;enabled=true\n"
 +
+        "      HIVE: maxFailoverAttempts=3;failoverSleep=1000;enabled=true";
+    ProviderConfiguration pc = doTestParseProviderConfiguration(YAML, 
"my-providers." + extension);
+
+    assertNotNull(pc);
+
+    List<ProviderConfiguration.Provider> providers = pc.getProviders();
+    assertNotNull(providers);
+    assertFalse(providers.isEmpty());
+    assertEquals(4, providers.size());
+
+    // Validate the providers
+    for (ProviderConfiguration.Provider provider : providers) {
+      String role = provider.getRole();
+      if ("authentication".equals(role)) {
+        assertEquals("ShiroProvider", provider.getName());
+        assertTrue(provider.isEnabled());
+        Map<String, String> params = provider.getParams();
+        assertNotNull(params);
+        assertEquals(8, params.size());
+        assertEquals(params.get("sessionTimeout"), "30");
+        assertEquals(params.get("main.ldapRealm"), 
"org.apache.hadoop.gateway.shirorealm.KnoxLdapRealm");
+        assertEquals(params.get("main.ldapContextFactory"), 
"org.apache.hadoop.gateway.shirorealm.KnoxLdapContextFactory");
+        assertEquals(params.get("main.ldapRealm.contextFactory"), 
"$ldapContextFactory");
+        assertEquals(params.get("main.ldapRealm.userDnTemplate"), 
"uid={0},ou=people,dc=hadoop,dc=apache,dc=org");
+        assertEquals(params.get("main.ldapRealm.contextFactory.url"), 
"ldap://localhost:33389";);
+        
assertEquals(params.get("main.ldapRealm.contextFactory.authenticationMechanism"),
 "simple");
+        assertEquals(params.get("urls./**"), "authcBasic");
+      } else if ("hostmap".equals(role)) {
+        assertEquals("static", provider.getName());
+        assertTrue(provider.isEnabled());
+        Map<String, String> params = provider.getParams();
+        assertNotNull(params);
+        assertEquals(1, params.size());
+        assertEquals(params.get("localhost"), 
"sandbox,sandbox.hortonworks.com");
+      } else if ("ha".equals(role)) {
+        assertEquals("HaProvider", provider.getName());
+        assertFalse(provider.isEnabled());
+        Map<String, String> params = provider.getParams();
+        assertNotNull(params);
+        assertEquals(2, params.size());
+        assertEquals(params.get("WEBHDFS"), 
"maxFailoverAttempts=3;failoverSleep=1000;maxRetryAttempts=300;retrySleep=1000;enabled=true");
+        assertEquals(params.get("HIVE"), 
"maxFailoverAttempts=3;failoverSleep=1000;enabled=true");
+      } else if ("dummy".equals(provider.getRole())) {
+        assertEquals("NoParamsDummyProvider", provider.getName());
+        assertTrue(provider.isEnabled());
+        Map<String, String> params = provider.getParams();
+        assertNotNull(params);
+        assertTrue(params.isEmpty());
+      }
+    }
+  }
+
+
+  /**
+   * Parse the specified configuration, and return the parse result for 
validation by the caller.
+   *
+   * @param config   The provider config content to parse.
+   * @param fileName The name of the temporary file to which the content 
should be written prior to parsing.
+   *
+   * @return The resulting ProviderConfiguration
+   */
+  private ProviderConfiguration doTestParseProviderConfiguration(final String 
config, final String fileName) throws Exception {
+    ProviderConfiguration pc;
+
+    File testConfig = new File(tmpDir, fileName);
+
+    Writer fw = new FileWriter(testConfig);
+    fw.write(config);
+    fw.flush();
+    fw.close();
+
+    try {
+      pc = ProviderConfigurationParser.parse(testConfig.getAbsolutePath());
+    } finally {
+      FileUtils.delete(testConfig);
+    }
+
+    return pc;
+  }
+
+
+}

http://git-wip-us.apache.org/repos/asf/knox/blob/7025086a/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 575b68a..0a64e60 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
@@ -25,6 +25,7 @@ import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 
+import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -32,6 +33,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathFactory;
@@ -40,6 +45,7 @@ import org.apache.commons.io.FileUtils;
 import org.easymock.EasyMock;
 import org.junit.Test;
 import org.w3c.dom.Document;
+import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
@@ -58,78 +64,55 @@ public class SimpleDescriptorHandlerTest {
 
     private static final String TEST_PROVIDER_CONFIG =
             "    <gateway>\n" +
-                    "        <provider>\n" +
-                    "            <role>authentication</role>\n" +
-                    "            <name>ShiroProvider</name>\n" +
-                    "            <enabled>true</enabled>\n" +
-                    "            <param>\n" +
-                    "                <!-- \n" +
-                    "                session timeout in minutes,  this is 
really idle timeout,\n" +
-                    "                defaults to 30mins, if the property value 
is not defined,, \n" +
-                    "                current client authentication would 
expire if client idles contiuosly for more than this value\n" +
-                    "                -->\n" +
-                    "                <name>sessionTimeout</name>\n" +
-                    "                <value>30</value>\n" +
-                    "            </param>\n" +
-                    "            <param>\n" +
-                    "                <name>main.ldapRealm</name>\n" +
-                    "                
<value>org.apache.knox.gateway.shirorealm.KnoxLdapRealm</value>\n" +
-                    "            </param>\n" +
-                    "            <param>\n" +
-                    "                <name>main.ldapContextFactory</name>\n" +
-                    "                
<value>org.apache.knox.gateway.shirorealm.KnoxLdapContextFactory</value>\n" +
-                    "            </param>\n" +
-                    "            <param>\n" +
-                    "                
<name>main.ldapRealm.contextFactory</name>\n" +
-                    "                <value>$ldapContextFactory</value>\n" +
-                    "            </param>\n" +
-                    "            <param>\n" +
-                    "                
<name>main.ldapRealm.userDnTemplate</name>\n" +
-                    "                
<value>uid={0},ou=people,dc=hadoop,dc=apache,dc=org</value>\n" +
-                    "            </param>\n" +
-                    "            <param>\n" +
-                    "                
<name>main.ldapRealm.contextFactory.url</name>\n" +
-                    "                <value>ldap://localhost:33389</value>\n" +
-                    "            </param>\n" +
-                    "            <param>\n" +
-                    "                
<name>main.ldapRealm.contextFactory.authenticationMechanism</name>\n" +
-                    "                <value>simple</value>\n" +
-                    "            </param>\n" +
-                    "            <param>\n" +
-                    "                <name>urls./**</name>\n" +
-                    "                <value>authcBasic</value>\n" +
-                    "            </param>\n" +
-                    "        </provider>\n" +
-                    "\n" +
-                    "        <provider>\n" +
-                    "            <role>identity-assertion</role>\n" +
-                    "            <name>Default</name>\n" +
-                    "            <enabled>true</enabled>\n" +
-                    "        </provider>\n" +
-                    "\n" +
-                    "        <!--\n" +
-                    "        Defines rules for mapping host names internal to 
a Hadoop cluster to externally accessible host names.\n" +
-                    "        For example, a hadoop service running in AWS may 
return a response that includes URLs containing the\n" +
-                    "        some AWS internal host name.  If the client needs 
to make a subsequent request to the host identified\n" +
-                    "        in those URLs they need to be mapped to external 
host names that the client Knox can use to connect.\n" +
-                    "\n" +
-                    "        If the external hostname and internal host names 
are same turn of this provider by setting the value of\n" +
-                    "        enabled parameter as false.\n" +
-                    "\n" +
-                    "        The name parameter specifies the external host 
names in a comma separated list.\n" +
-                    "        The value parameter specifies corresponding 
internal host names in a comma separated list.\n" +
-                    "\n" +
-                    "        Note that when you are using Sandbox, the 
external hostname needs to be localhost, as seen in out\n" +
-                    "        of box sandbox.xml.  This is because Sandbox uses 
port mapping to allow clients to connect to the\n" +
-                    "        Hadoop services using localhost.  In real 
clusters, external host names would almost never be localhost.\n" +
-                    "        -->\n" +
-                    "        <provider>\n" +
-                    "            <role>hostmap</role>\n" +
-                    "            <name>static</name>\n" +
-                    "            <enabled>true</enabled>\n" +
-                    "            
<param><name>localhost</name><value>sandbox,sandbox.hortonworks.com</value></param>\n"
 +
-                    "        </provider>\n" +
-                    "    </gateway>\n";
+            "        <provider>\n" +
+            "            <role>authentication</role>\n" +
+            "            <name>ShiroProvider</name>\n" +
+            "            <enabled>true</enabled>\n" +
+            "            <param>\n" +
+            "                <name>sessionTimeout</name>\n" +
+            "                <value>30</value>\n" +
+            "            </param>\n" +
+            "            <param>\n" +
+            "                <name>main.ldapRealm</name>\n" +
+            "                
<value>org.apache.knox.gateway.shirorealm.KnoxLdapRealm</value>\n" +
+            "            </param>\n" +
+            "            <param>\n" +
+            "                <name>main.ldapContextFactory</name>\n" +
+            "                
<value>org.apache.knox.gateway.shirorealm.KnoxLdapContextFactory</value>\n" +
+            "            </param>\n" +
+            "            <param>\n" +
+            "                <name>main.ldapRealm.contextFactory</name>\n" +
+            "                <value>$ldapContextFactory</value>\n" +
+            "            </param>\n" +
+            "            <param>\n" +
+            "                <name>main.ldapRealm.userDnTemplate</name>\n" +
+            "                
<value>uid={0},ou=people,dc=hadoop,dc=apache,dc=org</value>\n" +
+            "            </param>\n" +
+            "            <param>\n" +
+            "                <name>main.ldapRealm.contextFactory.url</name>\n" 
+
+            "                <value>ldap://localhost:33389</value>\n" +
+            "            </param>\n" +
+            "            <param>\n" +
+            "                
<name>main.ldapRealm.contextFactory.authenticationMechanism</name>\n" +
+            "                <value>simple</value>\n" +
+            "            </param>\n" +
+            "            <param>\n" +
+            "                <name>urls./**</name>\n" +
+            "                <value>authcBasic</value>\n" +
+            "            </param>\n" +
+            "        </provider>\n" +
+            "        <provider>\n" +
+            "            <role>identity-assertion</role>\n" +
+            "            <name>Default</name>\n" +
+            "            <enabled>true</enabled>\n" +
+            "        </provider>\n" +
+            "        <provider>\n" +
+            "            <role>hostmap</role>\n" +
+            "            <name>static</name>\n" +
+            "            <enabled>true</enabled>\n" +
+            "            
<param><name>localhost</name><value>sandbox,sandbox.hortonworks.com</value></param>\n"
 +
+            "        </provider>\n" +
+            "    </gateway>\n";
 
 
     /**
@@ -240,10 +223,10 @@ public class SimpleDescriptorHandlerTest {
                        hasXPath("/topology/generated", is("true")));
 
             // Validate the provider configuration
-            Document extProviderConf = XmlUtils.readXml(new 
ByteArrayInputStream(TEST_PROVIDER_CONFIG.getBytes()));
             Node gatewayNode = (Node) 
xpath.compile("/topology/gateway").evaluate(topologyXml, XPathConstants.NODE);
-            assertTrue("Resulting provider config should be identical to the 
referenced content.",
-                       
extProviderConf.getDocumentElement().isEqualNode(gatewayNode));
+            ProviderConfiguration testProviderConfiguration =
+                        ProviderConfigurationParser.parseXML(new 
ByteArrayInputStream(TEST_PROVIDER_CONFIG.getBytes()));
+            validateGeneratedProviderConfiguration(testProviderConfiguration, 
gatewayNode);
 
             // Validate the service declarations
             Map<String, List<String>> topologyServiceURLs = new HashMap<>();
@@ -398,10 +381,10 @@ public class SimpleDescriptorHandlerTest {
             Document topologyXml = XmlUtils.readXml(topologyFile);
 
             // Validate the provider configuration
-            Document extProviderConf = XmlUtils.readXml(new 
ByteArrayInputStream(TEST_PROVIDER_CONFIG.getBytes()));
             Node gatewayNode = (Node) 
xpath.compile("/topology/gateway").evaluate(topologyXml, XPathConstants.NODE);
-            assertTrue("Resulting provider config should be identical to the 
referenced content.",
-                    
extProviderConf.getDocumentElement().isEqualNode(gatewayNode));
+            ProviderConfiguration testProviderConfiguration =
+                ProviderConfigurationParser.parseXML(new 
ByteArrayInputStream(TEST_PROVIDER_CONFIG.getBytes()));
+            validateGeneratedProviderConfiguration(testProviderConfiguration, 
gatewayNode);
 
             // Validate the service declarations
             List<String> topologyServices = new ArrayList<>();
@@ -452,4 +435,64 @@ public class SimpleDescriptorHandlerTest {
         return f;
     }
 
+
+    private void validateGeneratedProviderConfiguration(ProviderConfiguration 
expected, Node generatedGatewayNode) throws Exception {
+        assertNotNull(expected);
+
+        // Parse a ProviderConfiguration from the specified XML node
+        StringWriter writer = new StringWriter();
+        Transformer transformer = 
TransformerFactory.newInstance().newTransformer();
+        transformer.transform(new DOMSource(generatedGatewayNode), new 
StreamResult(writer));
+        ProviderConfiguration generatedProviderConfiguration =
+                        ProviderConfigurationParser.parseXML(new 
ByteArrayInputStream(writer.toString().getBytes()));
+        assertNotNull(generatedProviderConfiguration);
+
+        // Compare the generated ProviderConfiguration to the expected one
+        List<ProviderConfiguration.Provider> expectedProviders = 
expected.getProviders();
+        List<ProviderConfiguration.Provider> actualProviders = 
generatedProviderConfiguration.getProviders();
+        assertEquals("The number of providers should be the same.", 
expectedProviders.size(), actualProviders.size());
+
+        for (ProviderConfiguration.Provider expectedProvider : 
expectedProviders) {
+            assertTrue("Failed to validate provider with role " + 
expectedProvider.getRole(),
+                       validateProvider(expectedProvider, actualProviders));
+        }
+    }
+
+    /**
+     * Verify that the expected provider is included in the specified set of 
actual providers.
+     *
+     * @param expected        A Provider that should be among the specified 
actual providers
+     * @param actualProviders The set of actual providers.
+     */
+    private boolean validateProvider(ProviderConfiguration.Provider expected, 
List<ProviderConfiguration.Provider> actualProviders) {
+        boolean foundMatch = false;
+
+        for (ProviderConfiguration.Provider actual : actualProviders) {
+            if (expected.getRole().equals(actual.getRole())) {
+                if (expected.getName().equals(actual.getName())) {
+                    if (expected.isEnabled() == actual.isEnabled()) {
+                        Map<String, String> expectedParams = 
expected.getParams();
+                        Map<String, String> actualParams = actual.getParams();
+                        if (expectedParams.size() == actualParams.size()) {
+                            int matchingParamCount = 0;
+                            for (String expectedParamKey : 
expectedParams.keySet()) {
+                                if (actualParams.containsKey(expectedParamKey) 
&& 
expectedParams.get(expectedParamKey).equals(actualParams.get(expectedParamKey)))
 {
+                                    matchingParamCount++;
+                                }
+                            }
+                            foundMatch = (matchingParamCount == 
expectedParams.size());
+                        }
+                    }
+                }
+            }
+
+            if (foundMatch) {
+                break;
+            }
+        }
+
+        return foundMatch;
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/knox/blob/7025086a/gateway-spi/src/main/java/org/apache/knox/gateway/topology/discovery/ServiceDiscovery.java
----------------------------------------------------------------------
diff --git 
a/gateway-spi/src/main/java/org/apache/knox/gateway/topology/discovery/ServiceDiscovery.java
 
b/gateway-spi/src/main/java/org/apache/knox/gateway/topology/discovery/ServiceDiscovery.java
index 03effdd..b3366a3 100644
--- 
a/gateway-spi/src/main/java/org/apache/knox/gateway/topology/discovery/ServiceDiscovery.java
+++ 
b/gateway-spi/src/main/java/org/apache/knox/gateway/topology/discovery/ServiceDiscovery.java
@@ -70,6 +70,21 @@ public interface ServiceDiscovery {
          * @return The URLs for the specified service in this cluster.
          */
         List<String> getServiceURLs(String serviceName);
+
+        /**
+         * @param serviceName The name of the service
+         * @return The HA configuration properties for the specified service 
in this cluster.
+         */
+        ZooKeeperConfig getZooKeeperConfiguration(String serviceName);
+
+        interface ZooKeeperConfig {
+
+            boolean isEnabled();
+
+            String getEnsemble();
+
+            String getNamespace();
+        }
     }
 
 

Reply via email to