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 26575d3  AMBARI-25013. New kerberos-env property to allow 
auth_to_local rules for non installed service components (#2721)
26575d3 is described below

commit 26575d3df20503f798f5be390442dd6a3201f182
Author: Sandor Molnar <[email protected]>
AuthorDate: Thu Dec 13 18:53:27 2018 +0100

    AMBARI-25013. New kerberos-env property to allow auth_to_local rules for 
non installed service components (#2721)
---
 .../ambari/server/controller/KerberosHelper.java   |   4 +
 .../server/controller/KerberosHelperImpl.java      |   3 +-
 .../server/controller/KerberosHelperTest.java      | 132 +++++++++++++++++++++
 3 files changed, 138 insertions(+), 1 deletion(-)

diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java
index 0f41ea2..d3c291d 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java
@@ -135,6 +135,10 @@ public interface KerberosHelper {
    */
   String MANAGE_AUTH_TO_LOCAL_RULES = "manage_auth_to_local";
   /**
+   * The kerberos-env property name declaring whether the Hadoop auth_to_local 
rules should be included for all components of an installed service even if the 
component itself is not installed
+   */
+  String INCLUDE_ALL_COMPONENTS_IN_AUTH_TO_LOCAL_RULES = 
"include_all_components_in_auth_to_local_rules";
+  /**
    * The kerberos-env property name declaring whether auth-to-local rules 
should be case-insensitive or not
    */
   String CASE_INSENSITIVE_USERNAME_RULES = "case_insensitive_username_rules";
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
index 120fd7c..9f6b17a 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
@@ -1183,6 +1183,7 @@ public class KerberosHelperImpl implements KerberosHelper 
{
       // or marked to be preconfigured, add the relevant data to the 
auth-to-local rules.
       Map<String, KerberosServiceDescriptor> serviceDescriptors = 
kerberosDescriptor.getServices();
       if (serviceDescriptors != null) {
+        final boolean includeAllComponents = 
Boolean.valueOf(kerberosEnvProperties.get(INCLUDE_ALL_COMPONENTS_IN_AUTH_TO_LOCAL_RULES));
         for (KerberosServiceDescriptor serviceDescriptor : 
serviceDescriptors.values()) {
           String serviceName = serviceDescriptor.getName();
           boolean preconfigure = includePreconfigureData && 
serviceDescriptor.shouldPreconfigure();
@@ -1217,7 +1218,7 @@ public class KerberosHelperImpl implements KerberosHelper 
{
 
                 // Add this component's identities if we are implicitly 
preconfiguring the parent
                 // service or if the component has been explicitly added to 
the cluster
-                if (preconfigure || 
(installedServiceComponents.contains(componentName))) {
+                if (preconfigure || includeAllComponents || 
installedServiceComponents.contains(componentName)) {
                   LOG.info("Adding identities for component {} to auth to 
local mapping", componentName);
                   addIdentities(authToLocalBuilder, 
componentDescriptor.getIdentities(true, filterContext), null, replacements);
 
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/KerberosHelperTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/KerberosHelperTest.java
index 76b2e59..f4e86ab 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/controller/KerberosHelperTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/controller/KerberosHelperTest.java
@@ -1992,6 +1992,138 @@ public class KerberosHelperTest extends EasyMockSupport 
{
   }
 
   @Test
+  public void testSettingAuthToLocalRulesForUninstalledServiceComponents() 
throws Exception {
+    final KerberosPrincipalDescriptor principalDescriptor1 = 
createMock(KerberosPrincipalDescriptor.class);
+    
expect(principalDescriptor1.getValue()).andReturn("principal1/[email protected]").times(2);
+    
expect(principalDescriptor1.getLocalUsername()).andReturn("principal1_user").times(2);
+
+    final KerberosPrincipalDescriptor principalDescriptor2 = 
createMock(KerberosPrincipalDescriptor.class);
+    
expect(principalDescriptor2.getValue()).andReturn("principal2/[email protected]").times(1);
+    
expect(principalDescriptor2.getLocalUsername()).andReturn("principal2_user").times(1);
+
+    final KerberosIdentityDescriptor identityDescriptor1 = 
createMock(KerberosIdentityDescriptor.class);
+    
expect(identityDescriptor1.getPrincipalDescriptor()).andReturn(principalDescriptor1).times(2);
+    
expect(identityDescriptor1.shouldInclude(EasyMock.anyObject())).andReturn(true).anyTimes();
+
+    final KerberosIdentityDescriptor identityDescriptor2 = 
createMock(KerberosIdentityDescriptor.class);
+    
expect(identityDescriptor2.getPrincipalDescriptor()).andReturn(principalDescriptor2).times(1);
+    
expect(identityDescriptor2.shouldInclude(EasyMock.anyObject())).andReturn(true).anyTimes();
+
+    final KerberosComponentDescriptor componentDescriptor1 = 
createMockComponentDescriptor("COMPONENT1", 
Collections.singletonList(identityDescriptor1), null); //only this is installed
+    final KerberosComponentDescriptor componentDescriptor2 = 
createMockComponentDescriptor("COMPONENT2", 
Collections.singletonList(identityDescriptor2), null);
+
+    final KerberosServiceDescriptor serviceDescriptor1 = 
createMock(KerberosServiceDescriptor.class);
+    expect(serviceDescriptor1.getName()).andReturn("SERVICE1").anyTimes();
+    expect(serviceDescriptor1.getIdentities(eq(true), 
EasyMock.anyObject())).andReturn(Arrays.asList(identityDescriptor1)).times(1);
+    final Map<String, KerberosComponentDescriptor> kerberosComponents = new 
HashMap<>();
+    kerberosComponents.put("COMPONENT1", componentDescriptor1);
+    kerberosComponents.put("COMPONENT2", componentDescriptor2);
+    
expect(serviceDescriptor1.getComponents()).andReturn(kerberosComponents).times(1);
+    expect(serviceDescriptor1.getAuthToLocalProperties()).andReturn(new 
HashSet<>(Arrays.asList(
+        "default",
+        "explicit_multiple_lines|new_lines",
+        "explicit_multiple_lines_escaped|new_lines_escaped",
+        "explicit_single_line|spaces",
+        "service-site/default",
+        "service-site/explicit_multiple_lines|new_lines",
+        "service-site/explicit_multiple_lines_escaped|new_lines_escaped",
+        "service-site/explicit_single_line|spaces"
+    ))).times(1);
+
+    final Map<String, KerberosServiceDescriptor> serviceDescriptorMap = new 
HashMap<>();
+    serviceDescriptorMap.put("SERVICE1", serviceDescriptor1);
+
+    final Service service1 = createMockService("SERVICE1", new HashMap<>());
+
+    final Map<String, Service> serviceMap = new HashMap<>();
+    serviceMap.put("SERVICE1", service1);
+
+    final Map<String, String> serviceSiteProperties = new HashMap<>();
+    serviceSiteProperties.put("default", 
"RULE:[1:$1@$0]([email protected])s/.*/service_user/\nDEFAULT");
+    serviceSiteProperties.put("explicit_multiple_lines", 
"RULE:[1:$1@$0]([email protected])s/.*/service_user/\nDEFAULT");
+    serviceSiteProperties.put("explicit_multiple_lines_escaped", 
"RULE:[1:$1@$0]([email protected])s/.*/service_user/\\\nDEFAULT");
+    serviceSiteProperties.put("explicit_single_line", 
"RULE:[1:$1@$0]([email protected])s/.*/service_user/ DEFAULT");
+
+    final Map<String, Map<String, String>> existingConfigs = new HashMap<>();
+    existingConfigs.put("kerberos-env", new HashMap<String, String>());
+    
existingConfigs.get("kerberos-env").put(KerberosHelper.INCLUDE_ALL_COMPONENTS_IN_AUTH_TO_LOCAL_RULES,
 "true");
+    existingConfigs.put("service-site", serviceSiteProperties);
+
+    final KerberosDescriptor kerberosDescriptor = 
createMock(KerberosDescriptor.class);
+    
expect(kerberosDescriptor.getProperty("additional_realms")).andReturn(null).times(1);
+    expect(kerberosDescriptor.getIdentities(eq(true), 
EasyMock.anyObject())).andReturn(null).times(1);
+    
expect(kerberosDescriptor.getAuthToLocalProperties()).andReturn(null).times(1);
+    
expect(kerberosDescriptor.getServices()).andReturn(serviceDescriptorMap).times(1);
+
+    final Cluster cluster = createMockCluster("c1", 
Collections.<Host>emptyList(), SecurityType.KERBEROS, null, null);
+    final Map<String, Set<String>> installedServices = 
Collections.singletonMap("SERVICE1", Collections.singleton("COMPONENT1"));
+    final Map<String, Map<String, String>> kerberosConfigurations = new 
HashMap<>();
+
+    replayAll();
+
+    // Needed by infrastructure
+    injector.getInstance(AmbariMetaInfo.class).init();
+
+    injector.getInstance(KerberosHelper.class).setAuthToLocalRules(cluster, 
kerberosDescriptor, "EXAMPLE.COM", installedServices, existingConfigs, 
kerberosConfigurations, false);
+
+    verifyAll();
+
+    Map<String, String> configs = kerberosConfigurations.get("");
+    assertNotNull(configs);
+
+    //asserts that the rules contain COMPONENT2 related rules too (with 
principal2) even if COMPONENT2 is not installed (see installedServices 
declaration above)
+    assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
+            "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
+            "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
+            "DEFAULT",
+        configs.get("default"));
+    assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
+            "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
+            "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
+            "DEFAULT",
+        configs.get("explicit_multiple_lines"));
+    assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\\\n" +
+            "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\\\n" +
+            "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\\\n" +
+            "DEFAULT",
+        configs.get("explicit_multiple_lines_escaped"));
+    assertEquals("RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*// " +
+            "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/ " +
+            "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/ " +
+            "DEFAULT",
+        configs.get("explicit_single_line"));
+
+  configs = kerberosConfigurations.get("service-site");
+  assertNotNull(configs);
+
+  assertEquals("RULE:[1:$1@$0]([email protected])s/.*/service_user/\n" +
+          "RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
+          "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
+          "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
+          "DEFAULT",
+      configs.get("default"));
+  assertEquals("RULE:[1:$1@$0]([email protected])s/.*/service_user/\n" +
+          "RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\n" +
+          "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\n" +
+          "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\n" +
+          "DEFAULT",
+      configs.get("explicit_multiple_lines"));
+  
assertEquals("RULE:[1:$1@$0]([email protected])s/.*/service_user/\\\n" +
+          "RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*//\\\n" +
+          "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/\\\n" +
+          "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/\\\n" +
+          "DEFAULT",
+      configs.get("explicit_multiple_lines_escaped"));
+  assertEquals("RULE:[1:$1@$0]([email protected])s/.*/service_user/ " +
+          "RULE:[1:$1@$0](.*@EXAMPLE.COM)s/@.*// " +
+          "RULE:[2:$1@$0]([email protected])s/.*/principal1_user/ " +
+          "RULE:[2:$1@$0]([email protected])s/.*/principal2_user/ " +
+          "DEFAULT",
+      configs.get("explicit_single_line"));
+    }
+
+
+  @Test
   public void testMergeConfigurationsForPreconfiguring() throws Exception {
     Service existingService = createMockService("EXISTING_SERVICE", null);
 

Reply via email to