diff --git a/doc/source/conf.py b/doc/source/conf.py
index d75a939..33c2cc3 100755
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -38,7 +38,7 @@
 
 # General information about the project.
 project = u'patrole'
-copyright = u'2016, OpenStack Foundation'
+copyright = u'2017, Patrole Developers'
 
 # If true, '()' will be appended to :func: etc. cross-reference text.
 add_function_parentheses = True
@@ -68,7 +68,7 @@
     ('index',
      '%s.tex' % project,
      u'%s Documentation' % project,
-     u'OpenStack Foundation', 'manual'),
+     u'Patrole Developers', 'manual'),
 ]
 
 # Example configuration for intersphinx: refer to the Python standard library.
diff --git a/patrole_tempest_plugin/config.py b/patrole_tempest_plugin/config.py
index a0ca307..6ee1528 100644
--- a/patrole_tempest_plugin/config.py
+++ b/patrole_tempest_plugin/config.py
@@ -1,4 +1,4 @@
-#    Copyright (c) 2016 AT&T inc.
+#    Copyright 2017 AT&T Corporation.
 #    All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/plugin.py b/patrole_tempest_plugin/plugin.py
index 1bc4d04..3abf4aa 100644
--- a/patrole_tempest_plugin/plugin.py
+++ b/patrole_tempest_plugin/plugin.py
@@ -1,4 +1,4 @@
-#    Copyright (c) 2016 AT&T inc.
+#    Copyright 2017 AT&T Corporation.
 #    All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/rbac_auth.py b/patrole_tempest_plugin/rbac_auth.py
index 78cc951..1afc7ae 100644
--- a/patrole_tempest_plugin/rbac_auth.py
+++ b/patrole_tempest_plugin/rbac_auth.py
@@ -1,4 +1,4 @@
-# Copyright 2017 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/rbac_exceptions.py b/patrole_tempest_plugin/rbac_exceptions.py
index 94e6bdd..c6165ff 100644
--- a/patrole_tempest_plugin/rbac_exceptions.py
+++ b/patrole_tempest_plugin/rbac_exceptions.py
@@ -1,4 +1,4 @@
-# Copyright 2017 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/rbac_role_converter.py b/patrole_tempest_plugin/rbac_role_converter.py
index 65e3f27..bc6e006 100644
--- a/patrole_tempest_plugin/rbac_role_converter.py
+++ b/patrole_tempest_plugin/rbac_role_converter.py
@@ -1,4 +1,4 @@
-# Copyright 2016 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -17,6 +17,7 @@
 import os
 
 from oslo_log import log as logging
+from oslo_policy import generator
 from oslo_policy import policy
 from tempest import config
 
@@ -39,51 +40,73 @@
     def __init__(self, tenant_id, service, path=None):
         """Initialization of Policy Converter.
 
-        Parse policy files to create dictionary mapping policy actions to
-        roles.
+        Parses a policy file to create a dictionary, mapping policy actions to
+        roles. If a policy file does not exist, checks whether the policy file
+        is registered as a namespace under oslo.policy.policies. Nova, for
+        example, doesn't use a policy.json file by default; its policy is
+        implemented in code and registered as 'nova' under
+        oslo.policy.policies.
+
+        If the policy file is not found in either place, raises an exception.
+
+        Additionally, if the policy file exists in both code and as a
+        policy.json (for example, by creating a custom nova policy.json file),
+        the custom policy file over the default policy implementation is
+        prioritized.
 
         :param tenant_id: type uuid
         :param service: type string
         :param path: type string
         """
+        service = service.lower().strip()
         if path is None:
             self.path = '/etc/{0}/policy.json'.format(service)
         else:
             self.path = path
 
-        if not os.path.isfile(self.path):
-            raise rbac_exceptions.RbacResourceSetupFailed(
-                'Policy file for service: {0}, {1} not found.'
-                .format(service, self.path))
+        policy_data = "{}"
 
+        # First check whether policy file exists.
+        if os.path.isfile(self.path):
+            policy_data = open(self.path, 'r').read()
+        # Otherwise use oslo_policy to fetch the rules for provided service.
+        else:
+            policy_generator = generator._get_policies_dict([service])
+            if policy_generator and service in policy_generator:
+                policy_data = "{\n"
+                for r in policy_generator[service]:
+                    policy_data = policy_data + r.__str__() + ",\n"
+                policy_data = policy_data[:-2] + "\n}"
+            # Otherwise raise an exception.
+            else:
+                raise rbac_exceptions.RbacResourceSetupFailed(
+                    'Policy file for service: {0}, {1} not found.'
+                    .format(service, self.path))
+
+        self.rules = policy.Rules.load(policy_data, "default")
         self.tenant_id = tenant_id
 
     def allowed(self, rule_name, role):
-        policy_file = open(self.path, 'r')
-        access_token = self._get_access_token(role)
-
+        is_admin_context = self._is_admin_context(role)
         is_allowed = self._allowed(
-            policy_file=policy_file,
-            access=access_token,
+            access=self._get_access_token(role),
             apply_rule=rule_name,
-            is_admin=False)
+            is_admin=is_admin_context)
 
-        policy_file = open(self.path, 'r')
-        access_token = self._get_access_token(role)
-        allowed_as_admin_context = self._allowed(
-            policy_file=policy_file,
-            access=access_token,
-            apply_rule=rule_name,
-            is_admin=True)
+        return is_allowed
 
-        if allowed_as_admin_context and is_allowed:
-            return True
-        if allowed_as_admin_context and not is_allowed:
-            return False
-        if not allowed_as_admin_context and is_allowed:
-            return True
-        if not allowed_as_admin_context and not is_allowed:
-            return False
+    def _is_admin_context(self, role):
+        """Checks whether a role has admin context.
+
+        If context_is_admin is contained in the policy file, then checks
+        whether the given role is contained in context_is_admin. If it is not
+        in the policy file, then default to context_is_admin: admin.
+        """
+        if 'context_is_admin' in self.rules.keys():
+            return self._allowed(
+                access=self._get_access_token(role),
+                apply_rule='context_is_admin')
+        return role == 'admin'
 
     def _get_access_token(self, role):
         access_token = {
@@ -93,45 +116,50 @@
                         "name": role
                     }
                 ],
-                "project": {
-                    "id": self.tenant_id
-                }
+                "project_id": self.tenant_id,
+                "tenant_id": self.tenant_id
             }
         }
         return access_token
 
-    def _allowed(self, policy_file, access, apply_rule, is_admin=False):
+    def _allowed(self, access, apply_rule, is_admin=False):
         """Checks if a given rule in a policy is allowed with given access.
 
         Adapted from oslo_policy.shell.
 
-        :param policy file: type string: path to policy file
         :param access: type dict: dictionary from ``_get_access_token``
         :param apply_rule: type string: rule to be checked
         :param is_admin: type bool: whether admin context is used
         """
         access_data = copy.copy(access['token'])
         access_data['roles'] = [role['name'] for role in access_data['roles']]
-        access_data['project_id'] = access_data['project']['id']
         access_data['is_admin'] = is_admin
-        policy_data = policy_file.read()
-        rules = policy.Rules.load(policy_data, "default")
+        # TODO(felipemonteiro): Dynamically calculate is_admin_project rather
+        # than hard-coding it to True. is_admin_project cannot be determined
+        # from the role, but rather from project and domain names. See
+        # _populate_is_admin_project in keystone.token.providers.common
+        # for more information.
+        access_data['is_admin_project'] = True
 
         class Object(object):
             pass
         o = Object()
-        o.rules = rules
+        o.rules = self.rules
 
-        target = {"project_id": access_data['project_id']}
+        target = {"project_id": access_data['project_id'],
+                  "tenant_id": access_data['project_id'],
+                  "network:tenant_id": access_data['project_id']}
 
-        key = apply_rule
-        rule = rules[apply_rule]
-        result = self._try_rule(key, rule, target, access_data, o)
+        result = self._try_rule(apply_rule, target, access_data, o)
         return result
 
-    def _try_rule(self, key, rule, target, access_data, o):
+    def _try_rule(self, apply_rule, target, access_data, o):
         try:
+            rule = self.rules[apply_rule]
             return rule(target, access_data, o)
+        except KeyError as e:
+            LOG.debug("{0} not found in policy file.".format(apply_rule))
+            return False
         except Exception as e:
-            LOG.debug("Exception: {0} for rule: {1}".format(e, rule))
+            LOG.debug("Exception: {0} for rule: {1}.".format(e, rule))
             return False
diff --git a/patrole_tempest_plugin/rbac_rule_validation.py b/patrole_tempest_plugin/rbac_rule_validation.py
index ee32f78..4b85187 100644
--- a/patrole_tempest_plugin/rbac_rule_validation.py
+++ b/patrole_tempest_plugin/rbac_rule_validation.py
@@ -1,4 +1,4 @@
-# Copyright 2017 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/rbac_utils.py b/patrole_tempest_plugin/rbac_utils.py
index 1150416..48d5b4c 100644
--- a/patrole_tempest_plugin/rbac_utils.py
+++ b/patrole_tempest_plugin/rbac_utils.py
@@ -1,4 +1,4 @@
-# Copyright 2017 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/tests/api/compute/rbac_base.py b/patrole_tempest_plugin/tests/api/compute/rbac_base.py
index 030ee5c..ca24204 100644
--- a/patrole_tempest_plugin/tests/api/compute/rbac_base.py
+++ b/patrole_tempest_plugin/tests/api/compute/rbac_base.py
@@ -18,7 +18,6 @@
 
 
 class BaseV2ComputeRbacTest(compute_base.BaseV2ComputeTest):
-
     credentials = ['primary', 'admin']
 
     @classmethod
@@ -36,3 +35,24 @@
         super(BaseV2ComputeRbacTest, cls).setup_clients()
         cls.admin_client = cls.os_admin.agents_client
         cls.auth_provider = cls.os.auth_provider
+
+
+class BaseV2ComputeAdminRbacTest(compute_base.BaseV2ComputeAdminTest):
+
+    credentials = ['primary', 'admin']
+
+    @classmethod
+    def skip_checks(cls):
+        super(BaseV2ComputeAdminRbacTest, cls).skip_checks()
+        if not CONF.rbac.rbac_flag:
+            raise cls.skipException(
+                '%s skipped as RBAC flag not enabled' % cls.__name__)
+        if 'admin' not in CONF.auth.tempest_roles:
+            raise cls.skipException(
+                "%s skipped because tempest roles is not admin" % cls.__name__)
+
+    @classmethod
+    def setup_clients(cls):
+        super(BaseV2ComputeAdminRbacTest, cls).setup_clients()
+        cls.admin_client = cls.os_admin.agents_client
+        cls.auth_provider = cls.os.auth_provider
diff --git a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_access_ips_rbac.py
similarity index 61%
copy from patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
copy to patrole_tempest_plugin/tests/api/compute/test_access_ips_rbac.py
index 3da3bd8..ffeebc9 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_access_ips_rbac.py
@@ -1,4 +1,6 @@
-# Copyright 2017 AT&T Corporation
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
 #    Licensed 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
@@ -11,37 +13,33 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest import config
+from tempest.lib import decorators
+
 from patrole_tempest_plugin import rbac_rule_validation
 from patrole_tempest_plugin.rbac_utils import rbac_utils
 from patrole_tempest_plugin.tests.api.compute import rbac_base
-from tempest import config
-from tempest.lib import decorators
 
 CONF = config.CONF
 
 
-class RBACAbsoluteLimitsTestJSON(rbac_base.BaseV2ComputeRbacTest):
+class AccessIpsRbacTest(rbac_base.BaseV2ComputeRbacTest):
 
     def tearDown(self):
