http://git-wip-us.apache.org/repos/asf/knox/blob/e766b3b7/gateway-service-remoteconfig/src/main/java/org/apache/knox/gateway/service/config/remote/zk/ZooKeeperClientServiceProvider.java
----------------------------------------------------------------------
diff --git 
a/gateway-service-remoteconfig/src/main/java/org/apache/knox/gateway/service/config/remote/zk/ZooKeeperClientServiceProvider.java
 
b/gateway-service-remoteconfig/src/main/java/org/apache/knox/gateway/service/config/remote/zk/ZooKeeperClientServiceProvider.java
new file mode 100644
index 0000000..96b931c
--- /dev/null
+++ 
b/gateway-service-remoteconfig/src/main/java/org/apache/knox/gateway/service/config/remote/zk/ZooKeeperClientServiceProvider.java
@@ -0,0 +1,34 @@
+/**
+ * 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.service.config.remote.zk;
+
+import 
org.apache.knox.gateway.service.config.remote.RemoteConfigurationRegistryClientServiceProvider;
+
+
+public class ZooKeeperClientServiceProvider implements 
RemoteConfigurationRegistryClientServiceProvider {
+
+    @Override
+    public String getType() {
+        return ZooKeeperClientService.TYPE;
+    }
+
+    @Override
+    public ZooKeeperClientService newInstance() {
+        return new CuratorClientService();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/knox/blob/e766b3b7/gateway-service-remoteconfig/src/main/resources/META-INF/services/org.apache.hadoop.gateway.service.config.remote.RemoteConfigurationRegistryClientServiceProvider
----------------------------------------------------------------------
diff --git 
a/gateway-service-remoteconfig/src/main/resources/META-INF/services/org.apache.hadoop.gateway.service.config.remote.RemoteConfigurationRegistryClientServiceProvider
 
b/gateway-service-remoteconfig/src/main/resources/META-INF/services/org.apache.hadoop.gateway.service.config.remote.RemoteConfigurationRegistryClientServiceProvider
deleted file mode 100644
index 7f2312a..0000000
--- 
a/gateway-service-remoteconfig/src/main/resources/META-INF/services/org.apache.hadoop.gateway.service.config.remote.RemoteConfigurationRegistryClientServiceProvider
+++ /dev/null
@@ -1,19 +0,0 @@
-##########################################################################
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-##########################################################################
-
-org.apache.hadoop.gateway.service.config.remote.zk.ZooKeeperClientServiceProvider

http://git-wip-us.apache.org/repos/asf/knox/blob/e766b3b7/gateway-service-remoteconfig/src/main/resources/META-INF/services/org.apache.knox.gateway.service.config.remote.RemoteConfigurationRegistryClientServiceProvider
----------------------------------------------------------------------
diff --git 
a/gateway-service-remoteconfig/src/main/resources/META-INF/services/org.apache.knox.gateway.service.config.remote.RemoteConfigurationRegistryClientServiceProvider
 
b/gateway-service-remoteconfig/src/main/resources/META-INF/services/org.apache.knox.gateway.service.config.remote.RemoteConfigurationRegistryClientServiceProvider
new file mode 100644
index 0000000..fe12e48
--- /dev/null
+++ 
b/gateway-service-remoteconfig/src/main/resources/META-INF/services/org.apache.knox.gateway.service.config.remote.RemoteConfigurationRegistryClientServiceProvider
@@ -0,0 +1,19 @@
+##########################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+##########################################################################
+
+org.apache.knox.gateway.service.config.remote.zk.ZooKeeperClientServiceProvider

http://git-wip-us.apache.org/repos/asf/knox/blob/e766b3b7/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/config/DefaultRemoteConfigurationRegistriesTest.java
----------------------------------------------------------------------
diff --git 
a/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/config/DefaultRemoteConfigurationRegistriesTest.java
 
b/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/config/DefaultRemoteConfigurationRegistriesTest.java
deleted file mode 100644
index a33fcc2..0000000
--- 
a/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/config/DefaultRemoteConfigurationRegistriesTest.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <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.hadoop.gateway.service.config.remote.config;
-
-import org.apache.hadoop.gateway.config.GatewayConfig;
-import org.easymock.EasyMock;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import static org.junit.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-public class DefaultRemoteConfigurationRegistriesTest {
-
-    /**
-     * Test a single registry configuration with digest auth configuration.
-     */
-    @Test
-    public void testPropertiesRemoteConfigurationRegistriesSingleDigest() 
throws Exception {
-        Map<String, Properties> testProperties = new HashMap<>();
-        Properties p = new Properties();
-        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE, "ZooKeeper");
-        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS, 
"hostx:2181");
-        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_PRINCIPAL, 
"zkDigestUser");
-        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_AUTH_TYPE, 
"digest");
-        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_CREDENTIAL_ALIAS, 
"zkDigestAlias");
-        testProperties.put("testDigest", p);
-
-        doTestPropertiesRemoteConfigurationRegistries(testProperties);
-    }
-
-
-    /**
-     * Test a single registry configuration with kerberos auth configuration.
-     */
-    @Test
-    public void testPropertiesRemoteConfigurationRegistriesSingleKerberos() 
throws Exception {
-        Map<String, Properties> testProperties = new HashMap<>();
-        Properties p = new Properties();
-        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE, "ZooKeeper");
-        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS, 
"hostx:2181");
-        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_PRINCIPAL, 
"zkUser");
-        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_AUTH_TYPE, 
"kerberos");
-        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_KEYTAB, 
"/home/user/remoteregistry.keytab");
-        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_USE_KEYTAB, "true");
-        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_USE_TICKET_CACHE, 
"false");
-        testProperties.put("testKerb", p);
-
-        doTestPropertiesRemoteConfigurationRegistries(testProperties);
-    }
-
-    /**
-     * Test multiple registry configuration with varying auth configurations.
-     */
-    @Test
-    public void testPropertiesRemoteConfigurationRegistriesMultipleMixed() 
throws Exception {
-        Map<String, Properties> testProperties = new HashMap<>();
-
-        Properties kerb = new Properties();
-        kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE, 
"ZooKeeper");
-        kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS, 
"host1:2181");
-        kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_NAMESPACE, 
"/knox/config");
-        kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_PRINCIPAL, 
"kerbPrincipal");
-        kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_AUTH_TYPE, 
"kerberos");
-        kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_KEYTAB, 
"/home/user/mykrb.keytab");
-        kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_USE_KEYTAB, 
"true");
-        
kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_USE_TICKET_CACHE, 
"false");
-        testProperties.put("testKerb1", kerb);
-
-        Properties digest = new Properties();
-        digest.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE, 
"ZooKeeper");
-        digest.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS, 
"host2:2181");
-        digest.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_PRINCIPAL, 
"digestPrincipal");
-        digest.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_AUTH_TYPE, 
"digest");
-        
digest.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_CREDENTIAL_ALIAS, 
"digestPwdAlias");
-        testProperties.put("testDigest1", digest);
-
-        Properties unsecured = new Properties();
-        unsecured.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE, 
"ZooKeeper");
-        unsecured.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS, 
"host2:2181");
-        testProperties.put("testUnsecured", unsecured);
-
-        doTestPropertiesRemoteConfigurationRegistries(testProperties);
-    }
-
-
-    /**
-     * Perform the actual test.
-     *
-     * @param testProperties The test properties
-     */
-    private void doTestPropertiesRemoteConfigurationRegistries(Map<String, 
Properties> testProperties) throws Exception {
-        // Mock gateway config
-        GatewayConfig gc = mockGatewayConfig(testProperties);
-
-        // Create the RemoteConfigurationRegistries object to be tested from 
the GatewayConfig
-        RemoteConfigurationRegistries registries = new 
DefaultRemoteConfigurationRegistries(gc);
-
-        // Basic validation
-        assertNotNull(registries);
-        List<RemoteConfigurationRegistry> registryConfigs = 
registries.getRegistryConfigurations();
-        assertNotNull(registryConfigs);
-        assertEquals(testProperties.size(), registryConfigs.size());
-
-        // Validate the contents of the created object
-        for (RemoteConfigurationRegistry regConfig : registryConfigs) {
-            validateRemoteRegistryConfig(regConfig.getName(), 
testProperties.get(regConfig.getName()), regConfig);
-        }
-    }
-
-
-    /**
-     * Create a mock GatewayConfig based on the specified test properties.
-     *
-     * @param testProperties The test properties to set on the config
-     */
-    private GatewayConfig mockGatewayConfig(Map<String, Properties> 
testProperties) {
-        // Mock gateway config
-        GatewayConfig gc = EasyMock.createNiceMock(GatewayConfig.class);
-        List<String> configNames = new ArrayList<>();
-        for (String registryName : testProperties.keySet()) {
-            configNames.add(registryName);
-
-            String propertyValueString = "";
-            Properties props = testProperties.get(registryName);
-            Enumeration names = props.propertyNames();
-            while (names.hasMoreElements()) {
-                String propertyName = (String) names.nextElement();
-                propertyValueString += propertyName + "=" + 
props.get(propertyName);
-                if (names.hasMoreElements()) {
-                    propertyValueString += ";";
-                }
-            }
-            EasyMock.expect(gc.getRemoteRegistryConfiguration(registryName))
-                    .andReturn(propertyValueString)
-                    .anyTimes();
-        }
-        
EasyMock.expect(gc.getRemoteRegistryConfigurationNames()).andReturn(configNames).anyTimes();
-        EasyMock.replay(gc);
-
-        return gc;
-    }
-
-
-    /**
-     * Validate the specified RemoteConfigurationRegistry based on the 
expected test properties.
-     */
-    private void validateRemoteRegistryConfig(String                      
configName,
-                                              Properties                  
expected,
-                                              RemoteConfigurationRegistry 
registryConfig) throws Exception {
-        assertEquals(configName, registryConfig.getName());
-        assertEquals(expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE), 
registryConfig.getRegistryType());
-        
assertEquals(expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS), 
registryConfig.getConnectionString());
-        
assertEquals(expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_NAMESPACE), 
registryConfig.getNamespace());
-        assertEquals(registryConfig.isSecureRegistry(), 
expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_AUTH_TYPE) != null);
-        
assertEquals(expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_AUTH_TYPE), 
registryConfig.getAuthType());
-        
assertEquals(expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_PRINCIPAL), 
registryConfig.getPrincipal());
-        
assertEquals(expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_CREDENTIAL_ALIAS),
 registryConfig.getCredentialAlias());
