You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by tb...@apache.org on 2014/09/08 22:13:24 UTC

git commit: AMBARI-7190 - Views: attempting to access views during extraction throws exception

Repository: ambari
Updated Branches:
  refs/heads/trunk c0f9fdecc -> 32cb4c546


AMBARI-7190 - Views: attempting to access views during extraction throws exception


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/32cb4c54
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/32cb4c54
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/32cb4c54

Branch: refs/heads/trunk
Commit: 32cb4c546488bb28155d101a213747a7764eb0e9
Parents: c0f9fde
Author: tbeerbower <tb...@hortonworks.com>
Authored: Mon Sep 8 12:23:41 2014 -0400
Committer: tbeerbower <tb...@hortonworks.com>
Committed: Mon Sep 8 16:12:31 2014 -0400

----------------------------------------------------------------------
 .../internal/PrivilegeResourceProvider.java     |   6 +-
 .../internal/ViewInstanceResourceProvider.java  |  44 ++++--
 .../ViewPermissionResourceProvider.java         |   8 +-
 .../internal/ViewPrivilegeResourceProvider.java |  28 +++-
 .../internal/ViewVersionResourceProvider.java   |   6 +-
 .../ambari/server/orm/entities/ViewEntity.java  |   9 ++
 .../ViewInstanceResourceProviderTest.java       | 123 +++++++++++++++++
 .../ViewPermissionResourceProviderTest.java     | 133 +++++++++++++++++++
 .../ViewPrivilegeResourceProviderTest.java      |   8 +-
 .../server/orm/entities/ViewEntityTest.java     |  17 +++
 10 files changed, 355 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/32cb4c54/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java
