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