-        
assertEquals(expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_KEYTAB), 
registryConfig.getKeytab());
-        
assertEquals(Boolean.valueOf((String)expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_USE_KEYTAB)),
 registryConfig.isUseKeyTab());
-        
assertEquals(Boolean.valueOf((String)expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_USE_TICKET_CACHE)),
 registryConfig.isUseTicketCache());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/knox/blob/e766b3b7/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/config/RemoteConfigurationRegistryConfigParserTest.java
----------------------------------------------------------------------
diff --git 
a/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/config/RemoteConfigurationRegistryConfigParserTest.java
 
b/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/config/RemoteConfigurationRegistryConfigParserTest.java
deleted file mode 100644
index 386e332..0000000
--- 
a/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/config/RemoteConfigurationRegistryConfigParserTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <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.hadoop.gateway.service.config.remote.config;
-
-import org.apache.commons.io.FileUtils;
-import 
org.apache.hadoop.gateway.service.config.remote.RemoteConfigurationRegistryConfig;
-import 
org.apache.hadoop.gateway.service.config.remote.util.RemoteRegistryConfigTestUtils;
-import org.junit.Test;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-import static 
org.apache.hadoop.gateway.service.config.remote.util.RemoteRegistryConfigTestUtils.*;
-
-public class RemoteConfigurationRegistryConfigParserTest {
-
-    @Test
-    public void testExternalXMLParsing() throws Exception {
-        final String CONN_STR = "http://my.zookeeper.host:2181";;
-
-        Map<String, Map<String, String>> testRegistryConfigurations = new 
HashMap<>();
-
-        Map<String, String> config1 = new HashMap<>();
-        config1.put(PROPERTY_TYPE, "ZooKeeper");
-        config1.put(PROPERTY_NAME, "registry1");
-        config1.put(PROPERTY_ADDRESS, CONN_STR);
-        config1.put(PROPERTY_SECURE, "true");
-        config1.put(PROPERTY_AUTH_TYPE, "Digest");
-        config1.put(PROPERTY_PRINCIPAL, "knox");
-        config1.put(PROPERTY_CRED_ALIAS, "zkCredential");
-        testRegistryConfigurations.put(config1.get("name"), config1);
-
-        Map<String, String> config2 = new HashMap<>();
-        config2.put(PROPERTY_TYPE, "ZooKeeper");
-        config2.put(PROPERTY_NAME, "MyKerberos");
-        config2.put(PROPERTY_ADDRESS, CONN_STR);
-        config2.put(PROPERTY_SECURE, "true");
-        config2.put(PROPERTY_AUTH_TYPE, "Kerberos");
-        config2.put(PROPERTY_PRINCIPAL, "knox");
-        File myKeyTab = File.createTempFile("mytest", "keytab");
-        config2.put(PROPERTY_KEYTAB, myKeyTab.getAbsolutePath());
-        config2.put(PROPERTY_USE_KEYTAB, "false");
-        config2.put(PROPERTY_USE_TICKET_CACHE, "true");
-        testRegistryConfigurations.put(config2.get("name"), config2);
-
-        Map<String, String> config3 = new HashMap<>();
-        config3.put(PROPERTY_TYPE, "ZooKeeper");
-        config3.put(PROPERTY_NAME, "anotherRegistry");
-        config3.put(PROPERTY_ADDRESS, "whatever:1281");
-        testRegistryConfigurations.put(config3.get("name"), config3);
-
-        String configXML =
-                    
RemoteRegistryConfigTestUtils.createRemoteConfigRegistriesXML(testRegistryConfigurations.values());
-
-        File registryConfigFile = File.createTempFile("remote-registries", 
"xml");
-        try {
-            FileUtils.writeStringToFile(registryConfigFile, configXML);
-
-            List<RemoteConfigurationRegistryConfig> configs =
-                                    
RemoteConfigurationRegistriesParser.getConfig(registryConfigFile.getAbsolutePath());
-            assertNotNull(configs);
-            assertEquals(testRegistryConfigurations.keySet().size(), 
configs.size());
-
-            for (RemoteConfigurationRegistryConfig registryConfig : configs) {
-                Map<String, String> expected = 
testRegistryConfigurations.get(registryConfig.getName());
-                assertNotNull(expected);
-                validateParsedRegistryConfiguration(registryConfig, expected);
-            }
-        } finally {
-            registryConfigFile.delete();
-        }
-    }
-
-    private void 
validateParsedRegistryConfiguration(RemoteConfigurationRegistryConfig config,
-                                                     Map<String, String> 
expected) throws Exception {
-        assertEquals(expected.get(PROPERTY_TYPE), config.getRegistryType());
-        assertEquals(expected.get(PROPERTY_ADDRESS), 
config.getConnectionString());
-        assertEquals(expected.get(PROPERTY_NAME), config.getName());
-        assertEquals(expected.get(PROPERTY_NAMESAPCE), config.getNamespace());
-        assertEquals(Boolean.valueOf(expected.get(PROPERTY_SECURE)), 
config.isSecureRegistry());
-        assertEquals(expected.get(PROPERTY_AUTH_TYPE), config.getAuthType());
-        assertEquals(expected.get(PROPERTY_PRINCIPAL), config.getPrincipal());
-        assertEquals(expected.get(PROPERTY_CRED_ALIAS), 
config.getCredentialAlias());
-        assertEquals(expected.get(PROPERTY_KEYTAB), config.getKeytab());
-        assertEquals(Boolean.valueOf(expected.get(PROPERTY_USE_KEYTAB)), 
config.isUseKeyTab());
-        assertEquals(Boolean.valueOf(expected.get(PROPERTY_USE_TICKET_CACHE)), 
config.isUseTicketCache());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/knox/blob/e766b3b7/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/util/RemoteRegistryConfigTestUtils.java
----------------------------------------------------------------------
diff --git 
a/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/util/RemoteRegistryConfigTestUtils.java
 
b/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/util/RemoteRegistryConfigTestUtils.java
deleted file mode 100644
index 35919d0..0000000
--- 
a/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/util/RemoteRegistryConfigTestUtils.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <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.hadoop.gateway.service.config.remote.util;
-
-import java.util.Collection;
-import java.util.Map;
-
-public class RemoteRegistryConfigTestUtils {
-
-    public static final String PROPERTY_TYPE = "type";
-    public static final String PROPERTY_NAME = "name";
-    public static final String PROPERTY_ADDRESS = "address";
-    public static final String PROPERTY_NAMESAPCE = "namespace";
-    public static final String PROPERTY_SECURE = "secure";
-    public static final String PROPERTY_AUTH_TYPE = "authType";
-    public static final String PROPERTY_PRINCIPAL = "principal";
-    public static final String PROPERTY_CRED_ALIAS = "credentialAlias";
-    public static final String PROPERTY_KEYTAB = "keyTab";
-    public static final String PROPERTY_USE_KEYTAB = "useKeyTab";
-    public static final String PROPERTY_USE_TICKET_CACHE = "useTicketCache";
-
-    public static String 
createRemoteConfigRegistriesXML(Collection<Map<String, String>> 
configProperties) {
-        String result = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
-                        "<remote-configuration-registries>\n";
-
-        for (Map<String, String> props : configProperties) {
-            String authType = props.get(PROPERTY_AUTH_TYPE);
-            if ("Kerberos".equalsIgnoreCase(authType)) {
-                result +=
-                   
createRemoteConfigRegistryXMLWithKerberosAuth(props.get(PROPERTY_TYPE),
-                                                                 
props.get(PROPERTY_NAME),
-                                                                 
props.get(PROPERTY_ADDRESS),
-                                                                 
props.get(PROPERTY_PRINCIPAL),
-                                                                 
props.get(PROPERTY_KEYTAB),
-                                                                 
Boolean.valueOf(props.get(PROPERTY_USE_KEYTAB)),
-                                                                 
Boolean.valueOf(props.get(PROPERTY_USE_TICKET_CACHE)));
-            } else if ("Digest".equalsIgnoreCase(authType)) {
-                result +=
-                    
createRemoteConfigRegistryXMLWithDigestAuth(props.get(PROPERTY_TYPE),
-                                                                
props.get(PROPERTY_NAME),
-                                                                
props.get(PROPERTY_ADDRESS),
-                                                                
props.get(PROPERTY_PRINCIPAL),
-                                                                
props.get(PROPERTY_CRED_ALIAS));
-            } else {
-                result += 
createRemoteConfigRegistryXMLNoAuth(props.get(PROPERTY_TYPE),
-                                                              
props.get(PROPERTY_NAME),
-                                                              
props.get(PROPERTY_ADDRESS));
-            }
-        }
-
-        result += "</remote-configuration-registries>\n";
-
-        return result;
-    }
-
-    public static String createRemoteConfigRegistryXMLWithKerberosAuth(String 
type,
-                                                                       String 
name,
-                                                                       String 
address,
-                                                                       String 
principal,
-                                                                       String 
keyTab,
-                                                                       boolean 
userKeyTab,
-                                                                       boolean 
useTicketCache) {
-        return "  <remote-configuration-registry>\n" +
-               "    <name>" + name + "</name>\n" +
-               "    <type>" + type + "</type>\n" +
-               "    <address>" + address + "</address>\n" +
-               "    <secure>true</secure>\n" +
-               "    <auth-type>" + "Kerberos" + "</auth-type>\n" +
-               "    <principal>" + principal + "</principal>\n" +
-               "    <keytab>" + keyTab + "</keytab>\n" +
-               "    <use-keytab>" + String.valueOf(userKeyTab) + 
"</use-keytab>\n" +
-               "    <use-ticket-cache>" + String.valueOf(useTicketCache) + 
"</use-ticket-cache>\n" +
-               "  </remote-configuration-registry>\n";
-    }
-
-    public static String createRemoteConfigRegistryXMLWithDigestAuth(String 
type,
-                                                                     String 
name,
-                                                                     String 
address,
-                                                                     String 
principal,
-                                                                     String 
credentialAlias) {
-        return "  <remote-configuration-registry>\n" +
-               "    <name>" + name + "</name>\n" +
-               "    <type>" + type + "</type>\n" +
-               "    <address>" + address + "</address>\n" +
-               "    <secure>true</secure>\n" +
-               "    <auth-type>" + "Digest" + "</auth-type>\n" +
-               "    <principal>" + principal + "</principal>\n" +
-               "    <credential-alias>" + credentialAlias + 
"</credential-alias>\n" +
-               "  </remote-configuration-registry>\n";
-    }
-
-
-    public static String createRemoteConfigRegistryXMLNoAuth(String type,
-                                                             String name,
-                                                             String address) {
-        return "  <remote-configuration-registry>\n" +
-               "    <name>" + name + "</name>\n" +
-               "    <type>" + type + "</type>\n" +
-               "    <address>" + address + "</address>\n" +
-               "  </remote-configuration-registry>\n";
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/knox/blob/e766b3b7/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceTest.java
----------------------------------------------------------------------
diff --git 
a/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceTest.java
 
b/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceTest.java
deleted file mode 100644
index 0292ee3..0000000
--- 
a/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/zk/RemoteConfigurationRegistryClientServiceTest.java
+++ /dev/null
@@ -1,424 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <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.hadoop.gateway.service.config.remote.zk;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.curator.framework.CuratorFramework;
-import org.apache.curator.framework.CuratorFrameworkFactory;
-import org.apache.curator.retry.ExponentialBackoffRetry;
-import org.apache.curator.test.InstanceSpec;
-import org.apache.curator.test.TestingCluster;
-import org.apache.hadoop.gateway.config.GatewayConfig;
-import 
org.apache.hadoop.gateway.services.config.client.RemoteConfigurationRegistryClient.ChildEntryListener;
-import 
org.apache.hadoop.gateway.services.config.client.RemoteConfigurationRegistryClient;
-import 
org.apache.hadoop.gateway.services.config.client.RemoteConfigurationRegistryClientService;
-import 
org.apache.hadoop.gateway.service.config.remote.RemoteConfigurationRegistryClientServiceFactory;
-import 
org.apache.hadoop.gateway.service.config.remote.util.RemoteRegistryConfigTestUtils;
-import org.apache.hadoop.gateway.services.security.AliasService;
-import org.apache.zookeeper.ZooDefs;
-import org.apache.zookeeper.data.ACL;
-import org.apache.zookeeper.data.Id;
-import org.easymock.EasyMock;
-import org.junit.Test;
-
-import javax.security.auth.login.AppConfigurationEntry;
-import javax.security.auth.login.Configuration;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-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.assertNull;
-import static org.junit.Assert.assertTrue;
-
-public class RemoteConfigurationRegistryClientServiceTest {
-
-    /**
-     * Test a configuration for an unsecured remote registry, included in the 
gateway configuration.
-     */
-    @Test
-    public void testUnsecuredZooKeeperWithSimpleRegistryConfig() throws 
Exception {
-        final String REGISTRY_CLIENT_NAME = "unsecured-zk-registry-name";
-        final String PRINCIPAL = null;
-        final String PWD = null;
-        final String CRED_ALIAS = null;
-
-        // Configure and start a secure ZK cluster
-        TestingCluster zkCluster = setupAndStartSecureTestZooKeeper(PRINCIPAL, 
PWD);
-
-        try {
-            // Create the setup client for the test cluster, and initialize 
the test znodes
-            CuratorFramework setupClient = 
initializeTestClientAndZNodes(zkCluster, PRINCIPAL);
-
-            // Mock configuration
-            GatewayConfig config = 
EasyMock.createNiceMock(GatewayConfig.class);
-            final String registryConfigValue =
-                        GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE + "=" + 
ZooKeeperClientService.TYPE + ";" +
-                        GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS + "=" + 
zkCluster.getConnectString();
-            
EasyMock.expect(config.getRemoteRegistryConfiguration(REGISTRY_CLIENT_NAME))
-                    .andReturn(registryConfigValue)
-                    .anyTimes();
-            EasyMock.expect(config.getRemoteRegistryConfigurationNames())
-                    
.andReturn(Collections.singletonList(REGISTRY_CLIENT_NAME)).anyTimes();
-            EasyMock.replay(config);
-
-            doTestZooKeeperClient(setupClient, REGISTRY_CLIENT_NAME, config, 
CRED_ALIAS, PWD);
-        } finally {
-            zkCluster.stop();
-        }
-    }
-
-    /**
-     * Test multiple configurations for an unsecured remote registry.
-     */
-    @Test
-    public void testMultipleUnsecuredZooKeeperWithSimpleRegistryConfig() 
throws Exception {
-        final String REGISTRY_CLIENT_NAME_1 = "zkclient1";
-        final String REGISTRY_CLIENT_NAME_2 = "zkclient2";
-        final String PRINCIPAL = null;
-        final String PWD = null;
-        final String CRED_ALIAS = null;
-
-        // Configure and start a secure ZK cluster
-        TestingCluster zkCluster = setupAndStartSecureTestZooKeeper(PRINCIPAL, 
PWD);
-
-        try {
-            // Create the setup client for the test cluster, and initialize 
the test znodes
-            CuratorFramework setupClient = 
initializeTestClientAndZNodes(zkCluster, PRINCIPAL);
-
-            // Mock configuration
-            GatewayConfig config = 
EasyMock.createNiceMock(GatewayConfig.class);
-            final String registryConfigValue1 =
-                                GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE + 
"=" + ZooKeeperClientService.TYPE + ";" +
-                                GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS + 
"=" + zkCluster.getConnectString();
-            
EasyMock.expect(config.getRemoteRegistryConfiguration(REGISTRY_CLIENT_NAME_1))
-                    .andReturn(registryConfigValue1).anyTimes();
-            final String registryConfigValue2 =
-                                GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE + 
"=" + ZooKeeperClientService.TYPE + ";" +
-                                GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS + 
"=" + zkCluster.getConnectString();
-            
EasyMock.expect(config.getRemoteRegistryConfiguration(REGISTRY_CLIENT_NAME_2))
-                    .andReturn(registryConfigValue2).anyTimes();
-            EasyMock.expect(config.getRemoteRegistryConfigurationNames())
-                    .andReturn(Arrays.asList(REGISTRY_CLIENT_NAME_1, 
REGISTRY_CLIENT_NAME_2)).anyTimes();
-            EasyMock.replay(config);
-
-            // Create the client service instance
-            RemoteConfigurationRegistryClientService clientService =
-                    
RemoteConfigurationRegistryClientServiceFactory.newInstance(config);
-            assertEquals("Wrong registry client service type.", 
clientService.getClass(), CuratorClientService.class);
-            clientService.setAliasService(null);
-            clientService.init(config, null);
-            clientService.start();
-
-            RemoteConfigurationRegistryClient client1 = 
clientService.get(REGISTRY_CLIENT_NAME_1);
-            assertNotNull(client1);
-
-            RemoteConfigurationRegistryClient client2 = 
clientService.get(REGISTRY_CLIENT_NAME_2);
-            assertNotNull(client2);
-
-            doTestZooKeeperClient(setupClient, REGISTRY_CLIENT_NAME_1, 
clientService, false);
-            doTestZooKeeperClient(setupClient, REGISTRY_CLIENT_NAME_2, 
clientService, false);
-        } finally {
-            zkCluster.stop();
-        }
-    }
-
-    /**
-     * Test a configuration for a secure remote registry, included in the 
gateway configuration.
-     */
-    @Test
-    public void testZooKeeperWithSimpleRegistryConfig() throws Exception {
-        final String AUTH_TYPE = "digest";
-        final String REGISTRY_CLIENT_NAME = "zk-registry-name";
-        final String PRINCIPAL = "knox";
-        final String PWD = "knoxtest";
-        final String CRED_ALIAS = "zkCredential";
-
-        // Configure and start a secure ZK cluster
-        TestingCluster zkCluster = setupAndStartSecureTestZooKeeper(PRINCIPAL, 
PWD);
-
-        try {
-            // Create the setup client for the test cluster, and initialize 
the test znodes
-            CuratorFramework setupClient = 
initializeTestClientAndZNodes(zkCluster, PRINCIPAL);
-
-            // Mock configuration
-            GatewayConfig config = 
EasyMock.createNiceMock(GatewayConfig.class);
-            final String registryConfigValue =
-                            GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE + "=" + 
ZooKeeperClientService.TYPE + ";" +
-                            GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS + "=" 
+ zkCluster.getConnectString() + ";" +
-                            GatewayConfig.REMOTE_CONFIG_REGISTRY_AUTH_TYPE + 
"=" + AUTH_TYPE + ";" +
-                            GatewayConfig.REMOTE_CONFIG_REGISTRY_PRINCIPAL + 
"=" + PRINCIPAL + ";" +
-                            
GatewayConfig.REMOTE_CONFIG_REGISTRY_CREDENTIAL_ALIAS + "=" + CRED_ALIAS;
-            
EasyMock.expect(config.getRemoteRegistryConfiguration(REGISTRY_CLIENT_NAME))
-                    .andReturn(registryConfigValue)
-                    .anyTimes();
-            EasyMock.expect(config.getRemoteRegistryConfigurationNames())
-                    
.andReturn(Collections.singletonList(REGISTRY_CLIENT_NAME)).anyTimes();
-            EasyMock.replay(config);
-
-            doTestZooKeeperClient(setupClient, REGISTRY_CLIENT_NAME, config, 
CRED_ALIAS, PWD);
-        } finally {
-            zkCluster.stop();
-        }
-    }
-
-    /**
-     * Test the remote registry configuration external to, and referenced 
from, the gateway configuration, for a secure
-     * client.
-     */
-    @Test
-    public void testZooKeeperWithSingleExternalRegistryConfig() throws 
Exception {
-        final String AUTH_TYPE = "digest";
-        final String REGISTRY_CLIENT_NAME = "my-zookeeper_registryNAME";
-        final String PRINCIPAL = "knox";
-        final String PWD = "knoxtest";
-        final String CRED_ALIAS = "zkCredential";
-
-        // Configure and start a secure ZK cluster
-        TestingCluster zkCluster = setupAndStartSecureTestZooKeeper(PRINCIPAL, 
PWD);
-
-        File tmpRegConfigFile = null;
-
-        try {
-            // Create the setup client for the test cluster, and initialize 
the test znodes
-            CuratorFramework setupClient = 
initializeTestClientAndZNodes(zkCluster, PRINCIPAL);
-
-            // Mock configuration
-            Map<String, String> registryConfigProps = new HashMap<>();
-            registryConfigProps.put("type", ZooKeeperClientService.TYPE);
-            registryConfigProps.put("name", REGISTRY_CLIENT_NAME);
-            registryConfigProps.put("address", zkCluster.getConnectString());
-            registryConfigProps.put("secure", "true");
-            registryConfigProps.put("authType", AUTH_TYPE);
-            registryConfigProps.put("principal", PRINCIPAL);
-            registryConfigProps.put("credentialAlias", CRED_ALIAS);
-            String registryConfigXML =
-                  
RemoteRegistryConfigTestUtils.createRemoteConfigRegistriesXML(Collections.singleton(registryConfigProps));
-            tmpRegConfigFile = File.createTempFile("myRemoteRegistryConfig", 
"xml");
-            FileUtils.writeStringToFile(tmpRegConfigFile, registryConfigXML);
-
-            
System.setProperty("org.apache.knox.gateway.remote.registry.config.file", 
tmpRegConfigFile.getAbsolutePath());
-
-            GatewayConfig config = 
EasyMock.createNiceMock(GatewayConfig.class);
-            EasyMock.replay(config);
-
-            doTestZooKeeperClient(setupClient, REGISTRY_CLIENT_NAME, config, 
CRED_ALIAS, PWD);
-        } finally {
-            zkCluster.stop();
-            if (tmpRegConfigFile != null && tmpRegConfigFile.exists()) {
-                tmpRegConfigFile.delete();
-            }
-            
System.clearProperty("org.apache.knox.gateway.remote.registry.config.file");
-        }
-    }
-
-    /**
-     * Setup and start a secure test ZooKeeper cluster.
-     */
-    private TestingCluster setupAndStartSecureTestZooKeeper(String principal, 
String digestPassword) throws Exception {
-        final boolean applyAuthentication = (principal != null);
-
-        // Configure security for the ZK cluster instances
-        Map<String, Object> customInstanceSpecProps = new HashMap<>();
-
-        if (applyAuthentication) {
-            customInstanceSpecProps.put("authProvider.1", 
"org.apache.zookeeper.server.auth.SASLAuthenticationProvider");
-            customInstanceSpecProps.put("requireClientAuthScheme", "sasl");
-        }
-
-        // Define the test cluster
-        List<InstanceSpec> instanceSpecs = new ArrayList<>();
-        for (int i = 0 ; i < 3 ; i++) {
-            InstanceSpec is = new InstanceSpec(null, -1, -1, -1, false, (i+1), 
-1, -1, customInstanceSpecProps);
-            instanceSpecs.add(is);
-        }
-        TestingCluster zkCluster = new TestingCluster(instanceSpecs);
-
-        if (applyAuthentication) {
-            // Setup ZooKeeper server SASL
-            Map<String, String> digestOptions = new HashMap<>();
-            digestOptions.put("user_" + principal, digestPassword);
-            final AppConfigurationEntry[] serverEntries =
-                    {new 
AppConfigurationEntry("org.apache.zookeeper.server.auth.DigestLoginModule",
-                            
AppConfigurationEntry.LoginModuleControlFlag.REQUIRED,
-                            digestOptions)};
-            Configuration.setConfiguration(new Configuration() {
-                @Override
-                public AppConfigurationEntry[] getAppConfigurationEntry(String 
name) {
-                    return ("Server".equalsIgnoreCase(name)) ? serverEntries : 
null;
-                }
-            });
-        }
-
-        // Start the cluster
-        zkCluster.start();
-
-        return zkCluster;
-    }
-
-    /**
-     * Create a ZooKeeper client with SASL digest auth configured, and 
initialize the test znodes.
-     */
-    private CuratorFramework initializeTestClientAndZNodes(TestingCluster 
zkCluster, String principal) throws Exception {
-        // Create the client for the test cluster
-        CuratorFramework setupClient = CuratorFrameworkFactory.builder()
-                                                              
.connectString(zkCluster.getConnectString())
-                                                              .retryPolicy(new 
ExponentialBackoffRetry(100, 3))
-                                                              .build();
-        assertNotNull(setupClient);
-        setupClient.start();
-
-        List<ACL> acls = new ArrayList<>();
-        if (principal != null) {
-            acls.add(new ACL(ZooDefs.Perms.ALL, new Id("sasl", principal)));
-        } else {
-            acls.add(new ACL(ZooDefs.Perms.ALL, ZooDefs.Ids.ANYONE_ID_UNSAFE));
-        }
-        
setupClient.create().creatingParentsIfNeeded().withACL(acls).forPath("/knox/config/descriptors");
-        
setupClient.create().creatingParentsIfNeeded().withACL(acls).forPath("/knox/config/shared-providers");
-
-        List<ACL> negativeACLs = new ArrayList<>();
-        if (principal != null) {
-            negativeACLs.add(new ACL(ZooDefs.Perms.ALL, new Id("sasl", 
"notyou")));
-        } else {
-            negativeACLs.add(new ACL(ZooDefs.Perms.ALL, 
ZooDefs.Ids.ANYONE_ID_UNSAFE));
-        }
-        
setupClient.create().creatingParentsIfNeeded().withACL(negativeACLs).forPath("/someotherconfig");
-
-        return setupClient;
-    }
-
-    private void doTestZooKeeperClient(final CuratorFramework setupClient,
-                                       final String           testClientName,
-                                       final GatewayConfig    config,
-                                       final String           credentialAlias,
-                                       final String           digestPassword) 
throws Exception {
-        boolean isSecureTest = (credentialAlias != null && digestPassword != 
null);
-
-        // Mock alias service
-        AliasService aliasService = 
EasyMock.createNiceMock(AliasService.class);
-        
EasyMock.expect(aliasService.getPasswordFromAliasForGateway(credentialAlias))
-                .andReturn(isSecureTest ? digestPassword.toCharArray() : null)
-                .anyTimes();
-        EasyMock.replay(aliasService);
-
-        // Create the client service instance
-        RemoteConfigurationRegistryClientService clientService =
-                
RemoteConfigurationRegistryClientServiceFactory.newInstance(config);
-        assertEquals("Wrong registry client service type.", 
clientService.getClass(), CuratorClientService.class);
-        clientService.setAliasService(aliasService);
-        clientService.init(config, null);
-        clientService.start();
-
-        doTestZooKeeperClient(setupClient, testClientName, clientService, 
isSecureTest);
-    }
-
-    /**
-     * Test secure ZooKeeper client interactions.
-     *
-     * @param setupClient    The client used for interacting with ZooKeeper 
independent from the registry client service.
-     * @param testClientName The name of the client to use from the registry 
client service.
-     * @param clientService  The RemoteConfigurationRegistryClientService
-     * @param isSecureTest   Flag to indicate whether this is a secure 
interaction test
-     */
-    private void doTestZooKeeperClient(final CuratorFramework                  
       setupClient,
-                                       final String                            
       testClientName,
-                                       final 
RemoteConfigurationRegistryClientService clientService,
-                                       boolean                                 
       isSecureTest) throws Exception {
-
-        RemoteConfigurationRegistryClient client = 
clientService.get(testClientName);
-        assertNotNull(client);
-        List<String> descriptors = 
client.listChildEntries("/knox/config/descriptors");
-        assertNotNull(descriptors);
-        for (String descriptor : descriptors) {
-            System.out.println("Descriptor: " + descriptor);
-        }
-
-        List<String> providerConfigs = 
client.listChildEntries("/knox/config/shared-providers");
-        assertNotNull(providerConfigs);
-        for (String providerConfig : providerConfigs) {
-            System.out.println("Provider config: " + providerConfig);
-        }
-
-        List<String> someotherConfig = 
client.listChildEntries("/someotherconfig");
-        if (isSecureTest) {
-            assertNull("Expected null because of the ACL mismatch.", 
someotherConfig);
-        } else {
-            assertNotNull(someotherConfig);
-        }
-
-        // Test listeners
-        final String MY_NEW_ZNODE = "/clientServiceTestNode";
-        final String MY_NEW_DATA_ZNODE = MY_NEW_ZNODE + "/mydata";
-
-        if (setupClient.checkExists().forPath(MY_NEW_ZNODE) != null) {
-            
setupClient.delete().deletingChildrenIfNeeded().forPath(MY_NEW_ZNODE);
-        }
-
-        final List<String> listenerLog = new ArrayList<>();
-        client.addChildEntryListener(MY_NEW_ZNODE, (c, type, path) -> {
-            listenerLog.add("EXTERNAL: " + type.toString() + ":" + path);
-            if (ChildEntryListener.Type.ADDED.equals(type)) {
-                try {
-                    c.addEntryListener(path, (cc, p, d) -> 
listenerLog.add("EXTERNAL: " + p + ":" + (d != null ? new String(d) : "null")));
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-            }
-        });
-
-        client.createEntry(MY_NEW_ZNODE);
-        client.createEntry(MY_NEW_DATA_ZNODE, "more test data");
-        String testData = client.getEntryData(MY_NEW_DATA_ZNODE);
-        assertNotNull(testData);
-        assertEquals("more test data", testData);
-
-        assertTrue(client.entryExists(MY_NEW_DATA_ZNODE));
-        client.setEntryData(MY_NEW_DATA_ZNODE, "still more data");
-
-        try {
-            Thread.sleep(1000);
-        } catch (InterruptedException e) {
-            //
-        }
-
-        client.setEntryData(MY_NEW_DATA_ZNODE, "changed completely");
-
-        try {
-            Thread.sleep(1000);
-        } catch (InterruptedException e) {
-            //
-        }
-
-        client.deleteEntry(MY_NEW_DATA_ZNODE);
-
-        try {
-            Thread.sleep(1000);
-        } catch (InterruptedException e) {
-            //
-        }
-
-        assertFalse(listenerLog.isEmpty());
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/knox/blob/e766b3b7/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/zk/RemoteConfigurationRegistryJAASConfigTest.java
----------------------------------------------------------------------
diff --git 
a/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/zk/RemoteConfigurationRegistryJAASConfigTest.java
 
b/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/zk/RemoteConfigurationRegistryJAASConfigTest.java
deleted file mode 100644
index 6cbef9b..0000000
--- 
a/gateway-service-remoteconfig/src/test/java/org/apache/hadoop/gateway/service/config/remote/zk/RemoteConfigurationRegistryJAASConfigTest.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with this
- * work for additional information regarding copyright ownership. The ASF
- * licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * <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.hadoop.gateway.service.config.remote.zk;
-
-import 
org.apache.hadoop.gateway.service.config.remote.RemoteConfigurationRegistryConfig;
-import 
org.apache.hadoop.gateway.service.config.remote.zk.RemoteConfigurationRegistryJAASConfig;
-import org.apache.hadoop.gateway.services.security.AliasService;
-import org.easymock.EasyMock;
-import org.junit.Test;
-
-import javax.security.auth.login.AppConfigurationEntry;
-import javax.security.auth.login.Configuration;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-public class RemoteConfigurationRegistryJAASConfigTest {
-
-    @Test
-    public void testZooKeeperDigestContextEntry() throws Exception {
-        List<RemoteConfigurationRegistryConfig> registryConfigs = new 
ArrayList<>();
-        final String ENTRY_NAME       = "my_digest_context";
-        final String DIGEST_PRINCIPAL = "myIdentity";
-        final String DIGEST_PWD_ALIAS = "myAlias";
-        final String DIGEST_PWD       = "mysecret";
-
-        AliasService aliasService = 
EasyMock.createNiceMock(AliasService.class);
-        
EasyMock.expect(aliasService.getPasswordFromAliasForGateway(DIGEST_PWD_ALIAS)).andReturn(DIGEST_PWD.toCharArray()).anyTimes();
-        EasyMock.replay(aliasService);
-
-        registryConfigs.add(createDigestConfig(ENTRY_NAME, DIGEST_PRINCIPAL, 
DIGEST_PWD_ALIAS));
-
-        try {
-            RemoteConfigurationRegistryJAASConfig jaasConfig =
-                                    
RemoteConfigurationRegistryJAASConfig.configure(registryConfigs, aliasService);
-
-            // Make sure there are no entries for an invalid context entry name
-            assertNull(jaasConfig.getAppConfigurationEntry("invalid"));
-
-            // Validate the intended context entry
-            validateDigestContext(jaasConfig,
-                                  ENTRY_NAME,
-                                  
RemoteConfigurationRegistryJAASConfig.digestLoginModules.get("ZOOKEEPER"),
-                                  DIGEST_PRINCIPAL,
-                                  DIGEST_PWD);
-        } finally {
-            Configuration.setConfiguration(null);
-        }
-    }
-
-    @Test
-    public void testKerberosContextEntry() throws Exception {
-        List<RemoteConfigurationRegistryConfig> registryConfigs = new 
ArrayList<>();
-        final String ENTRY_NAME = "my_kerberos_context";
-        final String PRINCIPAL  = "myIdentity";
-
-        File dummyKeyTab = File.createTempFile("my_context", "keytab");
-        registryConfigs.add(createKerberosConfig(ENTRY_NAME, PRINCIPAL, 
dummyKeyTab.getAbsolutePath()));
-
-        try {
-            RemoteConfigurationRegistryJAASConfig jaasConfig =
-                                            
RemoteConfigurationRegistryJAASConfig.configure(registryConfigs, null);
-
-            // Make sure there are no entries for an invalid context entry name
-            assertNull(jaasConfig.getAppConfigurationEntry("invalid"));
-
-            // Validate the intended context entry
-            validateKerberosContext(jaasConfig,
-                                    ENTRY_NAME,
-                                    PRINCIPAL,
-                                    dummyKeyTab.getAbsolutePath(),
-                                    true,
-                                    false);
-
-        } finally {
-            Configuration.setConfiguration(null);
-        }
-    }
-
-    @Test
-    public void testZooKeeperMultipleContextEntries() throws Exception {
-        List<RemoteConfigurationRegistryConfig> registryConfigs = new 
ArrayList<>();
-        final String KERBEROS_ENTRY_NAME = "my_kerberos_context";
-        final String KERBEROS_PRINCIPAL  = "myKerberosIdentity";
-        final String DIGEST_ENTRY_NAME   = "my_digest_context";
-        final String DIGEST_PRINCIPAL    = "myDigestIdentity";
-        final String DIGEST_PWD_ALIAS    = "myAlias";
-        final String DIGEST_PWD          = "mysecret";
-
-        AliasService aliasService = 
EasyMock.createNiceMock(AliasService.class);
-        
EasyMock.expect(aliasService.getPasswordFromAliasForGateway(DIGEST_PWD_ALIAS)).andReturn(DIGEST_PWD.toCharArray()).anyTimes();
-        EasyMock.replay(aliasService);
-
-        File dummyKeyTab = File.createTempFile("my_context", "keytab");
-        registryConfigs.add(createKerberosConfig(KERBEROS_ENTRY_NAME, 
KERBEROS_PRINCIPAL, dummyKeyTab.getAbsolutePath()));
-        registryConfigs.add(createDigestConfig(DIGEST_ENTRY_NAME, 
DIGEST_PRINCIPAL, DIGEST_PWD_ALIAS));
-
-        try {
-            RemoteConfigurationRegistryJAASConfig jaasConfig =
-                                        
RemoteConfigurationRegistryJAASConfig.configure(registryConfigs, aliasService);
-
-            // Make sure there are no entries for an invalid context entry name
-            assertNull(jaasConfig.getAppConfigurationEntry("invalid"));
-
-            // Validate the kerberos context entry
-            validateKerberosContext(jaasConfig,
-                                    KERBEROS_ENTRY_NAME,
-                                    KERBEROS_PRINCIPAL,
-                                    dummyKeyTab.getAbsolutePath(),
-                                    true,
-                                    false);
-
-            // Validate the digest context entry
-            validateDigestContext(jaasConfig,
-                                  DIGEST_ENTRY_NAME,
-                                  
RemoteConfigurationRegistryJAASConfig.digestLoginModules.get("ZOOKEEPER"),
-                                  DIGEST_PRINCIPAL,
-                                  DIGEST_PWD);
-
-        } finally {
-            Configuration.setConfiguration(null);
-        }
-    }
-
-    @Test
-    public void testZooKeeperDigestContextEntryWithoutAliasService() throws 
Exception {
-        List<RemoteConfigurationRegistryConfig> registryConfigs = new 
ArrayList<>();
-        final String ENTRY_NAME       = "my_digest_context";
-        final String DIGEST_PRINCIPAL = "myIdentity";
-        final String DIGEST_PWD_ALIAS = "myAlias";
-
-        registryConfigs.add(createDigestConfig(ENTRY_NAME, DIGEST_PRINCIPAL, 
DIGEST_PWD_ALIAS));
-
-        try {
-            RemoteConfigurationRegistryJAASConfig jaasConfig =
-                                            
RemoteConfigurationRegistryJAASConfig.configure(registryConfigs, null);
-            fail("Expected IllegalArgumentException because the AliasService 
is not available.");
-        } catch (IllegalArgumentException e) {
-            // Expected
-            assertTrue(e.getMessage().contains("AliasService"));
-        } catch (Throwable e) {
-            fail("Wrong exception encountered: " + e.getClass().getName() + ", 
" + e.getMessage());
-        } finally {
-            Configuration.setConfiguration(null);
-        }
-    }
-
-    private static RemoteConfigurationRegistryConfig createDigestConfig(String 
entryName,
-                                                                        String 
principal,
-                                                                        String 
credentialAlias) {
-        return createDigestConfig(entryName, principal, credentialAlias, 
"ZooKeeper");
-    }
-
-    private static RemoteConfigurationRegistryConfig createDigestConfig(String 
entryName,
-                                                                        String 
principal,
-                                                                        String 
credentialAlias,
-                                                                        String 
registryType) {
-        RemoteConfigurationRegistryConfig rc = 
EasyMock.createNiceMock(RemoteConfigurationRegistryConfig.class);
-        
EasyMock.expect(rc.getRegistryType()).andReturn(registryType).anyTimes();
-        EasyMock.expect(rc.getName()).andReturn(entryName).anyTimes();
-        EasyMock.expect(rc.isSecureRegistry()).andReturn(true).anyTimes();
-        EasyMock.expect(rc.getAuthType()).andReturn("digest").anyTimes();
-        EasyMock.expect(rc.getPrincipal()).andReturn(principal).anyTimes();
-        
EasyMock.expect(rc.getCredentialAlias()).andReturn(credentialAlias).anyTimes();
-        EasyMock.replay(rc);
-        return rc;
-    }
-
-
-    private static RemoteConfigurationRegistryConfig 
createKerberosConfig(String entryName,
-                                                                          
String principal,
-                                                                          
String keyTabPath) {
-        return createKerberosConfig(entryName, principal, keyTabPath, 
"ZooKeeper");
-    }
-
-    private static RemoteConfigurationRegistryConfig 
createKerberosConfig(String entryName,
-                                                                          
String principal,
-                                                                          
String keyTabPath,
-                                                                          
String registryType) {
-        return createKerberosConfig(entryName, principal, keyTabPath, null, 
null, registryType);
-    }
-
-    private static RemoteConfigurationRegistryConfig 
createKerberosConfig(String entryName,
-                                                                          
String principal,
-                                                                          
String keyTabPath,
-                                                                          
Boolean useKeyTab,
-                                                                          
Boolean useTicketCache,
-                                                                          
String registryType) {
-        RemoteConfigurationRegistryConfig rc = 
EasyMock.createNiceMock(RemoteConfigurationRegistryConfig.class);
-        
EasyMock.expect(rc.getRegistryType()).andReturn(registryType).anyTimes();
-        EasyMock.expect(rc.getName()).andReturn(entryName).anyTimes();
-        EasyMock.expect(rc.isSecureRegistry()).andReturn(true).anyTimes();
-        EasyMock.expect(rc.getAuthType()).andReturn("kerberos").anyTimes();
-        EasyMock.expect(rc.getPrincipal()).andReturn(principal).anyTimes();
-        EasyMock.expect(rc.getKeytab()).andReturn(keyTabPath).anyTimes();
-        EasyMock.expect(rc.isUseKeyTab()).andReturn(useKeyTab != null ? 
useKeyTab : true).anyTimes();
-        EasyMock.expect(rc.isUseTicketCache()).andReturn(useTicketCache != 
null ? useTicketCache : false).anyTimes();
-        EasyMock.replay(rc);
-        return rc;
-    }
-
-    private static void 
validateDigestContext(RemoteConfigurationRegistryJAASConfig config,
-                                              String                           
     entryName,
-                                              String                           
     loginModule,
-                                              String                           
     principal,
-                                              String                           
     password) throws Exception {
-        AppConfigurationEntry[] myContextEntries = 
config.getAppConfigurationEntry(entryName);
-        assertNotNull(myContextEntries);
-        assertEquals(1, myContextEntries.length);
-        AppConfigurationEntry entry = myContextEntries[0];
-        assertTrue(entry.getLoginModuleName().equals(loginModule));
-        Map<String, ?> entryOpts = entry.getOptions();
-        assertEquals(principal, entryOpts.get("username"));
-        assertEquals(password, entryOpts.get("password"));
-    }
-
-    private static void 
validateKerberosContext(RemoteConfigurationRegistryJAASConfig config,
-                                                String                         
       entryName,
-                                                String                         
       principal,
-                                                String                         
       keyTab,
-                                                boolean                        
       useKeyTab,
-                                                boolean                        
       useTicketCache) throws Exception {
-        AppConfigurationEntry[] myContextEntries = 
config.getAppConfigurationEntry(entryName);
-        assertNotNull(myContextEntries);
-        assertEquals(1, myContextEntries.length);
-        AppConfigurationEntry entry = myContextEntries[0];
-        
assertTrue(entry.getLoginModuleName().endsWith(".security.auth.module.Krb5LoginModule"));
-        Map<String, ?> entryOpts = entry.getOptions();
-        assertEquals(principal, entryOpts.get("principal"));
-        assertEquals(keyTab, entryOpts.get("keyTab"));
-        assertEquals(useKeyTab, 
Boolean.valueOf((String)entryOpts.get("isUseKeyTab")));
-        assertEquals(useTicketCache, 
Boolean.valueOf((String)entryOpts.get("isUseTicketCache")));
-    }
-}

http://git-wip-us.apache.org/repos/asf/knox/blob/e766b3b7/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/config/DefaultRemoteConfigurationRegistriesTest.java
----------------------------------------------------------------------
diff --git 
a/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/config/DefaultRemoteConfigurationRegistriesTest.java
 
b/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/config/DefaultRemoteConfigurationRegistriesTest.java
new file mode 100644
index 0000000..ce223e9
--- /dev/null
+++ 
b/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/config/DefaultRemoteConfigurationRegistriesTest.java
@@ -0,0 +1,184 @@
+/**
+ * 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.service.config.remote.config;
+
+import org.apache.knox.gateway.config.GatewayConfig;
+import org.easymock.EasyMock;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.junit.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+public class DefaultRemoteConfigurationRegistriesTest {
+
+    /**
+     * Test a single registry configuration with digest auth configuration.
+     */
+    @Test
+    public void testPropertiesRemoteConfigurationRegistriesSingleDigest() 
throws Exception {
+        Map<String, Properties> testProperties = new HashMap<>();
+        Properties p = new Properties();
+        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE, "ZooKeeper");
+        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS, 
"hostx:2181");
+        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_PRINCIPAL, 
"zkDigestUser");
+        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_AUTH_TYPE, 
"digest");
+        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_CREDENTIAL_ALIAS, 
"zkDigestAlias");
+        testProperties.put("testDigest", p);
+
+        doTestPropertiesRemoteConfigurationRegistries(testProperties);
+    }
+
+
+    /**
+     * Test a single registry configuration with kerberos auth configuration.
+     */
+    @Test
+    public void testPropertiesRemoteConfigurationRegistriesSingleKerberos() 
throws Exception {
+        Map<String, Properties> testProperties = new HashMap<>();
+        Properties p = new Properties();
+        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE, "ZooKeeper");
+        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS, 
"hostx:2181");
+        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_PRINCIPAL, 
"zkUser");
+        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_AUTH_TYPE, 
"kerberos");
+        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_KEYTAB, 
"/home/user/remoteregistry.keytab");
+        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_USE_KEYTAB, "true");
+        p.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_USE_TICKET_CACHE, 
"false");
+        testProperties.put("testKerb", p);
+
+        doTestPropertiesRemoteConfigurationRegistries(testProperties);
+    }
+
+    /**
+     * Test multiple registry configuration with varying auth configurations.
+     */
+    @Test
+    public void testPropertiesRemoteConfigurationRegistriesMultipleMixed() 
throws Exception {
+        Map<String, Properties> testProperties = new HashMap<>();
+
+        Properties kerb = new Properties();
+        kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE, 
"ZooKeeper");
+        kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS, 
"host1:2181");
+        kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_NAMESPACE, 
"/knox/config");
+        kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_PRINCIPAL, 
"kerbPrincipal");
+        kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_AUTH_TYPE, 
"kerberos");
+        kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_KEYTAB, 
"/home/user/mykrb.keytab");
+        kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_USE_KEYTAB, 
"true");
+        
kerb.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_USE_TICKET_CACHE, 
"false");
+        testProperties.put("testKerb1", kerb);
+
+        Properties digest = new Properties();
+        digest.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE, 
"ZooKeeper");
+        digest.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS, 
"host2:2181");
+        digest.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_PRINCIPAL, 
"digestPrincipal");
+        digest.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_AUTH_TYPE, 
"digest");
+        
digest.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_CREDENTIAL_ALIAS, 
"digestPwdAlias");
+        testProperties.put("testDigest1", digest);
+
+        Properties unsecured = new Properties();
+        unsecured.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE, 
"ZooKeeper");
+        unsecured.setProperty(GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS, 
"host2:2181");
+        testProperties.put("testUnsecured", unsecured);
+
+        doTestPropertiesRemoteConfigurationRegistries(testProperties);
+    }
+
+
+    /**
+     * Perform the actual test.
+     *
+     * @param testProperties The test properties
+     */
+    private void doTestPropertiesRemoteConfigurationRegistries(Map<String, 
Properties> testProperties) throws Exception {
+        // Mock gateway config
+        GatewayConfig gc = mockGatewayConfig(testProperties);
+
+        // Create the RemoteConfigurationRegistries object to be tested from 
the GatewayConfig
+        RemoteConfigurationRegistries registries = new 
DefaultRemoteConfigurationRegistries(gc);
+
+        // Basic validation
+        assertNotNull(registries);
+        List<RemoteConfigurationRegistry> registryConfigs = 
registries.getRegistryConfigurations();
+        assertNotNull(registryConfigs);
+        assertEquals(testProperties.size(), registryConfigs.size());
+
+        // Validate the contents of the created object
+        for (RemoteConfigurationRegistry regConfig : registryConfigs) {
+            validateRemoteRegistryConfig(regConfig.getName(), 
testProperties.get(regConfig.getName()), regConfig);
+        }
+    }
+
+
+    /**
+     * Create a mock GatewayConfig based on the specified test properties.
+     *
+     * @param testProperties The test properties to set on the config
+     */
+    private GatewayConfig mockGatewayConfig(Map<String, Properties> 
testProperties) {
+        // Mock gateway config
+        GatewayConfig gc = EasyMock.createNiceMock(GatewayConfig.class);
+        List<String> configNames = new ArrayList<>();
+        for (String registryName : testProperties.keySet()) {
+            configNames.add(registryName);
+
+            String propertyValueString = "";
+            Properties props = testProperties.get(registryName);
+            Enumeration names = props.propertyNames();
+            while (names.hasMoreElements()) {
+                String propertyName = (String) names.nextElement();
+                propertyValueString += propertyName + "=" + 
props.get(propertyName);
+                if (names.hasMoreElements()) {
+                    propertyValueString += ";";
+                }
+            }
+            EasyMock.expect(gc.getRemoteRegistryConfiguration(registryName))
+                    .andReturn(propertyValueString)
+                    .anyTimes();
+        }
+        
EasyMock.expect(gc.getRemoteRegistryConfigurationNames()).andReturn(configNames).anyTimes();
+        EasyMock.replay(gc);
+
+        return gc;
+    }
+
+
+    /**
+     * Validate the specified RemoteConfigurationRegistry based on the 
expected test properties.
+     */
+    private void validateRemoteRegistryConfig(String                      
configName,
+                                              Properties                  
expected,
+                                              RemoteConfigurationRegistry 
registryConfig) throws Exception {
+        assertEquals(configName, registryConfig.getName());
+        assertEquals(expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_TYPE), 
registryConfig.getRegistryType());
+        
assertEquals(expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_ADDRESS), 
registryConfig.getConnectionString());
+        
assertEquals(expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_NAMESPACE), 
registryConfig.getNamespace());
+        assertEquals(registryConfig.isSecureRegistry(), 
expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_AUTH_TYPE) != null);
+        
assertEquals(expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_AUTH_TYPE), 
registryConfig.getAuthType());
+        
assertEquals(expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_PRINCIPAL), 
registryConfig.getPrincipal());
+        
assertEquals(expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_CREDENTIAL_ALIAS),
 registryConfig.getCredentialAlias());