index f0bcaf8..ae9cb52 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java
@@ -222,7 +222,7 @@ public abstract class PrivilegeResourceProvider<T> extends AbstractResourceProvi
 
       for(PrivilegeEntity privilegeEntity : entitySet){
         Resource resource = toResource(privilegeEntity, userEntities, groupEntities, resourceEntities, requestedIds);
-        if (predicate == null || predicate.evaluate(resource)) {
+        if (resource != null && (predicate == null || predicate.evaluate(resource))) {
           resources.add(resource);
         }
       }
@@ -441,6 +441,10 @@ public abstract class PrivilegeResourceProvider<T> extends AbstractResourceProvi
         if (resource == null) {
           // request body is empty, use predicate instead
           resource = getResourceEntityId(predicate);
+          // if the predicate does not identify a single resource or the resource is not available for update
+          if (resource == null) {
+            return null;
+          }
         }
         final List<PrivilegeEntity> currentPrivileges = privilegeDAO.findByResourceId(resource);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/32cb4c54/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
index ce23e79..09b63a4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
@@ -145,13 +145,16 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
       String instanceName = (String) propertyMap.get(INSTANCE_NAME_PROPERTY_ID);
 
       for (ViewEntity viewDefinition : viewRegistry.getDefinitions()){
-        if (viewName == null || viewName.equals(viewDefinition.getCommonName())) {
-          for (ViewInstanceEntity viewInstanceDefinition : viewRegistry.getInstanceDefinitions(viewDefinition)) {
-            if (instanceName == null || instanceName.equals(viewInstanceDefinition.getName())) {
-              if (viewVersion == null || viewVersion.equals(viewDefinition.getVersion())) {
-                if (includeInstance(viewInstanceDefinition, true)) {
-                  Resource resource = toResource(viewInstanceDefinition, requestedIds);
-                  resources.add(resource);
+        // do not report instances for views that are not loaded.
+        if (viewDefinition.isLoaded()){
+          if (viewName == null || viewName.equals(viewDefinition.getCommonName())) {
+            for (ViewInstanceEntity viewInstanceDefinition : viewRegistry.getInstanceDefinitions(viewDefinition)) {
+              if (instanceName == null || instanceName.equals(viewInstanceDefinition.getName())) {
+                if (viewVersion == null || viewVersion.equals(viewDefinition.getVersion())) {
+                  if (includeInstance(viewInstanceDefinition, true)) {
+                    Resource resource = toResource(viewInstanceDefinition, requestedIds);
+                    resources.add(resource);
+                  }
                 }
               }
             }
@@ -336,6 +339,20 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
           ViewRegistry       viewRegistry   = ViewRegistry.getInstance();
           ViewInstanceEntity instanceEntity = toEntity(properties);
 
+          ViewEntity viewEntity = instanceEntity.getViewEntity();
+          String     viewName   = viewEntity.getCommonName();
+          String     version    = viewEntity.getVersion();
+          ViewEntity view       = viewRegistry.getDefinition(viewName, version);
+
+          if ( view == null ) {
+            throw new IllegalStateException("The view " + viewName + " is not registered.");
+          }
+
+          // the view must be in the LOADED state to create an instance
+          if (!view.isLoaded()) {
+            throw new IllegalStateException("The view " + viewName + " is not loaded.");
+          }
+
           if (viewRegistry.instanceExists(instanceEntity)) {
             throw new DuplicateResourceException("The instance " + instanceEntity.getName() + " already exists.");
           }
@@ -376,11 +393,14 @@ public class ViewInstanceResourceProvider extends AbstractResourceProvider {
         Set<ViewInstanceEntity> viewInstanceEntities = new HashSet<ViewInstanceEntity>();
 
         for (ViewEntity viewEntity : viewRegistry.getDefinitions()){
-          for (ViewInstanceEntity viewInstanceEntity : viewRegistry.getInstanceDefinitions(viewEntity)){
-            Resource resource = toResource(viewInstanceEntity, requestedIds);
-            if (predicate == null || predicate.evaluate(resource)) {
-              if (includeInstance(viewInstanceEntity, false)) {
-                viewInstanceEntities.add(viewInstanceEntity);
+          // the view must be in the LOADED state to delete an instance
+          if (viewEntity.isLoaded()) {
+            for (ViewInstanceEntity viewInstanceEntity : viewRegistry.getInstanceDefinitions(viewEntity)){
+              Resource resource = toResource(viewInstanceEntity, requestedIds);
+              if (predicate == null || predicate.evaluate(resource)) {
+                if (includeInstance(viewInstanceEntity, false)) {
+                  viewInstanceEntities.add(viewInstanceEntity);
+                }
               }
             }
           }

http://git-wip-us.apache.org/repos/asf/ambari/blob/32cb4c54/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPermissionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPermissionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPermissionResourceProvider.java
index bcbc856..5f025d9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPermissionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPermissionResourceProvider.java
@@ -125,7 +125,11 @@ public class ViewPermissionResourceProvider extends AbstractResourceProvider {
       Object viewVersion = propertyMap.get(VIEW_VERSION_PROPERTY_ID);
       if (viewName != null && viewVersion != null) {
         ViewEntity viewEntity = viewRegistry.getDefinition(viewName.toString(), viewVersion.toString());
-        resources.add(toResource(viewUsePermission, viewEntity.getResourceType(), viewEntity, requestedIds));
+
+        // do not report permissions for views that are not loaded.
+        if (viewEntity.isLoaded()) {
+          resources.add(toResource(viewUsePermission, viewEntity.getResourceType(), viewEntity, requestedIds));
+        }
       }
     }
 
@@ -134,7 +138,7 @@ public class ViewPermissionResourceProvider extends AbstractResourceProvider {
 
       ViewEntity viewEntity = viewRegistry.getDefinition(resourceType);
 
-      if (viewEntity != null) {
+      if (viewEntity != null && viewEntity.isLoaded()) {
         resources.add(toResource(permissionEntity, resourceType, viewEntity, requestedIds));
       }
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/32cb4c54/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java
index ea4acef..f2f488a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java
@@ -115,7 +115,12 @@ public class ViewPrivilegeResourceProvider extends PrivilegeResourceProvider<Vie
       if (viewInstanceEntity == null) {
         throw new AmbariException("View instance " + instanceName + " of " + viewName + viewVersion + " was not found");
       }
-      return Collections.singletonMap(viewInstanceEntity.getResource().getId(), viewInstanceEntity);
+
+      ViewEntity view = viewInstanceEntity.getViewEntity();
+
+      return view.isLoaded() ?
+          Collections.singletonMap(viewInstanceEntity.getResource().getId(), viewInstanceEntity) :
+          Collections.<Long, ViewInstanceEntity>emptyMap();
     }
 
     Set<ViewEntity> viewEntities = new HashSet<ViewEntity>();
@@ -136,8 +141,10 @@ public class ViewPrivilegeResourceProvider extends PrivilegeResourceProvider<Vie
     Map<Long, ViewInstanceEntity> resourceEntities = new HashMap<Long, ViewInstanceEntity>();
 
     for (ViewEntity viewEntity : viewEntities) {
-      for (ViewInstanceEntity viewInstanceEntity : viewEntity.getInstances()) {
-        resourceEntities.put(viewInstanceEntity.getResource().getId(), viewInstanceEntity);
+      if (viewEntity.isLoaded()) {
+        for (ViewInstanceEntity viewInstanceEntity : viewEntity.getInstances()) {
+          resourceEntities.put(viewInstanceEntity.getResource().getId(), viewInstanceEntity);
+        }
       }
     }
     return resourceEntities;
@@ -150,10 +157,19 @@ public class ViewPrivilegeResourceProvider extends PrivilegeResourceProvider<Vie
     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();
+
+    if (viewInstanceEntity != null) {
+
+      ViewEntity view = viewInstanceEntity.getViewEntity();
+
+      return view.isLoaded() ? viewInstanceEntity.getResource().getId() : null;
+    }
+    return null;
   }
 
+
   // ----- helper methods ----------------------------------------------------
 
   @Override
@@ -173,6 +189,10 @@ public class ViewPrivilegeResourceProvider extends PrivilegeResourceProvider<Vie
       ViewInstanceEntity viewInstanceEntity = resourceEntities.get(privilegeEntity.getResource().getId());
       ViewEntity         viewEntity         = viewInstanceEntity.getViewEntity();
 
+      if (!viewEntity.isLoaded()) {
+        return null;
+      }
+
       setResourceProperty(resource, PRIVILEGE_VIEW_NAME_PROPERTY_ID, viewEntity.getCommonName(), requestedIds);
       setResourceProperty(resource, PRIVILEGE_VIEW_VERSION_PROPERTY_ID, viewEntity.getVersion(), requestedIds);
       setResourceProperty(resource, PRIVILEGE_INSTANCE_NAME_PROPERTY_ID, viewInstanceEntity.getName(), requestedIds);

http://git-wip-us.apache.org/repos/asf/ambari/blob/32cb4c54/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java
index e2138be..ed9f06a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java
@@ -98,7 +98,7 @@ public class ViewVersionResourceProvider extends AbstractResourceProvider {
   public RequestStatus createResources(Request request)
       throws SystemException, UnsupportedPropertyException,
       ResourceAlreadyExistsException, NoSuchParentResourceException {
-    throw new UnsupportedOperationException("Not yet supported.");
+    throw new UnsupportedOperationException("Not supported.");
   }
 
   @Override
@@ -147,13 +147,13 @@ public class ViewVersionResourceProvider extends AbstractResourceProvider {
   @Override
   public RequestStatus updateResources(Request request, Predicate predicate)
       throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
-    throw new UnsupportedOperationException("Not yet supported.");
+    throw new UnsupportedOperationException("Not supported.");
   }
 
   @Override
   public RequestStatus deleteResources(Predicate predicate)
       throws SystemException, UnsupportedPropertyException, NoSuchResourceException, NoSuchParentResourceException {
-    throw new UnsupportedOperationException("Not yet supported.");
+    throw new UnsupportedOperationException("Not supported.");
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/32cb4c54/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewEntity.java
index 8fb5a33..073451d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ViewEntity.java
@@ -750,6 +750,15 @@ public class ViewEntity implements ViewDefinition {
   }
 
   /**
+   * Determine whether or not the entity is loaded.
+   *
+   * @return true if the entity is loaded
+   */
+  public boolean isLoaded() {
+    return status.equals(ViewStatus.LOADED);
+  }
+
+  /**
    * Get the internal view name from the given common name and version.
    *
    * @param name     the view common name

http://git-wip-us.apache.org/repos/asf/ambari/blob/32cb4c54/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProviderTest.java
index f409f07..4a429b6 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProviderTest.java
@@ -18,8 +18,10 @@
 
 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.controller.spi.ResourceAlreadyExistsException;
+import org.apache.ambari.server.controller.utilities.PredicateBuilder;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.orm.entities.ViewEntity;
 import org.apache.ambari.server.orm.entities.ViewInstanceDataEntity;
@@ -27,6 +29,7 @@ import org.apache.ambari.server.orm.entities.ViewInstanceEntity;
 import org.apache.ambari.server.orm.entities.ViewInstancePropertyEntity;
 import org.apache.ambari.server.orm.entities.ViewParameterEntity;
 import org.apache.ambari.server.view.ViewRegistry;
+import org.apache.ambari.view.ViewDefinition;
 import org.easymock.Capture;
 import org.junit.Assert;
 import org.junit.Before;
@@ -111,8 +114,15 @@ public class ViewInstanceResourceProviderTest {
     viewInstanceEntity.setViewName("V1{1.0.0}");
     viewInstanceEntity.setName("I1");
 
+    ViewEntity viewEntity = new ViewEntity();
+    viewEntity.setStatus(ViewDefinition.ViewStatus.LOADED);
+    viewEntity.setName("V1{1.0.0}");
+
+    viewInstanceEntity.setViewEntity(viewEntity);
+
     expect(singleton.instanceExists(viewInstanceEntity)).andReturn(false);
     expect(singleton.getInstanceDefinition("V1", "1.0.0", "I1")).andReturn(viewInstanceEntity);
+    expect(singleton.getDefinition("V1", null)).andReturn(viewEntity);
 
     Capture<ViewInstanceEntity> instanceEntityCapture = new Capture<ViewInstanceEntity>();
     singleton.installViewInstance(capture(instanceEntityCapture));
@@ -144,8 +154,15 @@ public class ViewInstanceResourceProviderTest {
     viewInstanceEntity.setViewName("V1{1.0.0}");
     viewInstanceEntity.setName("I1");
 
+    ViewEntity viewEntity = new ViewEntity();
+    viewEntity.setStatus(ViewDefinition.ViewStatus.LOADED);
+    viewEntity.setName("V1{1.0.0}");
+
+    viewInstanceEntity.setViewEntity(viewEntity);
+
     expect(singleton.instanceExists(viewInstanceEntity)).andReturn(true);
     expect(singleton.getInstanceDefinition("V1", "1.0.0", "I1")).andReturn(viewInstanceEntity);
+    expect(singleton.getDefinition("V1", null)).andReturn(viewEntity);
 
     replay(singleton);
 
@@ -158,4 +175,110 @@ public class ViewInstanceResourceProviderTest {
 
     verify(singleton);
   }
+
+  @Test
+  public void testCreateResources_viewNotLoaded() throws Exception {
+    ViewInstanceResourceProvider provider = new ViewInstanceResourceProvider();
+
+    Set<Map<String, Object>> properties = new HashSet<Map<String, Object>>();
+
+    Map<String, Object> propertyMap = new HashMap<String, Object>();
+
+    propertyMap.put(ViewInstanceResourceProvider.VIEW_NAME_PROPERTY_ID, "V1");
+    propertyMap.put(ViewInstanceResourceProvider.VIEW_VERSION_PROPERTY_ID, "1.0.0");
+    propertyMap.put(ViewInstanceResourceProvider.INSTANCE_NAME_PROPERTY_ID, "I1");
+
+    properties.add(propertyMap);
+
+    ViewEntity viewEntity = new ViewEntity();
+    viewEntity.setName("V1{1.0.0}");
+    viewEntity.setStatus(ViewDefinition.ViewStatus.LOADING);
+    ViewInstanceEntity viewInstanceEntity = new ViewInstanceEntity();
+    viewInstanceEntity.setViewName("V1{1.0.0}");
+    viewInstanceEntity.setName("I1");
+    viewInstanceEntity.setViewEntity(viewEntity);
+
+    expect(singleton.getInstanceDefinition("V1", "1.0.0", "I1")).andReturn(viewInstanceEntity);
+    expect(singleton.getDefinition("V1", null)).andReturn(viewEntity);
+
+    replay(singleton);
+
+    try {
+      provider.createResources(PropertyHelper.getCreateRequest(properties, null));
+      fail("Expected IllegalStateException.");
+    } catch (IllegalStateException e) {
+      // expected
+    }
+
+    verify(singleton);
+  }
+
+  @Test
+  public void testUpdateResources_viewNotLoaded() throws Exception {
+    ViewInstanceResourceProvider provider = new ViewInstanceResourceProvider();
+
+    Set<Map<String, Object>> properties = new HashSet<Map<String, Object>>();
+
+    Map<String, Object> propertyMap = new HashMap<String, Object>();
+
+    propertyMap.put(ViewInstanceResourceProvider.ICON_PATH_ID, "path");
+
+    properties.add(propertyMap);
+
+    PredicateBuilder predicateBuilder = new PredicateBuilder();
+    Predicate predicate =
+        predicateBuilder.property(ViewInstanceResourceProvider.VIEW_NAME_PROPERTY_ID).equals("V1").toPredicate();
+    ViewEntity viewEntity = new ViewEntity();
+    viewEntity.setName("V1{1.0.0}");
+    viewEntity.setStatus(ViewDefinition.ViewStatus.LOADING);
+    ViewInstanceEntity viewInstanceEntity = new ViewInstanceEntity();
+    viewInstanceEntity.setViewName("V1{1.0.0}");
+    viewInstanceEntity.setName("I1");
+    viewInstanceEntity.setViewEntity(viewEntity);
+
+    expect(singleton.getDefinitions()).andReturn(Collections.singleton(viewEntity));
+
+    replay(singleton);
+
+    provider.updateResources(PropertyHelper.getCreateRequest(properties, null), predicate);
+
+    Assert.assertNull(viewInstanceEntity.getIcon());
+
+    verify(singleton);
+  }
+
+  @Test
+  public void testDeleteResources_viewNotLoaded() throws Exception {
+    ViewInstanceResourceProvider provider = new ViewInstanceResourceProvider();
+
+    Set<Map<String, Object>> properties = new HashSet<Map<String, Object>>();
+
+    Map<String, Object> propertyMap = new HashMap<String, Object>();
+
+    propertyMap.put(ViewInstanceResourceProvider.VIEW_NAME_PROPERTY_ID, "V1");
+    propertyMap.put(ViewInstanceResourceProvider.VIEW_VERSION_PROPERTY_ID, "1.0.0");
+    propertyMap.put(ViewInstanceResourceProvider.INSTANCE_NAME_PROPERTY_ID, "I1");
+
+    properties.add(propertyMap);
+
+    PredicateBuilder predicateBuilder = new PredicateBuilder();
+    Predicate predicate =
+        predicateBuilder.property(ViewInstanceResourceProvider.VIEW_NAME_PROPERTY_ID).equals("V1").toPredicate();
+
+    ViewEntity viewEntity = new ViewEntity();
+    viewEntity.setName("V1{1.0.0}");
+    viewEntity.setStatus(ViewDefinition.ViewStatus.LOADING);
+    ViewInstanceEntity viewInstanceEntity = new ViewInstanceEntity();
+    viewInstanceEntity.setViewName("V1{1.0.0}");
+    viewInstanceEntity.setName("I1");
+    viewInstanceEntity.setViewEntity(viewEntity);
+
+    expect(singleton.getDefinitions()).andReturn(Collections.singleton(viewEntity));
+
+    replay(singleton);
+
+    provider.deleteResources(predicate);
+
+    verify(singleton);
+  }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/32cb4c54/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPermissionResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPermissionResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPermissionResourceProviderTest.java
new file mode 100644
index 0000000..eebe0d3
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPermissionResourceProviderTest.java
@@ -0,0 +1,133 @@
+/**
+ * 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.Resource;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
+import org.apache.ambari.server.orm.dao.PermissionDAO;
+import org.apache.ambari.server.orm.entities.PermissionEntity;
+import org.apache.ambari.server.orm.entities.ResourceTypeEntity;
+import org.apache.ambari.server.orm.entities.ViewEntity;
+import org.apache.ambari.server.view.ViewRegistry;
+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.createMock;
+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;
+
+/**
+ * ViewPermissionResourceProvider tests.
+ */
+public class ViewPermissionResourceProviderTest {
+  private final static PermissionDAO dao = createStrictMock(PermissionDAO.class);
+  private static final ViewRegistry viewRegistry = createMock(ViewRegistry.class);
+
+  static {
+    ViewRegistry.initInstance(viewRegistry);
+  }
+
+  @BeforeClass
+  public static void initClass() {
+    ViewPermissionResourceProvider.init(dao);
+  }
+
+  @Before
+  public void resetGlobalMocks() {
+    reset(dao, viewRegistry);
+  }
+
+  @Test
+  public void testGetResources() throws Exception {
+    List<PermissionEntity> permissionEntities = new LinkedList<PermissionEntity>();
+
+    PermissionEntity permissionEntity = createNiceMock(PermissionEntity.class);
+    PermissionEntity viewUsePermissionEntity = createNiceMock(PermissionEntity.class);
+    ResourceTypeEntity resourceTypeEntity = createNiceMock(ResourceTypeEntity.class);
+    ViewEntity viewEntity = createMock(ViewEntity.class);
+
+    permissionEntities.add(permissionEntity);
+
+    expect(dao.findViewUsePermission()).andReturn(viewUsePermissionEntity);
+    expect(dao.findAll()).andReturn(Collections.singletonList(permissionEntity));
+
+    expect(permissionEntity.getId()).andReturn(99);
+    expect(permissionEntity.getPermissionName()).andReturn("P1");
+    expect(permissionEntity.getResourceType()).andReturn(resourceTypeEntity);
+    expect(resourceTypeEntity.getName()).andReturn("V1");
+
+    expect(viewEntity.isLoaded()).andReturn(true).anyTimes();
+    expect(viewEntity.getCommonName()).andReturn("V1").anyTimes();
+    expect(viewEntity.getVersion()).andReturn("1.0.0").anyTimes();
+
+    expect(viewRegistry.getDefinition(resourceTypeEntity)).andReturn(viewEntity);
+
+    replay(dao, permissionEntity, viewUsePermissionEntity, resourceTypeEntity, viewEntity, viewRegistry);
+    ViewPermissionResourceProvider provider = new ViewPermissionResourceProvider();
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), null);
+    // built in permissions
+    Assert.assertEquals(1, resources.size());
+    Resource resource = resources.iterator().next();
+
+    Assert.assertEquals(99, resource.getPropertyValue(PermissionResourceProvider.PERMISSION_ID_PROPERTY_ID));
+    Assert.assertEquals("P1", resource.getPropertyValue(PermissionResourceProvider.PERMISSION_NAME_PROPERTY_ID));
+    Assert.assertEquals("V1", resource.getPropertyValue(PermissionResourceProvider.RESOURCE_NAME_PROPERTY_ID));
+    verify(dao, permissionEntity, viewUsePermissionEntity, resourceTypeEntity, viewEntity, viewRegistry);
+  }
+
+  @Test
+  public void testGetResources_viewNotLoaded() throws Exception {
+    List<PermissionEntity> permissionEntities = new LinkedList<PermissionEntity>();
+
+    PermissionEntity permissionEntity = createNiceMock(PermissionEntity.class);
+    PermissionEntity viewUsePermissionEntity = createNiceMock(PermissionEntity.class);
+    ResourceTypeEntity resourceTypeEntity = createNiceMock(ResourceTypeEntity.class);
+    ViewEntity viewEntity = createMock(ViewEntity.class);
+
+    permissionEntities.add(permissionEntity);
+
+    expect(dao.findViewUsePermission()).andReturn(viewUsePermissionEntity);
+    expect(dao.findAll()).andReturn(Collections.singletonList(permissionEntity));
+
+    expect(permissionEntity.getResourceType()).andReturn(resourceTypeEntity);
+
+    expect(viewEntity.isLoaded()).andReturn(false).anyTimes();
+
+    expect(viewRegistry.getDefinition(resourceTypeEntity)).andReturn(viewEntity);
+
+    replay(dao, permissionEntity, viewUsePermissionEntity, resourceTypeEntity, viewEntity, viewRegistry);
+    ViewPermissionResourceProvider provider = new ViewPermissionResourceProvider();
+    Set<Resource> resources = provider.getResources(PropertyHelper.getReadRequest(), null);
+    // built in permissions
+    Assert.assertEquals(0, resources.size());
+
+    verify(dao, permissionEntity, viewUsePermissionEntity, resourceTypeEntity, viewEntity, viewRegistry);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/32cb4c54/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProviderTest.java
index 80f7751..eb4ef9c 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProviderTest.java
@@ -45,6 +45,7 @@ import org.apache.ambari.server.security.SecurityHelper;
 import org.apache.ambari.server.view.ViewInstanceHandlerList;
 import org.apache.ambari.server.view.ViewRegistry;
 import org.apache.ambari.server.view.ViewRegistryTest;
+import org.apache.ambari.view.ViewDefinition;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -100,6 +101,8 @@ public class ViewPrivilegeResourceProviderTest {
     ViewInstanceEntity viewInstanceDefinition = ViewInstanceEntityTest.getViewInstanceEntity();
 
     viewDefinition.addInstanceDefinition(viewInstanceDefinition);
+    viewInstanceDefinition.setViewEntity(viewDefinition);
+    viewDefinition.setStatus(ViewDefinition.ViewStatus.LOADED);
 
     ViewRegistry registry = ViewRegistry.getInstance();
 
@@ -159,10 +162,5 @@ public class ViewPrivilegeResourceProviderTest {
     verify(privilegeDAO, userDAO, groupDAO, principalDAO, permissionDAO, resourceDAO, privilegeEntity, resourceEntity,
         userEntity, principalEntity, permissionEntity, principalTypeEntity);
   }
-
-  @Test
-  public void testUpdateResources() throws Exception {
-    // see AmbariPrivilegeResourceProvider#testUpdateResources
-  }
 }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/32cb4c54/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewEntityTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewEntityTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewEntityTest.java
index 115c2bf..977e01d 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewEntityTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ViewEntityTest.java
@@ -266,4 +266,21 @@ public class ViewEntityTest {
     viewDefinition.setStatusDetail("status detail");
     Assert.assertEquals("status detail", viewDefinition.getStatusDetail());
   }
+
+  @Test
+  public void testIsLoaded() throws Exception {
+    ViewEntity viewDefinition = getViewEntity();
+
+    viewDefinition.setStatus(ViewDefinition.ViewStatus.PENDING);
+    Assert.assertFalse(viewDefinition.isLoaded());
+
+    viewDefinition.setStatus(ViewDefinition.ViewStatus.LOADING);
+    Assert.assertFalse(viewDefinition.isLoaded());
+
+    viewDefinition.setStatus(ViewDefinition.ViewStatus.LOADED);
+    Assert.assertTrue(viewDefinition.isLoaded());
+
+    viewDefinition.setStatus(ViewDefinition.ViewStatus.ERROR);
+    Assert.assertFalse(viewDefinition.isLoaded());
+  }
 }