You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sw...@apache.org on 2014/07/25 23:32:37 UTC

git commit: AMBARI-6343. Views : Admin - Add Group and Group Member Resources. Additional fix.

Repository: ambari
Updated Branches:
  refs/heads/trunk 7602acae4 -> 0ae8350bc


AMBARI-6343. Views : Admin - Add Group and Group Member Resources. Additional fix.


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

Branch: refs/heads/trunk
Commit: 0ae8350bc62ef827c6de471514e2131385201c8c
Parents: 7602aca
Author: Siddharth Wagle <sw...@hortonworks.com>
Authored: Fri Jul 25 14:32:20 2014 -0700
Committer: Siddharth Wagle <sw...@hortonworks.com>
Committed: Fri Jul 25 14:32:20 2014 -0700

----------------------------------------------------------------------
 .../server/api/services/MemberService.java      | 15 ++++++++
 .../controller/AmbariManagementController.java  |  9 +++++
 .../AmbariManagementControllerImpl.java         | 33 ++++++++++++++++-
 .../internal/MemberResourceProvider.java        |  2 +-
 .../server/security/authorization/Users.java    | 18 +++++++++
 .../server/api/services/MemberServiceTest.java  |  6 +++
 .../internal/MemberResourceProviderTest.java    | 39 +++++++++++++++++++-
 7 files changed, 118 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/0ae8350b/ambari-server/src/main/java/org/apache/ambari/server/api/services/MemberService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/MemberService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/MemberService.java
index 72e194f..28e53e6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/MemberService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/MemberService.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
@@ -132,6 +133,20 @@ public class MemberService extends BaseService {
   }
 
   /**
+   * Updates all members.
+   * Handles: PUT /groups/{groupname}/members requests.
+   *
+   * @param headers    http headers
+   * @param ui         uri info
+   * @return status of the request
+   */
+  @PUT
+  @Produces("text/plain")
+  public Response updateMembers(String body, @Context HttpHeaders headers, @Context UriInfo ui) {
+    return handleRequest(headers, body, ui, Request.Type.PUT, createMemberResource(groupName, null));
+  }
+
+  /**
    * Create a member resource instance.
    *
    * @param groupName  group name

http://git-wip-us.apache.org/repos/asf/ambari/blob/0ae8350b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
index 2776394..b2c5ed0 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementController.java
@@ -249,6 +249,15 @@ public interface AmbariManagementController {
    */
   public void updateGroups(Set<GroupRequest> requests) throws AmbariException;
 
+  /**
+   * Updates the members of the group specified.
+   *
+   * @param requests the members to be set for this group
+   *
+   * @throws AmbariException if the resources cannot be updated
+   */
+  public void updateMembers(Set<MemberRequest> requests) throws AmbariException;
+
 
   // ----- Delete -----------------------------------------------------------
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/0ae8350b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 64383fe..b25e56c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@ -23,6 +23,7 @@ import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
+
 import java.io.File;
 import java.io.IOException;
 import java.net.InetAddress;
@@ -58,6 +59,7 @@ import org.apache.ambari.server.actionmanager.RequestFactory;
 import org.apache.ambari.server.actionmanager.Stage;
 import org.apache.ambari.server.actionmanager.StageFactory;
 import org.apache.ambari.server.agent.ExecutionCommand;
+
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_DRIVER;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_PASSWORD;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.AMBARI_DB_RCA_URL;
@@ -80,6 +82,7 @@ import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_P
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.SERVICE_REPO_INFO;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_NAME;
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.STACK_VERSION;
+
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.internal.RequestOperationLevel;
@@ -130,6 +133,7 @@ import org.apache.ambari.server.state.svccomphost.ServiceComponentHostStartEvent
 import org.apache.ambari.server.state.svccomphost.ServiceComponentHostStopEvent;
 import org.apache.ambari.server.state.svccomphost.ServiceComponentHostUpgradeEvent;
 import org.apache.ambari.server.utils.StageUtils;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.http.client.utils.URIBuilder;
@@ -715,6 +719,31 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
     return responses;
   }
 
