Преглед на файлове

AMBARI-6679 - Add Cluster Privilege Resource

tbeerbower преди 11 години
родител
ревизия
48f97d3997
променени са 36 файла, в които са добавени 673 реда и са изтрити 42 реда
  1. 1 0
      ambari-server/src/main/java/org/apache/ambari/server/api/resources/ClusterResourceDefinition.java
  2. 60 0
      ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterPrivilegeService.java
  3. 8 0
      ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterService.java
  4. 3 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
  5. 141 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProvider.java
  6. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
  7. 16 8
      ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java
  8. 3 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ResourceDAO.java
  9. 4 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ResourceTypeDAO.java
  10. 24 0
      ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterEntity.java
  11. 3 2
      ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ResourceEntity.java
  12. 1 1
      ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java
  13. 21 0
      ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClustersImpl.java
  14. 2 0
      ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
  15. 0 1
      ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java
  16. 2 2
      ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
  17. 2 1
      ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
  18. 2 1
      ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
  19. 2 1
      ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
  20. 2 1
      ambari-server/src/test/java/org/apache/ambari/server/api/resources/ClusterResourceDefinitionTest.java
  21. 94 0
      ambari-server/src/test/java/org/apache/ambari/server/api/services/ClusterPrivilegeServiceTest.java
  22. 152 0
      ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProviderTest.java
  23. 1 1
      ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProviderTest.java
  24. 25 0
      ambari-server/src/test/java/org/apache/ambari/server/orm/OrmTestHelper.java
  25. 36 3
      ambari-server/src/test/java/org/apache/ambari/server/orm/TestOrmImpl.java
  26. 16 0
      ambari-server/src/test/java/org/apache/ambari/server/orm/dao/ConfigGroupDAOTest.java
  27. 16 0
      ambari-server/src/test/java/org/apache/ambari/server/orm/dao/RequestScheduleDAOTest.java
  28. 26 12
      ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog150Test.java
  29. 1 1
      ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.2.3.sql
  30. 1 1
      ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.2.4.sql
  31. 1 1
      ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.2.5.sql
  32. 1 1
      ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.4.0.sql
  33. 1 1
      ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.4.1.sql
  34. 1 1
      ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.4.2.sql
  35. 1 1
      ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.4.3.sql
  36. 1 1
      ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.4.4.sql

+ 1 - 0
ambari-server/src/main/java/org/apache/ambari/server/api/resources/ClusterResourceDefinition.java

@@ -66,6 +66,7 @@ public class ClusterResourceDefinition extends BaseResourceDefinition {
     setChildren.add(new SubResourceDefinition(Resource.Type.Request));
     setChildren.add(new SubResourceDefinition(Resource.Type.Workflow));
     setChildren.add(new SubResourceDefinition(Resource.Type.ConfigGroup));
+    setChildren.add(new SubResourceDefinition(Resource.Type.ClusterPrivilege));
     setChildren.add(new SubResourceDefinition(Resource.Type.AlertDefinition));
 
     return setChildren;

+ 60 - 0
ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterPrivilegeService.java

@@ -0,0 +1,60 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing privileges and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.api.services;
+
+import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.controller.spi.Resource;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ *  Service responsible for cluster privilege resource requests.
+ */
+public class ClusterPrivilegeService extends PrivilegeService {
+
+  /**
+   * The cluster name.
+   */
+  private String clusterName;
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct a ClusterPrivilegeService.
+   *
+   * @param clusterName  the cluster name
+   */
+  public ClusterPrivilegeService(String clusterName) {
+    this.clusterName = clusterName;
+  }
+
+// ----- PrivilegeService --------------------------------------------------
+
+  @Override
+  protected ResourceInstance createPrivilegeResource(String privilegeId) {
+    Map<Resource.Type,String> mapIds = new HashMap<Resource.Type, String>();
+    mapIds.put(Resource.Type.Cluster, clusterName);
+    mapIds.put(Resource.Type.ClusterPrivilege, privilegeId);
+
+    return createResource(Resource.Type.ClusterPrivilege, mapIds);
+  }
+}
+

+ 8 - 0
ambari-server/src/main/java/org/apache/ambari/server/api/services/ClusterService.java

@@ -217,6 +217,14 @@ public class ClusterService extends BaseService {
     return new AlertDefinitionService(clusterName);
   }
 
+  /**
+   * Gets the privilege service
+   */
+  @Path("{clusterName}/privileges")
+  public PrivilegeService getPrivilegeService(@PathParam ("clusterName") String clusterName) {
+    return new ClusterPrivilegeService(clusterName);
+  }
+
   /**
    * Create a cluster resource instance.
    *

+ 3 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java

@@ -47,6 +47,7 @@ import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.internal.AbstractControllerResourceProvider;
 import org.apache.ambari.server.controller.internal.AlertDefinitionResourceProvider;
 import org.apache.ambari.server.controller.internal.BlueprintResourceProvider;
+import org.apache.ambari.server.controller.internal.ClusterPrivilegeResourceProvider;
 import org.apache.ambari.server.controller.internal.ClusterResourceProvider;
 import org.apache.ambari.server.controller.internal.PermissionResourceProvider;
 import org.apache.ambari.server.controller.internal.PrivilegeResourceProvider;
@@ -59,6 +60,7 @@ import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.PersistenceType;
 import org.apache.ambari.server.orm.dao.AlertDefinitionDAO;
 import org.apache.ambari.server.orm.dao.BlueprintDAO;
+import org.apache.ambari.server.orm.dao.ClusterDAO;
 import org.apache.ambari.server.orm.dao.GroupDAO;
 import org.apache.ambari.server.orm.dao.MemberDAO;
 import org.apache.ambari.server.orm.dao.MetainfoDAO;
@@ -550,6 +552,7 @@ public class AmbariServer {
     PrivilegeResourceProvider.init(injector.getInstance(PrivilegeDAO.class), injector.getInstance(UserDAO.class),
         injector.getInstance(GroupDAO.class), injector.getInstance(PrincipalDAO.class),
         injector.getInstance(PermissionDAO.class), injector.getInstance(ResourceDAO.class));
+    ClusterPrivilegeResourceProvider.init(injector.getInstance(ClusterDAO.class));
     ViewRegistry.init(injector.getInstance(ViewDAO.class), injector.getInstance(ViewInstanceDAO.class),
         injector.getInstance(ResourceDAO.class), injector.getInstance(ResourceTypeDAO.class),
         injector.getInstance(UserDAO.class), injector.getInstance(MemberDAO.class),

+ 141 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProvider.java

@@ -0,0 +1,141 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing privileges and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.controller.internal;
+
+import org.apache.ambari.server.controller.spi.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.apache.ambari.server.orm.dao.ClusterDAO;
+import org.apache.ambari.server.orm.entities.ClusterEntity;
+import org.apache.ambari.server.orm.entities.GroupEntity;
+import org.apache.ambari.server.orm.entities.PrivilegeEntity;
+import org.apache.ambari.server.orm.entities.UserEntity;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Resource provider for cluster privileges.
+ */
+public class ClusterPrivilegeResourceProvider extends PrivilegeResourceProvider<ClusterEntity>{
+
+  /**
+   * Data access object used to obtain privilege entities.
+   */
+  protected static ClusterDAO clusterDAO;
+
+  /**
+   * Cluster privilege property id constants.
+   */
+  protected static final String PRIVILEGE_CLUSTER_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("PrivilegeInfo", "cluster_name");
+
+  /**
+   * The property ids for a privilege resource.
+   */
+  private static Set<String> propertyIds = new HashSet<String>();
+  static {
+    propertyIds.add(PRIVILEGE_CLUSTER_NAME_PROPERTY_ID);
+    propertyIds.add(PRIVILEGE_ID_PROPERTY_ID);
+    propertyIds.add(PERMISSION_NAME_PROPERTY_ID);
+    propertyIds.add(PRINCIPAL_NAME_PROPERTY_ID);
+    propertyIds.add(PRINCIPAL_TYPE_PROPERTY_ID);
+  }
+
+  /**
+   * The key property ids for a privilege resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<Resource.Type, String>();
+  static {
+    keyPropertyIds.put(Resource.Type.Cluster, PRIVILEGE_CLUSTER_NAME_PROPERTY_ID);
+    keyPropertyIds.put(Resource.Type.ClusterPrivilege, PRIVILEGE_ID_PROPERTY_ID);
+  }
+
+
+  // ----- Constructors ------------------------------------------------------
+
+  /**
+   * Construct an ClusterPrivilegeResourceProvider.
+   */
+  public ClusterPrivilegeResourceProvider() {
+    super(propertyIds, keyPropertyIds, Resource.Type.ClusterPrivilege);
+  }
+
+
+  // ----- ClusterPrivilegeResourceProvider ---------------------------------
+
+  /**
+   * Static initialization.
+   *
+   * @param dao  the cluster data access object
+   */
+  public static void init(ClusterDAO dao) {
+    clusterDAO  = dao;
+  }
+
+
+  // ----- AbstractResourceProvider ------------------------------------------
+
+  @Override
+  public Map<Resource.Type, String> getKeyPropertyIds() {
+    return keyPropertyIds;
+  }
+
+
+  // ----- PrivilegeResourceProvider -----------------------------------------
+
+  @Override
+  public Map<Long, ClusterEntity> getResourceEntities(Map<String, Object> properties) {
+
+    String clusterName = (String) properties.get(PRIVILEGE_CLUSTER_NAME_PROPERTY_ID);
+
+    if (clusterName == null) {
+      Map<Long, ClusterEntity> resourceEntities = new HashMap<Long, ClusterEntity>();
+
+      List<ClusterEntity> clusterEntities = clusterDAO.findAll();
+
+      for (ClusterEntity clusterEntity : clusterEntities) {
+        resourceEntities.put(clusterEntity.getResource().getId(), clusterEntity);
+      }
+      return resourceEntities;
+    }
+    ClusterEntity clusterEntity = clusterDAO.findByName(clusterName);
+    return Collections.singletonMap(clusterEntity.getResource().getId(), clusterEntity);
+  }
+
+
+  // ----- helper methods ----------------------------------------------------
+
+  @Override
+  protected Resource toResource(PrivilegeEntity privilegeEntity,
+                                Map<Long, UserEntity> userEntities,
+                                Map<Long, GroupEntity> groupEntities,
+                                Map<Long, ClusterEntity> resourceEntities,
+                                Set<String> requestedIds) {
+
+    Resource resource = super.toResource(privilegeEntity, userEntities, groupEntities, resourceEntities, requestedIds);
+    if (resource != null) {
+      ClusterEntity clusterEntity = resourceEntities.get(privilegeEntity.getResource().getId());
+      setResourceProperty(resource, PRIVILEGE_CLUSTER_NAME_PROPERTY_ID, clusterEntity.getClusterName(), requestedIds);
+    }
+    return resource;
+  }
+}
+

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java

@@ -77,6 +77,8 @@ public class DefaultProviderModule extends AbstractProviderModule {
         return new ViewPrivilegeResourceProvider();
       case ViewPermission:
         return new ViewPermissionResourceProvider();
+      case ClusterPrivilege:
+        return new ClusterPrivilegeResourceProvider();
       default:
         return AbstractControllerResourceProvider.getResourceProvider(type, propertyIds,
             keyPropertyIds, managementController);

+ 16 - 8
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java

@@ -37,6 +37,7 @@ import org.apache.ambari.server.orm.dao.PrivilegeDAO;
 import org.apache.ambari.server.orm.dao.ResourceDAO;
 import org.apache.ambari.server.orm.dao.UserDAO;
 import org.apache.ambari.server.orm.entities.GroupEntity;
+import org.apache.ambari.server.orm.entities.PermissionEntity;
 import org.apache.ambari.server.orm.entities.PrincipalEntity;
 import org.apache.ambari.server.orm.entities.PrincipalTypeEntity;
 import org.apache.ambari.server.orm.entities.PrivilegeEntity;
@@ -154,7 +155,7 @@ public abstract class PrivilegeResourceProvider<T> extends AbstractResourceProvi
     for (Map<String, Object> properties : request.getProperties()) {
       createResources(getCreateCommand(properties));
     }
-    notifyCreate(Resource.Type.ViewInstance, request);
+    notifyCreate(resourceType, request);
 
     return getRequestStatus(null);
   }
@@ -177,16 +178,15 @@ public abstract class PrivilegeResourceProvider<T> extends AbstractResourceProvi
 
       resourceIds.addAll(resourceEntities.keySet());
 
-      Map<Long, PrivilegeEntity> entityMap     = new HashMap<Long, PrivilegeEntity>();
-      List<PrincipalEntity>      principalList = new LinkedList<PrincipalEntity>();
-
+      Set<PrivilegeEntity>  entitySet     = new HashSet<PrivilegeEntity>();
+      List<PrincipalEntity> principalList = new LinkedList<PrincipalEntity>();
 
       List<PrivilegeEntity> entities = privilegeDAO.findAll();
 
       for(PrivilegeEntity privilegeEntity : entities){
         if (resourceIds.contains(privilegeEntity.getResource().getId())) {
           PrincipalEntity principal = privilegeEntity.getPrincipal();
-          entityMap.put(principal.getId(), privilegeEntity);
+          entitySet.add(privilegeEntity);
           principalList.add(principal);
         }
       }
@@ -205,7 +205,7 @@ public abstract class PrivilegeResourceProvider<T> extends AbstractResourceProvi
         groupEntities.put(groupEntity.getPrincipal().getId(), groupEntity);
       }
 
