This is an automated email from the ASF dual-hosted git repository.

smolnar pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 153d5f9  AMBARI-24913. New LDAP related properties to indicate if 
Ambari should manage LDAP configuration for certain services (#2629)
153d5f9 is described below

commit 153d5f96cf1c1c68084d308bb98314b3d5231153
Author: Sandor Molnar <smol...@apache.org>
AuthorDate: Mon Nov 19 15:54:41 2018 +0100

    AMBARI-24913. New LDAP related properties to indicate if Ambari should 
manage LDAP configuration for certain services (#2629)
---
 .../AmbariServerConfigurationKey.java              |   3 +
 .../AmbariServerLDAPConfigurationHandler.java      |   2 +-
 .../ldap/domain/AmbariLdapConfiguration.java       |   8 ++
 .../ambari/server/upgrade/UpgradeCatalog270.java   |   8 ++
 .../main/resources/stacks/ambari_configuration.py  |  59 ++++++++++++
 .../server/upgrade/UpgradeCatalog270Test.java      |   3 +
 .../src/test/python/TestAmbariConfiguration.py     | 104 +++++++++++++++++++++
 7 files changed, 186 insertions(+), 1 deletion(-)

diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/configuration/AmbariServerConfigurationKey.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/configuration/AmbariServerConfigurationKey.java
index 8599a0d0..05caa75 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/configuration/AmbariServerConfigurationKey.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/configuration/AmbariServerConfigurationKey.java
@@ -25,6 +25,9 @@ public enum AmbariServerConfigurationKey {
   /* ********************************************************
    * LDAP Configuration Keys
    * ******************************************************** */
+  
AMBARI_MANAGES_LDAP_CONFIGURATION(AmbariServerConfigurationCategory.LDAP_CONFIGURATION,
 "ambari.ldap.manage_services", PLAINTEXT, "false", "A Boolean value indicating 
whether Ambari is to manage the LDAP configuration for services or not."),
+  LDAP_ENABLED_SERVICES(AmbariServerConfigurationCategory.LDAP_CONFIGURATION, 
"ambari.ldap.enabled_services", PLAINTEXT, null, "A comma-delimited list of 
services that are expected to be configured for LDAP.  A \"*\" indicates all 
services."),
+
   LDAP_ENABLED(AmbariServerConfigurationCategory.LDAP_CONFIGURATION, 
"ambari.ldap.authentication.enabled", PLAINTEXT, "false", "An internal property 
used for unit testing and development purposes."),
   SERVER_HOST(AmbariServerConfigurationCategory.LDAP_CONFIGURATION, 
"ambari.ldap.connectivity.server.host", PLAINTEXT, "localhost", "The LDAP URL 
host used for connecting to an LDAP server when authenticating users."),
   SERVER_PORT(AmbariServerConfigurationCategory.LDAP_CONFIGURATION, 
"ambari.ldap.connectivity.server.port", PLAINTEXT, "33389", "The LDAP URL port 
used for connecting to an LDAP server when authenticating users."),
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariServerLDAPConfigurationHandler.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariServerLDAPConfigurationHandler.java
index f08c1de..2cc79b2 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariServerLDAPConfigurationHandler.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariServerLDAPConfigurationHandler.java
@@ -66,7 +66,7 @@ public class AmbariServerLDAPConfigurationHandler extends 
AmbariServerStackAdvis
   public void updateComponentCategory(String categoryName, Map<String, String> 
properties, boolean removePropertiesIfNotSpecified) throws AmbariException {
     super.updateComponentCategory(categoryName, properties, 
removePropertiesIfNotSpecified);
     final AmbariLdapConfiguration ldapConfiguration = new 
AmbariLdapConfiguration(getConfigurationProperties(AmbariServerConfigurationCategory.LDAP_CONFIGURATION.getCategoryName()));
-    if (ldapConfiguration.ldapEnabled()) {
+    if (ldapConfiguration.isAmbariManagesLdapConfiguration()) {
       processClusters(LDAP_CONFIGURATIONS);
     }
   }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/ldap/domain/AmbariLdapConfiguration.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/ldap/domain/AmbariLdapConfiguration.java
index c55f337..0647138 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/ldap/domain/AmbariLdapConfiguration.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/ldap/domain/AmbariLdapConfiguration.java
@@ -71,6 +71,14 @@ public class AmbariLdapConfiguration {
     this.configurationMap = configuration;
   }
 
+  public boolean isAmbariManagesLdapConfiguration() {
+    return 
Boolean.valueOf(configValue(AmbariServerConfigurationKey.AMBARI_MANAGES_LDAP_CONFIGURATION));
+  }
+
+  public String getLdapEnabledServices() {
+    return configValue(AmbariServerConfigurationKey.LDAP_ENABLED_SERVICES);
+  }
+
   public boolean ldapEnabled() {
     return 
Boolean.valueOf(configValue(AmbariServerConfigurationKey.LDAP_ENABLED));
   }
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog270.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog270.java
index 43a3d5f..6ba4ce2 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog270.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog270.java
@@ -1683,6 +1683,14 @@ public class UpgradeCatalog270 extends 
AbstractUpgradeCatalog {
             populateConfigurationToBeMoved(propertiesToBeMoved, null, 
AmbariServerConfigurationKey.SSO_MANAGE_SERVICES, "true");
             populateConfigurationToBeMoved(propertiesToBeMoved, null, 
AmbariServerConfigurationKey.SSO_ENABLED_SERVICES, "AMBARI");
           }
+        } else if (AmbariServerConfigurationKey.LDAP_ENABLED == key) {
+          populateConfigurationToBeMoved(propertiesToBeMoved, oldPropertyName, 
key, propertyValue);
+
+          if ("true".equalsIgnoreCase(propertyValue)) {
+            // Add the new properties to tell Ambari that LDAP is enabled:
+            populateConfigurationToBeMoved(propertiesToBeMoved, null, 
AmbariServerConfigurationKey.AMBARI_MANAGES_LDAP_CONFIGURATION, "true");
+            populateConfigurationToBeMoved(propertiesToBeMoved, null, 
AmbariServerConfigurationKey.LDAP_ENABLED_SERVICES, "AMBARI");
+          }
         } else {
           populateConfigurationToBeMoved(propertiesToBeMoved, oldPropertyName, 
key, propertyValue);
         }
diff --git a/ambari-server/src/main/resources/stacks/ambari_configuration.py 
b/ambari-server/src/main/resources/stacks/ambari_configuration.py
index 9104c32..ece7387 100644
--- a/ambari-server/src/main/resources/stacks/ambari_configuration.py
+++ b/ambari-server/src/main/resources/stacks/ambari_configuration.py
@@ -487,3 +487,62 @@ class AmbariLDAPConfiguration:
     :return: How to handle username collision while updating from LDAP or None 
if ldap-configuration/ambari.ldap.advanced.collision_behavior is not specified
     '''
     return _get_from_dictionary(self.ldap_properties, 
'ambari.ldap.advanced.collision_behavior')
+
+  def is_managing_services(self):
+    """
+    Tests the configuration data to determine if Ambari should be configuring 
services to enable LDAP integration.
+
+    The relevant property is "ldap-configuration/ambari.ldap.manage_services", 
which is expected
+    to be a "true" or "false".
+
+    :return: True, if Ambari should manage services' LDAP configurations
+    """
+    return "true" == _get_from_dictionary(self.ldap_properties, 
"ambari.ldap.manage_services")
+
+  def get_services_to_enable(self):
+    """
+    Safely gets the list of services that Ambari should enabled for LDAP.
+
+    The returned value is a list of the relevant service names converted to 
lowercase.
+
+    :return: a list of service names converted to lowercase
+    """
+    ldap_enabled_services = _get_from_dictionary(self.ldap_properties, 
"ambari.ldap.enabled_services")
+
+    return [x.strip().lower() for x in 
ldap_enabled_services.strip().split(",")] \
+      if ldap_enabled_services \
+      else []
+
+  def should_enable_ldap(self, service_name):
+    """
+    Tests the configuration data to determine if the specified service should 
be configured by
+    Ambari to enable LDAP integration.
+
+    The relevant property is 
"ldap-configuration/ambari.ldap.enabled_services", which is expected
+    to be a comma-delimited list of services to be enabled or '*' indicating 
ALL installed services.
+
+    :param service_name: the name of the service to test
+    :return: True, if LDAP should be enabled; False, otherwise
+    """
+    if self.is_managing_services():
+      services_to_enable = self.get_services_to_enable()
+      return "*" in services_to_enable or service_name.lower() in 
services_to_enable
+    else:
+      return False
+
+  def should_disable_ldap(self, service_name):
+    """
+    Tests the configuration data to determine if the specified service should 
be configured by
+    Ambari to disable LDAP integration.
+
+    The relevant property is 
"ldap-configuration/ambari.ldap.enabled_services", which is expected
+    to be a comma-delimited list of services to be enabled or '*' indicating 
ALL installed services.
+
+    :param service_name: the name of the service to test
+    :return: True, if LDAP should be disabled; False, otherwise
+    """
+    if self.is_managing_services():
+      services_to_enable = self.get_services_to_enable()
+      return "*" not in services_to_enable and service_name.lower() not in 
services_to_enable
+    else:
+      return False
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog270Test.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog270Test.java
index 6fa317b..d83b99b 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog270Test.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog270Test.java
@@ -1267,6 +1267,9 @@ public class UpgradeCatalog270Test {
     expect(entityManager.find(anyObject(), 
anyObject())).andReturn(null).anyTimes();
     final Map<String, String> properties = new HashMap<>();
     properties.put(AmbariServerConfigurationKey.LDAP_ENABLED.key(), "true");
+    
properties.put(AmbariServerConfigurationKey.AMBARI_MANAGES_LDAP_CONFIGURATION.key(),
 "true");
+    properties.put(AmbariServerConfigurationKey.LDAP_ENABLED_SERVICES.key(), 
"AMBARI");
+
     
expect(ambariConfigurationDao.reconcileCategory(AmbariServerConfigurationCategory.LDAP_CONFIGURATION.getCategoryName(),
 properties, false)).andReturn(true).once();
     replay(entityManager, ambariConfigurationDao);
 
diff --git a/ambari-server/src/test/python/TestAmbariConfiguration.py 
b/ambari-server/src/test/python/TestAmbariConfiguration.py
index 58062e1..fd2bc7b 100644
--- a/ambari-server/src/test/python/TestAmbariConfiguration.py
+++ b/ambari-server/src/test/python/TestAmbariConfiguration.py
@@ -404,3 +404,107 @@ class TestAmbariConfiguration(TestCase):
     
self.assertTrue(ambari_ldap_details.is_ldap_alternate_user_search_enabled())
     self.assertEquals(ambari_ldap_details.get_alternate_user_search_filter(), 
"alternate_user_search_filter")
     
self.assertEquals(ambari_ldap_details.get_sync_collision_handling_behavior(), 
"collision_behavior")
+
+  def testAmbariNotMangingLdapConfiguration(self):
+    ## Case 1: missing the boolean flag indicating that Ambari manages LDAP 
configuration
+    services_json = {
+      "ambari-server-configuration": {
+        "ldap-configuration": {
+          "ambari.ldap.enabled_services": "AMBARI"
+        }
+      }
+    }
+
+    ambari_configuration = self.ambari_configuration_class(services_json)
+    self.assertIsNotNone(ambari_configuration.get_ambari_ldap_configuration())
+
+    ambari_ldap_details = ambari_configuration.get_ambari_ldap_details()
+    self.assertIsNotNone(ambari_ldap_details)
+    self.assertFalse(ambari_ldap_details.is_managing_services())
+    self.assertFalse(ambari_ldap_details.should_enable_ldap("AMBARI"))
+    self.assertFalse(ambari_ldap_details.should_disable_ldap("AMBARI"))
+
+    ## Case 2: setting the boolean flag to false indicating that Ambari shall 
NOT manage LDAP configuration
+    services_json = {
+      "ambari-server-configuration": {
+        "ldap-configuration": {
+          "ambari.ldap.manage_services": "false",
+          "ambari.ldap.enabled_services": "AMBARI, RANGER"
+        }
+      }
+    }
+
+    ambari_configuration = self.ambari_configuration_class(services_json)
+    self.assertIsNotNone(ambari_configuration.get_ambari_ldap_configuration())
+
+    ambari_ldap_details = ambari_configuration.get_ambari_ldap_details()
+    self.assertIsNotNone(ambari_ldap_details)
+    self.assertFalse(ambari_ldap_details.is_managing_services())
+    self.assertFalse(ambari_ldap_details.should_enable_ldap("AMBARI"))
+    self.assertFalse(ambari_ldap_details.should_disable_ldap("AMBARI"))
+    self.assertFalse(ambari_ldap_details.should_enable_ldap("RANGER"))
+    self.assertFalse(ambari_ldap_details.should_disable_ldap("RANGER"))
+
+    ## Case 3: setting the boolean flag to false indicating that Ambari shall 
NOT manage LDAP configuration and indicating it should be done for ALL services
+    services_json = {
+      "ambari-server-configuration": {
+        "ldap-configuration": {
+          "ambari.ldap.manage_services": "false",
+          "ambari.ldap.enabled_services": "*"
+        }
+      }
+    }
+
+    ambari_configuration = self.ambari_configuration_class(services_json)
+    self.assertIsNotNone(ambari_configuration.get_ambari_ldap_configuration())
+
+    ambari_ldap_details = ambari_configuration.get_ambari_ldap_details()
+    self.assertIsNotNone(ambari_ldap_details)
+    self.assertFalse(ambari_ldap_details.is_managing_services())
+    self.assertFalse(ambari_ldap_details.should_enable_ldap("AMBARI"))
+    self.assertFalse(ambari_ldap_details.should_disable_ldap("AMBARI"))
+    self.assertFalse(ambari_ldap_details.should_enable_ldap("RANGER"))
+    self.assertFalse(ambari_ldap_details.should_disable_ldap("RANGER"))
+
+  def testAmbariMangingLdapConfiguration(self):
+    ## Case 1: setting the boolean flag to false indicating that Ambari shall 
manage LDAP configuration for AMBARI and RANGER
+    services_json = {
+      "ambari-server-configuration": {
+        "ldap-configuration": {
+          "ambari.ldap.manage_services": "true",
+          "ambari.ldap.enabled_services": "AMBARI, RANGER"
+        }
+      }
+    }
+
+    ambari_configuration = self.ambari_configuration_class(services_json)
+    self.assertIsNotNone(ambari_configuration.get_ambari_ldap_configuration())
+
+    ambari_ldap_details = ambari_configuration.get_ambari_ldap_details()
+    self.assertIsNotNone(ambari_ldap_details)
+    self.assertTrue(ambari_ldap_details.is_managing_services())
+    self.assertTrue(ambari_ldap_details.should_enable_ldap("AMBARI"))
+    self.assertFalse(ambari_ldap_details.should_disable_ldap("AMBARI"))
+    self.assertTrue(ambari_ldap_details.should_enable_ldap("RANGER"))
+    self.assertFalse(ambari_ldap_details.should_disable_ldap("RANGER"))
+
+    ## Case 2: setting the boolean flag to false indicating that Ambari shall 
manage LDAP configuration for ALL services
+    services_json = {
+      "ambari-server-configuration": {
+        "ldap-configuration": {
+          "ambari.ldap.manage_services": "true",
+          "ambari.ldap.enabled_services": "*"
+        }
+      }
+    }
+
+    ambari_configuration = self.ambari_configuration_class(services_json)
+    self.assertIsNotNone(ambari_configuration.get_ambari_ldap_configuration())
+
+    ambari_ldap_details = ambari_configuration.get_ambari_ldap_details()
+    self.assertIsNotNone(ambari_ldap_details)
+    self.assertTrue(ambari_ldap_details.is_managing_services())
+    self.assertTrue(ambari_ldap_details.should_enable_ldap("AMBARI"))
+    self.assertFalse(ambari_ldap_details.should_disable_ldap("AMBARI"))
+    self.assertTrue(ambari_ldap_details.should_enable_ldap("HDFS"))
+    self.assertFalse(ambari_ldap_details.should_disable_ldap("HDFS"))

Reply via email to