Repository: ambari Updated Branches: refs/heads/trunk bf49c0c2f -> b7f9612b5
AMBARI-6822. Privilege removal API should correctly process arrays. Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/b7f9612b Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/b7f9612b Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/b7f9612b Branch: refs/heads/trunk Commit: b7f9612b5556d4f14906b54caebefd118a548e73 Parents: bf49c0c Author: Siddharth Wagle <swa...@hortonworks.com> Authored: Mon Aug 11 14:03:20 2014 -0700 Committer: Siddharth Wagle <swa...@hortonworks.com> Committed: Mon Aug 11 14:04:31 2014 -0700 ---------------------------------------------------------------------- .../server/api/services/PrivilegeService.java | 22 +++- .../AbstractControllerResourceProvider.java | 30 ----- .../internal/AbstractResourceProvider.java | 31 ++++- .../AmbariPrivilegeResourceProvider.java | 6 + .../ClusterPrivilegeResourceProvider.java | 8 ++ .../internal/PrivilegeResourceProvider.java | 119 ++++++++++++++++--- .../internal/ViewPrivilegeResourceProvider.java | 23 +++- .../ambari/server/orm/dao/PrivilegeDAO.java | 38 ++++-- .../server/orm/entities/PrivilegeEntity.java | 2 +- .../api/services/PrivilegeServiceTest.java | 12 ++ .../AbstractControllerResourceProviderTest.java | 45 +------ .../internal/AbstractResourceProviderTest.java | 37 ++++++ .../AmbariPrivilegeResourceProviderTest.java | 75 +++++++++--- .../ClusterPrivilegeResourceProviderTest.java | 8 +- .../ViewPrivilegeResourceProviderTest.java | 12 +- 15 files changed, 323 insertions(+), 145 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/b7f9612b/ambari-server/src/main/java/org/apache/ambari/server/api/services/PrivilegeService.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/PrivilegeService.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/PrivilegeService.java index 8a0d200..2caa5d2 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/PrivilegeService.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/PrivilegeService.java @@ -76,6 +76,7 @@ public abstract class PrivilegeService extends BaseService { * Handles: POST /privileges * Create a privilege. * + * @param body request body * @param headers http headers * @param ui uri info * @@ -108,9 +109,26 @@ public abstract class PrivilegeService extends BaseService { } /** + * Handles: PUT /privileges + * Update a set of privileges for the resource. + * + * @param body request body + * @param headers http headers + * @param ui uri info + * + * @return information regarding the updated privileges + */ + @PUT + @Produces("text/plain") + public Response updatePrivileges(String body, @Context HttpHeaders headers, @Context UriInfo ui) { + return handleRequest(headers, body, ui, Request.Type.PUT, createPrivilegeResource(null)); + } + + /** * Handles: DELETE /privileges * Delete privileges. * + * @param body request body * @param headers http headers * @param ui uri info * @@ -118,9 +136,9 @@ public abstract class PrivilegeService extends BaseService { */ @DELETE @Produces("text/plain") - public Response deletePrivileges(@Context HttpHeaders headers, @Context UriInfo ui) { + public Response deletePrivileges(String body, @Context HttpHeaders headers, @Context UriInfo ui) { - return handleRequest(headers, null, ui, Request.Type.DELETE, createPrivilegeResource(null)); + return handleRequest(headers, body, ui, Request.Type.DELETE, createPrivilegeResource(null)); } /** http://git-wip-us.apache.org/repos/asf/ambari/blob/b7f9612b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java index 1c8948f..71ddc8d 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java @@ -20,9 +20,6 @@ package org.apache.ambari.server.controller.internal; import org.apache.ambari.server.controller.AmbariManagementController; import org.apache.ambari.server.controller.ResourceProviderFactory; -import org.apache.ambari.server.controller.predicate.ArrayPredicate; -import org.apache.ambari.server.controller.predicate.EqualsPredicate; -import org.apache.ambari.server.controller.spi.Predicate; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.controller.spi.ResourceProvider; import org.apache.ambari.server.controller.utilities.ClusterControllerHelper; @@ -173,31 +170,4 @@ public abstract class AbstractControllerResourceProvider extends AbstractResourc ensureResourceProvider(type); } - /** - * Extracting given query_parameter value from the predicate - * @param queryParameterId query parameter id - * @param predicate predicate - * @return the query parameter - */ - protected static Object getQueryParameterValue(String queryParameterId, Predicate predicate) { - - Object result = null; - - if (predicate instanceof EqualsPredicate) { - EqualsPredicate equalsPredicate = (EqualsPredicate) predicate; - if (queryParameterId.equals(equalsPredicate.getPropertyId())) { - return equalsPredicate.getValue(); - } - } else if (predicate instanceof ArrayPredicate) { - ArrayPredicate arrayPredicate = (ArrayPredicate) predicate; - for (Predicate predicateItem : arrayPredicate.getPredicates()) { - result = getQueryParameterValue(queryParameterId, predicateItem); - if (result != null) { - return result; - } - } - - } - return result; - } } http://git-wip-us.apache.org/repos/asf/ambari/blob/b7f9612b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java index 01c526d..53e683c 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java @@ -32,7 +32,8 @@ import org.apache.ambari.server.ObjectNotFoundException; import org.apache.ambari.server.ParentObjectNotFoundException; import org.apache.ambari.server.controller.ConfigurationRequest; import org.apache.ambari.server.controller.RequestStatusResponse; -import org.apache.ambari.server.controller.ServiceConfigVersionRequest; +import org.apache.ambari.server.controller.predicate.ArrayPredicate; +import org.apache.ambari.server.controller.predicate.EqualsPredicate; import org.apache.ambari.server.controller.spi.*; import org.apache.ambari.server.controller.utilities.PredicateHelper; import org.apache.ambari.server.controller.utilities.PropertyHelper; @@ -221,6 +222,34 @@ public abstract class AbstractResourceProvider extends BaseProvider implements R } /** + * Extracting given query_parameter value from the predicate + * @param queryParameterId query parameter id + * @param predicate predicate + * @return the query parameter + */ + protected static Object getQueryParameterValue(String queryParameterId, Predicate predicate) { + + Object result = null; + + if (predicate instanceof EqualsPredicate) { + EqualsPredicate equalsPredicate = (EqualsPredicate) predicate; + if (queryParameterId.equals(equalsPredicate.getPropertyId())) { + return equalsPredicate.getValue(); + } + } else if (predicate instanceof ArrayPredicate) { + ArrayPredicate arrayPredicate = (ArrayPredicate) predicate; + for (Predicate predicateItem : arrayPredicate.getPredicates()) { + result = getQueryParameterValue(queryParameterId, predicateItem); + if (result != null) { + return result; + } + } + + } + return result; + } + + /** * Invoke a command against the Ambari backend to create resources and map * any {@link AmbariException} to the types appropriate for the * {@link ResourceProvider} interface. http://git-wip-us.apache.org/repos/asf/ambari/blob/b7f9612b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProvider.java index e5fe0e9..b24f994 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProvider.java @@ -17,6 +17,7 @@ */ package org.apache.ambari.server.controller.internal; +import org.apache.ambari.server.controller.spi.Predicate; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.orm.entities.ResourceEntity; @@ -76,4 +77,9 @@ public class AmbariPrivilegeResourceProvider extends PrivilegeResourceProvider<O // the singleton Ambari entity is implied return Collections.singletonMap(ResourceEntity.AMBARI_RESOURCE_ID, null); } + + @Override + public Long getResourceEntityId(Predicate predicate) { + return ResourceEntity.AMBARI_RESOURCE_ID; + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/b7f9612b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProvider.java index 46bfea0..c9e2a83 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProvider.java @@ -17,6 +17,7 @@ */ package org.apache.ambari.server.controller.internal; +import org.apache.ambari.server.controller.spi.Predicate; import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.controller.utilities.PropertyHelper; @@ -135,6 +136,13 @@ public class ClusterPrivilegeResourceProvider extends PrivilegeResourceProvider< return Collections.singletonMap(clusterEntity.getResource().getId(), clusterEntity); } + @Override + public Long getResourceEntityId(Predicate predicate) { + final String clusterName = getQueryParameterValue(PRIVILEGE_CLUSTER_NAME_PROPERTY_ID, predicate).toString(); + final ClusterEntity clusterEntity = clusterDAO.findByName(clusterName); + return clusterEntity.getResource().getId(); + } + // ----- helper methods ---------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/b7f9612b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java index 42ab21d..60d6396 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java @@ -18,6 +18,15 @@ package org.apache.ambari.server.controller.internal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.apache.ambari.server.AmbariException; import org.apache.ambari.server.DuplicateResourceException; import org.apache.ambari.server.controller.spi.NoSuchParentResourceException; @@ -29,7 +38,6 @@ import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException; import org.apache.ambari.server.controller.spi.SystemException; import org.apache.ambari.server.controller.spi.UnsupportedPropertyException; -import org.apache.ambari.server.controller.utilities.PropertyHelper; import org.apache.ambari.server.orm.dao.GroupDAO; import org.apache.ambari.server.orm.dao.PermissionDAO; import org.apache.ambari.server.orm.dao.PrincipalDAO; @@ -44,14 +52,6 @@ import org.apache.ambari.server.orm.entities.PrivilegeEntity; import org.apache.ambari.server.orm.entities.ResourceEntity; import org.apache.ambari.server.orm.entities.UserEntity; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * Abstract resource provider for privilege resources. */ @@ -139,12 +139,21 @@ public abstract class PrivilegeResourceProvider<T> extends AbstractResourceProvi /** * Get the entities for the owning resources from the given properties. * - * @param properties the set of properties + * @param properties the set of properties * * @return the entities */ public abstract Map<Long, T> getResourceEntities(Map<String, Object> properties); + /** + * Get the id for the resource specified by predicate. + * + * @param predicate predicate + * + * @return the resource id + */ + public abstract Long getResourceEntityId(Predicate predicate); + // ----- ResourceProvider -------------------------------------------------- @@ -219,14 +228,16 @@ public abstract class PrivilegeResourceProvider<T> extends AbstractResourceProvi @Override public RequestStatus updateResources(Request request, Predicate predicate) throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException { - throw new UnsupportedOperationException("Not supported."); + modifyResources(getUpdateCommand(request, predicate)); + notifyUpdate(resourceType, request, predicate); + return getRequestStatus(null); } @Override public RequestStatus deleteResources(Predicate predicate) throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException { modifyResources(getDeleteCommand(predicate)); - notifyDelete(Resource.Type.ViewInstance, predicate); + notifyDelete(resourceType, predicate); return getRequestStatus(null); } @@ -331,6 +342,11 @@ public abstract class PrivilegeResourceProvider<T> extends AbstractResourceProvi if (userEntity != null) { entity.setPrincipal(principalDAO.findById(userEntity.getPrincipal().getId())); } + } else { + throw new AmbariException("Unknown principal type " + principalType); + } + if (entity.getPrincipal() == null) { + throw new AmbariException("Could not find " + principalType + " named " + principalName); } return entity; } @@ -378,13 +394,16 @@ public abstract class PrivilegeResourceProvider<T> extends AbstractResourceProvi @Override public Void invoke() throws AmbariException { try { - Set<Resource> resources = getResources(PropertyHelper.getReadRequest(), predicate); - for (Resource resource : resources) { - - PrivilegeEntity entity = - privilegeDAO.findById((Integer) resource.getPropertyValue(PRIVILEGE_ID_PROPERTY_ID)); - + for (Map<String, Object> resource : getPropertyMaps(predicate)) { + if (resource.get(PRIVILEGE_ID_PROPERTY_ID) == null) { + throw new AmbariException("Privilege ID should be provided for this request"); + } + PrivilegeEntity entity = privilegeDAO.findById(Integer.valueOf(resource.get(PRIVILEGE_ID_PROPERTY_ID).toString())); if (entity != null) { + if (!checkResourceTypes(entity)) { + throw new AmbariException("Can't remove " + entity.getPermission().getResourceType().getName() + + " permission from a " + entity.getResource().getResourceType().getName() + " resource."); + } privilegeDAO.remove(entity); } } @@ -395,5 +414,69 @@ public abstract class PrivilegeResourceProvider<T> extends AbstractResourceProvi } }; } + + private Command<Void> getUpdateCommand(final Request request, final Predicate predicate) { + return new Command<Void>() { + @Override + public Void invoke() throws AmbariException { + Long resource = null; + final List<PrivilegeEntity> requiredEntities = new ArrayList<PrivilegeEntity>(); + for (Map<String, Object> properties: request.getProperties()) { + Set<Long> resourceIds = getResourceEntities(properties).keySet(); + Long resourceId = resourceIds.iterator().next(); + + if (resource != null && resourceId != resource) { + throw new AmbariException("Can't update privileges of multiple resources in one request"); + } + resource = resourceId; + + PrivilegeEntity entity = toEntity(properties, resourceId); + requiredEntities.add(entity); + } + if (resource == null) { + // request body is empty, use predicate instead + resource = getResourceEntityId(predicate); + } + final List<PrivilegeEntity> currentPrivileges = privilegeDAO.findByResourceId(resource); + + for (PrivilegeEntity requiredPrivilege: requiredEntities) { + boolean isInBothLists = false; + for (PrivilegeEntity currentPrivilege: currentPrivileges) { + if (requiredPrivilege.getPermission().getPermissionName().equals(currentPrivilege.getPermission().getPermissionName()) && + requiredPrivilege.getPrincipal().getId().equals(currentPrivilege.getPrincipal().getId())) { + isInBothLists = true; + break; + } + } + if (!isInBothLists) { + if (!checkResourceTypes(requiredPrivilege)) { + throw new AmbariException("Can't grant " + requiredPrivilege.getPermission().getResourceType().getName() + + " permission on a " + requiredPrivilege.getResource().getResourceType().getName() + " resource."); + } + + privilegeDAO.create(requiredPrivilege); + } + } + for (PrivilegeEntity currentPrivilege: currentPrivileges) { + boolean isInBothLists = false; + for (PrivilegeEntity requiredPrivilege: requiredEntities) { + if (requiredPrivilege.getPermission().getPermissionName().equals(currentPrivilege.getPermission().getPermissionName()) && + requiredPrivilege.getPrincipal().getId().equals(currentPrivilege.getPrincipal().getId())) { + isInBothLists = true; + break; + } + } + if (!isInBothLists) { + if (!checkResourceTypes(currentPrivilege)) { + throw new AmbariException("Can't remove " + currentPrivilege.getPermission().getResourceType().getName() + + " permission from a " + currentPrivilege.getResource().getResourceType().getName() + " resource."); + } + privilegeDAO.remove(currentPrivilege); + } + } + return null; + } + }; + } } http://git-wip-us.apache.org/repos/asf/ambari/blob/b7f9612b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java index 6d10797..57eb28e 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java @@ -17,7 +17,14 @@ */ package org.apache.ambari.server.controller.internal; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + import org.apache.ambari.server.AmbariException; +import org.apache.ambari.server.controller.spi.Predicate; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.orm.entities.GroupEntity; import org.apache.ambari.server.orm.entities.PermissionEntity; @@ -29,12 +36,6 @@ import org.apache.ambari.server.orm.entities.ViewEntity; import org.apache.ambari.server.orm.entities.ViewInstanceEntity; import org.apache.ambari.server.view.ViewRegistry; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - /** * Resource provider for view privilege resources. */ @@ -139,6 +140,16 @@ public class ViewPrivilegeResourceProvider extends PrivilegeResourceProvider<Vie return resourceEntities; } + @Override + public Long getResourceEntityId(Predicate predicate) { + final ViewRegistry viewRegistry = ViewRegistry.getInstance(); + + final String viewName = getQueryParameterValue(PRIVILEGE_VIEW_NAME_PROPERTY_ID, predicate).toString(); + final String viewVersion = getQueryParameterValue(PRIVILEGE_VIEW_VERSION_PROPERTY_ID, predicate).toString(); + final String instanceName = getQueryParameterValue(PRIVILEGE_INSTANCE_NAME_PROPERTY_ID, predicate).toString(); + final ViewInstanceEntity viewInstanceEntity = viewRegistry.getInstanceDefinition(viewName, viewVersion, instanceName); + return viewInstanceEntity.getResource().getId(); + } // ----- helper methods ---------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/b7f9612b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PrivilegeDAO.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PrivilegeDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PrivilegeDAO.java index 2ad14d2..4fda7bc 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PrivilegeDAO.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PrivilegeDAO.java @@ -18,19 +18,21 @@ package org.apache.ambari.server.orm.dao; -import com.google.inject.Inject; -import com.google.inject.Provider; -import com.google.inject.Singleton; -import com.google.inject.persist.Transactional; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; + import org.apache.ambari.server.orm.entities.PermissionEntity; import org.apache.ambari.server.orm.entities.PrincipalEntity; import org.apache.ambari.server.orm.entities.PrivilegeEntity; import org.apache.ambari.server.orm.entities.ResourceEntity; -import javax.persistence.EntityManager; -import javax.persistence.TypedQuery; +import com.google.inject.Inject; +import com.google.inject.Provider; +import com.google.inject.Singleton; +import com.google.inject.persist.Transactional; import java.util.Collections; -import java.util.List; /** * Privilege Data Access Object. @@ -46,20 +48,20 @@ public class PrivilegeDAO { DaoUtils daoUtils; /** - * Find a resource with the given id. + * Find a privilege with the given id. * - * @param id type id + * @param id type id * - * @return a matching resource type or null + * @return a matching privilege or null */ public PrivilegeEntity findById(Integer id) { return entityManagerProvider.get().find(PrivilegeEntity.class, id); } /** - * Find all resources. + * Find all privileges. * - * @return all resources or an empty List + * @return all privileges or an empty List */ public List<PrivilegeEntity> findAll() { TypedQuery<PrivilegeEntity> query = entityManagerProvider.get().createQuery("SELECT privilege FROM PrivilegeEntity privilege", PrivilegeEntity.class); @@ -67,6 +69,18 @@ public class PrivilegeDAO { } /** + * Find all privileges for given resource. + * + * @param id ID of the resource + * @return all resource privileges or an empty list + */ + public List<PrivilegeEntity> findByResourceId(Long id) { + TypedQuery<PrivilegeEntity> query = entityManagerProvider.get().createQuery("SELECT privilege FROM PrivilegeEntity privilege WHERE privilege.resource.id = :resource_id", PrivilegeEntity.class); + query.setParameter("resource_id", id); + return daoUtils.selectList(query); + } + + /** * Determine whether or not the given privilege entity exists. * * @param entity the privilege entity http://git-wip-us.apache.org/repos/asf/ambari/blob/b7f9612b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/PrivilegeEntity.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/PrivilegeEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/PrivilegeEntity.java index 26802e6..fe97c7d 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/PrivilegeEntity.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/PrivilegeEntity.java @@ -173,7 +173,7 @@ public class PrivilegeEntity { @Override public int hashCode() { - int result = id.hashCode(); + int result = id != null ? id.hashCode() : 0; result = 31 * result + (permission != null ? permission.hashCode() : 0); result = 31 * result + (resource != null ? resource.hashCode() : 0); result = 31 * result + (principal != null ? principal.hashCode() : 0); http://git-wip-us.apache.org/repos/asf/ambari/blob/b7f9612b/ambari-server/src/test/java/org/apache/ambari/server/api/services/PrivilegeServiceTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/services/PrivilegeServiceTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/services/PrivilegeServiceTest.java index 516fad9..d9f3e28 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/api/services/PrivilegeServiceTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/api/services/PrivilegeServiceTest.java @@ -65,12 +65,24 @@ public class PrivilegeServiceTest extends BaseServiceTest { args = new Object[] {"body", getHttpHeaders(), getUriInfo(), "id"}; listInvocations.add(new ServiceTestInvocation(Request.Type.PUT, service, m, args, "body")); + //updatePrivileges + service = new TestPrivilegeService(null); + m = service.getClass().getMethod("updatePrivileges", String.class, HttpHeaders.class, UriInfo.class); + args = new Object[] {"body", getHttpHeaders(), getUriInfo()}; + listInvocations.add(new ServiceTestInvocation(Request.Type.PUT, service, m, args, "body")); + //deletePrivilege service = new TestPrivilegeService("id"); m = service.getClass().getMethod("deletePrivilege", HttpHeaders.class, UriInfo.class, String.class); args = new Object[] {getHttpHeaders(), getUriInfo(), "id"}; listInvocations.add(new ServiceTestInvocation(Request.Type.DELETE, service, m, args, null)); + //deletePrivileges + service = new TestPrivilegeService(null); + m = service.getClass().getMethod("deletePrivileges", String.class, HttpHeaders.class, UriInfo.class); + args = new Object[] {"body", getHttpHeaders(), getUriInfo()}; + listInvocations.add(new ServiceTestInvocation(Request.Type.DELETE, service, m, args, "body")); + return listInvocations; } http://git-wip-us.apache.org/repos/asf/ambari/blob/b7f9612b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java index 8453aad..5414b52 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java @@ -22,10 +22,8 @@ import junit.framework.Assert; import org.apache.ambari.server.controller.AmbariManagementController; import org.apache.ambari.server.controller.MaintenanceStateHelper; import org.apache.ambari.server.controller.ResourceProviderFactory; -import org.apache.ambari.server.controller.spi.Predicate; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.controller.spi.ResourceProvider; -import org.apache.ambari.server.controller.utilities.PredicateBuilder; import org.junit.Test; import java.util.HashMap; @@ -56,15 +54,15 @@ public class AbstractControllerResourceProviderTest { Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>(); AmbariManagementController managementController = createMock(AmbariManagementController.class); - + ResourceProviderFactory factory = createMock(ResourceProviderFactory.class); MaintenanceStateHelper maintenanceStateHelper = createNiceMock(MaintenanceStateHelper.class); ResourceProvider serviceResourceProvider = new ServiceResourceProvider(propertyIds, keyPropertyIds, managementController, maintenanceStateHelper); expect(factory.getServiceResourceProvider(propertyIds, keyPropertyIds, managementController)).andReturn(serviceResourceProvider); - + AbstractControllerResourceProvider.init(factory); - + replay(managementController, factory, maintenanceStateHelper); AbstractResourceProvider provider = @@ -77,41 +75,4 @@ public class AbstractControllerResourceProviderTest { Assert.assertTrue(provider instanceof ServiceResourceProvider); } - @Test - public void testGetQueryParameterValue() { - - String queryParameterId1 = "qp/variable1"; - String queryParameterValue1 = "value1"; - String queryParameterId2 = "qp/variable2"; - String queryParameterValue2 = "value2"; - - //Array of predicates - Predicate predicate = new PredicateBuilder().property(queryParameterId1).equals(queryParameterValue1). - and().property(queryParameterId2).equals(queryParameterValue2).toPredicate(); - - Assert.assertEquals(queryParameterValue1, AbstractControllerResourceProvider.getQueryParameterValue(queryParameterId1, predicate)); - Assert.assertFalse(queryParameterValue2.equals(AbstractControllerResourceProvider.getQueryParameterValue(queryParameterId1, predicate))); - Assert.assertNull(AbstractControllerResourceProvider.getQueryParameterValue("queryParameterIdNotFound", predicate)); - - String queryParameterId3 = "qp/variable3"; - String queryParameterValue3 = "value3"; - - // tests ServiceInfo/state=INSTALLED¶ms/run_smoke_test=true - //Array of arrays of predicates - predicate = new PredicateBuilder().property(queryParameterId3).equals(queryParameterValue3). - and().begin().property(queryParameterId1).equals(queryParameterValue1). - and().property(queryParameterId2).equals(queryParameterValue2).end().toPredicate(); - - Assert.assertEquals(queryParameterValue1, AbstractControllerResourceProvider. - getQueryParameterValue(queryParameterId1, predicate)); - Assert.assertFalse(queryParameterValue2.equals(AbstractControllerResourceProvider. - getQueryParameterValue(queryParameterId1, predicate))); - Assert.assertNull(AbstractControllerResourceProvider. - getQueryParameterValue("queryParameterIdNotFound", predicate)); - - Assert.assertEquals(queryParameterValue3, AbstractControllerResourceProvider. - getQueryParameterValue(queryParameterId3, predicate)); - - } - } http://git-wip-us.apache.org/repos/asf/ambari/blob/b7f9612b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java index 0a56586..c1f4f5b 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java @@ -235,6 +235,43 @@ public class AbstractResourceProviderTest { } } + @Test + public void testGetQueryParameterValue() { + + String queryParameterId1 = "qp/variable1"; + String queryParameterValue1 = "value1"; + String queryParameterId2 = "qp/variable2"; + String queryParameterValue2 = "value2"; + + //Array of predicates + Predicate predicate = new PredicateBuilder().property(queryParameterId1).equals(queryParameterValue1). + and().property(queryParameterId2).equals(queryParameterValue2).toPredicate(); + + Assert.assertEquals(queryParameterValue1, AbstractResourceProvider.getQueryParameterValue(queryParameterId1, predicate)); + Assert.assertFalse(queryParameterValue2.equals(AbstractResourceProvider.getQueryParameterValue(queryParameterId1, predicate))); + Assert.assertNull(AbstractResourceProvider.getQueryParameterValue("queryParameterIdNotFound", predicate)); + + String queryParameterId3 = "qp/variable3"; + String queryParameterValue3 = "value3"; + + // tests ServiceInfo/state=INSTALLED¶ms/run_smoke_test=true + //Array of arrays of predicates + predicate = new PredicateBuilder().property(queryParameterId3).equals(queryParameterValue3). + and().begin().property(queryParameterId1).equals(queryParameterValue1). + and().property(queryParameterId2).equals(queryParameterValue2).end().toPredicate(); + + Assert.assertEquals(queryParameterValue1, AbstractResourceProvider. + getQueryParameterValue(queryParameterId1, predicate)); + Assert.assertFalse(queryParameterValue2.equals(AbstractResourceProvider. + getQueryParameterValue(queryParameterId1, predicate))); + Assert.assertNull(AbstractResourceProvider. + getQueryParameterValue("queryParameterIdNotFound", predicate)); + + Assert.assertEquals(queryParameterValue3, AbstractResourceProvider. + getQueryParameterValue(queryParameterId3, predicate)); + + } + // ----- helper methods ---------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/b7f9612b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProviderTest.java index 44c8810..94fb7dd 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProviderTest.java @@ -18,6 +18,21 @@ package org.apache.ambari.server.controller.internal; +import static org.easymock.EasyMock.createNiceMock; +import static org.easymock.EasyMock.createStrictMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.easymock.EasyMock.reset; +import static org.easymock.EasyMock.verify; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.apache.ambari.server.controller.spi.Request; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.controller.utilities.PropertyHelper; @@ -33,24 +48,14 @@ import org.apache.ambari.server.orm.entities.PrincipalEntity; import org.apache.ambari.server.orm.entities.PrincipalTypeEntity; import org.apache.ambari.server.orm.entities.PrivilegeEntity; import org.apache.ambari.server.orm.entities.ResourceEntity; +import org.apache.ambari.server.orm.entities.ResourceTypeEntity; import org.apache.ambari.server.orm.entities.UserEntity; +import org.easymock.EasyMock; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; - -import static org.easymock.EasyMock.createNiceMock; -import static org.easymock.EasyMock.createStrictMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.reset; -import static org.easymock.EasyMock.verify; - /** * AmbariPrivilegeResourceProvider tests. */ @@ -129,13 +134,47 @@ public class AmbariPrivilegeResourceProviderTest { public void testUpdateResources() throws Exception { PrivilegeResourceProvider provider = new AmbariPrivilegeResourceProvider(); + PrivilegeEntity privilegeEntity = createNiceMock(PrivilegeEntity.class); + ResourceEntity resourceEntity = createNiceMock(ResourceEntity.class); + ResourceTypeEntity resourceTypeEntity = createNiceMock(ResourceTypeEntity.class); Request request = createNiceMock(Request.class); + PermissionEntity permissionEntity = createNiceMock(PermissionEntity.class); + PrincipalEntity principalEntity = createNiceMock(PrincipalEntity.class); + UserEntity userEntity = createNiceMock(UserEntity.class); + + expect(privilegeDAO.findByResourceId(1L)).andReturn(Collections.singletonList(privilegeEntity)).anyTimes(); + privilegeDAO.remove(privilegeEntity); + EasyMock.expectLastCall().anyTimes(); + expect(request.getProperties()).andReturn(new HashSet<Map<String,Object>>() { + { + add(new HashMap<String, Object>() { + { + put(PrivilegeResourceProvider.PERMISSION_NAME_PROPERTY_ID, "READ"); + put(PrivilegeResourceProvider.PRINCIPAL_NAME_PROPERTY_ID, "admin"); + put(PrivilegeResourceProvider.PRINCIPAL_TYPE_PROPERTY_ID, "user"); + } + }); + } + }).anyTimes(); + expect(permissionDAO.findPermissionByNameAndType(EasyMock.eq("READ"), EasyMock.<ResourceTypeEntity> anyObject())).andReturn(permissionEntity); + expect(resourceDAO.findById(EasyMock.anyLong())).andReturn(resourceEntity); + expect(userDAO.findLocalUserByName("admin")).andReturn(userEntity); + expect(principalDAO.findById(EasyMock.anyLong())).andReturn(principalEntity); + expect(userEntity.getPrincipal()).andReturn(principalEntity).anyTimes(); + expect(principalEntity.getId()).andReturn(2L).anyTimes(); + expect(permissionEntity.getPermissionName()).andReturn("READ").anyTimes(); + expect(privilegeEntity.getPermission()).andReturn(permissionEntity).anyTimes(); + expect(resourceTypeEntity.getId()).andReturn(3).anyTimes(); + expect(resourceEntity.getResourceType()).andReturn(resourceTypeEntity).anyTimes(); + expect(permissionEntity.getResourceType()).andReturn(resourceTypeEntity).anyTimes(); + expect(privilegeEntity.getPrincipal()).andReturn(principalEntity).anyTimes(); + privilegeDAO.create(EasyMock.<PrivilegeEntity> anyObject()); + EasyMock.expectLastCall().anyTimes(); + + replay(privilegeEntity, privilegeDAO, request, permissionDAO, permissionEntity, resourceEntity, resourceDAO, principalEntity, principalDAO, userDAO, userEntity, resourceTypeEntity); + + provider.updateResources(request, null); - try { - provider.updateResources(request, null); - Assert.fail("expected UnsupportedOperationException"); - } catch (UnsupportedOperationException e) { - // expected - } + verify(privilegeEntity, privilegeDAO, request, permissionDAO, permissionEntity, resourceEntity, resourceDAO, principalEntity, principalDAO, userDAO, userEntity, resourceTypeEntity); } } http://git-wip-us.apache.org/repos/asf/ambari/blob/b7f9612b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProviderTest.java index 864fc14..148c139 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProviderTest.java @@ -142,7 +142,6 @@ public class ClusterPrivilegeResourceProviderTest { @Test public void testUpdateResources() throws Exception { - PermissionEntity permissionEntity = createNiceMock(PermissionEntity.class); Request request = createNiceMock(Request.class); @@ -155,9 +154,10 @@ public class ClusterPrivilegeResourceProviderTest { PrivilegeResourceProvider provider = new ClusterPrivilegeResourceProvider(); try { provider.updateResources(request, null); - Assert.fail("expected UnsupportedOperationException"); - } catch (UnsupportedOperationException e) { - // expected + } catch (Exception ex) { + // omit the exception, this method is from abstract class and tested in + // AmbariPrivilegeResourceProvider#testUpdateResources + // just check that permissions are okay } verify(permissionDAO, permissionEntity, request); http://git-wip-us.apache.org/repos/asf/ambari/blob/b7f9612b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProviderTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProviderTest.java index d61a0b6..695ceea 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProviderTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProviderTest.java @@ -18,7 +18,6 @@ package org.apache.ambari.server.controller.internal; -import org.apache.ambari.server.controller.spi.Request; import org.apache.ambari.server.controller.spi.Resource; import org.apache.ambari.server.controller.utilities.PropertyHelper; import org.apache.ambari.server.orm.dao.GroupDAO; @@ -154,16 +153,7 @@ public class ViewPrivilegeResourceProviderTest { @Test public void testUpdateResources() throws Exception { - PrivilegeResourceProvider provider = new ViewPrivilegeResourceProvider(); - - Request request = createNiceMock(Request.class); - - try { - provider.updateResources(request, null); - Assert.fail("expected UnsupportedOperationException"); - } catch (UnsupportedOperationException e) { - // expected - } + // see AmbariPrivilegeResourceProvider#testUpdateResources } }