-      for(PrivilegeEntity privilegeEntity : entityMap.values()){
+      for(PrivilegeEntity privilegeEntity : entitySet){
         Resource resource = toResource(privilegeEntity, userEntities, groupEntities, resourceEntities, requestedIds);
         if (predicate == null || predicate.evaluate(resource)) {
           resources.add(resource);
@@ -303,13 +303,21 @@ public abstract class PrivilegeResourceProvider<T> extends AbstractResourceProvi
    *
    * @return the new privilege entity
    */
-  protected PrivilegeEntity toEntity(Map<String, Object> properties, Long resourceId) {
+  protected PrivilegeEntity toEntity(Map<String, Object> properties, Long resourceId)
+      throws AmbariException {
     PrivilegeEntity entity         = new PrivilegeEntity();
     String          permissionName = (String) properties.get(PERMISSION_NAME_PROPERTY_ID);
     ResourceEntity  resourceEntity = resourceDAO.findById(resourceId);
 
     entity.setResource(resourceEntity);
-    entity.setPermission(permissionDAO.findPermissionByNameAndType(permissionName, resourceEntity.getResourceType()));
+
+    PermissionEntity permission =
+        permissionDAO.findPermissionByNameAndType(permissionName, resourceEntity.getResourceType());
+    if (permission == null) {
+      throw new AmbariException("Can't find a permission named " + permissionName +
+          " for the resource type " + resourceEntity.getResourceType().getName() + ".");
+    }
+    entity.setPermission(permission);
 
     String principalName = (String) properties.get(PRINCIPAL_NAME_PROPERTY_ID);
     String principalType = (String) properties.get(PRINCIPAL_TYPE_PROPERTY_ID);

+ 3 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ResourceDAO.java

@@ -22,6 +22,7 @@ import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
+import org.apache.ambari.server.orm.RequiresSession;
 import org.apache.ambari.server.orm.entities.ResourceEntity;
 
 import javax.persistence.EntityManager;
@@ -48,6 +49,7 @@ public class ResourceDAO {
    *
    * @return  a matching resource type  or null
    */
+  @RequiresSession
   public ResourceEntity findById(Long id) {
     return entityManagerProvider.get().find(ResourceEntity.class, id);
   }
@@ -57,6 +59,7 @@ public class ResourceDAO {
    *
    * @return all resources or an empty List
    */
+  @RequiresSession
   public List<ResourceEntity> findAll() {
     TypedQuery<ResourceEntity> query = entityManagerProvider.get().createQuery("SELECT resource FROM ResourceEntity resource", ResourceEntity.class);
     return daoUtils.selectList(query);

+ 4 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ResourceTypeDAO.java

@@ -22,6 +22,7 @@ import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
+import org.apache.ambari.server.orm.RequiresSession;
 import org.apache.ambari.server.orm.entities.ResourceTypeEntity;
 
 import javax.persistence.EntityManager;
@@ -48,6 +49,7 @@ public class ResourceTypeDAO {
    *
    * @return  a matching resource type or null
    */
+  @RequiresSession
   public ResourceTypeEntity findById(Integer id) {
     return entityManagerProvider.get().find(ResourceTypeEntity.class, id);
   }
@@ -59,6 +61,7 @@ public class ResourceTypeDAO {
    *
    * @return  a matching resource type or null
    */
+  @RequiresSession
   public ResourceTypeEntity findByName(String name) {
     TypedQuery<ResourceTypeEntity> query = entityManagerProvider.get().createQuery(
         "SELECT resourceType FROM ResourceTypeEntity resourceType WHERE resourceType.name = ?1",
@@ -71,6 +74,7 @@ public class ResourceTypeDAO {
    *
    * @return all resource types or an empty List
    */
+  @RequiresSession
   public List<ResourceTypeEntity> findAll() {
     TypedQuery<ResourceTypeEntity> query = entityManagerProvider.get().createQuery("SELECT resourceType FROM ResourceTypeEntity resourceType", ResourceTypeEntity.class);
     return daoUtils.selectList(query);

+ 24 - 0
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterEntity.java

@@ -96,6 +96,12 @@ public class ClusterEntity {
   @OneToMany(mappedBy = "clusterEntity", cascade = CascadeType.REMOVE)
   private Collection<ServiceConfigEntity> serviceConfigEntities;
 
+  @OneToOne(cascade = CascadeType.ALL)
+  @JoinColumns({
+      @JoinColumn(name = "resource_id", referencedColumnName = "resource_id", nullable = false)
+  })
+  private ResourceEntity resource;
+
   public Long getClusterId() {
     return clusterId;
   }
@@ -241,4 +247,22 @@ public class ClusterEntity {
   public void setServiceConfigEntities(Collection<ServiceConfigEntity> serviceConfigEntities) {
     this.serviceConfigEntities = serviceConfigEntities;
   }
+
+  /**
+   * Get the admin resource entity.
+   *
+   * @return the resource entity
+   */
+  public ResourceEntity getResource() {
+    return resource;
+  }
+
+  /**
+   * Set the admin resource entity.
+   *
+   * @param resource  the resource entity
+   */
+  public void setResource(ResourceEntity resource) {
+    this.resource = resource;
+  }
 }

+ 3 - 2
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ResourceEntity.java

@@ -94,6 +94,7 @@ public class ResourceEntity {
 
   // ----- Object overrides --------------------------------------------------
 
+
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;
@@ -101,14 +102,14 @@ public class ResourceEntity {
 
     ResourceEntity that = (ResourceEntity) o;
 
-    return id.equals(that.id) && !(resourceType != null ?
+    return !(id != null ? !id.equals(that.id) : that.id != null) && !(resourceType != null ?
         !resourceType.equals(that.resourceType) : that.resourceType != null);
 
   }
 
   @Override
   public int hashCode() {
-    int result = id.hashCode();
+    int result = id != null ? id.hashCode() : 0;
     result = 31 * result + (resourceType != null ? resourceType.hashCode() : 0);
     return result;
   }

+ 1 - 1
ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewInstanceEntity.java

@@ -146,7 +146,7 @@ public class ViewInstanceEntity implements ViewInstanceDefinition {
   @JoinColumn(name = "view_name", referencedColumnName = "view_name", nullable = false)
   private ViewEntity view;
 
-  @OneToOne
+  @OneToOne(cascade = CascadeType.ALL)
   @JoinColumns({
       @JoinColumn(name = "resource_id", referencedColumnName = "resource_id", nullable = false),
   })

+ 21 - 0
ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClustersImpl.java

@@ -31,8 +31,12 @@ import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.orm.dao.ClusterDAO;
 import org.apache.ambari.server.orm.dao.ConfigGroupHostMappingDAO;
 import org.apache.ambari.server.orm.dao.HostDAO;
+import org.apache.ambari.server.orm.dao.ResourceDAO;
+import org.apache.ambari.server.orm.dao.ResourceTypeDAO;
 import org.apache.ambari.server.orm.entities.ClusterEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
+import org.apache.ambari.server.orm.entities.ResourceEntity;
+import org.apache.ambari.server.orm.entities.ResourceTypeEntity;
 import org.apache.ambari.server.state.AgentVersion;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
@@ -82,6 +86,10 @@ public class ClustersImpl implements Clusters {
   @Inject
   HostDAO hostDAO;
   @Inject
+  ResourceDAO resourceDAO;
+  @Inject
+  ResourceTypeDAO resourceTypeDAO;
+  @Inject
   ClusterFactory clusterFactory;
   @Inject
   HostFactory hostFactory;
@@ -156,11 +164,24 @@ public class ClustersImpl implements Clusters {
         throw new DuplicateResourceException("Attempted to create a Cluster which already exists"
             + ", clusterName=" + clusterName);
       }
+
+      // create an admin resource to represent this cluster
+      ResourceTypeEntity resourceTypeEntity = resourceTypeDAO.findById(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+      if (resourceTypeEntity == null) {
+        resourceTypeEntity = new ResourceTypeEntity();
+        resourceTypeEntity.setId(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+        resourceTypeEntity.setName(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE_NAME);
+        resourceTypeEntity = resourceTypeDAO.merge(resourceTypeEntity);
+      }
+      ResourceEntity resourceEntity = new ResourceEntity();
+      resourceEntity.setResourceType(resourceTypeEntity);
+
       // retrieve new cluster id
       // add cluster id -> cluster mapping into clustersById
       ClusterEntity clusterEntity = new ClusterEntity();
       clusterEntity.setClusterName(clusterName);
       clusterEntity.setDesiredStackVersion(gson.toJson(new StackId()));
+      clusterEntity.setResource(resourceEntity);
 
       try {
         clusterDAO.create(clusterEntity);

+ 2 - 0
ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java

@@ -174,6 +174,8 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
         Integer.class, 1, 1, false));
     dbAccessor.addColumn("viewinstance", new DBAccessor.DBColumnInfo("resource_id",
         Long.class, 1, 1, false));
+    dbAccessor.addColumn("clusters", new DBAccessor.DBColumnInfo("resource_id",
+        Long.class, 1, 1, false));
 
     dbAccessor.addColumn("host_role_command", new DBAccessor.DBColumnInfo("output_log", String.class, 255, null, true));
     dbAccessor.addColumn("host_role_command", new DBAccessor.DBColumnInfo("error_log", String.class, 255, null, true));

+ 0 - 1
ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java

@@ -476,7 +476,6 @@ public class ViewRegistry {
         // create an admin resource to represent this view instance
         ResourceEntity resourceEntity = new ResourceEntity();
         resourceEntity.setResourceType(viewEntity.getResourceType());
-        resourceDAO.create(resourceEntity);
 
         instanceEntity.setResource(resourceEntity);
 

+ 2 - 2
ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql

@@ -26,7 +26,7 @@ delimiter ;
 
 # USE @schema;
 
-CREATE TABLE clusters (cluster_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, provisioning_state VARCHAR(255) NOT NULL DEFAULT 'INIT', desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
+CREATE TABLE clusters (cluster_id BIGINT NOT NULL, resource_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, provisioning_state VARCHAR(255) NOT NULL DEFAULT 'INIT', desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 CREATE TABLE clusterconfig (config_id BIGINT NOT NULL, version_tag VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, config_data LONGTEXT NOT NULL, config_attributes LONGTEXT, create_timestamp BIGINT NOT NULL, PRIMARY KEY (config_id));
 CREATE TABLE serviceconfig (service_config_id BIGINT NOT NULL, cluster_id BIGINT NOT NULL, service_name VARCHAR(255) NOT NULL, version BIGINT NOT NULL, create_timestamp BIGINT NOT NULL, PRIMARY KEY (service_config_id));
 CREATE TABLE serviceconfigmapping (service_config_id BIGINT NOT NULL, config_id BIGINT NOT NULL, PRIMARY KEY(service_config_id, config_id));
@@ -146,7 +146,7 @@ ALTER TABLE serviceconfig ADD CONSTRAINT UQ_scv_service_version UNIQUE (cluster_
 ALTER TABLE serviceconfigmapping ADD CONSTRAINT FK_scvm_scv FOREIGN KEY (service_config_id) REFERENCES serviceconfig(service_config_id);
 ALTER TABLE serviceconfigmapping ADD CONSTRAINT FK_scvm_config FOREIGN KEY (config_id) REFERENCES clusterconfig(config_id);
 ALTER TABLE serviceconfigapplication ADD CONSTRAINT FK_scva_scv FOREIGN KEY (service_config_id) REFERENCES serviceconfig(service_config_id);
-
+ALTER TABLE clusters ADD CONSTRAINT FK_clusters_resource_id FOREIGN KEY (resource_id) REFERENCES adminresource(resource_id);
 
 INSERT INTO ambari_sequences(sequence_name, value) values ('cluster_id_seq', 1);
 INSERT INTO ambari_sequences(sequence_name, value) values ('host_role_command_id_seq', 1);

+ 2 - 1
ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql

@@ -16,7 +16,7 @@
 -- limitations under the License.
 --
 
-CREATE TABLE clusters (cluster_id NUMBER(19) NOT NULL, cluster_info VARCHAR2(255) NULL, cluster_name VARCHAR2(100) NOT NULL UNIQUE, provisioning_state VARCHAR2(255) DEFAULT 'INIT' NOT NULL, desired_cluster_state VARCHAR2(255) NULL, desired_stack_version VARCHAR2(255) NULL, PRIMARY KEY (cluster_id));
+CREATE TABLE clusters (cluster_id NUMBER(19) NOT NULL, resource_id NUMBER(19) NOT NULL, cluster_info VARCHAR2(255) NULL, cluster_name VARCHAR2(100) NOT NULL UNIQUE, provisioning_state VARCHAR2(255) DEFAULT 'INIT' NOT NULL, desired_cluster_state VARCHAR2(255) NULL, desired_stack_version VARCHAR2(255) NULL, PRIMARY KEY (cluster_id));
 CREATE TABLE clusterconfig (config_id NUMBER(19) NOT NULL, version_tag VARCHAR2(255) NOT NULL, type_name VARCHAR2(255) NOT NULL, cluster_id NUMBER(19) NOT NULL, config_data CLOB NOT NULL, config_attributes CLOB, create_timestamp NUMBER(19) NOT NULL, PRIMARY KEY (config_id));
 CREATE TABLE serviceconfig (service_config_id NUMBER(19) NOT NULL, cluster_id NUMBER(19) NOT NULL, service_name VARCHAR(255) NOT NULL, version NUMBER(19) NOT NULL, create_timestamp NUMBER(19) NOT NULL, PRIMARY KEY (service_config_id));
 CREATE TABLE serviceconfigmapping (service_config_id BIGINT NOT NULL, config_id BIGINT NOT NULL, PRIMARY KEY(service_config_id, config_id));
@@ -136,6 +136,7 @@ ALTER TABLE serviceconfig ADD CONSTRAINT UQ_scv_service_version UNIQUE (cluster_
 ALTER TABLE serviceconfigmapping ADD CONSTRAINT FK_scvm_scv FOREIGN KEY (service_config_id) REFERENCES serviceconfig(service_config_id);
 ALTER TABLE serviceconfigmapping ADD CONSTRAINT FK_scvm_config FOREIGN KEY (config_id) REFERENCES clusterconfig(config_id);
 ALTER TABLE serviceconfigapplication ADD CONSTRAINT FK_scva_scv FOREIGN KEY (service_config_id) REFERENCES serviceconfig(service_config_id);
+ALTER TABLE clusters ADD CONSTRAINT FK_clusters_resource_id FOREIGN KEY (resource_id) REFERENCES adminresource(resource_id);
 
 INSERT INTO ambari_sequences(sequence_name, value) values ('host_role_command_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, value) values ('user_id_seq', 1);

+ 2 - 1
ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql

@@ -17,7 +17,7 @@
 --
 
 ------create tables ang grant privileges to db user---------
-CREATE TABLE clusters (cluster_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, provisioning_state VARCHAR(255) NOT NULL DEFAULT 'INIT', desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
+CREATE TABLE clusters (cluster_id BIGINT NOT NULL, resource_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, provisioning_state VARCHAR(255) NOT NULL DEFAULT 'INIT', desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 
 CREATE TABLE clusterconfig (config_id BIGINT NOT NULL, version_tag VARCHAR(255) NOT NULL, version BIGINT NOT NULL, type_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, config_data VARCHAR(32000) NOT NULL, config_attributes VARCHAR(32000), create_timestamp BIGINT NOT NULL, PRIMARY KEY (config_id));
 
@@ -172,6 +172,7 @@ ALTER TABLE serviceconfig ADD CONSTRAINT UQ_scv_service_version UNIQUE (cluster_
 ALTER TABLE serviceconfigmapping ADD CONSTRAINT FK_scvm_scv FOREIGN KEY (service_config_id) REFERENCES serviceconfig(service_config_id);
 ALTER TABLE serviceconfigmapping ADD CONSTRAINT FK_scvm_config FOREIGN KEY (config_id) REFERENCES clusterconfig(config_id);
 ALTER TABLE serviceconfigapplication ADD CONSTRAINT FK_scva_scv FOREIGN KEY (service_config_id) REFERENCES serviceconfig(service_config_id);
+ALTER TABLE clusters ADD CONSTRAINT FK_clusters_resource_id FOREIGN KEY (resource_id) REFERENCES adminresource(resource_id);
 
 -- Alerting Framework
 CREATE TABLE alert_definition (

+ 2 - 1
ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql

@@ -28,7 +28,7 @@ ALTER SCHEMA ambari OWNER TO :username;
 ALTER ROLE :username SET search_path TO 'ambari';
 
 ------create tables ang grant privileges to db user---------
-CREATE TABLE ambari.clusters (cluster_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, provisioning_state VARCHAR(255) NOT NULL DEFAULT 'INIT', desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
+CREATE TABLE ambari.clusters (cluster_id BIGINT NOT NULL, resource_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, provisioning_state VARCHAR(255) NOT NULL DEFAULT 'INIT', desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 GRANT ALL PRIVILEGES ON TABLE ambari.clusters TO :username;
 
 CREATE TABLE ambari.clusterconfig (config_id BIGINT NOT NULL, version_tag VARCHAR(255) NOT NULL, version BIGINT NOT NULL, type_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, config_data VARCHAR(32000) NOT NULL, config_attributes VARCHAR(32000), create_timestamp BIGINT NOT NULL, PRIMARY KEY (config_id));
@@ -238,6 +238,7 @@ ALTER TABLE ambari.viewinstance ADD CONSTRAINT FK_viewinstance_resource_id FOREI
 ALTER TABLE ambari.adminprivilege ADD CONSTRAINT FK_privilege_principal_id FOREIGN KEY (principal_id) REFERENCES ambari.adminprincipal(principal_id);
 ALTER TABLE ambari.users ADD CONSTRAINT FK_users_principal_id FOREIGN KEY (principal_id) REFERENCES ambari.adminprincipal(principal_id);
 ALTER TABLE ambari.groups ADD CONSTRAINT FK_groups_principal_id FOREIGN KEY (principal_id) REFERENCES ambari.adminprincipal(principal_id);
+ALTER TABLE ambari.clusters ADD CONSTRAINT FK_clusters_resource_id FOREIGN KEY (resource_id) REFERENCES ambari.adminresource(resource_id);
 
 -- Alerting Framework
 CREATE TABLE ambari.alert_definition (

+ 2 - 1
ambari-server/src/test/java/org/apache/ambari/server/api/resources/ClusterResourceDefinitionTest.java

@@ -50,7 +50,7 @@ public class ClusterResourceDefinitionTest {
     ResourceDefinition resource = new ClusterResourceDefinition();
     Set<SubResourceDefinition> subResources = resource.getSubResourceDefinitions();
 
-    assertEquals(8, subResources.size());
+    assertEquals(9, subResources.size());
     assertTrue(includesType(subResources, Resource.Type.Service));
     assertTrue(includesType(subResources, Resource.Type.Host));
     assertTrue(includesType(subResources, Resource.Type.Configuration));
@@ -59,6 +59,7 @@ public class ClusterResourceDefinitionTest {
     assertTrue(includesType(subResources, Resource.Type.ConfigGroup));
     assertTrue(includesType(subResources, Resource.Type.AlertDefinition));
     assertTrue(includesType(subResources, Resource.Type.ServiceConfigVersion));
+    assertTrue(includesType(subResources, Resource.Type.ClusterPrivilege));
   }
 
   @Test

+ 94 - 0
ambari-server/src/test/java/org/apache/ambari/server/api/services/ClusterPrivilegeServiceTest.java

@@ -0,0 +1,94 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing privileges and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.api.services;
+
+import org.apache.ambari.server.api.resources.ResourceInstance;
+import org.apache.ambari.server.api.services.parsers.RequestBodyParser;
+import org.apache.ambari.server.api.services.serializers.ResultSerializer;
+
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.UriInfo;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Unit tests for ClusterPrivilegeService.
+ */
+public class ClusterPrivilegeServiceTest extends BaseServiceTest {
+
+
+  public List<ServiceTestInvocation> getTestInvocations() throws Exception {
+    List<ServiceTestInvocation> listInvocations = new ArrayList<ServiceTestInvocation>();
+
+    //getPrivilege
+    ClusterPrivilegeService privilegeService = new TestClusterPrivilegeService("c1");
+    Method m = privilegeService.getClass().getMethod("getPrivilege", HttpHeaders.class, UriInfo.class, String.class);
+    Object[] args = new Object[] {getHttpHeaders(), getUriInfo(), "privilegename"};
+    listInvocations.add(new ServiceTestInvocation(Request.Type.GET, privilegeService, m, args, null));
+
+    //getPrivileges
+    privilegeService = new TestClusterPrivilegeService("c1");
+    m = privilegeService.getClass().getMethod("getPrivileges", HttpHeaders.class, UriInfo.class);
+    args = new Object[] {getHttpHeaders(), getUriInfo()};
+    listInvocations.add(new ServiceTestInvocation(Request.Type.GET, privilegeService, m, args, null));
+
+    //createPrivilege
+    privilegeService = new TestClusterPrivilegeService("c1");
+    m = privilegeService.getClass().getMethod("createPrivilege", String.class, HttpHeaders.class, UriInfo.class);
+    args = new Object[] {"body", getHttpHeaders(), getUriInfo()};
+    listInvocations.add(new ServiceTestInvocation(Request.Type.POST, privilegeService, m, args, "body"));
+
+    //deletePrivilege
+    privilegeService = new TestClusterPrivilegeService("c1");
+    m = privilegeService.getClass().getMethod("deletePrivilege", HttpHeaders.class, UriInfo.class, String.class);
+    args = new Object[] {getHttpHeaders(), getUriInfo(), "privilegename"};
+    listInvocations.add(new ServiceTestInvocation(Request.Type.DELETE, privilegeService, m, args, null));
+
+    return listInvocations;
+  }
+
+
+  private class TestClusterPrivilegeService extends ClusterPrivilegeService {
+
+    private TestClusterPrivilegeService(String clusterName) {
+      super(clusterName);
+    }
+
+    @Override
+    protected ResourceInstance createPrivilegeResource(String clusterName) {
+      return getTestResource();
+    }
+
+    @Override
+    RequestFactory getRequestFactory() {
+      return getTestRequestFactory();
+    }
+
+    @Override
+    protected RequestBodyParser getBodyParser() {
+      return getTestBodyParser();
+    }
+
+    @Override
+    protected ResultSerializer getResultSerializer() {
+      return getTestResultSerializer();
+    }
+  }
+}

+ 152 - 0
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProviderTest.java

@@ -0,0 +1,152 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+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.ClusterDAO;
+import org.apache.ambari.server.orm.dao.GroupDAO;
+import org.apache.ambari.server.orm.dao.PermissionDAO;
+import org.apache.ambari.server.orm.dao.PrincipalDAO;
+import org.apache.ambari.server.orm.dao.PrivilegeDAO;
+import org.apache.ambari.server.orm.dao.ResourceDAO;
+import org.apache.ambari.server.orm.dao.UserDAO;
+import org.apache.ambari.server.orm.entities.ClusterEntity;
+import org.apache.ambari.server.orm.entities.GroupEntity;
+import org.apache.ambari.server.orm.entities.PermissionEntity;
+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.UserEntity;
+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;
+
+/**
+ * ClusterPrivilegeResourceProvider tests.
+ */
+public class ClusterPrivilegeResourceProviderTest {
+  private final static PrivilegeDAO privilegeDAO = createStrictMock(PrivilegeDAO.class);
+  private final static UserDAO userDAO = createStrictMock(UserDAO.class);
+  private final static GroupDAO groupDAO = createStrictMock(GroupDAO.class);
+  private final static PrincipalDAO principalDAO = createStrictMock(PrincipalDAO.class);
+  private final static PermissionDAO permissionDAO = createStrictMock(PermissionDAO.class);
+  private final static ResourceDAO resourceDAO = createStrictMock(ResourceDAO.class);
+  private final static ClusterDAO clusterDAO = createStrictMock(ClusterDAO.class);
+
+  @BeforeClass
+  public static void initClass() {
+    PrivilegeResourceProvider.init(privilegeDAO, userDAO, groupDAO, principalDAO, permissionDAO, resourceDAO);
+    ClusterPrivilegeResourceProvider.init(clusterDAO);
+  }
+
+  @Before
+  public void resetGlobalMocks() {
+    reset(privilegeDAO, userDAO, groupDAO, principalDAO, permissionDAO, resourceDAO);
+  }
+
+  @Test
+  public void testGetResources() throws Exception {
+
+    List<PrivilegeEntity> privilegeEntities = new LinkedList<PrivilegeEntity>();
+
+    PrivilegeEntity privilegeEntity = createNiceMock(PrivilegeEntity.class);
+    ClusterEntity clusterEntity = createNiceMock(ClusterEntity.class);
+    ResourceEntity resourceEntity = createNiceMock(ResourceEntity.class);
+    UserEntity userEntity = createNiceMock(UserEntity.class);
+    PrincipalEntity principalEntity = createNiceMock(PrincipalEntity.class);
+    PrincipalTypeEntity principalTypeEntity = createNiceMock(PrincipalTypeEntity.class);
+    PermissionEntity permissionEntity = createNiceMock(PermissionEntity.class);
+
+    List<PrincipalEntity> principalEntities = new LinkedList<PrincipalEntity>();
+    principalEntities.add(principalEntity);
+
+    List<UserEntity> userEntities = new LinkedList<UserEntity>();
+    userEntities.add(userEntity);
+
+    privilegeEntities.add(privilegeEntity);
+
+    expect(privilegeDAO.findAll()).andReturn(privilegeEntities);
+    expect(privilegeEntity.getResource()).andReturn(resourceEntity).anyTimes();
+    expect(privilegeEntity.getPrincipal()).andReturn(principalEntity).anyTimes();
+    expect(privilegeEntity.getPermission()).andReturn(permissionEntity).anyTimes();
+    expect(resourceEntity.getId()).andReturn(20L).anyTimes();
+    expect(principalEntity.getId()).andReturn(20L).anyTimes();
+    expect(userEntity.getPrincipal()).andReturn(principalEntity).anyTimes();
+    expect(userEntity.getUserName()).andReturn("joe").anyTimes();
+    expect(permissionEntity.getPermissionName()).andReturn("CLUSTER.OPERATE").anyTimes();
+    expect(principalEntity.getPrincipalType()).andReturn(principalTypeEntity).anyTimes();
+    expect(principalTypeEntity.getName()).andReturn("USER").anyTimes();
+    expect(clusterEntity.getResource()).andReturn(resourceEntity);
+
+    List<ClusterEntity> clusterEntities = new LinkedList<ClusterEntity>();
+    clusterEntities.add(clusterEntity);
+    expect(clusterDAO.findAll()).andReturn(clusterEntities);
+
+    expect(userDAO.findUsersByPrincipal(principalEntities)).andReturn(userEntities);
+    expect(groupDAO.findGroupsByPrincipal(principalEntities)).andReturn(Collections.<GroupEntity>emptyList());
+
+    replay(privilegeDAO, userDAO, groupDAO, principalDAO, permissionDAO, resourceDAO, clusterDAO, privilegeEntity,
+        clusterEntity, resourceEntity, userEntity, principalEntity, permissionEntity, principalTypeEntity);
+
+    PrivilegeResourceProvider provider = new ClusterPrivilegeResourceProvider();
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), null);
+
+    Assert.assertEquals(1, resources.size());
+
+    Resource resource = resources.iterator().next();
+
+    Assert.assertEquals("CLUSTER.OPERATE", resource.getPropertyValue(AmbariPrivilegeResourceProvider.PERMISSION_NAME_PROPERTY_ID));
+    Assert.assertEquals("joe", resource.getPropertyValue(AmbariPrivilegeResourceProvider.PRINCIPAL_NAME_PROPERTY_ID));
+    Assert.assertEquals("USER", resource.getPropertyValue(AmbariPrivilegeResourceProvider.PRINCIPAL_TYPE_PROPERTY_ID));
+
+    verify(privilegeDAO, userDAO, groupDAO, principalDAO, permissionDAO, resourceDAO, clusterDAO, privilegeEntity,
+        resourceEntity, clusterEntity, userEntity, principalEntity, permissionEntity, principalTypeEntity);
+  }
+
+  @Test
+  public void testUpdateResources() throws Exception {
+    PrivilegeResourceProvider provider = new ClusterPrivilegeResourceProvider();
+
+    Request request = createNiceMock(Request.class);
+
+    try {
+      provider.updateResources(request, null);
+      Assert.fail("expected UnsupportedOperationException");
+    } catch (UnsupportedOperationException e) {
+      // expected
+    }
+  }
+}
+

+ 1 - 1
ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProviderTest.java

@@ -71,7 +71,7 @@ public class ViewPrivilegeResourceProviderTest {
 
   @BeforeClass
   public static void initClass() {
-    AmbariPrivilegeResourceProvider.init(privilegeDAO, userDAO, groupDAO, principalDAO, permissionDAO, resourceDAO);
+    PrivilegeResourceProvider.init(privilegeDAO, userDAO, groupDAO, principalDAO, permissionDAO, resourceDAO);
   }
 
   @Before

+ 25 - 0
ambari-server/src/test/java/org/apache/ambari/server/orm/OrmTestHelper.java

@@ -38,6 +38,7 @@ import org.apache.ambari.server.orm.dao.ClusterDAO;
 import org.apache.ambari.server.orm.dao.HostDAO;
 import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
 import org.apache.ambari.server.orm.dao.RequestDAO;
+import org.apache.ambari.server.orm.dao.ResourceTypeDAO;
 import org.apache.ambari.server.orm.dao.RoleDAO;
 import org.apache.ambari.server.orm.dao.StageDAO;
 import org.apache.ambari.server.orm.dao.UserDAO;
@@ -52,6 +53,8 @@ import org.apache.ambari.server.orm.entities.HostStateEntity;
 import org.apache.ambari.server.orm.entities.PrincipalEntity;
 import org.apache.ambari.server.orm.entities.PrincipalTypeEntity;
 import org.apache.ambari.server.orm.entities.RequestEntity;
+import org.apache.ambari.server.orm.entities.ResourceEntity;
+import org.apache.ambari.server.orm.entities.ResourceTypeEntity;
 import org.apache.ambari.server.orm.entities.RoleEntity;
 import org.apache.ambari.server.orm.entities.StageEntity;
 import org.apache.ambari.server.orm.entities.UserEntity;
@@ -99,8 +102,17 @@ public class OrmTestHelper {
    */
   @Transactional
   public void createDefaultData() {
+
+    ResourceTypeEntity resourceTypeEntity =  new ResourceTypeEntity();
+    resourceTypeEntity.setId(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+    resourceTypeEntity.setName(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE_NAME);
+
+    ResourceEntity resourceEntity = new ResourceEntity();
+    resourceEntity.setResourceType(resourceTypeEntity);
+
     ClusterEntity clusterEntity = new ClusterEntity();
     clusterEntity.setClusterName("test_cluster1");
+    clusterEntity.setResource(resourceEntity);
     clusterEntity.setClusterInfo("test_cluster_info1");
 
     HostEntity host1 = new HostEntity();
@@ -142,6 +154,8 @@ public class OrmTestHelper {
 
     getEntityManager().persist(host1);
     getEntityManager().persist(host2);
+    getEntityManager().persist(resourceTypeEntity);
+    getEntityManager().persist(resourceEntity);
     getEntityManager().persist(clusterEntity);
     getEntityManager().persist(hostStateEntity1);
     getEntityManager().persist(hostStateEntity2);
@@ -265,11 +279,22 @@ public class OrmTestHelper {
    */
   @Transactional
   public Long createCluster() {
+    ResourceTypeDAO resourceTypeDAO = injector.getInstance(ResourceTypeDAO.class);
+
+    ResourceTypeEntity resourceTypeEntity =  new ResourceTypeEntity();
+    resourceTypeEntity.setId(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+    resourceTypeEntity.setName(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE_NAME);
+    resourceTypeEntity = resourceTypeDAO.merge(resourceTypeEntity);
+
+    ResourceEntity resourceEntity = new ResourceEntity();
+    resourceEntity.setResourceType(resourceTypeEntity);
+
     ClusterDAO clusterDAO = injector.getInstance(ClusterDAO.class);
 
     ClusterEntity clusterEntity = new ClusterEntity();
     clusterEntity.setClusterName("test_cluster1");
     clusterEntity.setClusterInfo("test_cluster_info1");
+    clusterEntity.setResource(resourceEntity);
 
     clusterDAO.create(clusterEntity);
 

+ 36 - 3
ambari-server/src/test/java/org/apache/ambari/server/orm/TestOrmImpl.java

@@ -21,10 +21,8 @@ package org.apache.ambari.server.orm;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.persist.PersistService;
-import com.google.inject.persist.jpa.AmbariJpaPersistService;
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
-import org.apache.ambari.server.actionmanager.Stage;
 import org.apache.ambari.server.orm.dao.*;
 import org.apache.ambari.server.orm.entities.*;
 import org.junit.*;
@@ -62,8 +60,22 @@ public class TestOrmImpl extends Assert {
   public void testEmptyPersistentCollection() {
     String testClusterName = "test_cluster2";
 
+    ResourceTypeDAO resourceTypeDAO = injector.getInstance(ResourceTypeDAO.class);
+
+    // create an admin resource to represent this cluster
+    ResourceTypeEntity resourceTypeEntity = resourceTypeDAO.findById(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+    if (resourceTypeEntity == null) {
+      resourceTypeEntity = new ResourceTypeEntity();
+      resourceTypeEntity.setId(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+      resourceTypeEntity.setName(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE_NAME);
+      resourceTypeEntity = resourceTypeDAO.merge(resourceTypeEntity);
+    }
+    ResourceEntity resourceEntity = new ResourceEntity();
+    resourceEntity.setResourceType(resourceTypeEntity);
+
     ClusterEntity clusterEntity = new ClusterEntity();
     clusterEntity.setClusterName(testClusterName);
+    clusterEntity.setResource(resourceEntity);
     ClusterDAO clusterDAO = injector.getInstance(ClusterDAO.class);
     clusterDAO.create(clusterEntity);
     clusterEntity = clusterDAO.findByName(clusterEntity.getClusterName());
@@ -244,9 +256,22 @@ public class TestOrmImpl extends Assert {
   @Test
   public void testConcurrentModification() throws InterruptedException {
     final ClusterDAO clusterDAO = injector.getInstance(ClusterDAO.class);
-    final AmbariJpaPersistService ambariJpaPersistService = injector.getInstance(AmbariJpaPersistService.class);
+    final ResourceTypeDAO resourceTypeDAO = injector.getInstance(ResourceTypeDAO.class);
+
+    // create an admin resource to represent this cluster
+    ResourceTypeEntity resourceTypeEntity = resourceTypeDAO.findById(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+    if (resourceTypeEntity == null) {
+      resourceTypeEntity = new ResourceTypeEntity();
+      resourceTypeEntity.setId(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+      resourceTypeEntity.setName(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE_NAME);
+      resourceTypeEntity = resourceTypeDAO.merge(resourceTypeEntity);
+    }
+    ResourceEntity resourceEntity = new ResourceEntity();
+    resourceEntity.setResourceType(resourceTypeEntity);
+
     ClusterEntity clusterEntity = new ClusterEntity();
     clusterEntity.setClusterName("cluster1");
+    clusterEntity.setResource(resourceEntity);
     clusterDAO.create(clusterEntity);
 //    assertFalse(ambariJpaPersistService.isWorking());
 
@@ -285,11 +310,16 @@ public class TestOrmImpl extends Assert {
 
     List<ClusterEntity> result = clusterDAO.findAll();
 
+    final ResourceTypeEntity finalResourceTypeEntity = resourceTypeEntity;
+
     thread = new Thread(){
       @Override
       public void run() {
+        ResourceEntity resourceEntity = new ResourceEntity();
+        resourceEntity.setResourceType(finalResourceTypeEntity);
         ClusterEntity temp = new ClusterEntity();
         temp.setClusterName("temp_cluster");
+        temp.setResource(resourceEntity);
         clusterDAO.create(temp);
       }
     };
@@ -303,8 +333,11 @@ public class TestOrmImpl extends Assert {
     thread = new Thread(){
       @Override
       public void run() {
+        ResourceEntity resourceEntity = new ResourceEntity();
+        resourceEntity.setResourceType(finalResourceTypeEntity);
         ClusterEntity temp = new ClusterEntity();
         temp.setClusterName("temp_cluster2");
+        temp.setResource(resourceEntity);
         clusterDAO.create(temp);
       }
     };

+ 16 - 0
ambari-server/src/test/java/org/apache/ambari/server/orm/dao/ConfigGroupDAOTest.java

@@ -31,6 +31,8 @@ import org.apache.ambari.server.orm.entities.ConfigGroupConfigMappingEntity;
 import org.apache.ambari.server.orm.entities.ConfigGroupEntity;
 import org.apache.ambari.server.orm.entities.ConfigGroupHostMappingEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
+import org.apache.ambari.server.orm.entities.ResourceEntity;
+import org.apache.ambari.server.orm.entities.ResourceTypeEntity;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -46,6 +48,7 @@ public class ConfigGroupDAOTest {
   private ConfigGroupConfigMappingDAO configGroupConfigMappingDAO;
   private ConfigGroupHostMappingDAO configGroupHostMappingDAO;
   private HostDAO hostDAO;
+  private ResourceTypeDAO resourceTypeDAO;
 
   @Before
   public void setup() throws Exception {
@@ -59,6 +62,7 @@ public class ConfigGroupDAOTest {
     configGroupHostMappingDAO = injector.getInstance
       (ConfigGroupHostMappingDAO.class);
     hostDAO = injector.getInstance(HostDAO.class);
+    resourceTypeDAO = injector.getInstance(ResourceTypeDAO.class);
   }
 
   @After
@@ -71,8 +75,20 @@ public class ConfigGroupDAOTest {
          List<ClusterConfigEntity> configs) throws Exception {
     ConfigGroupEntity configGroupEntity = new ConfigGroupEntity();
 
+    // create an admin resource to represent this cluster
+    ResourceTypeEntity resourceTypeEntity = resourceTypeDAO.findById(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+    if (resourceTypeEntity == null) {
+      resourceTypeEntity = new ResourceTypeEntity();
+      resourceTypeEntity.setId(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+      resourceTypeEntity.setName(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE_NAME);
+      resourceTypeEntity = resourceTypeDAO.merge(resourceTypeEntity);
+    }
+    ResourceEntity resourceEntity = new ResourceEntity();
+    resourceEntity.setResourceType(resourceTypeEntity);
+
     ClusterEntity clusterEntity = new ClusterEntity();
     clusterEntity.setClusterName(clusterName);
+    clusterEntity.setResource(resourceEntity);
     clusterDAO.create(clusterEntity);
 
     configGroupEntity.setClusterEntity(clusterEntity);

+ 16 - 0
ambari-server/src/test/java/org/apache/ambari/server/orm/dao/RequestScheduleDAOTest.java

@@ -28,6 +28,8 @@ import org.apache.ambari.server.orm.entities.ClusterEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.orm.entities.RequestScheduleBatchRequestEntity;
 import org.apache.ambari.server.orm.entities.RequestScheduleEntity;
+import org.apache.ambari.server.orm.entities.ResourceEntity;
+import org.apache.ambari.server.orm.entities.ResourceTypeEntity;
 import org.apache.ambari.server.state.scheduler.BatchRequest;
 import org.junit.After;
 import org.junit.Before;
@@ -41,6 +43,7 @@ public class RequestScheduleDAOTest {
   private ClusterDAO clusterDAO;
   private RequestScheduleDAO requestScheduleDAO;
   private RequestScheduleBatchRequestDAO batchRequestDAO;
+  private ResourceTypeDAO resourceTypeDAO;
   private String testUri = "http://localhost/blah";
   private String testBody = "ValidJson";
   private String testType = BatchRequest.Type.POST.name();
@@ -55,6 +58,7 @@ public class RequestScheduleDAOTest {
     clusterDAO = injector.getInstance(ClusterDAO.class);
     requestScheduleDAO = injector.getInstance(RequestScheduleDAO.class);
     batchRequestDAO = injector.getInstance(RequestScheduleBatchRequestDAO.class);
+    resourceTypeDAO = injector.getInstance(ResourceTypeDAO.class);
   }
 
   @After
@@ -65,8 +69,20 @@ public class RequestScheduleDAOTest {
   private RequestScheduleEntity createScheduleEntity() {
     RequestScheduleEntity scheduleEntity = new RequestScheduleEntity();
 
+    // create an admin resource to represent this cluster
+    ResourceTypeEntity resourceTypeEntity = resourceTypeDAO.findById(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+    if (resourceTypeEntity == null) {
+      resourceTypeEntity = new ResourceTypeEntity();
+      resourceTypeEntity.setId(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+      resourceTypeEntity.setName(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE_NAME);
+      resourceTypeEntity = resourceTypeDAO.merge(resourceTypeEntity);
+    }
+    ResourceEntity resourceEntity = new ResourceEntity();
+    resourceEntity.setResourceType(resourceTypeEntity);
+
     ClusterEntity clusterEntity = new ClusterEntity();
     clusterEntity.setClusterName("c1");
+    clusterEntity.setResource(resourceEntity);
     clusterDAO.create(clusterEntity);
 
     scheduleEntity.setClusterEntity(clusterEntity);

+ 26 - 12
ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog150Test.java

@@ -20,9 +20,7 @@ package org.apache.ambari.server.upgrade;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.persist.PersistService;
-
 import junit.framework.Assert;
-
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
@@ -31,6 +29,7 @@ import org.apache.ambari.server.orm.dao.ClusterServiceDAO;
 import org.apache.ambari.server.orm.dao.HostComponentDesiredStateDAO;
 import org.apache.ambari.server.orm.dao.HostDAO;
 import org.apache.ambari.server.orm.dao.KeyValueDAO;
+import org.apache.ambari.server.orm.dao.ResourceTypeDAO;
 import org.apache.ambari.server.orm.entities.ClusterConfigEntity;
 import org.apache.ambari.server.orm.entities.ClusterConfigMappingEntity;
 import org.apache.ambari.server.orm.entities.ClusterEntity;
@@ -39,6 +38,8 @@ import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.orm.entities.KeyValueEntity;
+import org.apache.ambari.server.orm.entities.ResourceEntity;
+import org.apache.ambari.server.orm.entities.ResourceTypeEntity;
 import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.ServiceDesiredStateEntity;
 import org.apache.ambari.server.state.HostComponentAdminState;
@@ -46,11 +47,10 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
+import javax.persistence.EntityManager;
 import java.util.ArrayList;
 import java.util.Collections;
 
-import javax.persistence.EntityManager;
-
 public class UpgradeCatalog150Test {
   private Injector injector;
   private final String CLUSTER_NAME = "c1";
@@ -70,11 +70,25 @@ public class UpgradeCatalog150Test {
   }
 
   private ClusterEntity createCluster() {
+    ResourceTypeDAO resourceTypeDAO = injector.getInstance(ResourceTypeDAO.class);
+
+    // create an admin resource to represent this cluster
+    ResourceTypeEntity resourceTypeEntity = resourceTypeDAO.findById(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+    if (resourceTypeEntity == null) {
+      resourceTypeEntity = new ResourceTypeEntity();
+      resourceTypeEntity.setId(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+      resourceTypeEntity.setName(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE_NAME);
+      resourceTypeEntity = resourceTypeDAO.merge(resourceTypeEntity);
+    }
+    ResourceEntity resourceEntity = new ResourceEntity();
+    resourceEntity.setResourceType(resourceTypeEntity);
+
     ClusterDAO clusterDAO = injector.getInstance(ClusterDAO.class);
     ClusterEntity clusterEntity = new ClusterEntity();
     clusterEntity.setClusterId(1L);
     clusterEntity.setClusterName(CLUSTER_NAME);
     clusterEntity.setDesiredStackVersion(DESIRED_STACK_VERSION);
+    clusterEntity.setResource(resourceEntity);
     clusterDAO.create(clusterEntity);
     return clusterEntity;
   }
@@ -95,14 +109,14 @@ public class UpgradeCatalog150Test {
     ClusterServiceEntity clusterServiceEntity = new ClusterServiceEntity();
     clusterServiceEntity.setClusterEntity(clusterEntity);
     clusterServiceEntity.setServiceName(serviceName);
-    
+
     ServiceDesiredStateEntity serviceDesiredStateEntity = new ServiceDesiredStateEntity();
     serviceDesiredStateEntity.setDesiredStackVersion(DESIRED_STACK_VERSION);
     serviceDesiredStateEntity.setClusterServiceEntity(clusterServiceEntity);
-    
+
     clusterServiceEntity.setServiceDesiredStateEntity(serviceDesiredStateEntity);
     clusterEntity.getClusterServiceEntities().add(clusterServiceEntity);
-    
+
     clusterDAO.merge(clusterEntity);
     
     return clusterServiceEntity;
@@ -126,22 +140,22 @@ public class UpgradeCatalog150Test {
     componentDesiredStateEntity.setClusterServiceEntity(clusterServiceEntity);
     componentDesiredStateEntity.setComponentName(componentName);
     componentDesiredStateEntity.setHostComponentStateEntities(new ArrayList<HostComponentStateEntity>());
-    
+
     HostComponentDesiredStateEntity hostComponentDesiredStateEntity = new HostComponentDesiredStateEntity();
     hostComponentDesiredStateEntity.setAdminState(HostComponentAdminState.INSERVICE);
     hostComponentDesiredStateEntity.setServiceComponentDesiredStateEntity(componentDesiredStateEntity);
     hostComponentDesiredStateEntity.setHostEntity(hostEntity);
-    
+
     HostComponentStateEntity hostComponentStateEntity = new HostComponentStateEntity();
     hostComponentStateEntity.setHostEntity(hostEntity);
     hostComponentStateEntity.setHostName(hostEntity.getHostName());
     hostComponentStateEntity.setCurrentStackVersion(clusterEntity.getDesiredStackVersion());
     hostComponentStateEntity.setServiceComponentDesiredStateEntity(componentDesiredStateEntity);
-    
+
     componentDesiredStateEntity.getHostComponentStateEntities().add(hostComponentStateEntity);
     componentDesiredStateEntity.setHostComponentDesiredStateEntities(new ArrayList<HostComponentDesiredStateEntity>());
     componentDesiredStateEntity.getHostComponentDesiredStateEntities().add(hostComponentDesiredStateEntity);
-    
+
     hostEntity.getHostComponentStateEntities().add(hostComponentStateEntity);
     hostEntity.getHostComponentDesiredStateEntities().add(hostComponentDesiredStateEntity);
     clusterServiceEntity.getServiceComponentDesiredStateEntities().add(componentDesiredStateEntity);
@@ -175,7 +189,7 @@ public class UpgradeCatalog150Test {
     final ClusterEntity clusterEntity = createCluster();
     final ClusterServiceEntity clusterServiceEntityMR = addService(clusterEntity, "MAPREDUCE");
     final HostEntity hostEntity = createHost(clusterEntity);
-    
+
     executeInTransaction(new Runnable() {
       @Override
       public void run() {

+ 1 - 1
ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.2.3.sql

@@ -16,7 +16,7 @@
 -- limitations under the License.
 
 
-CREATE TABLE clusters (cluster_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
+CREATE TABLE clusters (cluster_id BIGINT NOT NULL, resource_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 
 CREATE TABLE clusterconfig (version_tag VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, config_data VARCHAR(32000) NOT NULL, create_timestamp BIGINT NOT NULL, PRIMARY KEY (cluster_id, type_name, version_tag));
 

+ 1 - 1
ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.2.4.sql

@@ -17,7 +17,7 @@
 --
 
 
-CREATE TABLE clusters (cluster_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
+CREATE TABLE clusters (cluster_id BIGINT NOT NULL, resource_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 
 
 

+ 1 - 1
ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.2.5.sql

@@ -16,7 +16,7 @@
 -- limitations under the License.
 --
 
-CREATE TABLE clusters (cluster_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
+CREATE TABLE clusters (cluster_id BIGINT NOT NULL, resource_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 
 
 

+ 1 - 1
ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.4.0.sql

@@ -17,7 +17,7 @@
 --
 
 
-CREATE TABLE clusters (cluster_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
+CREATE TABLE clusters (cluster_id BIGINT NOT NULL, resource_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 
 
 

+ 1 - 1
ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.4.1.sql

@@ -17,7 +17,7 @@
 --
 
 ------create tables ang grant privileges to db user---------
-CREATE TABLE clusters (cluster_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
+CREATE TABLE clusters (cluster_id BIGINT NOT NULL, resource_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 
 
 CREATE TABLE clusterconfig (version_tag VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, config_data VARCHAR(32000) NOT NULL, create_timestamp BIGINT NOT NULL, PRIMARY KEY (cluster_id, type_name, version_tag));

+ 1 - 1
ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.4.2.sql

@@ -17,7 +17,7 @@
 --
 
 ------create tables ang grant privileges to db user---------
-CREATE TABLE clusters (cluster_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
+CREATE TABLE clusters (cluster_id BIGINT NOT NULL, resource_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 
 
 CREATE TABLE clusterconfig (version_tag VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, config_data VARCHAR(32000) NOT NULL, create_timestamp BIGINT NOT NULL, PRIMARY KEY (cluster_id, type_name, version_tag));

+ 1 - 1
ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.4.3.sql

@@ -17,7 +17,7 @@
 --
 
 ------create tables ang grant privileges to db user---------
-CREATE TABLE clusters (cluster_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
+CREATE TABLE clusters (cluster_id BIGINT NOT NULL, resource_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 
 
 CREATE TABLE clusterconfig (version_tag VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, config_data VARCHAR(32000) NOT NULL, create_timestamp BIGINT NOT NULL, PRIMARY KEY (cluster_id, type_name, version_tag));

+ 1 - 1
ambari-server/src/test/resources/ddl-scripts/Ambari-DDL-Derby-1.4.4.sql

@@ -17,7 +17,7 @@
 --
 
 ------create tables ang grant privileges to db user---------
-CREATE TABLE clusters (cluster_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
+CREATE TABLE clusters (cluster_id BIGINT NOT NULL, resource_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 
 CREATE TABLE clusterconfig (version_tag VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, config_data VARCHAR(32000) NOT NULL, create_timestamp BIGINT NOT NULL, PRIMARY KEY (cluster_id, type_name, version_tag));