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(); + } }