-        rbac_utils.switch_role(self, switchToRbacRole=False)
-        super(RBACAbsoluteLimitsTestJSON, self).tearDown()
-
-    @classmethod
-    def setup_clients(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).setup_clients()
-        cls.identity_client = cls.os_adm.identity_client
-        cls.tenants_client = cls.os_adm.tenants_client
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        super(AccessIpsRbacTest, self).tearDown()
 
     @classmethod
     def skip_checks(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).skip_checks()
+        super(AccessIpsRbacTest, cls).skip_checks()
         if not CONF.compute_feature_enabled.api_extensions:
             raise cls.skipException(
                 '%s skipped as no compute extensions enabled' % cls.__name__)
 
     @rbac_rule_validation.action(service="nova",
-                                 rule="os_compute_api:os-used-limits")
-    @decorators.idempotent_id('3fb60f83-9a5f-4fdd-89d9-26c3710844a1')
-    def test_used_limits_for_admin_rbac(self):
+                                 rule="os_compute_api:os-access-ips")
+    @decorators.idempotent_id('f5811ed1-95d4-4085-a69e-87e6bd958738')
+    def test_access_ip(self):
         rbac_utils.switch_role(self, switchToRbacRole=True)
-        self.limits_client.show_limits()
+        ipv4 = '127.0.0.1'
+        self.create_test_server(accessIPv4=ipv4)
diff --git a/patrole_tempest_plugin/tests/api/compute/test_hypervisor_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_hypervisor_rbac.py
new file mode 100644
index 0000000..5f571a5
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_hypervisor_rbac.py
@@ -0,0 +1,76 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.compute import rbac_base
+
+CONF = config.CONF
+
+
+class HypervisorRbacTest(rbac_base.BaseV2ComputeRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(HypervisorRbacTest, cls).setup_clients()
+        cls.client = cls.hypervisor_client
+
+    @classmethod
+    def skip_checks(cls):
+        super(HypervisorRbacTest, cls).skip_checks()
+        if not CONF.compute_feature_enabled.api_extensions:
+            raise cls.skipException(
+                '%s skipped as no compute extensions enabled' % cls.__name__)
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(HypervisorRbacTest, self).tearDown()
+
+    @decorators.idempotent_id('afe5d5ed-c9b9-4e9b-bdc6-20ef9fe86ad8')
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:limits:discoverable")
+    def test_hypervisor_discoverable(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.extensions_client.list_extensions()
+
+
+class HypervisorAdminRbacTest(rbac_base.BaseV2ComputeAdminRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(HypervisorAdminRbacTest, cls).setup_clients()
+        cls.client = cls.hypervisor_client
+
+    @classmethod
+    def skip_checks(cls):
+        super(HypervisorAdminRbacTest, cls).skip_checks()
+        if not CONF.compute_feature_enabled.api_extensions:
+            raise cls.skipException(
+                '%s skipped as no compute extensions enabled' % cls.__name__)
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(HypervisorAdminRbacTest, self).tearDown()
+
+    @decorators.idempotent_id('17bbeb9a-e73e-445f-a771-c794448ef562')
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-hypervisors")
+    def test_list_hypervisors(self):
+        self.client.list_hypervisors()['hypervisors']
diff --git a/patrole_tempest_plugin/tests/api/compute/test_instance_actions.py b/patrole_tempest_plugin/tests/api/compute/test_instance_actions.py
new file mode 100644
index 0000000..5bcb18e
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_instance_actions.py
@@ -0,0 +1,63 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.compute import rbac_base
+
+CONF = config.CONF
+
+
+class InstanceActionsRbacTest(rbac_base.BaseV2ComputeRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(InstanceActionsRbacTest, cls).setup_clients()
+        cls.client = cls.servers_client
+
+    @classmethod
+    def skip_checks(cls):
+        super(InstanceActionsRbacTest, cls).skip_checks()
+        if not CONF.compute_feature_enabled.api_extensions:
+            raise cls.skipException(
+                '%s skipped as no compute extensions enabled' % cls.__name__)
+
+    @classmethod
+    def resource_setup(cls):
+        super(InstanceActionsRbacTest, cls).resource_setup()
+        cls.server = cls.create_test_server(wait_until='ACTIVE')
+        cls.request_id = cls.server.response['x-compute-request-id']
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(InstanceActionsRbacTest, self).tearDown()
+
+    @decorators.idempotent_id('9d1b131d-407e-4fa3-8eef-eb2c4526f1da')
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-instance-actions")
+    def test_list_instance_actions(self):
+        self.client.list_instance_actions(self.server['id'])
+
+    @decorators.idempotent_id('eb04c439-4215-4029-9ccb-5b3c041bfc25')
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-instance-actions:events")
+    def test_get_instance_action(self):
+        self.client.show_instance_action(
+            self.server['id'], self.request_id)['instanceAction']
diff --git a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_limits_rbac.py
similarity index 72%
rename from patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
rename to patrole_tempest_plugin/tests/api/compute/test_limits_rbac.py
index 3da3bd8..ae52fe5 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_limits_rbac.py
@@ -11,37 +11,37 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest import config
+from tempest.lib import decorators
+
 from patrole_tempest_plugin import rbac_rule_validation
 from patrole_tempest_plugin.rbac_utils import rbac_utils
 from patrole_tempest_plugin.tests.api.compute import rbac_base
-from tempest import config
-from tempest.lib import decorators
 
 CONF = config.CONF
 
 
-class RBACAbsoluteLimitsTestJSON(rbac_base.BaseV2ComputeRbacTest):
+class LimitsRbacTest(rbac_base.BaseV2ComputeRbacTest):
 
     def tearDown(self):
         rbac_utils.switch_role(self, switchToRbacRole=False)
-        super(RBACAbsoluteLimitsTestJSON, self).tearDown()
+        super(LimitsRbacTest, self).tearDown()
 
     @classmethod
     def setup_clients(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).setup_clients()
-        cls.identity_client = cls.os_adm.identity_client
-        cls.tenants_client = cls.os_adm.tenants_client
+        super(LimitsRbacTest, cls).setup_clients()
+        cls.client = cls.limits_client
 
     @classmethod
     def skip_checks(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).skip_checks()
+        super(LimitsRbacTest, cls).skip_checks()
         if not CONF.compute_feature_enabled.api_extensions:
             raise cls.skipException(
                 '%s skipped as no compute extensions enabled' % cls.__name__)
 
     @rbac_rule_validation.action(service="nova",
-                                 rule="os_compute_api:os-used-limits")
+                                 rule="os_compute_api:limits")
     @decorators.idempotent_id('3fb60f83-9a5f-4fdd-89d9-26c3710844a1')
-    def test_used_limits_for_admin_rbac(self):
+    def test_show_limits(self):
         rbac_utils.switch_role(self, switchToRbacRole=True)
-        self.limits_client.show_limits()
+        self.client.show_limits()
diff --git a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_migrations_rbac.py
similarity index 64%
copy from patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
copy to patrole_tempest_plugin/tests/api/compute/test_migrations_rbac.py
index 3da3bd8..4825f82 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_migrations_rbac.py
@@ -1,4 +1,6 @@
-# Copyright 2017 AT&T Corporation
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
 #    Licensed 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
@@ -11,37 +13,38 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest import config
+from tempest.lib import decorators
+
 from patrole_tempest_plugin import rbac_rule_validation
 from patrole_tempest_plugin.rbac_utils import rbac_utils
 from patrole_tempest_plugin.tests.api.compute import rbac_base
-from tempest import config
-from tempest.lib import decorators
 
 CONF = config.CONF
 
 
-class RBACAbsoluteLimitsTestJSON(rbac_base.BaseV2ComputeRbacTest):
-
-    def tearDown(self):
-        rbac_utils.switch_role(self, switchToRbacRole=False)
-        super(RBACAbsoluteLimitsTestJSON, self).tearDown()
+class MigrationsAdminRbacTest(rbac_base.BaseV2ComputeAdminRbacTest):
 
     @classmethod
     def setup_clients(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).setup_clients()
-        cls.identity_client = cls.os_adm.identity_client
-        cls.tenants_client = cls.os_adm.tenants_client
+        super(MigrationsAdminRbacTest, cls).setup_clients()
+        cls.client = cls.migrations_client
 
     @classmethod
     def skip_checks(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).skip_checks()
+        super(MigrationsAdminRbacTest, cls).skip_checks()
         if not CONF.compute_feature_enabled.api_extensions:
             raise cls.skipException(
                 '%s skipped as no compute extensions enabled' % cls.__name__)
 
-    @rbac_rule_validation.action(service="nova",
-                                 rule="os_compute_api:os-used-limits")
-    @decorators.idempotent_id('3fb60f83-9a5f-4fdd-89d9-26c3710844a1')
-    def test_used_limits_for_admin_rbac(self):
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(MigrationsAdminRbacTest, self).tearDown()
+
+    @decorators.idempotent_id('5795231c-3729-448c-a072-9a225db1a328')
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-migrations:index")
+    def test_list_services(self):
         rbac_utils.switch_role(self, switchToRbacRole=True)
-        self.limits_client.show_limits()
+        self.client.list_migrations()['migrations']
diff --git a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_rescue_rbac.py
similarity index 63%
copy from patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
copy to patrole_tempest_plugin/tests/api/compute/test_rescue_rbac.py
index 3da3bd8..88997b2 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_rescue_rbac.py
@@ -1,4 +1,6 @@
-# Copyright 2017 AT&T Corporation
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
 #    Licensed 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
@@ -11,37 +13,43 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest import config
+from tempest.lib import decorators
+
 from patrole_tempest_plugin import rbac_rule_validation
 from patrole_tempest_plugin.rbac_utils import rbac_utils
 from patrole_tempest_plugin.tests.api.compute import rbac_base
-from tempest import config
-from tempest.lib import decorators
 
 CONF = config.CONF
 
 
-class RBACAbsoluteLimitsTestJSON(rbac_base.BaseV2ComputeRbacTest):
-
-    def tearDown(self):
-        rbac_utils.switch_role(self, switchToRbacRole=False)
-        super(RBACAbsoluteLimitsTestJSON, self).tearDown()
+class RescueRbacTest(rbac_base.BaseV2ComputeRbacTest):
 
     @classmethod
     def setup_clients(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).setup_clients()
-        cls.identity_client = cls.os_adm.identity_client
-        cls.tenants_client = cls.os_adm.tenants_client
+        super(RescueRbacTest, cls).setup_clients()
+        cls.client = cls.servers_client
 
     @classmethod
     def skip_checks(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).skip_checks()
+        super(RescueRbacTest, cls).skip_checks()
         if not CONF.compute_feature_enabled.api_extensions:
             raise cls.skipException(
                 '%s skipped as no compute extensions enabled' % cls.__name__)
 
-    @rbac_rule_validation.action(service="nova",
-                                 rule="os_compute_api:os-used-limits")
-    @decorators.idempotent_id('3fb60f83-9a5f-4fdd-89d9-26c3710844a1')
-    def test_used_limits_for_admin_rbac(self):
+    @classmethod
+    def resource_setup(cls):
+        super(RescueRbacTest, cls).resource_setup()
+        cls.server = cls.create_test_server(wait_until='ACTIVE')
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(RescueRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-rescue")
+    @decorators.idempotent_id('fbbb2afc-ed0e-4552-887d-ac00fb5d436e')
+    def test_rescue_server(self):
         rbac_utils.switch_role(self, switchToRbacRole=True)
-        self.limits_client.show_limits()
+        self.client.rescue_server(self.server['id'])
diff --git a/patrole_tempest_plugin/tests/api/compute/test_security_groups_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_security_groups_rbac.py
new file mode 100644
index 0000000..7cbf012
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_security_groups_rbac.py
@@ -0,0 +1,35 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.compute import rbac_base
+
+
+class SecurityGroupsRbacTest(rbac_base.BaseV2ComputeRbacTest):
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(SecurityGroupsRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-security-groups")
+    @decorators.idempotent_id('4ac58e49-48c1-4fca-a6c3-3f95fb99eb77')
+    def test_server_security_groups(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.security_groups_client.list_security_groups()
diff --git a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_diagnostics_rbac.py
similarity index 60%
copy from patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
copy to patrole_tempest_plugin/tests/api/compute/test_server_diagnostics_rbac.py
index 3da3bd8..390dae5 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_diagnostics_rbac.py
@@ -1,4 +1,6 @@
-# Copyright 2017 AT&T Corporation
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
 #    Licensed 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
@@ -11,37 +13,43 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest import config
+from tempest.lib import decorators
+
 from patrole_tempest_plugin import rbac_rule_validation
 from patrole_tempest_plugin.rbac_utils import rbac_utils
 from patrole_tempest_plugin.tests.api.compute import rbac_base
-from tempest import config
-from tempest.lib import decorators
 
 CONF = config.CONF
 
 
-class RBACAbsoluteLimitsTestJSON(rbac_base.BaseV2ComputeRbacTest):
-
-    def tearDown(self):
-        rbac_utils.switch_role(self, switchToRbacRole=False)
-        super(RBACAbsoluteLimitsTestJSON, self).tearDown()
+class ServerDiagnosticsRbacTest(rbac_base.BaseV2ComputeRbacTest):
 
     @classmethod
     def setup_clients(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).setup_clients()
-        cls.identity_client = cls.os_adm.identity_client
-        cls.tenants_client = cls.os_adm.tenants_client
+        super(ServerDiagnosticsRbacTest, cls).setup_clients()
+        cls.client = cls.servers_client
 
     @classmethod
     def skip_checks(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).skip_checks()
+        super(ServerDiagnosticsRbacTest, cls).skip_checks()
         if not CONF.compute_feature_enabled.api_extensions:
             raise cls.skipException(
                 '%s skipped as no compute extensions enabled' % cls.__name__)
 
-    @rbac_rule_validation.action(service="nova",
-                                 rule="os_compute_api:os-used-limits")
-    @decorators.idempotent_id('3fb60f83-9a5f-4fdd-89d9-26c3710844a1')
-    def test_used_limits_for_admin_rbac(self):
+    @classmethod
+    def resource_setup(cls):
+        super(ServerDiagnosticsRbacTest, cls).resource_setup()
+        cls.server = cls.create_test_server(wait_until='ACTIVE')
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ServerDiagnosticsRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-server-diagnostics")
+    @decorators.idempotent_id('5dabfcc4-bedb-417b-8247-b3ee7c5c0f3e')
+    def test_show_server_diagnostics(self):
         rbac_utils.switch_role(self, switchToRbacRole=True)
-        self.limits_client.show_limits()
+        self.client.show_server_diagnostics(self.server['id'])
diff --git a/patrole_tempest_plugin/tests/api/compute/test_server_groups_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_groups_rbac.py
new file mode 100644
index 0000000..8e47b59
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_groups_rbac.py
@@ -0,0 +1,81 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.compute import rbac_base
+
+CONF = config.CONF
+
+
+class ServerGroupsRbacTest(rbac_base.BaseV2ComputeRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(ServerGroupsRbacTest, cls).setup_clients()
+        cls.client = cls.server_groups_client
+
+    @classmethod
+    def skip_checks(cls):
+        super(ServerGroupsRbacTest, cls).skip_checks()
+        if not CONF.compute_feature_enabled.api_extensions:
+            raise cls.skipException(
+                '%s skipped as no compute extensions enabled' % cls.__name__)
+
+    @classmethod
+    def resource_setup(cls):
+        super(ServerGroupsRbacTest, cls).resource_setup()
+        cls.server = cls.create_test_server(wait_until='ACTIVE')
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ServerGroupsRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-server-groups:create")
+    @decorators.idempotent_id('7f3eae94-6130-47e9-81ac-34009f55be2f')
+    def test_create_server_group(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.create_test_server_group()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-server-groups:delete")
+    @decorators.idempotent_id('832d9be3-632e-47b2-93d2-5897db43e3e2')
+    def test_delete_server_group(self):
+        server_group = self.create_test_server_group()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.delete_server_group(server_group['id'])
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-server-groups:index")
+    @decorators.idempotent_id('5eccd67f-5945-483b-b1c8-de851ebfc1c1')
+    def test_list_server_groups(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.list_server_groups()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-server-groups:show")
+    @decorators.idempotent_id('62534e3f-7e99-4a3d-a08e-33e056460cf2')
+    def test_show_server_group(self):
+        server_group = self.create_test_server_group()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.show_server_group(server_group['id'])
diff --git a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_usage_rbac.py
similarity index 61%
copy from patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
copy to patrole_tempest_plugin/tests/api/compute/test_server_usage_rbac.py
index 3da3bd8..486a023 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_usage_rbac.py
@@ -1,4 +1,6 @@
-# Copyright 2017 AT&T Corporation
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
 #    Licensed 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
@@ -11,37 +13,43 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest import config
+from tempest.lib import decorators
+
 from patrole_tempest_plugin import rbac_rule_validation
 from patrole_tempest_plugin.rbac_utils import rbac_utils
 from patrole_tempest_plugin.tests.api.compute import rbac_base
-from tempest import config
-from tempest.lib import decorators
 
 CONF = config.CONF
 
 
-class RBACAbsoluteLimitsTestJSON(rbac_base.BaseV2ComputeRbacTest):
-
-    def tearDown(self):
-        rbac_utils.switch_role(self, switchToRbacRole=False)
-        super(RBACAbsoluteLimitsTestJSON, self).tearDown()
+class ServerUsageRbacTest(rbac_base.BaseV2ComputeRbacTest):
 
     @classmethod
     def setup_clients(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).setup_clients()
-        cls.identity_client = cls.os_adm.identity_client
-        cls.tenants_client = cls.os_adm.tenants_client
+        super(ServerUsageRbacTest, cls).setup_clients()
+        cls.client = cls.servers_client
 
     @classmethod
     def skip_checks(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).skip_checks()
+        super(ServerUsageRbacTest, cls).skip_checks()
         if not CONF.compute_feature_enabled.api_extensions:
             raise cls.skipException(
                 '%s skipped as no compute extensions enabled' % cls.__name__)
 
-    @rbac_rule_validation.action(service="nova",
-                                 rule="os_compute_api:os-used-limits")
-    @decorators.idempotent_id('3fb60f83-9a5f-4fdd-89d9-26c3710844a1')
-    def test_used_limits_for_admin_rbac(self):
+    @classmethod
+    def resource_setup(cls):
+        super(ServerUsageRbacTest, cls).resource_setup()
+        cls.server = cls.create_test_server(wait_until='ACTIVE')
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ServerUsageRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-server-usage")
+    @decorators.idempotent_id('f0437ead-b9fb-462a-9f3d-ce53fac9d57a')
+    def test_show_server_diagnostics(self):
         rbac_utils.switch_role(self, switchToRbacRole=True)
-        self.limits_client.show_limits()
+        self.client.show_server(self.server['id'])
diff --git a/patrole_tempest_plugin/tests/api/compute/test_server_volume_attachments_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_server_volume_attachments_rbac.py
new file mode 100644
index 0000000..d5897d3
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_server_volume_attachments_rbac.py
@@ -0,0 +1,131 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest.common import waiters
+from tempest import config
+from tempest.lib.common.utils import test_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.compute import rbac_base
+
+CONF = config.CONF
+
+
+class ServerVolumeAttachmentRbacTest(rbac_base.BaseV2ComputeRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(ServerVolumeAttachmentRbacTest, cls).setup_clients()
+        cls.client = cls.servers_client
+        cls.volumes_client = cls.os.volumes_client
+
+    @classmethod
+    def skip_checks(cls):
+        super(ServerVolumeAttachmentRbacTest, cls).skip_checks()
+        if not CONF.compute_feature_enabled.api_extensions:
+            raise cls.skipException(
+                '%s skipped as no compute extensions enabled' % cls.__name__)
+
+    @classmethod
+    def resource_setup(cls):
+        super(ServerVolumeAttachmentRbacTest, cls).resource_setup()
+        cls.server = cls.create_test_server(wait_until='ACTIVE')
+
+    @classmethod
+    def resource_cleanup(cls):
+        test_utils.call_and_ignore_notfound_exc(cls.delete_server,
+                                                cls.server['id'])
+        super(ServerVolumeAttachmentRbacTest, cls).resource_cleanup()
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ServerVolumeAttachmentRbacTest, self).tearDown()
+
+    def _create_and_attach(self):
+        self.volume = self.create_volume()
+        self.attachment = self._attach(self.server, self.volume)
+
+    def _attach(self, server, volume):
+        attachment = self.client.attach_volume(
+            server['id'],
+            volumeId=volume['id'])['volumeAttachment']
+        self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+                        self._detach, server['id'], volume['id'])
+        waiters.wait_for_volume_status(self.volumes_client, volume['id'],
+                                       'in-use')
+        return attachment
+
+    def _detach(self, server_id, volume_id):
+        # For test_update_volume_attachment, an addCleanup is called with
+        # a stale volume, because a new volume is attached, so only detach
+        # the new volume to avoid a bad request error.
+        if hasattr(self, 'volume') and self.volume['id'] == volume_id:
+            self.client.detach_volume(server_id, volume_id)
+            waiters.wait_for_volume_status(self.volumes_client, volume_id,
+                                           'available')
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-volumes-attachments:index")
+    @decorators.idempotent_id('529b668b-6edb-41d5-8886-d7dbd0614678')
+    def test_list_volume_attachments(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.list_volume_attachments(self.server['id'])
+        ['volumeAttachments']
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-volumes-attachments:create")
+    @decorators.idempotent_id('21c2c3fd-fbe8-41b1-8ef8-115ec47d54c1')
+    def test_create_volume_attachment(self):
+        self.volume = self.create_volume()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self._attach(self.server, self.volume)
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-volumes-attachments:show")
+    @decorators.idempotent_id('997df9c2-6e54-47b6-ab74-e4fdb500f385')
+    def test_show_volume_attachment(self):
+        self._create_and_attach()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.show_volume_attachment(
+            self.server['id'], self.attachment['id'])
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-volumes-attachments:update")
+    @decorators.idempotent_id('bd667186-eca6-4b78-ab6a-3e2fabcb971f')
+    def test_update_volume_attachment(self):
+        self._create_and_attach()
+        self.volume = self.create_volume()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.update_attached_volume(
+            self.server['id'], self.attachment['id'],
+            volumeId=self.volume['id'])
+        self.addCleanup(self._detach, self.server['id'], self.volume['id'])
+        waiters.wait_for_volume_status(self.volumes_client, self.volume['id'],
+                                       'in-use')
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-volumes-attachments:delete")
+    @decorators.idempotent_id('12b03e90-d087-46af-9c4d-507d021c4984')
+    def test_delete_volume_attachment(self):
+        self._create_and_attach()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self._detach(self.server['id'], self.volume['id'])
diff --git a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_services_rbac.py
similarity index 65%
copy from patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
copy to patrole_tempest_plugin/tests/api/compute/test_services_rbac.py
index 3da3bd8..a2f6409 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_services_rbac.py
@@ -1,4 +1,6 @@
-# Copyright 2017 AT&T Corporation
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
 #    Licensed 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
@@ -11,37 +13,38 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+from tempest import config
+from tempest.lib import decorators
+
 from patrole_tempest_plugin import rbac_rule_validation
 from patrole_tempest_plugin.rbac_utils import rbac_utils
 from patrole_tempest_plugin.tests.api.compute import rbac_base
-from tempest import config
-from tempest.lib import decorators
 
 CONF = config.CONF
 
 
-class RBACAbsoluteLimitsTestJSON(rbac_base.BaseV2ComputeRbacTest):
-
-    def tearDown(self):
-        rbac_utils.switch_role(self, switchToRbacRole=False)
-        super(RBACAbsoluteLimitsTestJSON, self).tearDown()
+class ServicesAdminRbacTest(rbac_base.BaseV2ComputeAdminRbacTest):
 
     @classmethod
     def setup_clients(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).setup_clients()
-        cls.identity_client = cls.os_adm.identity_client
-        cls.tenants_client = cls.os_adm.tenants_client
+        super(ServicesAdminRbacTest, cls).setup_clients()
+        cls.client = cls.services_client
 
     @classmethod
     def skip_checks(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).skip_checks()
+        super(ServicesAdminRbacTest, cls).skip_checks()
         if not CONF.compute_feature_enabled.api_extensions:
             raise cls.skipException(
                 '%s skipped as no compute extensions enabled' % cls.__name__)
 
-    @rbac_rule_validation.action(service="nova",
-                                 rule="os_compute_api:os-used-limits")
-    @decorators.idempotent_id('3fb60f83-9a5f-4fdd-89d9-26c3710844a1')
-    def test_used_limits_for_admin_rbac(self):
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ServicesAdminRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-services")
+    @decorators.idempotent_id('7472261b-9c6d-453a-bcb3-aecaa29ad281')
+    def test_list_services(self):
         rbac_utils.switch_role(self, switchToRbacRole=True)
-        self.limits_client.show_limits()
+        self.client.list_services()['services']
diff --git a/patrole_tempest_plugin/tests/api/compute/test_simple_tenant_usage_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_simple_tenant_usage_rbac.py
new file mode 100644
index 0000000..eb7a91f
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_simple_tenant_usage_rbac.py
@@ -0,0 +1,62 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.compute import rbac_base
+
+CONF = config.CONF
+
+
+class SimpleTenantUsageRbacTest(rbac_base.BaseV2ComputeRbacTest):
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(SimpleTenantUsageRbacTest, self).tearDown()
+
+    @classmethod
+    def setup_clients(cls):
+        super(SimpleTenantUsageRbacTest, cls).setup_clients()
+        cls.client = cls.os.tenant_usages_client
+
+    @classmethod
+    def skip_checks(cls):
+        super(SimpleTenantUsageRbacTest, cls).skip_checks()
+        if not CONF.compute_feature_enabled.api_extensions:
+            raise cls.skipException(
+                '%s skipped as no compute extensions enabled' % cls.__name__)
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-simple-tenant-usage:list")
+    @decorators.idempotent_id('2aef094f-0452-4df6-a66a-0ec22a92b16e')
+    def test_simple_tenant_usage_list(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.list_tenant_usages()
+
+    @rbac_rule_validation.action(
+        service="nova",
+        rule="os_compute_api:os-simple-tenant-usage:show")
+    @decorators.idempotent_id('fe7eacda-15c4-4bf7-93ef-1091c4546a9d')
+    def test_simple_tenant_usage_show(self):
+        # A server must be created in order for usage activity to exist; else
+        # the validation method in the API call throws an error.
+        self.create_test_server(wait_until='ACTIVE')['id']
+        tenant_id = self.auth_provider.credentials.tenant_id
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.show_tenant_usage(tenant_id=tenant_id)
diff --git a/patrole_tempest_plugin/tests/api/identity/v3/__init__.py b/patrole_tempest_plugin/tests/api/identity/v3/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/identity/v3/__init__.py
diff --git a/patrole_tempest_plugin/tests/api/identity/v3/rbac_base.py b/patrole_tempest_plugin/tests/api/identity/v3/rbac_base.py
new file mode 100644
index 0000000..3639caa
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/identity/v3/rbac_base.py
@@ -0,0 +1,58 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest.api.identity import base
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib.common.utils import test_utils
+
+CONF = config.CONF
+
+
+class BaseIdentityV3RbacAdminTest(base.BaseIdentityV3AdminTest):
+
+    credentials = ['primary', 'admin']
+
+    @classmethod
+    def skip_checks(cls):
+        super(BaseIdentityV3RbacAdminTest, cls).skip_checks()
+        if not CONF.rbac.rbac_flag:
+            raise cls.skipException(
+                "%s skipped as RBAC Flag not enabled" % cls.__name__)
+        if CONF.auth.tempest_roles != ['admin']:
+            raise cls.skipException(
+                "%s skipped because tempest roles is not admin" % cls.__name__)
+
+    @classmethod
+    def setup_clients(cls):
+        super(BaseIdentityV3RbacAdminTest, cls).setup_clients()
+        cls.auth_provider = cls.os.auth_provider
+        cls.admin_client = cls.os_adm.identity_v3_client
+        cls.creds_client = cls.os.credentials_client
+        cls.services_client = cls.os.identity_services_v3_client
+        cls.endpoints_client = cls.os.endpoints_v3_client
+
+    def _create_service(self):
+        """Creates a service for test."""
+        name = data_utils.rand_name('service')
+        serv_type = data_utils.rand_name('type')
+        desc = data_utils.rand_name('description')
+        service = self.services_client \
+                      .create_service(name=name,
+                                      type=serv_type,
+                                      description=desc)['service']
+        self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+                        self.services_client.delete_service, service['id'])
+        return service
diff --git a/patrole_tempest_plugin/tests/api/identity/v3/test_credentials_rbac.py b/patrole_tempest_plugin/tests/api/identity/v3/test_credentials_rbac.py
new file mode 100644
index 0000000..45abe9f
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/identity/v3/test_credentials_rbac.py
@@ -0,0 +1,117 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest.common.utils import data_utils
+from tempest import test
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.identity.v3 import rbac_base
+
+
+class IdentityCredentialsV3AdminRbacTest(
+        rbac_base.BaseIdentityV3RbacAdminTest):
+
+    def tearDown(self):
+        """Reverts user back to admin for cleanup."""
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(IdentityCredentialsV3AdminRbacTest, self).tearDown()
+
+    def _create_credential(self):
+        """Creates a user, project, and credential for test."""
+        user = self.setup_test_user()
+        user_id = user['id']
+        project_id = user['project_id']
+        keys = [data_utils.rand_name('Access'),
+                data_utils.rand_name('Secret')]
+        blob = "{\"access\": \"%s\", \"secret\": \"%s\"}" % (
+            keys[0], keys[1])
+        credential = self.creds_client \
+                         .create_credential(user_id=user_id,
+                                            project_id=project_id,
+                                            blob=blob,
+                                            type='ec2')['credential']
+
+        self.addCleanup(self.creds_client.delete_credential, credential['id'])
+        return (project_id, credential)
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:create_credential")
+    @test.idempotent_id('c1ab6d34-c59f-4ae1-bae9-bb3c1089b48e')
+    def test_create_credential(self):
+        """Create a Credential.
+
+        RBAC test for Keystone: identity:create_credential
+        """
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self._create_credential()
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:update_credential")
+    @test.idempotent_id('cfb05ce3-bffb-496e-a3c2-9515d730da63')
+    def test_update_credential(self):
+        """Update a Credential.
+
+        RBAC test for Keystone: identity:update_credential
+        """
+        project_id, credential = self._create_credential()
+        # Update blob keys
+        new_keys = [data_utils.rand_name('NewAccess'),
+                    data_utils.rand_name('NewSecret')]
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.creds_client \
+            .update_credential(credential['id'],
+                               credential=credential,
+                               access_key=new_keys[0],
+                               secret_key=new_keys[1],
+                               project_id=project_id)['credential']
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:delete_credential")
+    @test.idempotent_id('87ab42af-8d41-401b-90df-21e72919fcde')
+    def test_delete_credential(self):
+        """Delete a Credential.
+
+        RBAC test for Keystone: identity:delete_credential
+        """
+        _, credential = self._create_credential()
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.creds_client.delete_credential(credential['id'])
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:get_credential")
+    @test.idempotent_id('1b6eeae6-f1e8-4cdf-8903-1c002b1fc271')
+    def test_show_credential(self):
+        """Show/Get a Credential.
+
+        RBAC test for Keystone: identity:get_credential
+        """
+        _, credential = self._create_credential()
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.creds_client.show_credential(credential['id'])
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:list_credentials")
+    @test.idempotent_id('3de303e2-12a7-4811-805a-f18906472038')
+    def test_list_credentials(self):
+        """List all Credentials.
+
+        RBAC test for Keystone: identity:list_credentials
+        """
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.creds_client.list_credentials()
diff --git a/patrole_tempest_plugin/tests/api/identity/v3/test_endpoints_rbac.py b/patrole_tempest_plugin/tests/api/identity/v3/test_endpoints_rbac.py
new file mode 100644
index 0000000..b60c3e8
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/identity/v3/test_endpoints_rbac.py
@@ -0,0 +1,111 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest.common.utils import data_utils
+from tempest import config
+from tempest.lib.common.utils import test_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.identity.v3 import rbac_base
+
+CONF = config.CONF
+
+
+class IdentityEndpointsV3AdminRbacTest(
+        rbac_base.BaseIdentityV3RbacAdminTest):
+
+    def _create_endpoint(self):
+        """Creates a service and an endpoint for test."""
+        interface = 'public'
+        url = data_utils.rand_url()
+        service = self._create_service()
+        endpoint = self.endpoints_client \
+                       .create_endpoint(service_id=service['id'],
+                                        interface=interface,
+                                        url=url)['endpoint']
+        self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+                        self.endpoints_client.delete_endpoint, endpoint['id'])
+        return (service, endpoint)
+
+    def tearDown(self):
+        """Reverts user back to admin for cleanup."""
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(IdentityEndpointsV3AdminRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:create_endpoint")
+    @decorators.idempotent_id('6bdaecd4-0843-4ed6-ab64-3a57ab0cd127')
+    def test_create_endpoint(self):
+        """Create an endpoint.
+
+        RBAC test for Keystone: identity:create_endpoint
+        """
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self._create_endpoint()
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:update_endpoint")
+    @decorators.idempotent_id('6bdaecd4-0843-4ed6-ab64-3a57ab0cd128')
+    def test_update_endpoint(self):
+        """Update an endpoint.
+
+        RBAC test for Keystone: identity:update_endpoint
+        """
+        service, endpoint = self._create_endpoint()
+        new_url = data_utils.rand_url()
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.endpoints_client.update_endpoint(endpoint["id"],
+                                              service_id=service['id'],
+                                              url=new_url)
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:delete_endpoint")
+    @decorators.idempotent_id('6bdaecd4-0843-4ed6-ab64-3a57ab0cd129')
+    def test_delete_endpoint(self):
+        """Delete an endpoint.
+
+        RBAC test for Keystone: identity:delete_endpoint
+        """
+        _, endpoint = self._create_endpoint()
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.endpoints_client.delete_endpoint(endpoint['id'])
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:get_endpoint")
+    @decorators.idempotent_id('6bdaecd4-0843-4ed6-ab64-3a57ab0cd130')
+    def test_show_endpoint(self):
+        """Show/Get an endpoint.
+
+        RBAC test for Keystone: identity:get_endpoint
+        """
+        _, endpoint = self._create_endpoint()
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.endpoints_client.show_endpoint(endpoint['id'])
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:list_endpoints")
+    @decorators.idempotent_id('6bdaecd4-0843-4ed6-ab64-3a57ab0cd131')
+    def test_list_endpoints(self):
+        """Create a Domain.
+
+        RBAC test for Keystone: identity:create_domain
+        """
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.endpoints_client.list_endpoints()
diff --git a/patrole_tempest_plugin/tests/api/identity/v3/test_projects_rbac.py b/patrole_tempest_plugin/tests/api/identity/v3/test_projects_rbac.py
new file mode 100644
index 0000000..9af2ccf
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/identity/v3/test_projects_rbac.py
@@ -0,0 +1,99 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest.common.utils import data_utils
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.identity.v3 import rbac_base
+
+CONF = config.CONF
+
+
+class IdentityProjectV3AdminRbacTest(
+        rbac_base.BaseIdentityV3RbacAdminTest):
+
+    def tearDown(self):
+        """Reverts user back to admin for cleanup."""
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(IdentityProjectV3AdminRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:create_project")
+    @decorators.idempotent_id('0f148510-63bf-11e6-1564-080044d0d904')
+    def test_create_project(self):
+        """Create a Project.
+
+        RBAC test for Keystone: identity:create_project
+        """
+        name = data_utils.rand_name('project')
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        project = self.non_admin_projects_client \
+                      .create_project(name)['project']
+        self.addCleanup(self.projects_client.delete_project, project['id'])
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:update_project")
+    @decorators.idempotent_id('0f148510-63bf-11e6-1564-080044d0d905')
+    def test_update_project(self):
+        """Update a Project.
+
+        RBAC test for Keystone: identity:update_project
+        """
+        project = self.setup_test_project()
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.non_admin_projects_client \
+            .update_project(project['id'],
+                            description="Changed description")
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:delete_project")
+    @decorators.idempotent_id('0f148510-63bf-11e6-1564-080044d0d906')
+    def test_delete_project(self):
+        """Delete a Project.
+
+        RBAC test for Keystone: identity:delete_project
+        """
+        project = self.setup_test_project()
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.non_admin_projects_client.delete_project(project['id'])
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:get_project")
+    @decorators.idempotent_id('0f148510-63bf-11e6-1564-080044d0d907')
+    def test_show_project(self):
+        """Show a project.
+
+        RBAC test for Keystone: identity:get_project
+        """
+        project = self.setup_test_project()
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.non_admin_projects_client.show_project(project['id'])
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:list_projects")
+    @decorators.idempotent_id('0f148510-63bf-11e6-1564-080044d0d908')
+    def test_list_projects(self):
+        """List all projects.
+
+        RBAC test for Keystone: identity:list_projects
+        """
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.non_admin_projects_client.list_projects()
diff --git a/patrole_tempest_plugin/tests/api/identity/v3/test_services_rbac.py b/patrole_tempest_plugin/tests/api/identity/v3/test_services_rbac.py
new file mode 100644
index 0000000..f5a0a3e
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/identity/v3/test_services_rbac.py
@@ -0,0 +1,97 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest.common.utils import data_utils
+from tempest import config
+from tempest import test
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.identity.v3 import rbac_base
+
+CONF = config.CONF
+
+
+class IdentitySericesV3AdminRbacTest(rbac_base.BaseIdentityV3RbacAdminTest):
+
+    def tearDown(self):
+        """Reverts user back to admin for cleanup."""
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(IdentitySericesV3AdminRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:create_service")
+    @test.idempotent_id('9a4bb317-f0bb-4005-8df0-4b672885b7c8')
+    def test_create_service(self):
+        """Create a service.
+
+        RBAC test for Keystone: identity:create_service
+        """
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self._create_service()
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:update_service")
+    @test.idempotent_id('b39447d1-2cf6-40e5-a899-46f287f2ecf0')
+    def test_update_service(self):
+        """Update a service.
+
+        RBAC test for Keystone: identity:update_service
+        """
+        service = self._create_service()
+        new_name = data_utils.rand_name('new_test_name')
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.services_client.update_service(service['id'],
+                                            service=service,
+                                            name=new_name,
+                                            type=service['type'])
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:delete_service")
+    @test.idempotent_id('177b991a-438d-4bef-8e9f-9c6cc5a1c9e8')
+    def test_delete_service(self):
+        """Delete a service.
+
+        RBAC test for Keystone: identity:delete_service
+        """
+        service = self._create_service()
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.services_client.delete_service(service['id'])
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:get_service")
+    @test.idempotent_id('d89a9ac6-cd53-428d-84c0-5bc71f4a432d')
+    def test_show_service(self):
+        """Show/Get a service.
+
+        RBAC test for Keystone: identity:get_service
+        """
+        service = self._create_service()
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.services_client.show_service(service['id'])
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:list_services")
+    @test.idempotent_id('706e6bea-3385-4718-919c-0b5121395806')
+    def test_list_services(self):
+        """list all services.
+
+        RBAC test for Keystone: identity:list_services
+        """
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.services_client.list_services()
diff --git a/patrole_tempest_plugin/tests/api/identity/v3/test_users_rbac.py b/patrole_tempest_plugin/tests/api/identity/v3/test_users_rbac.py
new file mode 100644
index 0000000..b611541
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/identity/v3/test_users_rbac.py
@@ -0,0 +1,144 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.identity.v3 import rbac_base
+
+CONF = config.CONF
+
+
+class IdentityUserV3AdminRbacTest(
+        rbac_base.BaseIdentityV3RbacAdminTest):
+
+    def tearDown(self):
+        """Reverts user back to admin for cleanup."""
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(IdentityUserV3AdminRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:create_user")
+    @decorators.idempotent_id('0f148510-63bf-11e6-4522-080044d0d904')
+    def test_create_user(self):
+        """Creates a user.
+
+        RBAC test for Keystone: identity:create_user
+        """
+        user_name = data_utils.rand_name('test_create_user')
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.non_admin_users_client.create_user(name=user_name)
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:update_user")
+    @decorators.idempotent_id('0f148510-63bf-11e6-4522-080044d0d905')
+    def test_update_user(self):
+        """Updates a user.
+
+        RBAC test for Keystone: identity:update_user
+        """
+        user_name = data_utils.rand_name('test_update_user')
+        user = self._create_test_user(name=user_name, password=None)
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.non_admin_users_client.update_user(user['id'],
+                                                name=user_name,
+                                                email="changedUser@xyz.com")
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:delete_user")
+    @decorators.idempotent_id('0f148510-63bf-11e6-4522-080044d0d906')
+    def test_delete_user(self):
+        """Get the list of users.
+
+        RBAC test for Keystone: identity:delete_user
+        """
+        user_name = data_utils.rand_name('test_delete_user')
+        user = self._create_test_user(name=user_name, password=None)
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.non_admin_users_client.delete_user(user['id'])
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:list_users")
+    @decorators.idempotent_id('0f148510-63bf-11e6-4522-080044d0d907')
+    def test_list_users(self):
+        """Get the list of users.
+
+        RBAC test for Keystone: identity:list_users
+        """
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.non_admin_users_client.list_users()
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:get_user")
+    @decorators.idempotent_id('0f148510-63bf-11e6-4522-080044d0d908')
+    def test_show_user(self):
+        """Get one user.
+
+        RBAC test for Keystone: identity:get_user
+        """
+        user_name = data_utils.rand_name('test_get_user')
+        user = self._create_test_user(name=user_name, password=None)
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.non_admin_users_client.show_user(user['id'])
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:change_password")
+    @decorators.idempotent_id('0f148510-63bf-11e6-4522-080044d0d90a')
+    def test_change_password(self):
+        """Update a user password
+
+        RBAC test for Keystone: identity:change_password
+        """
+        user_name = data_utils.rand_name('test_change_password')
+        user = self._create_test_user(name=user_name, password='nova')
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.non_admin_users_client \
+            .update_user_password(user['id'],
+                                  original_password='nova',
+                                  password='neutron')
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:list_groups_for_user")
+    @decorators.idempotent_id('bd5946d4-46d2-423d-a800-a3e7aabc18b3')
+    def test_list_group_user(self):
+        """Lists groups which a user belongs to.
+
+        RBAC test for Keystone: identity:list_groups_for_user
+        """
+        user_name = data_utils.rand_name('User')
+        user = self._create_test_user(name=user_name, password=None)
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.non_admin_users_client.list_user_groups(user['id'])
+
+    @rbac_rule_validation.action(service="keystone",
+                                 rule="identity:list_user_projects")
+    @decorators.idempotent_id('0f148510-63bf-11e6-1564-080044d0d909')
+    def test_list_user_projects(self):
+        """List User's Projects.
+
+        RBAC test for Keystone: identity:list_user_projects
+        """
+        user = self.setup_test_user()
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.non_admin_users_client.list_user_projects(user['id'])
diff --git a/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_objects_rbac.py b/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_objects_rbac.py
new file mode 100644
index 0000000..324543e
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_objects_rbac.py
@@ -0,0 +1,111 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib.common.utils import test_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.image import rbac_base
+
+CONF = config.CONF
+
+
+class ImageNamespacesObjectsRbacTest(rbac_base.BaseV2ImageRbacTest):
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ImageNamespacesObjectsRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="add_metadef_object")
+    @decorators.idempotent_id("772156f2-e33d-432e-8521-12385746c2f0")
+    def test_create_metadef_object_in_namespace(self):
+        """Create Metadef Object Namespace Test
+
+        RBAC test for the glance add_metadef_object policy
+        """
+        namespace = self.create_namespace()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # create a md object, it will be cleaned automatically after
+        # cleanup of namespace
+        object_name = data_utils.rand_name('test-object')
+        self.namespace_objects_client.create_namespace_object(
+            namespace['namespace'],
+            name=object_name)
+        self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+                        self.namespace_objects_client.delete_namespace_object,
+                        namespace['namespace'], object_name)
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="get_metadef_objects")
+    @decorators.idempotent_id("48b50ecb-237d-4909-be62-b6a05c47b64d")
+    def test_list_metadef_objects_in_namespace(self):
+        """List Metadef Object Namespace Test
+
+        RBAC test for the glance get_metadef_objects policy
+        """
+        namespace = self.create_namespace()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # list md objects
+        self.namespace_objects_client.list_namespace_objects(
+            namespace['namespace'])
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="modify_metadef_object")
+    @decorators.idempotent_id("cd130b1d-89fa-479c-a90e-498d895fb455")
+    def test_update_metadef_object_in_namespace(self):
+        """Update Metadef Object Namespace Test
+
+        RBAC test for the glance modify_metadef_object policy
+        """
+        namespace = self.create_namespace()
+        object_name = data_utils.rand_name('test-object')
+        self.namespace_objects_client.create_namespace_object(
+            namespace['namespace'],
+            name=object_name)
+        self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+                        self.namespace_objects_client.delete_namespace_object,
+                        namespace['namespace'], object_name)
+
+        # Toggle role and modify object
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        new_name = "Object New Name"
+        self.namespace_objects_client.update_namespace_object(
+            namespace['namespace'], object_name, name=new_name)
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="get_metadef_object")
+    @decorators.idempotent_id("93c61420-5b80-4a0e-b6f3-4ccc6e90b865")
+    def test_show_metadef_object_in_namespace(self):
+        """Show Metadef Object Namespace Test
+
+        RBAC test for the glance get_metadef_object policy
+        """
+        namespace = self.create_namespace()
+        object_name = data_utils.rand_name('test-object')
+        self.namespace_objects_client.create_namespace_object(
+            namespace['namespace'],
+            name=object_name)
+        self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+                        self.namespace_objects_client.delete_namespace_object,
+                        namespace['namespace'], object_name)
+        # Toggle role and get object
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.namespace_objects_client.show_namespace_object(
+            namespace['namespace'],
+            object_name)
diff --git a/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_property_rbac.py b/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_property_rbac.py
new file mode 100644
index 0000000..6804fa3
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_property_rbac.py
@@ -0,0 +1,102 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.image import rbac_base
+
+CONF = config.CONF
+
+
+class NamespacesPropertyRbacTest(rbac_base.BaseV2ImageRbacTest):
+
+    @classmethod
+    def resource_setup(cls):
+        super(NamespacesPropertyRbacTest, cls).resource_setup()
+        body = cls.resource_types_client.list_resource_types()
+        cls.resource_name = body['resource_types'][0]['name']
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(NamespacesPropertyRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="add_metadef_property")
+    @decorators.idempotent_id('383555ca-677b-43e9-b809-acc2b5a0176c')
+    def test_add_md_properties(self):
+        """Create Image Metadef Namespace Property Test
+
+        RBAC test for the glance add_metadef_property policy
+        """
+        namespace = self.create_namespace()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        property_name = data_utils.rand_name('test-ns-property')
+        self.namespace_properties_client.create_namespace_property(
+            namespace=namespace['namespace'], type="string",
+            title=property_name, name=self.resource_name)
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="get_metadef_properties")
+    @decorators.idempotent_id('d5177611-c2b5-4000-bd9c-1987af9222ea')
+    def test_get_md_properties(self):
+        """List Image Metadef Namespace Properties Test
+
+        RBAC test for the glance get_metadef_properties policy
+        """
+        namespace = self.create_namespace()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.namespace_properties_client.list_namespace_properties(
+            namespace=namespace['namespace'])
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="get_metadef_property")
+    @decorators.idempotent_id('cfeda2af-bcab-433e-80c7-4b40c774aed5')
+    def test_get_md_property(self):
+        """Get Image Metadef Namespace Property Test
+
+        RBAC test for the glance get_metadef_property policy
+        """
+        namespace = self.create_namespace()
+        property_name = data_utils.rand_name('test-ns-property')
+        self.namespace_properties_client.create_namespace_property(
+            namespace=namespace['namespace'], type="string",
+            title=property_name, name=self.resource_name)
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.namespace_properties_client.show_namespace_properties(
+            namespace['namespace'], self.resource_name)
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="modify_metadef_property")
+    @decorators.idempotent_id('fdaf9363-4010-4f2f-8192-1b28f6b22e69')
+    def test_modify_md_properties(self):
+        """Modify Image Metadef Namespace Policy Test
+
+        RBAC test for the glance modify_metadef_property policy
+        """
+        namespace = self.create_namespace()
+        property_name = data_utils.rand_name('test-ns-property')
+        self.namespace_properties_client.create_namespace_property(
+            namespace=namespace['namespace'], type="string",
+            title=property_name, name=self.resource_name)
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.namespace_properties_client.update_namespace_properties(
+            namespace['namespace'], self.resource_name, type="string",
+            title=property_name, name=self.resource_name)
diff --git a/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_rbac.py b/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_rbac.py
new file mode 100644
index 0000000..6396f4f
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/image/v2/test_image_namespace_rbac.py
@@ -0,0 +1,82 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib.common.utils import test_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.image import rbac_base
+
+CONF = config.CONF
+
+
+class ImageNamespacesRbacTest(rbac_base.BaseV2ImageRbacTest):
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ImageNamespacesRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="add_metadef_namespace")
+    @decorators.idempotent_id('e0730ead-b824-4ffc-b774-9469df0e4da6')
+    def test_create_metadef_namespace(self):
+        """Create Image Metadef Namespace Test
+
+        RBAC test for the glance add_metadef_namespace policy
+        """
+        namespace_name = data_utils.rand_name('test-ns')
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.namespaces_client.create_namespace(
+            namespace=namespace_name,
+            protected=False)
+        self.addCleanup(
+            test_utils.call_and_ignore_notfound_exc,
+            self.namespaces_client.delete_namespace,
+            namespace_name)
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="get_metadef_namespaces")
+    @decorators.idempotent_id('f0b12538-9047-489e-98a5-2d78f48ce789')
+    def test_list_metadef_namespaces(self):
+        """List Image Metadef Namespace Test
+
+        RBAC test for the glance get_metadef_namespaces policy
+        """
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.namespaces_client.list_namespaces()
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="modify_metadef_namespace")
+    @decorators.idempotent_id('72c14a7e-927d-4f1a-9e1f-25475552922b')
+    def test_modify_metadef_namespace(self):
+        """Modify Image Metadef Namespace Test
+
+        RBAC test for the glance modify_metadef_namespace policy
+        """
+        namespace_name = data_utils.rand_name('test-ns')
+        body = self.namespaces_client.create_namespace(
+            namespace=namespace_name,
+            protected=False)
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.namespaces_client.update_namespace(body['namespace'],
+                                                description="My new "
+                                                            "description")
+        self.addCleanup(
+            test_utils.call_and_ignore_notfound_exc,
+            self.namespaces_client.delete_namespace,
+            namespace_name)
diff --git a/patrole_tempest_plugin/tests/api/image/v2/test_images_member_rbac.py b/patrole_tempest_plugin/tests/api/image/v2/test_images_member_rbac.py
index bcfeea7..d6a6d62 100644
--- a/patrole_tempest_plugin/tests/api/image/v2/test_images_member_rbac.py
+++ b/patrole_tempest_plugin/tests/api/image/v2/test_images_member_rbac.py
@@ -1,4 +1,4 @@
-# Copyright 2016 ATT Corporation.
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/tests/api/image/v2/test_images_rbac.py b/patrole_tempest_plugin/tests/api/image/v2/test_images_rbac.py
index 39b4cd9..5e20612 100644
--- a/patrole_tempest_plugin/tests/api/image/v2/test_images_rbac.py
+++ b/patrole_tempest_plugin/tests/api/image/v2/test_images_rbac.py
@@ -1,4 +1,4 @@
-# Copyright 2016 ATT Corporation.
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/tests/api/image/v2/test_test_image_namespace_resource_type.py b/patrole_tempest_plugin/tests/api/image/v2/test_test_image_namespace_resource_type.py
new file mode 100644
index 0000000..f7e76c1
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/image/v2/test_test_image_namespace_resource_type.py
@@ -0,0 +1,64 @@
+#    Copyright 2017 AT&T Corporation.
+#    All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib.common.utils import test_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.image import rbac_base
+
+CONF = config.CONF
+
+
+class ImageNamespacesResourceTypeRbacTest(rbac_base.BaseV2ImageRbacTest):
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(ImageNamespacesResourceTypeRbacTest, self).tearDown()
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="list_metadef_resource_types")
+    @decorators.idempotent_id('0416fc4d-cfdc-447b-88b6-d9f1dd0382f7')
+    def test_list_metadef_resource_types(self):
+        """List Metadef Resource Type Image Test
+
+        RBAC test for the glance list_metadef_resource_type policy.
+        """
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.resource_types_client.list_resource_types()
+
+    @rbac_rule_validation.action(service="glance",
+                                 rule="get_metadef_resource_type")
+    @decorators.idempotent_id('3698d53c-71ae-4803-a2c3-c272c054f25c')
+    def test_get_metadef_resource_type(self):
+        """Get Metadef Resource Type Image Test
+
+        RBAC test for the glance get_metadef_resource_type policy.
+        """
+        namespace_name = data_utils.rand_name('test-ns')
+        self.namespaces_client.create_namespace(
+            namespace=namespace_name,
+            protected=False)
+        self.addCleanup(
+            test_utils.call_and_ignore_notfound_exc,
+            self.namespaces_client.delete_namespace,
+            namespace_name)
+
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.resource_types_client.list_resource_type_association(
+            namespace_name)
diff --git a/patrole_tempest_plugin/tests/api/network/rbac_base.py b/patrole_tempest_plugin/tests/api/network/rbac_base.py
index 3bbe8b6..18a80a1 100644
--- a/patrole_tempest_plugin/tests/api/network/rbac_base.py
+++ b/patrole_tempest_plugin/tests/api/network/rbac_base.py
@@ -1,4 +1,6 @@
-# Copyright 2017 at&t
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
 #    Licensed 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
