Merge "Copyright and other information correctness"
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_absolute_limits_rbac.py
index 3da3bd8..8e1f6ee 100644
--- a/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
+++ b/patrole_tempest_plugin/tests/api/compute/test_absolute_limits_rbac.py
@@ -11,30 +11,31 @@
 #    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 AbsoluteLimitsRbacTest(rbac_base.BaseV2ComputeRbacTest):
 
     def tearDown(self):
         rbac_utils.switch_role(self, switchToRbacRole=False)
-        super(RBACAbsoluteLimitsTestJSON, self).tearDown()
+        super(AbsoluteLimitsRbacTest, self).tearDown()
 
     @classmethod
     def setup_clients(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).setup_clients()
+        super(AbsoluteLimitsRbacTest, cls).setup_clients()
         cls.identity_client = cls.os_adm.identity_client
         cls.tenants_client = cls.os_adm.tenants_client
 
     @classmethod
     def skip_checks(cls):
-        super(RBACAbsoluteLimitsTestJSON, cls).skip_checks()
+        super(AbsoluteLimitsRbacTest, cls).skip_checks()
         if not CONF.compute_feature_enabled.api_extensions:
             raise cls.skipException(
                 '%s skipped as no compute extensions enabled' % cls.__name__)
diff --git a/patrole_tempest_plugin/tests/api/compute/test_access_ips_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_access_ips_rbac.py
new file mode 100644
index 0000000..ffeebc9
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_access_ips_rbac.py
@@ -0,0 +1,45 @@
+# 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 AccessIpsRbacTest(rbac_base.BaseV2ComputeRbacTest):
+
+    def tearDown(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        super(AccessIpsRbacTest, self).tearDown()
+
+    @classmethod
+    def skip_checks(cls):
+        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-access-ips")
+    @decorators.idempotent_id('f5811ed1-95d4-4085-a69e-87e6bd958738')
+    def test_access_ip(self):
+        rbac_utils.switch_role(self, switchToRbacRole=True)
+        ipv4 = '127.0.0.1'
+        self.create_test_server(accessIPv4=ipv4)
diff --git a/patrole_tempest_plugin/tests/api/compute/test_services_rbac.py b/patrole_tempest_plugin/tests/api/compute/test_services_rbac.py
new file mode 100644
index 0000000..a2f6409
--- /dev/null
+++ b/patrole_tempest_plugin/tests/api/compute/test_services_rbac.py
@@ -0,0 +1,50 @@
+#    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 ServicesAdminRbacTest(rbac_base.BaseV2ComputeAdminRbacTest):
+
+    @classmethod
+    def setup_clients(cls):
+        super(ServicesAdminRbacTest, cls).setup_clients()
+        cls.client = cls.services_client
+
+    @classmethod
+    def skip_checks(cls):
+        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__)
+
+    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.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)