Repository: ambari
Updated Branches:
  refs/heads/branch-rbac-sso 221d14029 -> 91721eca0


AMBARI-14516. Failed to deploy Kerberized cluster via blueprint with custom 
principal name (rlevas)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/91721eca
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/91721eca
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/91721eca

Branch: refs/heads/branch-rbac-sso
Commit: 91721eca0cead28eb10d9d4917e142417ae2362f
Parents: 221d140
Author: Robert Levas <[email protected]>
Authored: Mon Jan 4 19:24:48 2016 -0500
Committer: Robert Levas <[email protected]>
Committed: Mon Jan 4 19:24:48 2016 -0500

----------------------------------------------------------------------
 .../server/controller/KerberosHelperImpl.java   | 12 +++-
 .../HostKerberosIdentityResourceProvider.java   |  9 ++-
 .../kerberos/KerberosPrincipalDescriptor.java   | 13 ++--
 .../state/kerberos/KerberosPrincipalType.java   | 22 +++++-
 .../KerberosPrincipalDescriptorTest.java        | 73 ++++++++++++++++++++
 5 files changed, 117 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/91721eca/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelperImpl.java
----------------------------------------------------------------------
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 92e8f46..9710b7b 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
@@ -110,6 +110,7 @@ import 
org.apache.ambari.server.state.kerberos.KerberosDescriptorFactory;
 import org.apache.ambari.server.state.kerberos.KerberosIdentityDescriptor;
 import org.apache.ambari.server.state.kerberos.KerberosKeytabDescriptor;
 import org.apache.ambari.server.state.kerberos.KerberosPrincipalDescriptor;
+import org.apache.ambari.server.state.kerberos.KerberosPrincipalType;
 import org.apache.ambari.server.state.kerberos.KerberosServiceDescriptor;
 import org.apache.ambari.server.state.kerberos.VariableReplacementHelper;
 import 
