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