diff --git a/patrole_tempest_plugin/tests/api/network/test_networks_rbac.py b/patrole_tempest_plugin/tests/api/network/test_networks_rbac.py
index 77d042d..eb5c42a 100644
--- a/patrole_tempest_plugin/tests/api/network/test_networks_rbac.py
+++ b/patrole_tempest_plugin/tests/api/network/test_networks_rbac.py
@@ -1,4 +1,4 @@
-# Copyright 2016 AT&T Corp
+# Copyright 2017 AT&T Corporation.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
diff --git a/patrole_tempest_plugin/tests/api/volume/admin/test_volumes_backup_admin_rbac.py b/patrole_tempest_plugin/tests/api/volume/admin/test_volumes_backup_admin_rbac.py
new file mode 100644
index 0000000..e36d684
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/admin/test_volumes_backup_admin_rbac.py
@@ -0,0 +1,72 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class VolumesBackupsAdminRbacTest(rbac_base.BaseVolumeAdminRbacTest):
+
+    @classmethod
+    def skip_checks(cls):
+        super(VolumesBackupsAdminRbacTest, cls).skip_checks()
+        if not CONF.volume_feature_enabled.backup:
+            raise cls.skipException("Cinder backup feature disabled")
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(VolumesBackupsAdminRbacTest, self).tearDown()
+
+    @classmethod
+    def resource_setup(cls):
+        super(VolumesBackupsAdminRbacTest, cls).resource_setup()
+        cls.volume = cls.create_volume()
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="backup:backup-export")
+    @decorators.idempotent_id('e984ec8d-e8eb-485c-98bc-f1856020303c')
+    def test_volume_backup_export(self):
+        # Create a temp backup
+        backup = self.create_backup(volume_id=self.volume['id'])
+        # Export Backup
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.backups_client.export_backup(
+            backup['id'])['backup-record']
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="backup:backup-import")
+    @decorators.idempotent_id('1e70f039-4556-44cc-9cc1-edf2b7ed648b')
+    def test_volume_backup_import(self):
+        # Create a temp backup
+        backup = self.create_backup(volume_id=self.volume['id'])
+        # Export a temp backup
+        export_backup = self.backups_client.export_backup(
+            backup['id'])['backup-record']
+        # Import the temp backup
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        import_backup = self.backups_client.import_backup(
+            backup_service=export_backup['backup_service'],
+            backup_url=export_backup['backup_url'])['backup']
+        self.addCleanup(self.backups_client.delete_backup, import_backup['id'])
+
+
+class VolumesBackupsAdminV3RbacTest(VolumesBackupsAdminRbacTest):
+    _api_version = 3
diff --git a/patrole_tempest_plugin/tests/api/volume/test_snapshots_metadata_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_snapshots_metadata_rbac.py
new file mode 100644
index 0000000..d650177
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/test_snapshots_metadata_rbac.py
@@ -0,0 +1,90 @@
+# Copyright 2016 AT&T Corp
+# All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class SnapshotMetadataRbacTest(rbac_base.BaseVolumeRbacTest):
+
+    @classmethod
+    def skip_checks(cls):
+        super(SnapshotMetadataRbacTest, cls).skip_checks()
+        if not CONF.volume_feature_enabled.snapshot:
+            raise cls.skipException("Cinder snapshot feature disabled")
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(SnapshotMetadataRbacTest, self).tearDown()
+
+    @classmethod
+    def resource_setup(cls):
+        super(SnapshotMetadataRbacTest, cls).resource_setup()
+        cls.volume = cls.create_volume()
+        # Create a snapshot
+        cls.snapshot = cls.create_snapshot(volume_id=cls.volume['id'])
+        cls.snapshot_id = cls.snapshot['id']
+
+    @classmethod
+    def _create_test_snapshot_metadata(self):
+        # Create test snapshot metadata
+        metadata = {"key1": "value1",
+                    "key2": "value2",
+                    "key3": "value3"}
+        self.snapshots_client.create_snapshot_metadata(
+            self.snapshot_id, metadata)['metadata']
+
+    @rbac_rule_validation.action(
+        service="cinder",
+        rule="volume_extension:extended_snapshot_attributes")
+    @decorators.idempotent_id('c9cbec1c-edfe-46b8-825b-7b6ac0a58c25')
+    def test_create_snapshot_metadata(self):
+        # Create metadata for the snapshot
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self._create_test_snapshot_metadata()
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:get_volume_image_metadata")
+    @decorators.idempotent_id('f6912bb1-62e6-483d-bcd0-e98c1641f4c3')
+    def test_get_snapshot_metadata(self):
+        # Create volume and snapshot metadata
+        self._create_test_snapshot_metadata()
+        # Get metadata for the snapshot
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.snapshots_client.show_snapshot_metadata(
+            self.snapshot_id)
+
+    @rbac_rule_validation.action(
+        service="cinder",
+        rule="volume_extension:volume_tenant_attribute")
+    @decorators.idempotent_id('e2c73b00-0c19-4bb7-8c61-d84b1a223ed1')
+    def test_get_snapshot_metadata_for_volume_tenant(self):
+        # Create volume and snapshot metadata
+        self._create_test_snapshot_metadata()
+        # Get metadata for the snapshot
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Get the metadata of the snapshot
+        self.snapshots_client.show_snapshot_metadata(
+            self.snapshot_id)['metadata']
+
+
+class SnapshotMetadataV3RbacTest(SnapshotMetadataRbacTest):
+    _api_version = 3
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volume_actions_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volume_actions_rbac.py
new file mode 100644
index 0000000..b15eb3f
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/test_volume_actions_rbac.py
@@ -0,0 +1,121 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest.common import waiters
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib.common.utils import test_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class VolumesActionsRbacTest(rbac_base.BaseVolumeRbacTest):
+
+    @classmethod
+    def skip_checks(cls):
+        super(VolumesActionsRbacTest, cls).skip_checks()
+        # Nova is needed to create a server
+        if not CONF.service_available.nova:
+            skip_msg = ("%s skipped as nova is not available" % cls.__name__)
+            raise cls.skipException(skip_msg)
+        # Glance is needed to create an image
+        if not CONF.service_available.glance:
+            skip_msg = ("%s skipped as glance is not available" % cls.__name__)
+            raise cls.skipException(skip_msg)
+
+    @classmethod
+    def setup_clients(cls):
+        super(VolumesActionsRbacTest, cls).setup_clients()
+        cls.client = cls.os.volumes_client
+        cls.image_client = cls.os.image_client
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(VolumesActionsRbacTest, self).tearDown()
+
+    @classmethod
+    def resource_setup(cls):
+        super(VolumesActionsRbacTest, cls).resource_setup()
+        cls.volume = cls.create_volume()
+
+    def _attach_volume(self):
+        server = self.create_server(wait_until='ACTIVE')
+        self.servers_client.attach_volume(
+            server['id'], volumeId=self.volume['id'],
+            device='/dev/%s' % CONF.compute.volume_device_name)
+        waiters.wait_for_volume_status(self.client,
+                                       self.volume['id'], 'in-use')
+        self.addCleanup(self._detach_volume)
+
+    def _detach_volume(self):
+        self.client.detach_volume(self.volume['id'])
+        waiters.wait_for_volume_status(self.client, self.volume['id'],
+                                       'available')
+
+    @rbac_rule_validation.action(service="cinder", rule="volume:attach")
+    @decorators.idempotent_id('f97b10e4-2eed-4f8b-8632-71c02cb9fe42')
+    def test_attach_volume_to_instance(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Attach the volume
+        self._attach_volume()
+
+    @rbac_rule_validation.action(service="cinder", rule="volume:detach")
+    @decorators.idempotent_id('5a042f6a-688b-42e6-a02e-fe5c47b89b07')
+    def test_detach_volume_to_instance(self):
+        # Attach the volume
+        self._attach_volume()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Detach the volume
+        self._detach_volume()
+
+    @rbac_rule_validation.action(service="cinder", rule="volume:get")
+    @decorators.idempotent_id('c4c3fdd5-b1b1-49c3-b977-a9f40ee9257a')
+    def test_get_volume_attachment(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Get attachment
+        self.client.show_volume(self.volume['id'])
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:copy_volume_to_image")
+    @decorators.idempotent_id('b0d0da46-903c-4445-893e-20e680d68b50')
+    def test_volume_upload(self):
+        image_name = data_utils.rand_name('image')
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        body = self.client.upload_volume(
+            self.volume['id'], image_name=image_name,
+            disk_format=CONF.volume.disk_format)['os-volume_upload_image']
+        image_id = body['image_id']
+        self.addCleanup(test_utils.call_and_ignore_notfound_exc,
+                        self.image_client.delete_image,
+                        image_id)
+        waiters.wait_for_image_status(self.image_client, image_id, 'active')
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:update_readonly_flag")
+    @decorators.idempotent_id('2750717a-f250-4e41-9e09-02624aad6ff8')
+    def test_volume_readonly_update(self):
+        volume = self.create_volume()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Update volume readonly
+        self.client.update_volume_readonly(volume['id'], readonly=True)
+
+
+class VolumesActionsV3RbacTest(VolumesActionsRbacTest):
+    _api_version = 3
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volume_transfers_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volume_transfers_rbac.py
new file mode 100644
index 0000000..485844f
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/test_volume_transfers_rbac.py
@@ -0,0 +1,104 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest.common import waiters
+from tempest import config
+from tempest.lib.common.utils import test_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class VolumesTransfersRbacTest(rbac_base.BaseVolumeRbacTest):
+
+    credentials = ['primary', 'alt', 'admin']
+
+    @classmethod
+    def setup_clients(cls):
+        super(VolumesTransfersRbacTest, cls).setup_clients()
+        cls.client = cls.volumes_client
+        cls.alt_client = cls.os_alt.volumes_client
+        cls.alt_tenant_id = cls.alt_client.tenant_id
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(VolumesTransfersRbacTest, self).tearDown()
+
+    @classmethod
+    def resource_setup(cls):
+        super(VolumesTransfersRbacTest, cls).resource_setup()
+        cls.volume = cls.create_volume()
+
+    def _delete_transfer(self, transfer):
+        # Volume from create_volume_transfer test may get stuck in
+        # 'awaiting-transfer' state, preventing cleanup and causing
+        # the test to fail
+        test_utils.call_and_ignore_notfound_exc(
+            self.client.delete_volume_transfer, transfer['id'])
+        waiters.wait_for_volume_status(self.client, self.volume['id'],
+                                       'available')
+
+    def _create_transfer(self):
+        transfer = self.client.create_volume_transfer(
+            volume_id=self.volume['id'])['transfer']
+        self.addCleanup(self._delete_transfer, transfer)
+        return transfer
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:create_transfer")
+    @decorators.idempotent_id('25413af4-468d-48ff-94ca-4436f8526b3e')
+    def test_create_volume_transfer(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self._create_transfer()
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:get_transfer")
+    @decorators.idempotent_id('7a0925d3-ed97-4c25-8299-e5cdabe2eb55')
+    def test_get_volume_transfer(self):
+        transfer = self._create_transfer()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.show_volume_transfer(transfer['id'])
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:get_all_transfers")
+    @decorators.idempotent_id('02a06f2b-5040-49e2-b2b7-619a7db59603')
+    def test_list_volume_transfers(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.list_volume_transfers()
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:accept_transfer")
+    @decorators.idempotent_id('987f2a11-d657-4984-a6c9-28f06c1cd014')
+    def test_accept_volume_transfer(self):
+        transfer = self._create_transfer()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.accept_volume_transfer(transfer['id'],
+                                           auth_key=transfer['auth_key'])
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:delete_transfer")
+    @decorators.idempotent_id('4672187e-7fff-454b-832a-5c8865dda868')
+    def test_delete_volume_transfer(self):
+        transfer = self._create_transfer()
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.delete_volume_transfer(transfer['id'])
+
+
+class VolumesTransfersV3RbacTest(VolumesTransfersRbacTest):
+    _api_version = 3
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volumes_backup_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volumes_backup_rbac.py
new file mode 100644
index 0000000..32a1566
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/test_volumes_backup_rbac.py
@@ -0,0 +1,101 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest.common import waiters
+from tempest import config
+from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class VolumesBackupsRbacTest(rbac_base.BaseVolumeRbacTest):
+
+    @classmethod
+    def skip_checks(cls):
+        super(VolumesBackupsRbacTest, cls).skip_checks()
+        if not CONF.volume_feature_enabled.backup:
+            raise cls.skipException("Cinder backup feature disabled")
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(VolumesBackupsRbacTest, self).tearDown()
+
+    def create_backup(self, volume_id):
+        backup_name = data_utils.rand_name(
+            self.__class__.__name__ + '-Backup')
+        backup = self.backups_client.create_backup(
+            volume_id=volume_id, name=backup_name)['backup']
+        self.addCleanup(self.backups_client.delete_backup, backup['id'])
+        waiters.wait_for_backup_status(self.backups_client, backup['id'],
+                                       'available')
+        return backup
+
+    @classmethod
+    def resource_setup(cls):
+        super(VolumesBackupsRbacTest, cls).resource_setup()
+        cls.volume = cls.create_volume()
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="backup:create")
+    @decorators.idempotent_id('6887ec94-0bcf-4ab7-b30f-3808a4b5a2a5')
+    def test_volume_backup_create(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.create_backup(volume_id=self.volume['id'])
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="backup:get")
+    @decorators.idempotent_id('abd92bdd-b0fb-4dc4-9cfc-de9e968f8c8a')
+    def test_volume_backup_get(self):
+        # Create a temp backup
+        backup = self.create_backup(volume_id=self.volume['id'])
+        # Get a given backup
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.backups_client.show_backup(backup['id'])
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="backup:get_all")
+    @decorators.idempotent_id('4d18f0f0-7e01-4007-b622-dedc859b22f6')
+    def test_volume_backup_list(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.backups_client.list_backups()
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="backup:restore")
+    @decorators.idempotent_id('9c794bf9-2446-4f41-8fe0-80b71e757f9d')
+    def test_volume_backup_restore(self):
+        # Create a temp backup
+        backup = self.create_backup(volume_id=self.volume['id'])
+        # Restore backup
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.backups_client.restore_backup(backup['id'])['restore']
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="backup:delete")
+    @decorators.idempotent_id('d5d0c6a2-413d-437e-a73f-4bf2b41a20ed')
+    def test_volume_backup_delete(self):
+        # Create a temp backup
+        backup = self.create_backup(volume_id=self.volume['id'])
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Delete backup
+        self.backups_client.delete_backup(backup['id'])
+
+
+class VolumesBackupsV3RbacTest(VolumesBackupsRbacTest):
+    _api_version = 3
diff --git a/patrole_tempest_plugin/tests/api/volume/test_volumes_snapshots_rbac.py b/patrole_tempest_plugin/tests/api/volume/test_volumes_snapshots_rbac.py
new file mode 100644
index 0000000..2fb8885
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/volume/test_volumes_snapshots_rbac.py
@@ -0,0 +1,114 @@
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
+#
+#    Licensed 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.
+
+from tempest import config
+from tempest.lib import decorators
+
+from patrole_tempest_plugin import rbac_rule_validation
+from patrole_tempest_plugin.rbac_utils import rbac_utils
+from patrole_tempest_plugin.tests.api.volume import rbac_base
+
+CONF = config.CONF
+
+
+class VolumesSnapshotRbacTest(rbac_base.BaseVolumeRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(VolumesSnapshotRbacTest, cls).setup_clients()
+        cls.client = cls.snapshots_client
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=False)
+        super(VolumesSnapshotRbacTest, self).tearDown()
+
+    @classmethod
+    def skip_checks(cls):
+        super(VolumesSnapshotRbacTest, cls).skip_checks()
+        if not CONF.volume_feature_enabled.snapshot:
+            raise cls.skipException("Cinder volume snapshots are disabled")
+
+    @classmethod
+    def resource_setup(cls):
+        super(VolumesSnapshotRbacTest, cls).resource_setup()
+        # Create a test shared volume for tests
+        cls.name_field = cls.special_fields['name_field']
+        cls.descrip_field = cls.special_fields['descrip_field']
+        cls.volume = cls.create_volume()
+        # Create a test shared snapshot for tests
+        cls.snapshot = cls.create_snapshot(cls.volume['id'])
+
+    def _list_by_param_values(self, params, with_detail=False):
+        # Perform list or list_details action with given params
+        # and validates result.
+
+        if with_detail:
+            self.snapshots_client.list_snapshots(
+                detail=True, params=params)['snapshots']
+        else:
+            self.snapshots_client.list_snapshots(
+                params=params)['snapshots']
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:create_snapshot")
+    @decorators.idempotent_id('ac7b2ee5-fbc0-4360-afc2-de8fa4881ede')
+    def test_snapshot_create(self):
+        # Create a temp snapshot
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.create_snapshot(self.volume['id'])
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:get_snapshot")
+    @decorators.idempotent_id('93a11b40-1ba8-44d6-a196-f8d97220f796')
+    def test_snapshot_get(self):
+        # Get the snapshot
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.show_snapshot(self.snapshot
+                                  ['id'])['snapshot']
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:update_snapshot")
+    @decorators.idempotent_id('53fe8ee3-3bea-4ae8-a979-3c98ea72f620')
+    def test_snapshot_update(self):
+        new_desc = 'This is the new description of snapshot.'
+        params = {self.descrip_field: new_desc}
+        # Updates snapshot with new values
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self.client.update_snapshot(
+            self.snapshot['id'], **params)['snapshot']
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:get_all_snapshots")
+    @decorators.idempotent_id('e4edf0c0-2cd3-420f-b8ab-4d98a0718608')
+    def test_snapshots_get_all(self):
+        """list snapshots with params."""
+        # Verify list snapshots by display_name filter
+        params = {self.name_field: self.snapshot[self.name_field]}
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        self._list_by_param_values(params)
+
+    @rbac_rule_validation.action(service="cinder",
+                                 rule="volume:delete_snapshot")
+    @decorators.idempotent_id('c7fe54ec-3b70-4772-ba11-f166d95888a3')
+    def test_snapshot_delete(self):
+        # Create a temp snapshot
+        temp_snapshot = self.create_snapshot(self.volume['id'])
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        # Delete the snapshot
+        self.client.delete_snapshot(temp_snapshot['id'])
+
+
+class VolumesSnapshotV3RbacTest(VolumesSnapshotRbacTest):
+    _api_version = 3
diff --git a/releasenotes/source/conf.py b/releasenotes/source/conf.py
index 0fe31a5..d86d91c 100644
--- a/releasenotes/source/conf.py
+++ b/releasenotes/source/conf.py
@@ -12,8 +12,8 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Glance Release Notes documentation build configuration file, created by
-# sphinx-quickstart on Tue Nov  3 17:40:50 2015.
+# Patrole Release Notes documentation build configuration file, created by
+# sphinx-quickstart on Tue Jan 5 17:40:50 2017.
 #
 # This file is execfile()d with the current directory set to its
 # containing dir.
@@ -56,7 +56,7 @@
 
 # General information about the project.
 project = u'patrole Release Notes'
-copyright = u'2016, OpenStack Foundation'
+copyright = u'2017, Patrole Developers'
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
@@ -189,7 +189,7 @@
 # html_file_suffix = None
 
 # Output file base name for HTML help builder.
-htmlhelp_basename = 'GlanceReleaseNotesdoc'
+htmlhelp_basename = 'PatroleReleaseNotesdoc'
 
 
 # -- Options for LaTeX output ---------------------------------------------
@@ -209,8 +209,9 @@
 # (source start file, target name, title,
 #  author, documentclass [howto, manual, or own class]).
 latex_documents = [
-    ('index', 'GlanceReleaseNotes.tex', u'Glance Release Notes Documentation',
-     u'Glance Developers', 'manual'),
+    ('index', 'PatroleReleaseNotes.tex',
+     u'Patrole Release Notes Documentation',
+     u'Patrole Developers', 'manual'),
 ]
 
 # The name of an image file (relative to this directory) to place at the top of
@@ -239,8 +240,8 @@
 # One entry per manual page. List of tuples
 # (source start file, name, description, authors, manual section).
 man_pages = [
-    ('index', 'glancereleasenotes', u'Glance Release Notes Documentation',
-     [u'Glance Developers'], 1)
+    ('index', 'patrolereleasenotes', u'Patrole Release Notes Documentation',
+     [u'Patrole Developers'], 1)
 ]
 
 # If true, show URL addresses after external links.
@@ -253,8 +254,8 @@
 # (source start file, target name, title, author,
 #  dir menu entry, description, category)
 texinfo_documents = [
-    ('index', 'GlanceReleaseNotes', u'Glance Release Notes Documentation',
-     u'Glance Developers', 'GlanceReleaseNotes',
+    ('index', 'PatroleReleaseNotes', u'Patrole Release Notes Documentation',
+     u'Patrole Developers', 'PatroleReleaseNotes',
      'One line description of project.',
      'Miscellaneous'),
 ]
diff --git a/setup.py b/setup.py
index 3dccac1..f730546 100644
--- a/setup.py
+++ b/setup.py
@@ -1,4 +1,5 @@
-# Copyright (c) 2016 AT&T inc.
+# Copyright 2017 ATT Corporation.
+# All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
diff --git a/tests/base.py b/tests/base.py
index 14872ac..d73ff43 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -1,6 +1,6 @@
 # Copyright 2010-2011 OpenStack Foundation
 # Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
-# Copyright (c) 2016 AT&T Inc
+# Copyright 2017 AT&T Corporation.
 #
 # Licensed under the Apache License, Version 2.0 (the "License"); you may
 # not use this file except in compliance with the License. You may obtain
diff --git a/tests/resources/alt_admin_rbac_policy.json b/tests/resources/alt_admin_rbac_policy.json
new file mode 100644
index 0000000..bf07182
--- /dev/null
+++ b/tests/resources/alt_admin_rbac_policy.json
@@ -0,0 +1,5 @@
+{
+	"context_is_admin": "role:super_admin",
+	"admin_rule": "role:super_admin",
+	"non_admin_rule": "role:fake_admin"
+}
diff --git a/tests/resources/tenant_rbac_policy.json b/tests/resources/tenant_rbac_policy.json
new file mode 100644
index 0000000..2647e4d
--- /dev/null
+++ b/tests/resources/tenant_rbac_policy.json
@@ -0,0 +1,6 @@
+{
+	"rule1": "tenant_id:%(network:tenant_id)s",
+	"rule2": "tenant_id:%(tenant_id)s",
+	"rule3": "project_id:%(project_id)s",
+	"admin_rule": "role:admin and tenant_id:%(tenant_id)s"
+}
\ No newline at end of file
diff --git a/tests/test_patrole.py b/tests/test_patrole.py
index 3e85142..d374e20 100644
--- a/tests/test_patrole.py
+++ b/tests/test_patrole.py
@@ -1,4 +1,5 @@
-# Copyright (c) 2016 AT&T Inc
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License"); you may
 # not use this file except in compliance with the License. You may obtain
diff --git a/tests/test_rbac_role_converter.py b/tests/test_rbac_role_converter.py
index 4d4f673..09fa081 100644
--- a/tests/test_rbac_role_converter.py
+++ b/tests/test_rbac_role_converter.py
@@ -1,4 +1,5 @@
-#    Copyright 2017 AT&T Inc.
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
 #    not use this file except in compliance with the License. You may obtain
@@ -12,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import mock
 import os
 
 from tempest import config
@@ -34,8 +36,15 @@
         self.admin_policy_file = os.path.join(current_directory,
                                               'resources',
                                               'admin_rbac_policy.json')
+        self.alt_admin_policy_file = os.path.join(current_directory,
+                                                  'resources',
+                                                  'alt_admin_rbac_policy.json')
+        self.tenant_policy_file = os.path.join(current_directory,
+                                               'resources',
+                                               'tenant_rbac_policy.json')
 
-    def test_custom_policy(self):
+    @mock.patch.object(rbac_role_converter, 'LOG', autospec=True)
+    def test_custom_policy(self, m_log):
         default_roles = ['zero', 'one', 'two', 'three', 'four',
                          'five', 'six', 'seven', 'eight', 'nine']
 
@@ -55,7 +64,10 @@
         fake_rule = 'fake_rule'
 
         for role in default_roles:
-            self.assertRaises(KeyError, converter.allowed, fake_rule, role)
+            self.assertFalse(converter.allowed(fake_rule, role))
+            m_log.debug.assert_called_once_with(
+                "{0} not found in policy file.".format('fake_rule'))
+            m_log.debug.reset_mock()
 
         for rule, role_list in expected.items():
             for role in role_list:
@@ -69,10 +81,9 @@
 
         role = 'admin'
         allowed_rules = [
-            'admin_rule'
+            'admin_rule', 'is_admin_rule', 'alt_admin_rule'
         ]
-        disallowed_rules = [
-            'is_admin_rule', 'alt_admin_rule', 'non_admin_rule']
+        disallowed_rules = ['non_admin_rule']
 
         for rule in allowed_rules:
             allowed = converter.allowed(rule, role)
@@ -100,3 +111,72 @@
         for rule in disallowed_rules:
             allowed = converter.allowed(rule, role)
             self.assertFalse(allowed)
+
+    def test_admin_policy_file_with_context_is_admin(self):
+        converter = rbac_role_converter.RbacPolicyConverter(
+            None, "test", self.alt_admin_policy_file)
+
+        role = 'fake_admin'
+        allowed_rules = ['non_admin_rule']
+        disallowed_rules = ['admin_rule']
+
+        for rule in allowed_rules:
+            allowed = converter.allowed(rule, role)
+            self.assertTrue(allowed)
+
+        for rule in disallowed_rules:
+            allowed = converter.allowed(rule, role)
+            self.assertFalse(allowed)
+
+        role = 'super_admin'
+        allowed_rules = ['admin_rule']
+        disallowed_rules = ['non_admin_rule']
+
+        for rule in allowed_rules:
+            allowed = converter.allowed(rule, role)
+            self.assertTrue(allowed)
+
+        for rule in disallowed_rules:
+            allowed = converter.allowed(rule, role)
+            self.assertFalse(allowed)
+
+    def test_tenant_policy(self):
+        """Test whether rules with format tenant_id:%(tenant_id)s work.
+
+        Test whether Neutron rules that contain project_id, tenant_id, and
+        network:tenant_id pass.
+        """
+        test_tenant_id = mock.sentinel.tenant_id
+        converter = rbac_role_converter.RbacPolicyConverter(
+            test_tenant_id, "test", self.tenant_policy_file)
+
+        # Check whether Member role can perform expected actions.
+        allowed_rules = ['rule1', 'rule2', 'rule3']
+        for rule in allowed_rules:
+            allowed = converter.allowed(rule, 'Member')
+            self.assertTrue(allowed)
+        self.assertFalse(converter.allowed('admin_rule', 'Member'))
+
+        # Check whether admin role can perform expected actions.
+        allowed_rules.append('admin_rule')
+        for rule in allowed_rules:
+            allowed = converter.allowed(rule, 'admin')
+            self.assertTrue(allowed)
+
+        # Check whether _try_rule is called with the correct target dictionary.
+        with mock.patch.object(converter, '_try_rule', autospec=True) \
+            as mock_try_rule:
+            mock_try_rule.return_value = True
+
+            expected_target = {
+                "project_id": test_tenant_id,
+                "tenant_id": test_tenant_id,
+                "network:tenant_id": test_tenant_id
+            }
+
+            for rule in allowed_rules:
+                allowed = converter.allowed(rule, 'Member')
+                self.assertTrue(allowed)
+                mock_try_rule.assert_called_once_with(
+                    rule, expected_target, mock.ANY, mock.ANY)
+                mock_try_rule.reset_mock()
diff --git a/tests/test_rbac_utils.py b/tests/test_rbac_utils.py
index 657b389..3c645f8 100644
--- a/tests/test_rbac_utils.py
+++ b/tests/test_rbac_utils.py
@@ -1,4 +1,5 @@
-#    Copyright 2017 AT&T Inc.
+# Copyright 2017 AT&T Corporation.
+# All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
 #    not use this file except in compliance with the License. You may obtain
