Browse Source

AMBARI-6822. Privilege removal API should correctly process arrays.

Siddharth Wagle 11 năm trước cách đây
mục cha
commit
b7f9612b55
15 tập tin đã thay đổi với 323 bổ sung145 xóa
  1. 20 2
      ambari-server/src/main/java/org/apache/ambari/server/api/services/PrivilegeService.java
  2. 0 30
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
  3. 30 1
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractResourceProvider.java
  4. 6 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProvider.java
  5. 8 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProvider.java
  6. 101 18
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java
  7. 17 6
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java
  8. 26 12
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/PrivilegeDAO.java
  9. 1 1
      ambari-server/src/main/java/org/apache/ambari/server/orm/entities/PrivilegeEntity.java
  10. 12 0
      ambari-server/src/test/java/org/apache/ambari/server/api/services/PrivilegeServiceTest.java
  11. 3 42
      ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java
  12. 37 0
      ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java
  13. 57 18
      ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProviderTest.java
  14. 4 4
      ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProviderTest.java
  15. 1 11
      ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProviderTest.java

+ 20 - 2
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
    *
@@ -107,10 +108,27 @@ public abstract class PrivilegeService extends BaseService {
     return handleRequest(headers, body, ui, Request.Type.PUT, createPrivilegeResource(privilegeId));
   }
 
+  /**
+   * 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));
   }
 
   /**

+ 0 - 30
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;
-  }
 }

+ 30 - 1
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;
@@ -220,6 +221,34 @@ public abstract class AbstractResourceProvider extends BaseProvider implements R
     return getRequestStatus(response, null) ;
   }
 
+  /**
+   * 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

+ 6 - 0
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;
+  }
 }

+ 8 - 0
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 ----------------------------------------------------
 

+ 101 - 18
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;
+      }
+    };
+  }
 }
 

+ 17 - 6
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 ----------------------------------------------------
 

+ 26 - 12
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,26 +48,38 @@ 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);
     return daoUtils.selectList(query);
   }
 
+  /**
+   * 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.
    *

+ 1 - 1
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);

+ 12 - 0
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;
   }
 

+ 3 - 42
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&params/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));
-
-  }
-
   }

+ 37 - 0
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&params/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 ----------------------------------------------------
 

+ 57 - 18
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);
   }
 }

+ 4 - 4
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);

+ 1 - 11
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
   }
 }