You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by rl...@apache.org on 2015/03/15 04:13:23 UTC

ambari git commit: AMBARI-10071. Kerberos service check doesn't work is new HTTP session is created (rlevas)

Repository: ambari
Updated Branches:
  refs/heads/trunk def3848f3 -> 7a23cdaf6


AMBARI-10071. Kerberos service check doesn't work is new HTTP session is created (rlevas)


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

Branch: refs/heads/trunk
Commit: 7a23cdaf6677b759d3744ffc6fcbcf07feb8d5d0
Parents: def3848
Author: Robert Levas <rl...@hortonworks.com>
Authored: Sat Mar 14 23:13:02 2015 -0400
Committer: Robert Levas <rl...@hortonworks.com>
Committed: Sat Mar 14 23:13:02 2015 -0400

----------------------------------------------------------------------
 .../server/controller/KerberosHelper.java       | 12 +--
 .../org/apache/ambari/server/state/Cluster.java | 15 ++++
 .../server/state/cluster/ClusterImpl.java       | 46 +++++++++--
 .../server/controller/KerberosHelperTest.java   | 28 +++++--
 .../server/state/cluster/ClusterImplTest.java   | 80 ++++++++++++++++++--
 5 files changed, 155 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/7a23cdaf/ambari-server/src/main/java/org/apache/ambari/server/controller/KerberosHelper.java