+        
assertEquals(expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_KEYTAB), 
registryConfig.getKeytab());
+        
assertEquals(Boolean.valueOf((String)expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_USE_KEYTAB)),
 registryConfig.isUseKeyTab());
+        
assertEquals(Boolean.valueOf((String)expected.get(GatewayConfig.REMOTE_CONFIG_REGISTRY_USE_TICKET_CACHE)),
 registryConfig.isUseTicketCache());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/knox/blob/e766b3b7/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/config/RemoteConfigurationRegistryConfigParserTest.java
----------------------------------------------------------------------
diff --git 
a/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/config/RemoteConfigurationRegistryConfigParserTest.java
 
b/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/config/RemoteConfigurationRegistryConfigParserTest.java
new file mode 100644
index 0000000..1ff5dec
--- /dev/null
+++ 
b/gateway-service-remoteconfig/src/test/java/org/apache/knox/gateway/service/config/remote/config/RemoteConfigurationRegistryConfigParserTest.java
@@ -0,0 +1,115 @@
+/**
+ * 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.service.config.remote.config;
+
+import org.apache.commons.io.FileUtils;
+import 
org.apache.knox.gateway.service.config.remote.RemoteConfigurationRegistryConfig;
+import 
org.apache.knox.gateway.service.config.remote.util.RemoteRegistryConfigTestUtils;
+import org.junit.Test;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import static 
org.apache.knox.gateway.service.config.remote.util.RemoteRegistryConfigTestUtils.*;
+
+public class RemoteConfigurationRegistryConfigParserTest {
+
+    @Test
+    public void testExternalXMLParsing() throws Exception {
+        final String CONN_STR = "http://my.zookeeper.host:2181";;
+
+        Map<String, Map<String, String>> testRegistryConfigurations = new 
HashMap<>();
+
+        Map<String, String> config1 = new HashMap<>();
+        config1.put(RemoteRegistryConfigTestUtils.PROPERTY_TYPE, "ZooKeeper");
+        config1.put(RemoteRegistryConfigTestUtils.PROPERTY_NAME, "registry1");
+        config1.put(RemoteRegistryConfigTestUtils.PROPERTY_ADDRESS, CONN_STR);
+        config1.put(RemoteRegistryConfigTestUtils.PROPERTY_SECURE, "true");
+        config1.put(RemoteRegistryConfigTestUtils.PROPERTY_AUTH_TYPE, 
"Digest");
+        config1.put(RemoteRegistryConfigTestUtils.PROPERTY_PRINCIPAL, "knox");
+        config1.put(RemoteRegistryConfigTestUtils.PROPERTY_CRED_ALIAS, 
"zkCredential");
+        testRegistryConfigurations.put(config1.get("name"), config1);
+
+        Map<String, String> config2 = new HashMap<>();
+        config2.put(RemoteRegistryConfigTestUtils.PROPERTY_TYPE, "ZooKeeper");
+        config2.put(RemoteRegistryConfigTestUtils.PROPERTY_NAME, "MyKerberos");
+        config2.put(RemoteRegistryConfigTestUtils.PROPERTY_ADDRESS, CONN_STR);
+        config2.put(RemoteRegistryConfigTestUtils.PROPERTY_SECURE, "true");
+        config2.put(RemoteRegistryConfigTestUtils.PROPERTY_AUTH_TYPE, 
"Kerberos");
+        config2.put(RemoteRegistryConfigTestUtils.PROPERTY_PRINCIPAL, "knox");
+        File myKeyTab = File.createTempFile("mytest", "keytab");
+        config2.put(RemoteRegistryConfigTestUtils.PROPERTY_KEYTAB, 
myKeyTab.getAbsolutePath());
+        config2.put(RemoteRegistryConfigTestUtils.PROPERTY_USE_KEYTAB, 
"false");
+        config2.put(RemoteRegistryConfigTestUtils.PROPERTY_USE_TICKET_CACHE, 
"true");
+        testRegistryConfigurations.put(config2.get("name"), config2);
+
+        Map<String, String> config3 = new HashMap<>();
+        config3.put(RemoteRegistryConfigTestUtils.PROPERTY_TYPE, "ZooKeeper");
+        config3.put(RemoteRegistryConfigTestUtils.PROPERTY_NAME, 
"anotherRegistry");
+        config3.put(RemoteRegistryConfigTestUtils.PROPERTY_ADDRESS, 
"whatever:1281");
+        testRegistryConfigurations.put(config3.get("name"), config3);
+
+        String configXML =
+                    
RemoteRegistryConfigTestUtils.createRemoteConfigRegistriesXML(testRegistryConfigurations.values());
+
+        File registryConfigFile = File.createTempFile("remote-registries", 
"xml");
+        try {
+            FileUtils.writeStringToFile(registryConfigFile, configXML);
+
+            List<RemoteConfigurationRegistryConfig> configs =
+                                    
RemoteConfigurationRegistriesParser.getConfig(registryConfigFile.getAbsolutePath());
+            assertNotNull(configs);
+            assertEquals(testRegistryConfigurations.keySet().size(), 
configs.size());
+
+            for (RemoteConfigurationRegistryConfig registryConfig : configs) {
+                Map<String, String> expected = 
testRegistryConfigurations.get(registryConfig.getName());
+                assertNotNull(expected);
+                validateParsedRegistryConfiguration(registryConfig, expected);
+            }
+        } finally {
+            registryConfigFile.delete();
+        }
+    }
+
+    private void 
validateParsedRegistryConfiguration(RemoteConfigurationRegistryConfig config,
+                                                     Map<String, String> 
expected) throws Exception {
+        
assertEquals(expected.get(RemoteRegistryConfigTestUtils.PROPERTY_TYPE), 
config.getRegistryType());
+        
assertEquals(expected.get(RemoteRegistryConfigTestUtils.PROPERTY_ADDRESS), 
config.getConnectionString());
+        
assertEquals(expected.get(RemoteRegistryConfigTestUtils.PROPERTY_NAME), 
config.getName());
+        assertEquals(expected.get(
+            RemoteRegistryConfigTestUtils.PROPERTY_NAMESAPCE), 
config.getNamespace());
+        assertEquals(Boolean.valueOf(expected.get(
+            RemoteRegistryConfigTestUtils.PROPERTY_SECURE)), 
config.isSecureRegistry());
+        assertEquals(expected.get(
+            RemoteRegistryConfigTestUtils.PROPERTY_AUTH_TYPE), 
config.getAuthType());
+        assertEquals(expected.get(
+            RemoteRegistryConfigTestUtils.PROPERTY_PRINCIPAL), 
config.getPrincipal());
+        assertEquals(expected.get(
+            RemoteRegistryConfigTestUtils.PROPERTY_CRED_ALIAS), 
config.getCredentialAlias());
+        
assertEquals(expected.get(RemoteRegistryConfigTestUtils.PROPERTY_KEYTAB), 
config.getKeytab());
+        assertEquals(Boolean.valueOf(expected.get(
+            RemoteRegistryConfigTestUtils.PROPERTY_USE_KEYTAB)), 
config.isUseKeyTab());
+        assertEquals(Boolean.valueOf(expected.get(
+            RemoteRegistryConfigTestUtils.PROPERTY_USE_TICKET_CACHE)), 
config.isUseTicketCache());
+    }
+
+}

Reply via email to