org.apache.ambari.server.state.svccomphost.ServiceComponentHostServerActionEvent;
@@ -724,7 +725,7 @@ public class KerberosHelperImpl implements KerberosHelper {
 
           if (principalDescriptor != null) {
             principal = 
variableReplacementHelper.replaceVariables(principalDescriptor.getValue(), 
configurations);
-            principalType = principalDescriptor.getType().name().toLowerCase();
+            principalType = 
KerberosPrincipalType.translate(principalDescriptor.getType());
             principalConfiguration = 
variableReplacementHelper.replaceVariables(principalDescriptor.getConfiguration(),
 configurations);
           }
 
@@ -857,9 +858,16 @@ public class KerberosHelperImpl implements KerberosHelper {
                 String uniqueKey = String.format("%s|%s", principal, 
(keytabFile == null) ? "" : keytabFile);
 
                 if (!hostActiveIdentities.containsKey(uniqueKey)) {
+                  KerberosPrincipalType principalType = 
principalDescriptor.getType();
+
+                  // Assume the principal is a service principal if not 
specified
+                  if(principalType == null) {
+                    principalType = KerberosPrincipalType.SERVICE;
+                  }
+
                   KerberosPrincipalDescriptor resolvedPrincipalDescriptor =
                       new KerberosPrincipalDescriptor(principal,
-                          principalDescriptor.getType(),
+                          principalType,
                           
variableReplacementHelper.replaceVariables(principalDescriptor.getConfiguration(),
 configurations),
                           
variableReplacementHelper.replaceVariables(principalDescriptor.getLocalUsername(),
 configurations));
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/91721eca/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostKerberosIdentityResourceProvider.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostKerberosIdentityResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostKerberosIdentityResourceProvider.java
index c76ae6c..5ed5f35 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostKerberosIdentityResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostKerberosIdentityResourceProvider.java
@@ -37,6 +37,7 @@ import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.state.kerberos.KerberosIdentityDescriptor;
 import org.apache.ambari.server.state.kerberos.KerberosKeytabDescriptor;
 import org.apache.ambari.server.state.kerberos.KerberosPrincipalDescriptor;
+import org.apache.ambari.server.state.kerberos.KerberosPrincipalType;
 
 import java.text.DecimalFormat;
 import java.util.Collection;
@@ -178,12 +179,18 @@ public class HostKerberosIdentityResourceProvider extends 
ReadOnlyResourceProvid
 
                   if ((principal != null) && !principal.isEmpty()) {
                     Resource resource = new 
ResourceImpl(Resource.Type.HostKerberosIdentity);
+                    KerberosPrincipalType principalType = 
principalDescriptor.getType();
+
+                    // Assume the principal is a service principal if not 
specified
+                    if(principalType == null) {
+                      principalType = KerberosPrincipalType.SERVICE;
+                    }
 
                     setResourceProperty(resource, 
KERBEROS_IDENTITY_CLUSTER_NAME_PROPERTY_ID, clusterName, requestPropertyIds);
                     setResourceProperty(resource, 
KERBEROS_IDENTITY_HOST_NAME_PROPERTY_ID, currentHostName, requestPropertyIds);
 
                     setResourceProperty(resource, 
KERBEROS_IDENTITY_PRINCIPAL_NAME_PROPERTY_ID, principal, requestPropertyIds);
-                    setResourceProperty(resource, 
KERBEROS_IDENTITY_PRINCIPAL_TYPE_PROPERTY_ID, principalDescriptor.getType(), 
requestPropertyIds);
+                    setResourceProperty(resource, 
KERBEROS_IDENTITY_PRINCIPAL_TYPE_PROPERTY_ID, principalType, 
requestPropertyIds);
                     setResourceProperty(resource, 
KERBEROS_IDENTITY_PRINCIPAL_LOCAL_USERNAME_PROPERTY_ID, 
principalDescriptor.getLocalUsername(), requestPropertyIds);
 
                     String installedStatus;

http://git-wip-us.apache.org/repos/asf/ambari/blob/91721eca/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalDescriptor.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalDescriptor.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalDescriptor.java
index 09f6872..0156e4a 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalDescriptor.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalDescriptor.java
@@ -73,7 +73,7 @@ public class KerberosPrincipalDescriptor extends 
AbstractKerberosDescriptor {
    * <p/>
    * Expecting either "service" or "user"
    */
-  private KerberosPrincipalType type = KerberosPrincipalType.SERVICE;
+  private KerberosPrincipalType type = null;
 
   /**
    * A string declaring configuration type and property name indicating the 
property to be updated
@@ -109,7 +109,7 @@ public class KerberosPrincipalDescriptor extends 
AbstractKerberosDescriptor {
     // The name for this KerberosPrincipalDescriptor is stored in the "value" 
entry in the map
     // This is not automatically set by the super classes.
     setName(principal);
-    setType((type == null) ? KerberosPrincipalType.SERVICE : type);
+    setType(type);
     setConfiguration(configuration);
     setLocalUsername(localUsername);
   }
@@ -270,7 +270,7 @@ public class KerberosPrincipalDescriptor extends 
AbstractKerberosDescriptor {
     Map<String, Object> map = new HashMap<String, Object>();
 
     map.put("value", getValue());
-    map.put("type", getType().name().toLowerCase());
+    map.put("type", KerberosPrincipalType.translate(getType()));
     map.put("configuration", getConfiguration());
     map.put("local_username", getLocalUsername());
 
@@ -314,19 +314,16 @@ public class KerberosPrincipalDescriptor extends 
AbstractKerberosDescriptor {
 
   /**
    * Translates a string value representing a principal type to a 
KerberosPrincipalType.
-   * <p/>
-   * If no value is supplied for the key or a translation cannot be made then 
KerberosPrincipalType.SERVICE
-   * is assumed.
    *
    * @param map a Map containing the relevant data
    * @param key a String declaring the item to retrieve
-   * @return a KerberosPrincipalType
+   * @return a KerberosPrincipalType, or null is not specified in the map
    * @throws IllegalArgumentException if the principal type value is not one 
of the expected types.
    */
   private static KerberosPrincipalType getKerberosPrincipalTypeValue(Map<?, ?> 
map, String key) {
     String type = getStringValue(map, key);
     if ((type == null) || type.isEmpty()) {
-      return KerberosPrincipalType.SERVICE;
+      return null;
     } else {
       return KerberosPrincipalType.valueOf(type.toUpperCase());
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/91721eca/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalType.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalType.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalType.java
index e192be0..677be82 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalType.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalType.java
@@ -35,5 +35,25 @@ public enum KerberosPrincipalType {
    * <p/>
    * Typically in the form <code>service/host@REALM</code>.
    */
-  SERVICE
+  SERVICE;
+
+  public static KerberosPrincipalType translate(String string) {
+    if(string == null)
+      return null;
+    else {
+      string = string.trim();
+
+      if(string.isEmpty())
+        return null;
+      else {
+        return valueOf(string.toUpperCase());
+      }
+    }
+  }
+
+  public static String translate(KerberosPrincipalType type) {
+    return (type == null)
+        ? null
+        : type.name().toLowerCase();
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/91721eca/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalDescriptorTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalDescriptorTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalDescriptorTest.java
index 9a4a042..5c249e2 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalDescriptorTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/state/kerberos/KerberosPrincipalDescriptorTest.java
@@ -34,6 +34,11 @@ public class KerberosPrincipalDescriptorTest {
           "\"local_username\": \"localUser\"" +
           "}";
 
+  public static final String JSON_VALUE_SPARSE =
+      "{" +
+          "\"value\": \"serviceOther/_HOST@_REALM\"" +
+          "}";
+
   public static final Map<String, Object> MAP_VALUE =
       new HashMap<String, Object>() {
         {
@@ -44,6 +49,13 @@ public class KerberosPrincipalDescriptorTest {
         }
       };
 
+  public static final Map<String, Object> MAP_VALUE_SPARSE =
+      new HashMap<String, Object>() {
+        {
+          put("value", "userOther@_REALM");
+        }
+      };
+
   public static void validateFromJSON(KerberosPrincipalDescriptor 
principalDescriptor) {
     Assert.assertNotNull(principalDescriptor);
     Assert.assertFalse(principalDescriptor.isContainer());
@@ -77,10 +89,21 @@ public class KerberosPrincipalDescriptorTest {
     return new KerberosPrincipalDescriptor(map);
   }
 
+  private static KerberosPrincipalDescriptor createFromJSONSparse() {
+    Map<?, ?> map = new Gson().fromJson(JSON_VALUE_SPARSE,
+        new TypeToken<Map<?, ?>>() {
+        }.getType());
+    return new KerberosPrincipalDescriptor(map);
+  }
+
   private static KerberosPrincipalDescriptor createFromMap() {
     return new KerberosPrincipalDescriptor(MAP_VALUE);
   }
 
+  private static KerberosPrincipalDescriptor createFromMapSparse() {
+    return new KerberosPrincipalDescriptor(MAP_VALUE_SPARSE);
+  }
+
   @Test
   public void testJSONDeserialize() {
     validateFromJSON(createFromJSON());
@@ -116,4 +139,54 @@ public class KerberosPrincipalDescriptorTest {
 
     validateUpdatedData(principalDescriptor);
   }
+
+  @Test
+  public void testUpdateSparse() {
+    KerberosPrincipalDescriptor principalDescriptor;
+    KerberosPrincipalDescriptor updatedPrincipalDescriptor;
+
+    /* ****************************************
+     * Test updating a service principal
+     * **************************************** */
+    principalDescriptor = createFromJSON();
+    updatedPrincipalDescriptor = createFromJSONSparse();
+
+    Assert.assertNotNull(principalDescriptor);
+    Assert.assertNotNull(updatedPrincipalDescriptor);
+
+    // The original value
+    Assert.assertEquals("service/_HOST@_REALM", 
principalDescriptor.getValue());
+    Assert.assertEquals("service-site/service.component.kerberos.principal", 
principalDescriptor.getConfiguration());
+    Assert.assertEquals(KerberosPrincipalType.SERVICE, 
principalDescriptor.getType());
+    Assert.assertEquals("localUser", principalDescriptor.getLocalUsername());
+
+    principalDescriptor.update(updatedPrincipalDescriptor);
+
+    // The updated value
+    Assert.assertEquals("serviceOther/_HOST@_REALM", 
principalDescriptor.getValue());
+    Assert.assertEquals("service-site/service.component.kerberos.principal", 
principalDescriptor.getConfiguration());
+    Assert.assertEquals(KerberosPrincipalType.SERVICE, 
principalDescriptor.getType());
+    Assert.assertEquals("localUser", principalDescriptor.getLocalUsername());
+
+    /* ****************************************
+     * Test updating a user principal
+     * **************************************** */
+    principalDescriptor = createFromMap();
+    updatedPrincipalDescriptor = createFromMapSparse();
+
+    Assert.assertNotNull(principalDescriptor);
+    Assert.assertNotNull(updatedPrincipalDescriptor);
+
+    Assert.assertEquals("user@_REALM", principalDescriptor.getValue());
+    
Assert.assertEquals("service-site/service.component.kerberos.https.principal", 
principalDescriptor.getConfiguration());
+    Assert.assertEquals(KerberosPrincipalType.USER, 
principalDescriptor.getType());
+    Assert.assertNull(principalDescriptor.getLocalUsername());
+
+    principalDescriptor.update(updatedPrincipalDescriptor);
+
+    Assert.assertEquals("userOther@_REALM", principalDescriptor.getValue());
+    
Assert.assertEquals("service-site/service.component.kerberos.https.principal", 
principalDescriptor.getConfiguration());
+    Assert.assertEquals(KerberosPrincipalType.USER, 
principalDescriptor.getType());
+    Assert.assertNull(principalDescriptor.getLocalUsername());
+  }
 }
\ No newline at end of file

Reply via email to