You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by lp...@apache.org on 2017/10/13 15:55:01 UTC
[33/33] ambari git commit: AMBARI-21307 Added unit tests. Improved
logging, refactoring: rename, organized classes into packages
AMBARI-21307 Added unit tests. Improved logging, refactoring: rename, organized classes into packages
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/d623a21f
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/d623a21f
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/d623a21f
Branch: refs/heads/feature-branch-AMBARI-21307
Commit: d623a21fe6689bdd57c76dae70462d3f92903e0d
Parents: 36a49d1
Author: lpuskas <lp...@apache.org>
Authored: Fri Oct 13 17:19:41 2017 +0200
Committer: lpuskas <lp...@apache.org>
Committed: Fri Oct 13 17:53:38 2017 +0200
----------------------------------------------------------------------
.../apache/ambari/server/ldap/LdapModule.java | 2 +-
.../AmbariLdapConfigurationProvider.java | 13 +-
.../server/ldap/service/AmbariLdapFacade.java | 2 +-
.../service/LdapConnectionConfigService.java | 4 +-
.../ads/DefaultLdapConfigurationService.java | 38 +++-
.../ads/DefaultLdapConnectionConfigService.java | 116 ++++++++++
.../DefaultLdapConnectionConfigService.java | 116 ----------
.../server/ldap/LdapModuleFunctionalTest.java | 4 +-
...estAmbariAmbariLdapConfigurationFactory.java | 29 ---
.../TestAmbariLdapConfigurationFactory.java | 29 +++
.../ldap/service/AmbariLdapFacadeTest.java | 4 +-
.../DefaultLdapConfigurationServiceTest.java | 221 +++++++++++++++++++
12 files changed, 414 insertions(+), 164 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/d623a21f/ambari-server/src/main/java/org/apache/ambari/server/ldap/LdapModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/ldap/LdapModule.java b/ambari-server/src/main/java/org/apache/ambari/server/ldap/LdapModule.java
index 4abf4e7..67e84dc 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/ldap/LdapModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/ldap/LdapModule.java
@@ -25,7 +25,7 @@ import org.apache.ambari.server.ldap.service.LdapConnectionConfigService;
import org.apache.ambari.server.ldap.service.LdapFacade;
import org.apache.ambari.server.ldap.service.ads.DefaultLdapAttributeDetectionService;
import org.apache.ambari.server.ldap.service.ads.DefaultLdapConfigurationService;
-import org.apache.ambari.server.ldap.service.ads.detectors.DefaultLdapConnectionConfigService;
+import org.apache.ambari.server.ldap.service.ads.DefaultLdapConnectionConfigService;
import com.google.inject.AbstractModule;
import com.google.inject.assistedinject.FactoryModuleBuilder;
http://git-wip-us.apache.org/repos/asf/ambari/blob/d623a21f/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/AmbariLdapConfigurationProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/AmbariLdapConfigurationProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/AmbariLdapConfigurationProvider.java
index 9fad896..c88d420 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/AmbariLdapConfigurationProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/AmbariLdapConfigurationProvider.java
@@ -36,7 +36,8 @@ import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
/**
- * Provider implementation for LDAP configurations. It needs to be registered in the related GUICE module as a provider
+ * Provider implementation for LDAP configurations.
+ * It needs to be registered in the related GUICE module as a provider.
* It's responsible for managing LDAP configurations in the application.
* Whenever requested, this provider returns an AmbariLdapConfiguration which is always in sync with the persisted LDAP
* configuration resource.
@@ -85,15 +86,15 @@ public class AmbariLdapConfigurationProvider implements Provider<AmbariLdapConfi
AmbariConfigurationEntity configEntity = null;
LOGGER.info("Loading LDAP configuration ...");
- if (null != configurationId) {
+ if (null == configurationId) {
- LOGGER.debug("Reloading configuration based on the provied id: {}", configurationId);
- configEntity = ambariConfigurationDAOProvider.get().findByPK(configurationId);
+ LOGGER.debug("Initial loading of the ldap configuration ...");
+ configEntity = ambariConfigurationDAOProvider.get().getLdapConfiguration();
} else {
- LOGGER.debug("Initial loading of the ldap configuration ...");
- configEntity = ambariConfigurationDAOProvider.get().getLdapConfiguration();
+ LOGGER.debug("Reloading configuration based on the provied id: {}", configurationId);
+ configEntity = ambariConfigurationDAOProvider.get().findByPK(configurationId);
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/d623a21f/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/AmbariLdapFacade.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/AmbariLdapFacade.java b/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/AmbariLdapFacade.java
index bbfbc8e..0118840 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/AmbariLdapFacade.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/AmbariLdapFacade.java
@@ -33,7 +33,7 @@ public class AmbariLdapFacade implements LdapFacade {
/**
* Additional parameters expected to be provided along with the configuration
*/
- protected enum Parameters {
+ public enum Parameters {
TEST_USER_NAME("ambari.ldap.test.user.name"),
TEST_USER_PASSWORD("ambari.ldap.test.user.password");
http://git-wip-us.apache.org/repos/asf/ambari/blob/d623a21f/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/LdapConnectionConfigService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/LdapConnectionConfigService.java b/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/LdapConnectionConfigService.java
index e2055bb..a882075 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/LdapConnectionConfigService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/LdapConnectionConfigService.java
@@ -18,7 +18,9 @@ import org.apache.ambari.server.ldap.domain.AmbariLdapConfiguration;
import org.apache.directory.ldap.client.api.LdapConnectionConfig;
/**
- * Contract for creating connection configuration instances
+ * Contract for creating connection configuration instances.
+ * Implementers are in charge for implementing any required custom logic based on the ambari configuration properties.
+ * (Eg.: using custom key stores etc...)
*/
public interface LdapConnectionConfigService {
http://git-wip-us.apache.org/repos/asf/ambari/blob/d623a21f/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/ads/DefaultLdapConfigurationService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/ads/DefaultLdapConfigurationService.java b/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/ads/DefaultLdapConfigurationService.java
index 60c1272..d80a636 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/ads/DefaultLdapConfigurationService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/ads/DefaultLdapConfigurationService.java
@@ -58,7 +58,7 @@ public class DefaultLdapConfigurationService implements LdapConfigurationService
@Override
public void checkConnection(AmbariLdapConfiguration ambariLdapConfiguration) throws AmbariLdapException {
-
+ LOGGER.info("Trying to connect to the LDAP server using provided configuration...");
LdapConnectionTemplate ldapConnectionTemplate = ldapConnectionTemplateFactory.create(ambariLdapConfiguration);
// check if the connection from the connection pool of the template is connected
@@ -74,6 +74,8 @@ public class DefaultLdapConfigurationService implements LdapConfigurationService
throw new AmbariLdapException("Could not connect to the LDAP server. Configuration: " + ambariLdapConfiguration);
}
+ LOGGER.info("Successfully conencted to the LDAP.");
+
}
/**
@@ -92,7 +94,7 @@ public class DefaultLdapConfigurationService implements LdapConfigurationService
public String checkUserAttributes(String testUserName, String testPassword, AmbariLdapConfiguration ambariLdapConfiguration) throws AmbariLdapException {
String userDn;
try {
- LOGGER.info("Checking user attributes for user {} r ...", testUserName);
+ LOGGER.info("Checking user attributes for user [{}] ...", testUserName);
// set up a filter based on the provided attributes
String filter = FilterBuilder.and(
@@ -100,10 +102,15 @@ public class DefaultLdapConfigurationService implements LdapConfigurationService
FilterBuilder.equal(ambariLdapConfiguration.userNameAttribute(), testUserName))
.toString();
- LOGGER.info("Searching for the user: {} using the search filter: {}", testUserName, filter);
+ LOGGER.info("Searching for the user: [{}] using the search filter: [{}]", testUserName, filter);
userDn = ldapConnectionTemplateFactory.create(ambariLdapConfiguration).searchFirst(new Dn(ambariLdapConfiguration.userSearchBase()), filter, SearchScope.SUBTREE, getUserDnNameEntryMapper(ambariLdapConfiguration));
- LOGGER.info("Attribute validation succeeded. Filter: {}", filter);
+ if (null == userDn) {
+ LOGGER.info("Could not find user based on the provided configuration. User attributes are not complete ");
+ throw new AmbariLdapException("User attribute configuration incomplete");
+ }
+ LOGGER.info("Attribute validation succeeded. Filter: [{}]", filter);
+
} catch (Exception e) {
@@ -126,7 +133,7 @@ public class DefaultLdapConfigurationService implements LdapConfigurationService
public Set<String> checkGroupAttributes(String userDn, AmbariLdapConfiguration ambariLdapConfiguration) throws AmbariLdapException {
List<String> groups = Lists.newArrayList();
try {
- LOGGER.info("Checking group attributes for user dn {} ...", userDn);
+ LOGGER.info("Checking group attributes for user dn: [{}] ...", userDn);
// set up a filter based on the provided attributes
String filter = FilterBuilder.and(
@@ -134,7 +141,7 @@ public class DefaultLdapConfigurationService implements LdapConfigurationService
FilterBuilder.equal(ambariLdapConfiguration.groupMemberAttribute(), userDn)
).toString();
- LOGGER.info("Searching for the groups the user dn: {} is member of using the search filter: {}", userDn, filter);
+ LOGGER.info("Searching for the groups the user dn: [{}] is member of using the search filter: [{}]", userDn, filter);
LdapConnectionTemplate ldapConnectionTemplate = ldapConnectionTemplateFactory.create(ambariLdapConfiguration);
// assemble a search request
@@ -145,6 +152,13 @@ public class DefaultLdapConfigurationService implements LdapConfigurationService
// perform the search
groups = ldapConnectionTemplate.search(searchRequest, getGroupNameEntryMapper(ambariLdapConfiguration));
+ if (groups == null || groups.isEmpty()) {
+ LOGGER.info("No groups found for the user dn. Group attributes configuration is incomplete");
+ throw new AmbariLdapException("Group attribute ldap configuration is incomplete");
+ }
+
+ LOGGER.info("Group attribute configuration check succeeded.");
+
} catch (Exception e) {
LOGGER.error("User attributes validation failed.", e);
@@ -156,6 +170,12 @@ public class DefaultLdapConfigurationService implements LdapConfigurationService
}
+ /**
+ * Entry mapper for handling user search results.
+ *
+ * @param ambariLdapConfiguration ambari ldap configuration values
+ * @return user dn entry mapper instance
+ */
private EntryMapper<String> getGroupNameEntryMapper(AmbariLdapConfiguration ambariLdapConfiguration) {
EntryMapper<String> entryMapper = new EntryMapper<String>() {
@@ -168,6 +188,12 @@ public class DefaultLdapConfigurationService implements LdapConfigurationService
return entryMapper;
}
+ /**
+ * Entry mapper for handling group searches.
+ *
+ * @param ambariLdapConfiguration ambari ldap configuration values
+ * @return
+ */
private EntryMapper<String> getUserDnNameEntryMapper(AmbariLdapConfiguration ambariLdapConfiguration) {
EntryMapper<String> entryMapper = new EntryMapper<String>() {
http://git-wip-us.apache.org/repos/asf/ambari/blob/d623a21f/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/ads/DefaultLdapConnectionConfigService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/ads/DefaultLdapConnectionConfigService.java b/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/ads/DefaultLdapConnectionConfigService.java
new file mode 100644
index 0000000..9bc2daf
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/ads/DefaultLdapConnectionConfigService.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.ambari.server.ldap.service.ads;
+
+import static javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm;
+
+import java.io.FileInputStream;
+import java.security.KeyStore;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+
+import org.apache.ambari.server.ldap.domain.AmbariLdapConfiguration;
+import org.apache.ambari.server.ldap.service.AmbariLdapException;
+import org.apache.ambari.server.ldap.service.LdapConnectionConfigService;
+import org.apache.directory.api.util.Strings;
+import org.apache.directory.ldap.client.api.LdapConnectionConfig;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Singleton
+public class DefaultLdapConnectionConfigService implements LdapConnectionConfigService {
+
+ private static Logger LOG = LoggerFactory.getLogger(DefaultLdapConnectionConfigService.class);
+
+ @Inject
+ public DefaultLdapConnectionConfigService() {
+ }
+
+ @Override
+ public LdapConnectionConfig createLdapConnectionConfig(AmbariLdapConfiguration ambariLdapConfiguration) throws AmbariLdapException {
+
+ LOG.debug("Assembling ldap connection config based on: {}", ambariLdapConfiguration);
+
+ LdapConnectionConfig config = new LdapConnectionConfig();
+ config.setLdapHost(ambariLdapConfiguration.serverHost());
+ config.setLdapPort(ambariLdapConfiguration.serverPort());
+ config.setName(ambariLdapConfiguration.bindDn());
+ config.setCredentials(ambariLdapConfiguration.bindPassword());
+ config.setUseSsl(ambariLdapConfiguration.useSSL());
+
+ // todo implement proper validation logic here: identify optional/mandatory settings
+ // todo suggest proper naming
+ if ("custom".equals(ambariLdapConfiguration.trustStore())) {
+ LOG.info("Using custom trust manager configuration");
+ config.setTrustManagers(trustManagers(ambariLdapConfiguration));
+ }
+
+
+ return config;
+ }
+
+
+ /**
+ * Configure the trustmanagers to use the custom keystore.
+ *
+ * @param ambariLdapConfiguration congiguration instance holding current values
+ * @return the array of trust managers
+ * @throws AmbariLdapException if an error occurs while setting up the connection
+ */
+ private TrustManager[] trustManagers(AmbariLdapConfiguration ambariLdapConfiguration) throws AmbariLdapException {
+ try {
+
+ TrustManagerFactory tmFactory = TrustManagerFactory.getInstance(getDefaultAlgorithm());
+ tmFactory.init(keyStore(ambariLdapConfiguration));
+ return tmFactory.getTrustManagers();
+
+ } catch (Exception e) {
+
+ LOG.error("Failed to initialize trust managers", e);
+ throw new AmbariLdapException(e);
+
+ }
+
+ }
+
+ private KeyStore keyStore(AmbariLdapConfiguration ambariLdapConfiguration) throws AmbariLdapException {
+
+ // validating configuration settings
+ if (Strings.isEmpty(ambariLdapConfiguration.trustStoreType())) {
+ throw new AmbariLdapException("Key Store Type must be specified");
+ }
+
+ if (Strings.isEmpty(ambariLdapConfiguration.trustStorePath())) {
+ throw new AmbariLdapException("Key Store Path must be specified");
+ }
+
+ try {
+
+ KeyStore ks = KeyStore.getInstance(ambariLdapConfiguration.trustStoreType());
+ FileInputStream fis = new FileInputStream(ambariLdapConfiguration.trustStorePath());
+ ks.load(fis, ambariLdapConfiguration.trustStorePassword().toCharArray());
+ return ks;
+
+ } catch (Exception e) {
+
+ LOG.error("Failed to create keystore", e);
+ throw new AmbariLdapException(e);
+
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/d623a21f/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/ads/detectors/DefaultLdapConnectionConfigService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/ads/detectors/DefaultLdapConnectionConfigService.java b/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/ads/detectors/DefaultLdapConnectionConfigService.java
deleted file mode 100644
index b12cc85..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/ldap/service/ads/detectors/DefaultLdapConnectionConfigService.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Licensed 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.
- */
-
-package org.apache.ambari.server.ldap.service.ads.detectors;
-
-import static javax.net.ssl.TrustManagerFactory.getDefaultAlgorithm;
-
-import java.io.FileInputStream;
-import java.security.KeyStore;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.TrustManagerFactory;
-
-import org.apache.ambari.server.ldap.domain.AmbariLdapConfiguration;
-import org.apache.ambari.server.ldap.service.AmbariLdapException;
-import org.apache.ambari.server.ldap.service.LdapConnectionConfigService;
-import org.apache.directory.api.util.Strings;
-import org.apache.directory.ldap.client.api.LdapConnectionConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class DefaultLdapConnectionConfigService implements LdapConnectionConfigService {
-
- private static Logger LOG = LoggerFactory.getLogger(DefaultLdapConnectionConfigService.class);
-
- @Inject
- public DefaultLdapConnectionConfigService() {
- }
-
- @Override
- public LdapConnectionConfig createLdapConnectionConfig(AmbariLdapConfiguration ambariLdapConfiguration) throws AmbariLdapException {
-
- LOG.debug("Assembling ldap connection config based on: {}", ambariLdapConfiguration);
-
- LdapConnectionConfig config = new LdapConnectionConfig();
- config.setLdapHost(ambariLdapConfiguration.serverHost());
- config.setLdapPort(ambariLdapConfiguration.serverPort());
- config.setName(ambariLdapConfiguration.bindDn());
- config.setCredentials(ambariLdapConfiguration.bindPassword());
- config.setUseSsl(ambariLdapConfiguration.useSSL());
-
- // todo implement proper validation logic here: identify optional/mandatory settings
- // todo suggest proper naming
- if ("custom".equals(ambariLdapConfiguration.trustStore())) {
- LOG.info("Using custom trust manager configuration");
- config.setTrustManagers(trustManagers(ambariLdapConfiguration));
- }
-
-
- return config;
- }
-
-
- /**
- * Configure the trustmanagers to use the custom keystore.
- *
- * @param ambariLdapConfiguration congiguration instance holding current values
- * @return the array of trust managers
- * @throws AmbariLdapException if an error occurs while setting up the connection
- */
- private TrustManager[] trustManagers(AmbariLdapConfiguration ambariLdapConfiguration) throws AmbariLdapException {
- try {
-
- TrustManagerFactory tmFactory = TrustManagerFactory.getInstance(getDefaultAlgorithm());
- tmFactory.init(keyStore(ambariLdapConfiguration));
- return tmFactory.getTrustManagers();
-
- } catch (Exception e) {
-
- LOG.error("Failed to initialize trust managers", e);
- throw new AmbariLdapException(e);
-
- }
-
- }
-
- private KeyStore keyStore(AmbariLdapConfiguration ambariLdapConfiguration) throws AmbariLdapException {
-
- // validating configuration settings
- if (Strings.isEmpty(ambariLdapConfiguration.trustStoreType())) {
- throw new AmbariLdapException("Key Store Type must be specified");
- }
-
- if (Strings.isEmpty(ambariLdapConfiguration.trustStorePath())) {
- throw new AmbariLdapException("Key Store Path must be specified");
- }
-
- try {
-
- KeyStore ks = KeyStore.getInstance(ambariLdapConfiguration.trustStoreType());
- FileInputStream fis = new FileInputStream(ambariLdapConfiguration.trustStorePath());
- ks.load(fis, ambariLdapConfiguration.trustStorePassword().toCharArray());
- return ks;
-
- } catch (Exception e) {
-
- LOG.error("Failed to create keystore", e);
- throw new AmbariLdapException(e);
-
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/d623a21f/ambari-server/src/test/java/org/apache/ambari/server/ldap/LdapModuleFunctionalTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/ldap/LdapModuleFunctionalTest.java b/ambari-server/src/test/java/org/apache/ambari/server/ldap/LdapModuleFunctionalTest.java
index f3f0644..91f4e10 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/ldap/LdapModuleFunctionalTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/ldap/LdapModuleFunctionalTest.java
@@ -18,7 +18,7 @@ import java.util.Map;
import org.apache.ambari.server.ldap.domain.AmbariLdapConfigKeys;
import org.apache.ambari.server.ldap.domain.AmbariLdapConfiguration;
-import org.apache.ambari.server.ldap.domain.TestAmbariAmbariLdapConfigurationFactory;
+import org.apache.ambari.server.ldap.domain.TestAmbariLdapConfigurationFactory;
import org.apache.ambari.server.ldap.service.LdapConfigurationService;
import org.apache.ambari.server.ldap.service.LdapFacade;
import org.apache.ambari.server.ldap.service.ads.LdapConnectionTemplateFactory;
@@ -47,7 +47,7 @@ public class LdapModuleFunctionalTest {
private static Injector injector;
private static Module testModule;
- private static TestAmbariAmbariLdapConfigurationFactory ldapConfigurationFactory = new TestAmbariAmbariLdapConfigurationFactory();
+ private static TestAmbariLdapConfigurationFactory ldapConfigurationFactory = new TestAmbariLdapConfigurationFactory();
@BeforeClass
public static void beforeClass() throws Exception {
http://git-wip-us.apache.org/repos/asf/ambari/blob/d623a21f/ambari-server/src/test/java/org/apache/ambari/server/ldap/domain/TestAmbariAmbariLdapConfigurationFactory.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/ldap/domain/TestAmbariAmbariLdapConfigurationFactory.java b/ambari-server/src/test/java/org/apache/ambari/server/ldap/domain/TestAmbariAmbariLdapConfigurationFactory.java
deleted file mode 100644
index 1155494..0000000
--- a/ambari-server/src/test/java/org/apache/ambari/server/ldap/domain/TestAmbariAmbariLdapConfigurationFactory.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed 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.
- */
-
-package org.apache.ambari.server.ldap.domain;
-
-
-import java.util.Map;
-
-/**
- * Implementation used for testing purposes only!
- */
-public class TestAmbariAmbariLdapConfigurationFactory implements AmbariLdapConfigurationFactory {
-
- @Override
- public AmbariLdapConfiguration createLdapConfiguration(Map<String, Object> configuration) {
- return new AmbariLdapConfiguration(configuration);
- }
-}
http://git-wip-us.apache.org/repos/asf/ambari/blob/d623a21f/ambari-server/src/test/java/org/apache/ambari/server/ldap/domain/TestAmbariLdapConfigurationFactory.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/ldap/domain/TestAmbariLdapConfigurationFactory.java b/ambari-server/src/test/java/org/apache/ambari/server/ldap/domain/TestAmbariLdapConfigurationFactory.java
new file mode 100644
index 0000000..aa26498
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/ldap/domain/TestAmbariLdapConfigurationFactory.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.ambari.server.ldap.domain;
+
+
+import java.util.Map;
+
+/**
+ * Implementation used for testing purposes only!
+ */
+public class TestAmbariLdapConfigurationFactory implements AmbariLdapConfigurationFactory {
+
+ @Override
+ public AmbariLdapConfiguration createLdapConfiguration(Map<String, Object> configuration) {
+ return new AmbariLdapConfiguration(configuration);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ambari/blob/d623a21f/ambari-server/src/test/java/org/apache/ambari/server/ldap/service/AmbariLdapFacadeTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/ldap/service/AmbariLdapFacadeTest.java b/ambari-server/src/test/java/org/apache/ambari/server/ldap/service/AmbariLdapFacadeTest.java
index 8552f86..db0e5a9 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/ldap/service/AmbariLdapFacadeTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/ldap/service/AmbariLdapFacadeTest.java
@@ -20,7 +20,7 @@ import java.util.Set;
import org.apache.ambari.server.ldap.domain.AmbariLdapConfigKeys;
import org.apache.ambari.server.ldap.domain.AmbariLdapConfiguration;
import org.apache.ambari.server.ldap.domain.AmbariLdapConfigurationFactory;
-import org.apache.ambari.server.ldap.domain.TestAmbariAmbariLdapConfigurationFactory;
+import org.apache.ambari.server.ldap.domain.TestAmbariLdapConfigurationFactory;
import org.easymock.Capture;
import org.easymock.EasyMock;
import org.easymock.EasyMockRule;
@@ -63,7 +63,7 @@ public class AmbariLdapFacadeTest extends EasyMockSupport {
@Before
public void before() {
- ambariLdapConfigurationFactory = new TestAmbariAmbariLdapConfigurationFactory();
+ ambariLdapConfigurationFactory = new TestAmbariLdapConfigurationFactory();
ambariLdapConfiguration = ambariLdapConfigurationFactory.createLdapConfiguration(Maps.newHashMap());
ambariLdapConfigurationCapture = Capture.newInstance();
http://git-wip-us.apache.org/repos/asf/ambari/blob/d623a21f/ambari-server/src/test/java/org/apache/ambari/server/ldap/service/ads/DefaultLdapConfigurationServiceTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/ldap/service/ads/DefaultLdapConfigurationServiceTest.java b/ambari-server/src/test/java/org/apache/ambari/server/ldap/service/ads/DefaultLdapConfigurationServiceTest.java
new file mode 100644
index 0000000..4d6d2a6
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/ldap/service/ads/DefaultLdapConfigurationServiceTest.java
@@ -0,0 +1,221 @@
+/*
+ * Licensed 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.
+ */
+
+package org.apache.ambari.server.ldap.service.ads;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.ambari.server.ldap.domain.AmbariLdapConfigKeys;
+import org.apache.ambari.server.ldap.domain.AmbariLdapConfiguration;
+import org.apache.ambari.server.ldap.domain.TestAmbariLdapConfigurationFactory;
+import org.apache.ambari.server.ldap.service.AmbariLdapException;
+import org.apache.ambari.server.ldap.service.LdapConfigurationService;
+import org.apache.directory.api.ldap.model.message.SearchRequest;
+import org.apache.directory.api.ldap.model.message.SearchRequestImpl;
+import org.apache.directory.api.ldap.model.message.SearchScope;
+import org.apache.directory.api.ldap.model.name.Dn;
+import org.apache.directory.ldap.client.template.ConnectionCallback;
+import org.apache.directory.ldap.client.template.EntryMapper;
+import org.apache.directory.ldap.client.template.LdapConnectionTemplate;
+import org.easymock.EasyMock;
+import org.easymock.EasyMockRule;
+import org.easymock.EasyMockSupport;
+import org.easymock.Mock;
+import org.easymock.MockType;
+import org.easymock.TestSubject;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+public class DefaultLdapConfigurationServiceTest extends EasyMockSupport {
+ @Rule
+ public EasyMockRule mocks = new EasyMockRule(this);
+
+ @Mock(type = MockType.STRICT)
+ private LdapConnectionTemplateFactory ldapConnectionTemplateFactory;
+
+ @Mock(type = MockType.STRICT)
+ private LdapConnectionTemplate ldapConnectionTemplateMock;
+
+
+ @TestSubject
+ private LdapConfigurationService ldapConfigurationService = new DefaultLdapConfigurationService();
+
+ @Before
+ public void before() {
+ resetAll();
+ }
+
+ @Test
+ public void testShouldConnectionCheckSucceedWhenConnectionCallbackSucceeds() throws Exception {
+ // GIVEN
+ AmbariLdapConfiguration ambariLdapConfiguration = new TestAmbariLdapConfigurationFactory().createLdapConfiguration(Maps.newHashMap());
+
+ // the cllback returns TRUE
+ EasyMock.expect(ldapConnectionTemplateMock.execute(EasyMock.anyObject(ConnectionCallback.class))).andReturn(Boolean.TRUE);
+ EasyMock.expect(ldapConnectionTemplateFactory.create(ambariLdapConfiguration)).andReturn(ldapConnectionTemplateMock);
+
+ replayAll();
+ // WHEN
+ ldapConfigurationService.checkConnection(ambariLdapConfiguration);
+
+ // THEN
+ // no exceptions are thrown
+
+ }
+
+ @Test(expected = AmbariLdapException.class)
+ public void testShouldConnectionCheckFailWhenConnectionCallbackFails() throws Exception {
+
+ // GIVEN
+ AmbariLdapConfiguration ambariLdapConfiguration = new TestAmbariLdapConfigurationFactory().createLdapConfiguration(Maps.newHashMap());
+
+ // the callback returns FALSE
+ EasyMock.expect(ldapConnectionTemplateMock.execute(EasyMock.anyObject(ConnectionCallback.class))).andReturn(Boolean.FALSE);
+ EasyMock.expect(ldapConnectionTemplateFactory.create(ambariLdapConfiguration)).andReturn(ldapConnectionTemplateMock);
+
+ replayAll();
+ // WHEN
+ ldapConfigurationService.checkConnection(ambariLdapConfiguration);
+
+ // THEN
+ // exception is thrown
+
+ }
+
+ @Test
+ public void testShouldUserAttributeConfigurationCheckSucceedWhenUserDnIsFound() throws Exception {
+ // GIVEN
+ Map<String, Object> configMap = Maps.newHashMap();
+ configMap.put(AmbariLdapConfigKeys.USER_OBJECT_CLASS.key(), "person");
+ configMap.put(AmbariLdapConfigKeys.USER_NAME_ATTRIBUTE.key(), "uid");
+
+ AmbariLdapConfiguration ambariLdapConfiguration = new TestAmbariLdapConfigurationFactory().createLdapConfiguration(configMap);
+
+ // the callback returns FALSE
+ EasyMock.expect(ldapConnectionTemplateFactory.create(ambariLdapConfiguration)).andReturn(ldapConnectionTemplateMock);
+ // users found with dn
+ EasyMock.expect(ldapConnectionTemplateMock.searchFirst(EasyMock.anyObject(Dn.class), EasyMock.anyString(), EasyMock.anyObject(SearchScope.class),
+ EasyMock.anyObject(EntryMapper.class))).andReturn("dn");
+
+ replayAll();
+ // WHEN
+ String userDn = ldapConfigurationService.checkUserAttributes("testUser", "testPassword", ambariLdapConfiguration);
+
+ // THEN
+ Assert.assertEquals("The found userDn is not the expected one", userDn, "dn");
+
+ }
+
+ @Test(expected = AmbariLdapException.class)
+ public void testShouldUserAttributeConfigurationCheckFailWhenNoUsersFound() throws Exception {
+ // GIVEN
+ Map<String, Object> configMap = Maps.newHashMap();
+ configMap.put(AmbariLdapConfigKeys.USER_OBJECT_CLASS.key(), "posixAccount");
+ configMap.put(AmbariLdapConfigKeys.USER_NAME_ATTRIBUTE.key(), "dn");
+
+ AmbariLdapConfiguration ambariLdapConfiguration = new TestAmbariLdapConfigurationFactory().createLdapConfiguration(configMap);
+
+ // the callback returns FALSE
+ EasyMock.expect(ldapConnectionTemplateFactory.create(ambariLdapConfiguration)).andReturn(ldapConnectionTemplateMock);
+
+ // no users found, the returned dn is null
+ EasyMock.expect(ldapConnectionTemplateMock.searchFirst(EasyMock.anyObject(Dn.class), EasyMock.anyString(),
+ EasyMock.anyObject(SearchScope.class),
+ EasyMock.anyObject(EntryMapper.class))).andReturn(null);
+
+ replayAll();
+ // WHEN
+ String userDn = ldapConfigurationService.checkUserAttributes("testUser", "testPassword",
+ ambariLdapConfiguration);
+
+ // THEN
+ Assert.assertEquals("The found userDn is not the expected one", userDn, "dn");
+
+ }
+
+
+ @Test
+ public void testShouldGroupAttributeConfigurationCheckSucceedWhenGroupForUserDnIsFound() throws Exception {
+ // GIVEN
+
+ Map<String, Object> configMap = groupConfigObjectMap();
+
+ SearchRequest sr = new SearchRequestImpl();
+
+ AmbariLdapConfiguration ambariLdapConfiguration = new TestAmbariLdapConfigurationFactory().createLdapConfiguration(configMap);
+
+ // the callback returns FALSE
+ EasyMock.expect(ldapConnectionTemplateFactory.create(ambariLdapConfiguration)).andReturn(ldapConnectionTemplateMock);
+
+ EasyMock.expect(ldapConnectionTemplateMock.newSearchRequest(EasyMock.anyObject(Dn.class), EasyMock.anyString(),
+ EasyMock.anyObject(SearchScope.class))).andReturn(sr);
+
+ EasyMock.expect(ldapConnectionTemplateMock.search(EasyMock.anyObject(SearchRequest.class), EasyMock.anyObject(EntryMapper.class)))
+ .andReturn(Lists.newArrayList("userGroup"));
+
+ replayAll();
+ // WHEN
+ Set<String> userGroups = ldapConfigurationService.checkGroupAttributes("userDn", ambariLdapConfiguration);
+
+ // THEN
+ Assert.assertNotNull("No groups found", userGroups);
+
+ }
+
+
+ @Test(expected = AmbariLdapException.class)
+ public void testShouldGroupAttributeConfigurationCheckFailWhenNoGroupsForUserDnFound() throws Exception {
+ // GIVEN
+
+ Map<String, Object> configMap = groupConfigObjectMap();
+
+ SearchRequest sr = new SearchRequestImpl();
+
+ AmbariLdapConfiguration ambariLdapConfiguration = new TestAmbariLdapConfigurationFactory().createLdapConfiguration(configMap);
+
+ // the callback returns FALSE
+ EasyMock.expect(ldapConnectionTemplateFactory.create(ambariLdapConfiguration)).andReturn(ldapConnectionTemplateMock);
+
+ EasyMock.expect(ldapConnectionTemplateMock.newSearchRequest(EasyMock.anyObject(Dn.class), EasyMock.anyString(),
+ EasyMock.anyObject(SearchScope.class))).andReturn(sr);
+
+ EasyMock.expect(ldapConnectionTemplateMock.search(EasyMock.anyObject(SearchRequest.class), EasyMock.anyObject(EntryMapper.class)))
+ .andReturn(Lists.newArrayList());
+
+ replayAll();
+ // WHEN
+ Set<String> userGroups = ldapConfigurationService.checkGroupAttributes("userDn", ambariLdapConfiguration);
+
+ // THEN
+ Assert.assertNotNull("No groups found", userGroups);
+
+ }
+
+ private Map<String, Object> groupConfigObjectMap() {
+ Map<String, Object> configMap = Maps.newHashMap();
+ configMap.put(AmbariLdapConfigKeys.GROUP_OBJECT_CLASS.key(), "groupOfNames");
+ configMap.put(AmbariLdapConfigKeys.GROUP_SEARCH_BASE.key(), "dc=example,dc=com");
+ configMap.put(AmbariLdapConfigKeys.GROUP_NAME_ATTRIBUTE.key(), "uid");
+ configMap.put(AmbariLdapConfigKeys.GROUP_MEMBER_ATTRIBUTE.key(), "member");
+ return configMap;
+ }
+
+
+}
\ No newline at end of file