+  @Override
+  public synchronized void updateMembers(Set<MemberRequest> requests) throws AmbariException {
+    final Map<String, List<String>> membersPerGroup = new HashMap<String, List<String>>();
+    for (MemberRequest request : requests) {
+      if (StringUtils.isBlank(request.getGroupName()) || StringUtils.isBlank(request.getUserName())) {
+        throw new AmbariException("Both group name and user name must be supplied.");
+      }
+      if (membersPerGroup.get(request.getGroupName()) == null) {
+        membersPerGroup.put(request.getGroupName(), new ArrayList<String>());
+      }
+      membersPerGroup.get(request.getGroupName()).add(request.getUserName());
+    }
+    for (Entry<String, List<String>> entry: membersPerGroup.entrySet()) {
+      final String groupName = entry.getKey();
+      final List<String> requiredMembers = entry.getValue();
+      final List<String> currentMembers = users.getAllMembers(groupName);
+      for (String user: (Collection<String>) CollectionUtils.subtract(currentMembers, requiredMembers)) {
+        users.removeMemberFromGroup(groupName, user);
+      }
+      for (String user: (Collection<String>) CollectionUtils.subtract(requiredMembers, currentMembers)) {
+        users.addMemberToGroup(groupName, user);
+      }
+    }
+  }
+
   private Stage createNewStage(long id, Cluster cluster, long requestId, String requestContext, String clusterHostInfo) {
     String logDir = BASE_LOG_DIR + File.pathSeparator + requestId;
     Stage stage =
@@ -2910,7 +2939,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
         } else {
           URLStreamProvider usp = new URLStreamProvider(REPO_URL_CONNECT_TIMEOUT,
               REPO_URL_READ_TIMEOUT, null, null, null);
-          
+
           RepositoryInfo repositoryInfo = ambariMetaInfo.getRepository(rr.getStackName(), rr.getStackVersion(), rr.getOsType(), rr.getRepoId());
           String repoName = repositoryInfo.getRepoName();
 
@@ -2928,7 +2957,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
               spec = rr.getBaseUrl() + suffix.substring(1);
             else
               spec = rr.getBaseUrl() + suffix;
-             
+
             try {
               IOUtils.readLines(usp.readFrom(spec));
             } catch (IOException ioe) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/0ae8350b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MemberResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MemberResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MemberResourceProvider.java
index 27b7e4b..7017495 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MemberResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MemberResourceProvider.java
@@ -143,7 +143,7 @@ public class MemberResourceProvider extends AbstractControllerResourceProvider {
     modifyResources(new Command<Void>() {
       @Override
       public Void invoke() throws AmbariException {
-        // do nothing
+        getManagementController().updateMembers(requests);
         return null;
       }
     });

http://git-wip-us.apache.org/repos/asf/ambari/blob/0ae8350b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/Users.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/Users.java b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/Users.java
index e2eb7b1..f3050ce 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/Users.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/security/authorization/Users.java
@@ -305,6 +305,24 @@ public class Users {
     return groups;
   }
 
+  /**
+   * Gets all members of a group specified.
+   *
+   * @param groupName group name
+   * @return list of user names
+   */
+  public List<String> getAllMembers(String groupName) throws AmbariException {
+    final List<String> members = new ArrayList<String>();
+    final GroupEntity groupEntity = groupDAO.findGroupByName(groupName);
+    if (groupEntity == null) {
+      throw new AmbariException("Group " + groupName + " doesn't exist");
+    }
+    for (MemberEntity member: groupEntity.getMemberEntities()) {
+      members.add(member.getUser().getUserName());
+    }
+    return members;
+  }
+
   @Transactional
   public synchronized void removeGroup(Group group) throws AmbariException {
     final GroupEntity groupEntity = groupDAO.findByPK(group.getGroupId());

http://git-wip-us.apache.org/repos/asf/ambari/blob/0ae8350b/ambari-server/src/test/java/org/apache/ambari/server/api/services/MemberServiceTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/services/MemberServiceTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/services/MemberServiceTest.java
index 17b2031..9c5c860 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/services/MemberServiceTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/services/MemberServiceTest.java
@@ -73,6 +73,12 @@ public class MemberServiceTest extends BaseServiceTest {
     args = new Object[] {getHttpHeaders(), getUriInfo(), "joe"};
     listInvocations.add(new ServiceTestInvocation(Request.Type.GET, memberService, m, args, null));
 
+    //updateMembers
+    memberService = new TestMemberService("engineering");
+    m = memberService.getClass().getMethod("updateMembers", String.class, HttpHeaders.class, UriInfo.class);
+    args = new Object[] {"body", getHttpHeaders(), getUriInfo()};
+    listInvocations.add(new ServiceTestInvocation(Request.Type.PUT, memberService, m, args, "body"));
+
     return listInvocations;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/0ae8350b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MemberResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MemberResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MemberResourceProviderTest.java
index 4860ddd..da8d781 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MemberResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MemberResourceProviderTest.java
@@ -90,7 +90,44 @@ public class MemberResourceProviderTest {
 
   @Test
   public void testUpdateResources() throws Exception {
-    // currently provider.updateResources() does nothing, nothing to test
+    Resource.Type type = Resource.Type.Member;
+
+    AmbariManagementController managementController = createMock(AmbariManagementController.class);
+    RequestStatusResponse response = createNiceMock(RequestStatusResponse.class);
+    ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class);
+    ResourceProvider memberResourceProvider = createNiceMock(MemberResourceProvider.class);
+
+    AbstractControllerResourceProvider.init(resourceProviderFactory);
+
+    // set expectations
+    expect(resourceProviderFactory.getMemberResourceProvider(anyObject(Set.class), anyObject(Map.class),
+        eq(managementController))).andReturn(memberResourceProvider).anyTimes();
+
+    // replay
+    replay(managementController, response, resourceProviderFactory, memberResourceProvider);
+
+    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
+        type,
+        PropertyHelper.getPropertyIds(type),
+        PropertyHelper.getKeyPropertyIds(type),
+        managementController);
+
+    // add the property map to a set for the request.
+    Map<String, Object> properties = new LinkedHashMap<String, Object>();
+
+    properties.put(MemberResourceProvider.MEMBER_GROUP_NAME_PROPERTY_ID, "engineering");
+    properties.put(MemberResourceProvider.MEMBER_USER_NAME_PROPERTY_ID, "joe");
+
+    // create the request
+    Request request = PropertyHelper.getUpdateRequest(properties, null);
+
+    PredicateBuilder builder = new PredicateBuilder();
+    builder.property(MemberResourceProvider.MEMBER_GROUP_NAME_PROPERTY_ID).equals("engineering");
+    Predicate predicate = builder.toPredicate();
+    provider.updateResources(request, predicate);
+
+    // verify
+    verify(managementController, response);
   }
 
   @Test