----------------------------------------------------------------------
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 cf73236..01f7846 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
@@ -1730,14 +1730,10 @@ public class KerberosHelper {
    * @param value   the Kerberos service check identifier to store or null to clear any previously set value
    */
   private void setKerberosServiceCheckIdentifier(Cluster cluster, String value) {
-    Map<String, Object> sessionAttributes = cluster.getSessionAttributes();
-
-    if (sessionAttributes != null) {
-      if (value == null) {
-        sessionAttributes.remove(SERVICE_CHECK_IDENTIFIER);
-      } else {
-        sessionAttributes.put(SERVICE_CHECK_IDENTIFIER, value);
-      }
+    if (value == null) {
+      cluster.removeSessionAttribute(SERVICE_CHECK_IDENTIFIER);
+    } else {
+      cluster.setSessionAttribute(SERVICE_CHECK_IDENTIFIER, value);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/7a23cdaf/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
index 9b424b8..787f5d6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Cluster.java
@@ -477,6 +477,21 @@ public interface Cluster {
   public void addSessionAttributes(Map<String, Object> attributes);
 
   /**
+   * Sets or adds an attribute in the session for this cluster
+   *
+   * @param key   the name of the key which identifies the attribute in the map
+   * @param value the value to set
+   */
+  public void setSessionAttribute(String key, Object value);
+
+  /**
+   * Removes an attribute from the session for this cluster
+   *
+   * @param key the name of the key which identifies the attribute in the map
+   */
+  public void removeSessionAttribute(String key);
+
+  /**
    * Get the map of session attributes for this cluster.
    *
    * @return the map of session attributes for this cluster; never null

http://git-wip-us.apache.org/repos/asf/ambari/blob/7a23cdaf/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
index 638e4da..8e89cad 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
@@ -2530,23 +2530,34 @@ public class ClusterImpl implements Cluster {
   @Override
   public void addSessionAttributes(Map<String, Object> attributes) {
     if (attributes != null && !attributes.isEmpty()) {
-
       Map<String, Object>  sessionAttributes = new HashMap<String, Object>(getSessionAttributes());
-
       sessionAttributes.putAll(attributes);
+      setSessionAttributes(attributes);
+    }
+  }
 
-      String attributeName = CLUSTER_SESSION_ATTRIBUTES_PREFIX + getClusterName();
+  @Override
+  public void setSessionAttribute(String key, Object value){
+    if (key != null && !key.isEmpty()) {
+      Map<String, Object> sessionAttributes = new HashMap<String, Object>(getSessionAttributes());
+      sessionAttributes.put(key, value);
+      setSessionAttributes(sessionAttributes);
+    }
+  }
 
-      getSessionManager().setAttribute(attributeName, sessionAttributes);
+  @Override
+  public void removeSessionAttribute(String key) {
+    if (key != null && !key.isEmpty()) {
+      Map<String, Object> sessionAttributes = new HashMap<String, Object>(getSessionAttributes());
+      sessionAttributes.remove(key);
+      setSessionAttributes(sessionAttributes);
     }
   }
 
   @Override
   public Map<String, Object> getSessionAttributes() {
-    String attributeName = CLUSTER_SESSION_ATTRIBUTES_PREFIX + getClusterName();
-
     Map<String, Object>  attributes =
-        (Map<String, Object>) getSessionManager().getAttribute(attributeName);
+        (Map<String, Object>) getSessionManager().getAttribute(getClusterSessionAttributeName());
 
     return attributes == null ? Collections.<String, Object>emptyMap() : attributes;
   }
@@ -2559,4 +2570,25 @@ public class ClusterImpl implements Cluster {
   protected AmbariSessionManager getSessionManager() {
     return sessionManager;
   }
+
+  /**
+   * Set the map of session attributes for this cluster.
+   * <p/>
+   * This is a private method so that it may be used as a utility for add and update operations.
+   *
+   * @param sessionAttributes the map of session attributes for this cluster; never null
+   */
+  private void setSessionAttributes(Map<String, Object> sessionAttributes) {
+    getSessionManager().setAttribute(getClusterSessionAttributeName(), sessionAttributes);
+  }
+
+  /**
+   * Generates and returns the cluster-specific attribute name to use to set and get cluster-specific
+   * session attributes.
+   *
+   * @return the name of the cluster-specific session attribute
+   */
+  private String getClusterSessionAttributeName() {
+    return CLUSTER_SESSION_ATTRIBUTES_PREFIX + getClusterName();
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/7a23cdaf/ambari-server/src/test/java/org/apache/ambari/server/controller/KerberosHelperTest.java
----------------------------------------------------------------------
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 c2ded8c..e451ad1 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
@@ -363,6 +363,11 @@ public class KerberosHelperTest extends EasyMockSupport {
     testCreateTestIdentity(new KerberosCredential("principal", "password", "keytab"));
   }
 
+  @Test (expected = KerberosMissingAdminCredentialsException.class)
+  public void testCreateTestIdentityNoCredentials() throws Exception {
+    testCreateTestIdentity(null);
+  }
+
   @Test
   public void testDeleteTestIdentity() throws Exception {
     testDeleteTestIdentity(new KerberosCredential("principal", "password", "keytab"));
@@ -1965,6 +1970,13 @@ public class KerberosHelperTest extends EasyMockSupport {
     final Config krb5ConfConfig = createNiceMock(Config.class);
     expect(krb5ConfConfig.getProperties()).andReturn(krb5ConfProperties).anyTimes();
 
+    final Map<String,Object> attributeMap = new HashMap<String, Object>();
+    if (kerberosCredential != null) {
+      attributeMap.put("kerberos_admin/" + KerberosCredential.KEY_NAME_PRINCIPAL, kerberosCredential.getPrincipal());
+      attributeMap.put("kerberos_admin/" + KerberosCredential.KEY_NAME_PASSWORD, kerberosCredential.getPassword());
+      attributeMap.put("kerberos_admin/" + KerberosCredential.KEY_NAME_KEYTAB, kerberosCredential.getKeytab());
+    }
+
     final Cluster cluster = createNiceMock(Cluster.class);
     expect(cluster.getDesiredConfigByType("krb5-conf")).andReturn(krb5ConfConfig).anyTimes();
     expect(cluster.getDesiredConfigByType("kerberos-env")).andReturn(kerberosEnvConfig).anyTimes();
@@ -1991,13 +2003,17 @@ public class KerberosHelperTest extends EasyMockSupport {
     expect(cluster.getCurrentStackVersion())
         .andReturn(new StackId("HDP", "2.2"))
         .anyTimes();
-    expect(cluster.getSessionAttributes()).andReturn(new HashMap<String, Object>() {{
-      if (kerberosCredential != null) {
-        put("kerberos_admin/" + KerberosCredential.KEY_NAME_PRINCIPAL, kerberosCredential.getPrincipal());
-        put("kerberos_admin/" + KerberosCredential.KEY_NAME_PASSWORD, kerberosCredential.getPassword());
-        put("kerberos_admin/" + KerberosCredential.KEY_NAME_KEYTAB, kerberosCredential.getKeytab());
+    expect(cluster.getSessionAttributes()).andReturn(attributeMap).anyTimes();
+
+    cluster.setSessionAttribute(anyObject(String.class), anyObject());
+    expectLastCall().andAnswer(new IAnswer<Object>() {
+      @Override
+      public Object answer() throws Throwable {
+        Object[] args = getCurrentArguments();
+        attributeMap.put((String) args[0], args[1]);
+        return null;
       }
-    }}).anyTimes();
+    }).anyTimes();
 
     final Clusters clusters = injector.getInstance(Clusters.class);
     expect(clusters.getHostsForCluster("c1"))

http://git-wip-us.apache.org/repos/asf/ambari/blob/7a23cdaf/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterImplTest.java
index 8d07b9c..39431ed 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterImplTest.java
@@ -26,11 +26,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.createMockBuilder;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
+import static org.easymock.EasyMock.*;
 import static org.junit.Assert.*;
 
 public class ClusterImplTest {
@@ -62,6 +58,80 @@ public class ClusterImplTest {
   }
 
   @Test
+  public void testSetSessionAttribute() throws Exception {
+    Map<String, Object> attributes = new HashMap<String, Object>();
+    attributes.put("foo", "bar");
+    attributes.put("foo2", "bar2");
+
+    Map<String, Object> updatedAttributes = new HashMap<String, Object>(attributes);
+    updatedAttributes.put("foo2", "updated value");
+
+    Map<String, Object> addedAttributes = new HashMap<String, Object>(updatedAttributes);
+    updatedAttributes.put("foo3", "added value");
+
+    AmbariSessionManager sessionManager = createMock(AmbariSessionManager.class);
+
+    ClusterImpl cluster =
+      createMockBuilder(ClusterImpl.class).
+        addMockedMethod("getSessionManager").
+        addMockedMethod("getClusterName").
+        addMockedMethod("getSessionAttributes").
+        createMock();
+
+    expect(cluster.getSessionManager()).andReturn(sessionManager);
+    expect(cluster.getClusterName()).andReturn("c1");
+    expect(cluster.getSessionAttributes()).andReturn(attributes);
+
+    sessionManager.setAttribute("cluster_session_attributes:c1", updatedAttributes);
+    expectLastCall().once();
+
+    expect(cluster.getSessionManager()).andReturn(sessionManager);
+    expect(cluster.getClusterName()).andReturn("c1");
+    expect(cluster.getSessionAttributes()).andReturn(updatedAttributes);
+
+    sessionManager.setAttribute("cluster_session_attributes:c1", addedAttributes);
+    expectLastCall().once();
+
+    replay(sessionManager, cluster);
+
+    cluster.setSessionAttribute("foo2", "updated value");
+    cluster.setSessionAttribute("foo3", "added value");
+
+    verify(sessionManager, cluster);
+  }
+
+  @Test
+  public void testRemoveSessionAttribute() throws Exception {
+    Map<String, Object> attributes = new HashMap<String, Object>();
+    attributes.put("foo", "bar");
+    attributes.put("foo2", "bar2");
+
+    Map<String, Object> trimmedAttributes = new HashMap<String, Object>(attributes);
+    trimmedAttributes.remove("foo2");
+
+    AmbariSessionManager sessionManager = createMock(AmbariSessionManager.class);
+
+    ClusterImpl cluster =
+      createMockBuilder(ClusterImpl.class).
+        addMockedMethod("getSessionManager").
+        addMockedMethod("getClusterName").
+        addMockedMethod("getSessionAttributes").
+        createMock();
+
+    expect(cluster.getSessionManager()).andReturn(sessionManager);
+    expect(cluster.getClusterName()).andReturn("c1");
+    expect(cluster.getSessionAttributes()).andReturn(attributes);
+    sessionManager.setAttribute("cluster_session_attributes:c1", trimmedAttributes);
+    expectLastCall().once();
+
+    replay(sessionManager, cluster);
+
+    cluster.removeSessionAttribute("foo2");
+
+    verify(sessionManager, cluster);
+  }
+
+  @Test
   public void testGetSessionAttributes() throws Exception {
     Map<String, Object> attributes = new HashMap<String, Object>();
     attributes.put("foo", "bar");