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 <swa...@hortonworks.com>
Authored: Fri Jul 25 14:32:20 2014 -0700
Committer: Siddharth Wagle <swa...@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

Reply via email to