Adding description for testcases - compute part3

When Tempest is used in customer site, often we are required to
provide a testcase list including testcase names and descriptions.
Now no this kind of doc is available, so we can add descriptions
with the format of doc string for every testcase, so later we
can generata such a testcase description list.

There are hundreds of testcases missing descriptions, so we can
add them gradually, and limit the modified files in one patch
for the convenience of reviewing.

Change-Id: I3726f5df4afd23366a5a34de9c9da8b69287d30e
partially-implements: blueprint testcase-description
This commit is contained in:
zhufl 2020-05-13 15:52:15 +08:00
parent 006e8d175e
commit a0e87dc582
9 changed files with 101 additions and 66 deletions

View File

@ -63,7 +63,7 @@ class FloatingIPsBulkAdminTestJSON(base.BaseV2ComputeAdminTest):
@decorators.idempotent_id('2c8f145f-8012-4cb8-ac7e-95a587f0e4ab') @decorators.idempotent_id('2c8f145f-8012-4cb8-ac7e-95a587f0e4ab')
@utils.services('network') @utils.services('network')
def test_create_list_delete_floating_ips_bulk(self): def test_create_list_delete_floating_ips_bulk(self):
# Create, List and delete the Floating IPs Bulk """Creating, listing and deleting the Floating IPs Bulk"""
pool = 'test_pool' pool = 'test_pool'
# NOTE(GMann): Reserving the IP range but those are not attached # NOTE(GMann): Reserving the IP range but those are not attached
# anywhere. Using the below mentioned interface which is not ever # anywhere. Using the below mentioned interface which is not ever

View File

@ -18,7 +18,7 @@ from tempest.lib import decorators
class HostsAdminTestJSON(base.BaseV2ComputeAdminTest): class HostsAdminTestJSON(base.BaseV2ComputeAdminTest):
"""Tests hosts API using admin privileges.""" """Tests nova hosts API using admin privileges."""
max_microversion = '2.42' max_microversion = '2.42'
@ -29,13 +29,13 @@ class HostsAdminTestJSON(base.BaseV2ComputeAdminTest):
@decorators.idempotent_id('9bfaf98d-e2cb-44b0-a07e-2558b2821e4f') @decorators.idempotent_id('9bfaf98d-e2cb-44b0-a07e-2558b2821e4f')
def test_list_hosts(self): def test_list_hosts(self):
# Listing hosts. """Listing nova hosts"""
hosts = self.client.list_hosts()['hosts'] hosts = self.client.list_hosts()['hosts']
self.assertGreaterEqual(len(hosts), 2, str(hosts)) self.assertGreaterEqual(len(hosts), 2, str(hosts))
@decorators.idempotent_id('5dc06f5b-d887-47a2-bb2a-67762ef3c6de') @decorators.idempotent_id('5dc06f5b-d887-47a2-bb2a-67762ef3c6de')
def test_list_hosts_with_zone(self): def test_list_hosts_with_zone(self):
# Listing hosts with specified availability zone """Listing nova hosts with specified availability zone"""
self.useFixture(fixtures.LockFixture('availability_zone')) self.useFixture(fixtures.LockFixture('availability_zone'))
hosts = self.client.list_hosts()['hosts'] hosts = self.client.list_hosts()['hosts']
host = hosts[0] host = hosts[0]
@ -45,23 +45,27 @@ class HostsAdminTestJSON(base.BaseV2ComputeAdminTest):
@decorators.idempotent_id('9af3c171-fbf4-4150-a624-22109733c2a6') @decorators.idempotent_id('9af3c171-fbf4-4150-a624-22109733c2a6')
def test_list_hosts_with_a_blank_zone(self): def test_list_hosts_with_a_blank_zone(self):
# Listing hosts with blank availability zone. """Listing nova hosts with blank availability zone
# If send the request with a blank zone, the request will be successful
# and it will return all the hosts list If send the request with a blank zone, the request will be successful
and it will return all the hosts list
"""
hosts = self.client.list_hosts(zone='')['hosts'] hosts = self.client.list_hosts(zone='')['hosts']
self.assertNotEmpty(hosts) self.assertNotEmpty(hosts)
@decorators.idempotent_id('c6ddbadb-c94e-4500-b12f-8ffc43843ff8') @decorators.idempotent_id('c6ddbadb-c94e-4500-b12f-8ffc43843ff8')
def test_list_hosts_with_nonexistent_zone(self): def test_list_hosts_with_nonexistent_zone(self):
# Listing hosts with not existing availability zone. """Listing nova hosts with not existing availability zone.
# If send the request with a nonexistent zone, the request will be
# successful and no hosts will be returned If send the request with a nonexistent zone, the request will be
successful and no hosts will be returned
"""
hosts = self.client.list_hosts(zone='xxx')['hosts'] hosts = self.client.list_hosts(zone='xxx')['hosts']
self.assertEmpty(hosts) self.assertEmpty(hosts)
@decorators.idempotent_id('38adbb12-aee2-4498-8aec-329c72423aa4') @decorators.idempotent_id('38adbb12-aee2-4498-8aec-329c72423aa4')
def test_show_host_detail(self): def test_show_host_detail(self):
# Showing host details. """Showing nova host details"""
hosts = self.client.list_hosts()['hosts'] hosts = self.client.list_hosts()['hosts']
hosts = [host for host in hosts if host['service'] == 'compute'] hosts = [host for host in hosts if host['service'] == 'compute']

View File

@ -39,21 +39,21 @@ class HostsAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('dd032027-0210-4d9c-860e-69b1b8deed5f') @decorators.idempotent_id('dd032027-0210-4d9c-860e-69b1b8deed5f')
def test_list_hosts_with_non_admin_user(self): def test_list_hosts_with_non_admin_user(self):
# Non admin user is not allowed to list hosts. """Non admin user is not allowed to list hosts"""
self.assertRaises(lib_exc.Forbidden, self.assertRaises(lib_exc.Forbidden,
self.non_admin_client.list_hosts) self.non_admin_client.list_hosts)
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('e75b0a1a-041f-47a1-8b4a-b72a6ff36d3f') @decorators.idempotent_id('e75b0a1a-041f-47a1-8b4a-b72a6ff36d3f')
def test_show_host_detail_with_nonexistent_hostname(self): def test_show_host_detail_with_nonexistent_hostname(self):
# Showing host detail with not existing hostname should fail. """Showing host detail with not existing hostname should fail"""
self.assertRaises(lib_exc.NotFound, self.assertRaises(lib_exc.NotFound,
self.client.show_host, 'nonexistent_hostname') self.client.show_host, 'nonexistent_hostname')
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('19ebe09c-bfd4-4b7c-81a2-e2e0710f59cc') @decorators.idempotent_id('19ebe09c-bfd4-4b7c-81a2-e2e0710f59cc')
def test_show_host_detail_with_non_admin_user(self): def test_show_host_detail_with_non_admin_user(self):
# Non admin user is not allowed to show host details. """Non admin user is not allowed to show host details"""
self.assertRaises(lib_exc.Forbidden, self.assertRaises(lib_exc.Forbidden,
self.non_admin_client.show_host, self.non_admin_client.show_host,
self.hostname) self.hostname)
@ -61,7 +61,7 @@ class HostsAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('e40c72b1-0239-4ed6-ba21-81a184df1f7c') @decorators.idempotent_id('e40c72b1-0239-4ed6-ba21-81a184df1f7c')
def test_update_host_with_non_admin_user(self): def test_update_host_with_non_admin_user(self):
# Non admin user is not allowed to update host. """Non admin user is not allowed to update host"""
self.assertRaises(lib_exc.Forbidden, self.assertRaises(lib_exc.Forbidden,
self.non_admin_client.update_host, self.non_admin_client.update_host,
self.hostname, self.hostname,
@ -71,8 +71,10 @@ class HostsAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('fbe2bf3e-3246-4a95-a59f-94e4e298ec77') @decorators.idempotent_id('fbe2bf3e-3246-4a95-a59f-94e4e298ec77')
def test_update_host_with_invalid_status(self): def test_update_host_with_invalid_status(self):
# Updating host to invalid status should fail, """Updating host to invalid status should fail
# 'status' can only be 'enable' or 'disable'.
'status' can only be 'enable' or 'disable'.
"""
self.assertRaises(lib_exc.BadRequest, self.assertRaises(lib_exc.BadRequest,
self.client.update_host, self.client.update_host,
self.hostname, self.hostname,
@ -82,8 +84,10 @@ class HostsAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('ab1e230e-5e22-41a9-8699-82b9947915d4') @decorators.idempotent_id('ab1e230e-5e22-41a9-8699-82b9947915d4')
def test_update_host_with_invalid_maintenance_mode(self): def test_update_host_with_invalid_maintenance_mode(self):
# Updating host to invalid maintenance mode should fail, """Updating host to invalid maintenance mode should fail
# 'maintenance_mode' can only be 'enable' or 'disable'.
'maintenance_mode' can only be 'enable' or 'disable'.
"""
self.assertRaises(lib_exc.BadRequest, self.assertRaises(lib_exc.BadRequest,
self.client.update_host, self.client.update_host,
self.hostname, self.hostname,
@ -93,8 +97,10 @@ class HostsAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('0cd85f75-6992-4a4a-b1bd-d11e37fd0eee') @decorators.idempotent_id('0cd85f75-6992-4a4a-b1bd-d11e37fd0eee')
def test_update_host_without_param(self): def test_update_host_without_param(self):
# Updating host without param should fail, """Updating host without param should fail
# 'status' or 'maintenance_mode' is needed for host update.
'status' or 'maintenance_mode' is needed for host update
"""
self.assertRaises(lib_exc.BadRequest, self.assertRaises(lib_exc.BadRequest,
self.client.update_host, self.client.update_host,
self.hostname) self.hostname)
@ -102,7 +108,7 @@ class HostsAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('23c92146-2100-4d68-b2d6-c7ade970c9c1') @decorators.idempotent_id('23c92146-2100-4d68-b2d6-c7ade970c9c1')
def test_update_nonexistent_host(self): def test_update_nonexistent_host(self):
# Updating not existing host should fail. """Updating not existing host should fail"""
self.assertRaises(lib_exc.NotFound, self.assertRaises(lib_exc.NotFound,
self.client.update_host, self.client.update_host,
'nonexistent_hostname', 'nonexistent_hostname',
@ -112,7 +118,7 @@ class HostsAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('0d981ac3-4320-4898-b674-82b61fbb60e4') @decorators.idempotent_id('0d981ac3-4320-4898-b674-82b61fbb60e4')
def test_startup_nonexistent_host(self): def test_startup_nonexistent_host(self):
# Starting up not existing host should fail. """Starting up not existing host should fail"""
self.assertRaises(lib_exc.NotFound, self.assertRaises(lib_exc.NotFound,
self.client.startup_host, self.client.startup_host,
'nonexistent_hostname') 'nonexistent_hostname')
@ -120,7 +126,7 @@ class HostsAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('9f4ebb7e-b2ae-4e5b-a38f-0fd1bb0ddfca') @decorators.idempotent_id('9f4ebb7e-b2ae-4e5b-a38f-0fd1bb0ddfca')
def test_startup_host_with_non_admin_user(self): def test_startup_host_with_non_admin_user(self):
# Non admin user is not allowed to startup host. """Non admin user is not allowed to startup host"""
self.assertRaises(lib_exc.Forbidden, self.assertRaises(lib_exc.Forbidden,
self.non_admin_client.startup_host, self.non_admin_client.startup_host,
self.hostname) self.hostname)
@ -128,7 +134,7 @@ class HostsAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('9e637444-29cf-4244-88c8-831ae82c31b6') @decorators.idempotent_id('9e637444-29cf-4244-88c8-831ae82c31b6')
def test_shutdown_nonexistent_host(self): def test_shutdown_nonexistent_host(self):
# Shutting down not existing host should fail. """Shutting down not existing host should fail"""
self.assertRaises(lib_exc.NotFound, self.assertRaises(lib_exc.NotFound,
self.client.shutdown_host, self.client.shutdown_host,
'nonexistent_hostname') 'nonexistent_hostname')
@ -136,7 +142,7 @@ class HostsAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('a803529c-7e3f-4d3c-a7d6-8e1c203d27f6') @decorators.idempotent_id('a803529c-7e3f-4d3c-a7d6-8e1c203d27f6')
def test_shutdown_host_with_non_admin_user(self): def test_shutdown_host_with_non_admin_user(self):
# Non admin user is not allowed to shutdown host. """Non admin user is not allowed to shutdown host"""
self.assertRaises(lib_exc.Forbidden, self.assertRaises(lib_exc.Forbidden,
self.non_admin_client.shutdown_host, self.non_admin_client.shutdown_host,
self.hostname) self.hostname)
@ -144,7 +150,7 @@ class HostsAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('f86bfd7b-0b13-4849-ae29-0322e83ee58b') @decorators.idempotent_id('f86bfd7b-0b13-4849-ae29-0322e83ee58b')
def test_reboot_nonexistent_host(self): def test_reboot_nonexistent_host(self):
# Rebooting not existing host should fail. """Rebooting not existing host should fail"""
self.assertRaises(lib_exc.NotFound, self.assertRaises(lib_exc.NotFound,
self.client.reboot_host, self.client.reboot_host,
'nonexistent_hostname') 'nonexistent_hostname')
@ -152,7 +158,7 @@ class HostsAdminNegativeTestJSON(base.BaseV2ComputeAdminTest):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('02d79bb9-eb57-4612-abf6-2cb38897d2f8') @decorators.idempotent_id('02d79bb9-eb57-4612-abf6-2cb38897d2f8')
def test_reboot_host_with_non_admin_user(self): def test_reboot_host_with_non_admin_user(self):
# Non admin user is not allowed to reboot host. """Non admin user is not allowed to reboot host"""
self.assertRaises(lib_exc.Forbidden, self.assertRaises(lib_exc.Forbidden,
self.non_admin_client.reboot_host, self.non_admin_client.reboot_host,
self.hostname) self.hostname)

View File

@ -36,19 +36,19 @@ class HypervisorAdminTestJSON(HypervisorAdminTestBase):
@decorators.idempotent_id('7f0ceacd-c64d-4e96-b8ee-d02943142cc5') @decorators.idempotent_id('7f0ceacd-c64d-4e96-b8ee-d02943142cc5')
def test_get_hypervisor_list(self): def test_get_hypervisor_list(self):
# List of hypervisor and available hypervisors hostname """List of hypervisor and available hypervisors hostname"""
hypers = self._list_hypervisors() hypers = self._list_hypervisors()
self.assertNotEmpty(hypers, "No hypervisors found.") self.assertNotEmpty(hypers, "No hypervisors found.")
@decorators.idempotent_id('1e7fdac2-b672-4ad1-97a4-bad0e3030118') @decorators.idempotent_id('1e7fdac2-b672-4ad1-97a4-bad0e3030118')
def test_get_hypervisor_list_details(self): def test_get_hypervisor_list_details(self):
# Display the details of the all hypervisor """Display the details of the all hypervisor"""
hypers = self.client.list_hypervisors(detail=True)['hypervisors'] hypers = self.client.list_hypervisors(detail=True)['hypervisors']
self.assertNotEmpty(hypers, "No hypervisors found.") self.assertNotEmpty(hypers, "No hypervisors found.")
@decorators.idempotent_id('94ff9eae-a183-428e-9cdb-79fde71211cc') @decorators.idempotent_id('94ff9eae-a183-428e-9cdb-79fde71211cc')
def test_get_hypervisor_show_details(self): def test_get_hypervisor_show_details(self):
# Display the details of the specified hypervisor """Display the details of the specified hypervisor"""
hypers = self._list_hypervisors() hypers = self._list_hypervisors()
self.assertNotEmpty(hypers, "No hypervisors found.") self.assertNotEmpty(hypers, "No hypervisors found.")
@ -59,14 +59,14 @@ class HypervisorAdminTestJSON(HypervisorAdminTestBase):
@decorators.idempotent_id('797e4f28-b6e0-454d-a548-80cc77c00816') @decorators.idempotent_id('797e4f28-b6e0-454d-a548-80cc77c00816')
def test_get_hypervisor_stats(self): def test_get_hypervisor_stats(self):
# Verify the stats of the all hypervisor """Verify the stats of the all hypervisor"""
stats = (self.client.show_hypervisor_statistics() stats = (self.client.show_hypervisor_statistics()
['hypervisor_statistics']) ['hypervisor_statistics'])
self.assertNotEmpty(stats) self.assertNotEmpty(stats)
@decorators.idempotent_id('91a50d7d-1c2b-4f24-b55a-a1fe20efca70') @decorators.idempotent_id('91a50d7d-1c2b-4f24-b55a-a1fe20efca70')
def test_get_hypervisor_uptime(self): def test_get_hypervisor_uptime(self):
# Verify that GET shows the specified hypervisor uptime """Verify that GET shows the specified hypervisor uptime"""
hypers = self._list_hypervisors() hypers = self._list_hypervisors()
# Ironic will register each baremetal node as a 'hypervisor', # Ironic will register each baremetal node as a 'hypervisor',
@ -106,10 +106,13 @@ class HypervisorAdminTestJSON(HypervisorAdminTestBase):
class HypervisorAdminV228Test(HypervisorAdminTestBase): class HypervisorAdminV228Test(HypervisorAdminTestBase):
"""Tests Hypervisors API higher than 2.27 that require admin privileges"""
min_microversion = '2.28' min_microversion = '2.28'
@decorators.idempotent_id('d46bab64-0fbe-4eb8-9133-e6ee56188cc5') @decorators.idempotent_id('d46bab64-0fbe-4eb8-9133-e6ee56188cc5')
def test_get_list_hypervisor_details(self): def test_get_list_hypervisor_details(self):
"""Test listing and showing hypervisor details"""
# NOTE(zhufl): This test tests the hypervisor APIs response schema # NOTE(zhufl): This test tests the hypervisor APIs response schema
# for 2.28 microversion. No specific assert or behaviour verification # for 2.28 microversion. No specific assert or behaviour verification
# is needed. # is needed.
@ -119,11 +122,13 @@ class HypervisorAdminV228Test(HypervisorAdminTestBase):
class HypervisorAdminUnderV252Test(HypervisorAdminTestBase): class HypervisorAdminUnderV252Test(HypervisorAdminTestBase):
"""Tests Hypervisors API below 2.53 that require admin privileges"""
max_microversion = '2.52' max_microversion = '2.52'
@decorators.idempotent_id('e81bba3f-6215-4e39-a286-d52d2f906862') @decorators.idempotent_id('e81bba3f-6215-4e39-a286-d52d2f906862')
def test_get_hypervisor_show_servers(self): def test_get_hypervisor_show_servers(self):
# Show instances about the specific hypervisors """Test showing instances about the specific hypervisors"""
hypers = self._list_hypervisors() hypers = self._list_hypervisors()
self.assertNotEmpty(hypers, "No hypervisors found.") self.assertNotEmpty(hypers, "No hypervisors found.")
@ -134,7 +139,7 @@ class HypervisorAdminUnderV252Test(HypervisorAdminTestBase):
@decorators.idempotent_id('d7e1805b-3b14-4a3b-b6fd-50ec6d9f361f') @decorators.idempotent_id('d7e1805b-3b14-4a3b-b6fd-50ec6d9f361f')
def test_search_hypervisor(self): def test_search_hypervisor(self):
# Searching for hypervisors by its name. """Test searching for hypervisors by its name"""
hypers = self._list_hypervisors() hypers = self._list_hypervisors()
self.assertNotEmpty(hypers, "No hypervisors found.") self.assertNotEmpty(hypers, "No hypervisors found.")
hypers = self.client.search_hypervisor( hypers = self.client.search_hypervisor(

View File

@ -40,8 +40,9 @@ class HypervisorAdminNegativeTestJSON(HypervisorAdminNegativeTestBase):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('c136086a-0f67-4b2b-bc61-8482bd68989f') @decorators.idempotent_id('c136086a-0f67-4b2b-bc61-8482bd68989f')
def test_show_nonexistent_hypervisor(self): def test_show_nonexistent_hypervisor(self):
# Showing not existing hypervisor should fail. """Test showing non existent hypervisor should fail"""
nonexistent_hypervisor_id = data_utils.rand_uuid() nonexistent_hypervisor_id = data_utils.rand_uuid()
self.assertRaises( self.assertRaises(
lib_exc.NotFound, lib_exc.NotFound,
self.client.show_hypervisor, self.client.show_hypervisor,
@ -50,7 +51,7 @@ class HypervisorAdminNegativeTestJSON(HypervisorAdminNegativeTestBase):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('51e663d0-6b89-4817-a465-20aca0667d03') @decorators.idempotent_id('51e663d0-6b89-4817-a465-20aca0667d03')
def test_show_hypervisor_with_non_admin_user(self): def test_show_hypervisor_with_non_admin_user(self):
# Non admin user is not allowed to show hypervisor. """Test showing hypervisor by non admin user should fail"""
hypers = self._list_hypervisors() hypers = self._list_hypervisors()
self.assertNotEmpty(hypers) self.assertNotEmpty(hypers)
@ -62,7 +63,7 @@ class HypervisorAdminNegativeTestJSON(HypervisorAdminNegativeTestBase):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('e2b061bb-13f9-40d8-9d6e-d5bf17595849') @decorators.idempotent_id('e2b061bb-13f9-40d8-9d6e-d5bf17595849')
def test_get_hypervisor_stats_with_non_admin_user(self): def test_get_hypervisor_stats_with_non_admin_user(self):
# Non admin user is not allowed to get hypervisor stats. """Test getting hypervisor stats by non admin user should fail"""
self.assertRaises( self.assertRaises(
lib_exc.Forbidden, lib_exc.Forbidden,
self.non_adm_client.show_hypervisor_statistics) self.non_adm_client.show_hypervisor_statistics)
@ -70,7 +71,7 @@ class HypervisorAdminNegativeTestJSON(HypervisorAdminNegativeTestBase):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('f60aa680-9a3a-4c7d-90e1-fae3a4891303') @decorators.idempotent_id('f60aa680-9a3a-4c7d-90e1-fae3a4891303')
def test_get_nonexistent_hypervisor_uptime(self): def test_get_nonexistent_hypervisor_uptime(self):
# Getting uptime of not existing hypervisor should fail. """Test showing uptime of non existent hypervisor should fail"""
nonexistent_hypervisor_id = data_utils.rand_uuid() nonexistent_hypervisor_id = data_utils.rand_uuid()
self.assertRaises( self.assertRaises(
@ -81,7 +82,7 @@ class HypervisorAdminNegativeTestJSON(HypervisorAdminNegativeTestBase):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('6c3461f9-c04c-4e2a-bebb-71dc9cb47df2') @decorators.idempotent_id('6c3461f9-c04c-4e2a-bebb-71dc9cb47df2')
def test_get_hypervisor_uptime_with_non_admin_user(self): def test_get_hypervisor_uptime_with_non_admin_user(self):
# Non admin user is not allowed to get hypervisor uptime. """Test showing uptime of hypervisor by non admin user should fail"""
hypers = self._list_hypervisors() hypers = self._list_hypervisors()
self.assertNotEmpty(hypers) self.assertNotEmpty(hypers)
@ -93,7 +94,7 @@ class HypervisorAdminNegativeTestJSON(HypervisorAdminNegativeTestBase):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('51b3d536-9b14-409c-9bce-c6f7c794994e') @decorators.idempotent_id('51b3d536-9b14-409c-9bce-c6f7c794994e')
def test_get_hypervisor_list_with_non_admin_user(self): def test_get_hypervisor_list_with_non_admin_user(self):
# List of hypervisor and available services with non admin user """Test listing hypervisors by non admin user should fail"""
self.assertRaises( self.assertRaises(
lib_exc.Forbidden, lib_exc.Forbidden,
self.non_adm_client.list_hypervisors) self.non_adm_client.list_hypervisors)
@ -101,19 +102,21 @@ class HypervisorAdminNegativeTestJSON(HypervisorAdminNegativeTestBase):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('dc02db05-e801-4c5f-bc8e-d915290ab345') @decorators.idempotent_id('dc02db05-e801-4c5f-bc8e-d915290ab345')
def test_get_hypervisor_list_details_with_non_admin_user(self): def test_get_hypervisor_list_details_with_non_admin_user(self):
# Non admin user is not allowed to list hypervisor details. """Test listing hypervisor details by non admin user should fail"""
self.assertRaises( self.assertRaises(
lib_exc.Forbidden, lib_exc.Forbidden,
self.non_adm_client.list_hypervisors, detail=True) self.non_adm_client.list_hypervisors, detail=True)
class HypervisorAdminNegativeUnderV252Test(HypervisorAdminNegativeTestBase): class HypervisorAdminNegativeUnderV252Test(HypervisorAdminNegativeTestBase):
"""Tests Hypervisors API below ver 2.53 that require admin privileges"""
max_microversion = '2.52' max_microversion = '2.52'
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('2a0a3938-832e-4859-95bf-1c57c236b924') @decorators.idempotent_id('2a0a3938-832e-4859-95bf-1c57c236b924')
def test_show_servers_with_non_admin_user(self): def test_show_servers_with_non_admin_user(self):
# Non admin user is not allowed to show servers on hypervisor. """Test showing hypervisor servers by non admin user should fail"""
hypers = self._list_hypervisors() hypers = self._list_hypervisors()
self.assertNotEmpty(hypers) self.assertNotEmpty(hypers)
@ -125,7 +128,7 @@ class HypervisorAdminNegativeUnderV252Test(HypervisorAdminNegativeTestBase):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('02463d69-0ace-4d33-a4a8-93d7883a2bba') @decorators.idempotent_id('02463d69-0ace-4d33-a4a8-93d7883a2bba')
def test_show_servers_with_nonexistent_hypervisor(self): def test_show_servers_with_nonexistent_hypervisor(self):
# Showing servers on not existing hypervisor should fail. """Test showing servers on non existent hypervisor should fail"""
nonexistent_hypervisor_id = data_utils.rand_uuid() nonexistent_hypervisor_id = data_utils.rand_uuid()
self.assertRaises( self.assertRaises(
@ -136,7 +139,7 @@ class HypervisorAdminNegativeUnderV252Test(HypervisorAdminNegativeTestBase):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('5b6a6c79-5dc1-4fa5-9c58-9c8085948e74') @decorators.idempotent_id('5b6a6c79-5dc1-4fa5-9c58-9c8085948e74')
def test_search_hypervisor_with_non_admin_user(self): def test_search_hypervisor_with_non_admin_user(self):
# Non admin user is not allowed to search hypervisor. """Test searching hypervisor by non admin user should fail"""
hypers = self._list_hypervisors() hypers = self._list_hypervisors()
self.assertNotEmpty(hypers) self.assertNotEmpty(hypers)
@ -148,7 +151,7 @@ class HypervisorAdminNegativeUnderV252Test(HypervisorAdminNegativeTestBase):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('19a45cc1-1000-4055-b6d2-28e8b2ec4faa') @decorators.idempotent_id('19a45cc1-1000-4055-b6d2-28e8b2ec4faa')
def test_search_nonexistent_hypervisor(self): def test_search_nonexistent_hypervisor(self):
# Searching not existing hypervisor should fail. """Test searching non existent hypervisor should fail"""
self.assertRaises( self.assertRaises(
lib_exc.NotFound, lib_exc.NotFound,
self.client.search_hypervisor, self.client.search_hypervisor,

View File

@ -19,6 +19,8 @@ from tempest.lib import decorators
class KeyPairsV210TestJSON(base.BaseKeypairTest): class KeyPairsV210TestJSON(base.BaseKeypairTest):
"""Tests KeyPairs API with microversion higher than 2.9"""
credentials = ['primary', 'admin'] credentials = ['primary', 'admin']
min_microversion = '2.10' min_microversion = '2.10'
@ -48,6 +50,13 @@ class KeyPairsV210TestJSON(base.BaseKeypairTest):
@decorators.idempotent_id('3c8484af-cfb3-48f6-b8ba-d5d58bbf3eac') @decorators.idempotent_id('3c8484af-cfb3-48f6-b8ba-d5d58bbf3eac')
def test_admin_manage_keypairs_for_other_users(self): def test_admin_manage_keypairs_for_other_users(self):
"""Test admin managing keypairs for other users
First admin creates a keypair for an other user, then admin lists
keypairs filtered by that user, and keypairs created for that user
should appear in the result and keypairs not created for that user
should not appear in the result.
"""
user_id = self.non_admin_client.user_id user_id = self.non_admin_client.user_id
key_list = self._create_and_check_keypairs(user_id) key_list = self._create_and_check_keypairs(user_id)
first_keyname = key_list[0]['name'] first_keyname = key_list[0]['name']

View File

@ -53,10 +53,12 @@ class QuotasAdminNegativeTestBase(base.BaseV2ComputeAdminTest):
class QuotasAdminNegativeTest(QuotasAdminNegativeTestBase): class QuotasAdminNegativeTest(QuotasAdminNegativeTestBase):
"""Negative tests of nova quotas"""
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('733abfe8-166e-47bb-8363-23dbd7ff3476') @decorators.idempotent_id('733abfe8-166e-47bb-8363-23dbd7ff3476')
def test_update_quota_normal_user(self): def test_update_quota_normal_user(self):
"""Test updating nova quota by normal user should fail"""
self.assertRaises(lib_exc.Forbidden, self.assertRaises(lib_exc.Forbidden,
self.client.update_quota_set, self.client.update_quota_set,
self.demo_tenant_id, self.demo_tenant_id,
@ -67,7 +69,7 @@ class QuotasAdminNegativeTest(QuotasAdminNegativeTestBase):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('91058876-9947-4807-9f22-f6eb17140d9b') @decorators.idempotent_id('91058876-9947-4807-9f22-f6eb17140d9b')
def test_create_server_when_cpu_quota_is_full(self): def test_create_server_when_cpu_quota_is_full(self):
# Disallow server creation when tenant's vcpu quota is full """Disallow server creation when tenant's vcpu quota is full"""
self._update_quota('cores', 0) self._update_quota('cores', 0)
self.assertRaises((lib_exc.Forbidden, lib_exc.OverLimit), self.assertRaises((lib_exc.Forbidden, lib_exc.OverLimit),
self.create_test_server) self.create_test_server)
@ -75,7 +77,7 @@ class QuotasAdminNegativeTest(QuotasAdminNegativeTestBase):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('6fdd7012-584d-4327-a61c-49122e0d5864') @decorators.idempotent_id('6fdd7012-584d-4327-a61c-49122e0d5864')
def test_create_server_when_memory_quota_is_full(self): def test_create_server_when_memory_quota_is_full(self):
# Disallow server creation when tenant's memory quota is full """Disallow server creation when tenant's memory quota is full"""
self._update_quota('ram', 0) self._update_quota('ram', 0)
self.assertRaises((lib_exc.Forbidden, lib_exc.OverLimit), self.assertRaises((lib_exc.Forbidden, lib_exc.OverLimit),
self.create_test_server) self.create_test_server)
@ -83,13 +85,15 @@ class QuotasAdminNegativeTest(QuotasAdminNegativeTestBase):
@decorators.attr(type=['negative']) @decorators.attr(type=['negative'])
@decorators.idempotent_id('7c6be468-0274-449a-81c3-ac1c32ee0161') @decorators.idempotent_id('7c6be468-0274-449a-81c3-ac1c32ee0161')
def test_create_server_when_instances_quota_is_full(self): def test_create_server_when_instances_quota_is_full(self):
# Once instances quota limit is reached, disallow server creation """Once instances quota limit is reached, disallow server creation"""
self._update_quota('instances', 0) self._update_quota('instances', 0)
self.assertRaises((lib_exc.Forbidden, lib_exc.OverLimit), self.assertRaises((lib_exc.Forbidden, lib_exc.OverLimit),
self.create_test_server) self.create_test_server)
class QuotasSecurityGroupAdminNegativeTest(QuotasAdminNegativeTestBase): class QuotasSecurityGroupAdminNegativeTest(QuotasAdminNegativeTestBase):
"""Negative tests of nova security group quota"""
max_microversion = '2.35' max_microversion = '2.35'
@decorators.skip_because(bug="1186354", @decorators.skip_because(bug="1186354",
@ -98,7 +102,7 @@ class QuotasSecurityGroupAdminNegativeTest(QuotasAdminNegativeTestBase):
@decorators.idempotent_id('7c6c8f3b-2bf6-4918-b240-57b136a66aa0') @decorators.idempotent_id('7c6c8f3b-2bf6-4918-b240-57b136a66aa0')
@utils.services('network') @utils.services('network')
def test_security_groups_exceed_limit(self): def test_security_groups_exceed_limit(self):
# Negative test: Creation Security Groups over limit should FAIL """Negative test: Creation Security Groups over limit should FAIL"""
# Set the quota to number of used security groups # Set the quota to number of used security groups
sg_quota = self.limits_client.show_limits()['limits']['absolute'][ sg_quota = self.limits_client.show_limits()['limits']['absolute'][
'totalSecurityGroupsUsed'] 'totalSecurityGroupsUsed']
@ -117,7 +121,7 @@ class QuotasSecurityGroupAdminNegativeTest(QuotasAdminNegativeTestBase):
@decorators.idempotent_id('6e9f436d-f1ed-4f8e-a493-7275dfaa4b4d') @decorators.idempotent_id('6e9f436d-f1ed-4f8e-a493-7275dfaa4b4d')
@utils.services('network') @utils.services('network')
def test_security_groups_rules_exceed_limit(self): def test_security_groups_rules_exceed_limit(self):
# Negative test: Creation of Security Group Rules should FAIL """Negative test: Creation of Security Group Rules should FAIL"""
# when we reach limit maxSecurityGroupRules # when we reach limit maxSecurityGroupRules
self._update_quota('security_group_rules', 0) self._update_quota('security_group_rules', 0)

View File

@ -19,7 +19,10 @@ from tempest.lib import decorators
class ServicesAdminTestJSON(base.BaseV2ComputeAdminTest): class ServicesAdminTestJSON(base.BaseV2ComputeAdminTest):
"""Tests Services API. List and Enable/Disable require admin privileges.""" """Tests Nova Services API.
List and Enable/Disable require admin privileges.
"""
@classmethod @classmethod
def setup_clients(cls): def setup_clients(cls):
@ -28,13 +31,13 @@ class ServicesAdminTestJSON(base.BaseV2ComputeAdminTest):
@decorators.idempotent_id('5be41ef4-53d1-41cc-8839-5c2a48a1b283') @decorators.idempotent_id('5be41ef4-53d1-41cc-8839-5c2a48a1b283')
def test_list_services(self): def test_list_services(self):
# Listing nova services """Listing nova services"""
services = self.client.list_services()['services'] services = self.client.list_services()['services']
self.assertNotEmpty(services) self.assertNotEmpty(services)
@decorators.idempotent_id('f345b1ec-bc6e-4c38-a527-3ca2bc00bef5') @decorators.idempotent_id('f345b1ec-bc6e-4c38-a527-3ca2bc00bef5')
def test_get_service_by_service_binary_name(self): def test_get_service_by_service_binary_name(self):
# Listing nova services by binary name. """Listing nova services by binary name"""
binary_name = 'nova-compute' binary_name = 'nova-compute'
services = self.client.list_services(binary=binary_name)['services'] services = self.client.list_services(binary=binary_name)['services']
self.assertNotEmpty(services) self.assertNotEmpty(services)
@ -43,7 +46,7 @@ class ServicesAdminTestJSON(base.BaseV2ComputeAdminTest):
@decorators.idempotent_id('affb42d5-5b4b-43c8-8b0b-6dca054abcca') @decorators.idempotent_id('affb42d5-5b4b-43c8-8b0b-6dca054abcca')
def test_get_service_by_host_name(self): def test_get_service_by_host_name(self):
# Listing nova services by host name. """Listing nova services by host name"""
services = self.client.list_services()['services'] services = self.client.list_services()['services']
host_name = services[0]['host'] host_name = services[0]['host']
services_on_host = [service for service in services if services_on_host = [service for service in services if

View File

@ -18,11 +18,12 @@ from tempest.lib import decorators
class FlavorsV2TestJSON(base.BaseV2ComputeTest): class FlavorsV2TestJSON(base.BaseV2ComputeTest):
"""Tests Flavors"""
@decorators.attr(type='smoke') @decorators.attr(type='smoke')
@decorators.idempotent_id('e36c0eaa-dff5-4082-ad1f-3f9a80aa3f59') @decorators.idempotent_id('e36c0eaa-dff5-4082-ad1f-3f9a80aa3f59')
def test_list_flavors(self): def test_list_flavors(self):
# List of all flavors should contain the expected flavor """List of all flavors should contain the expected flavor"""
flavors = self.flavors_client.list_flavors()['flavors'] flavors = self.flavors_client.list_flavors()['flavors']
flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor'] flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor']
flavor_min_detail = {'id': flavor['id'], 'links': flavor['links'], flavor_min_detail = {'id': flavor['id'], 'links': flavor['links'],
@ -31,7 +32,7 @@ class FlavorsV2TestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('6e85fde4-b3cd-4137-ab72-ed5f418e8c24') @decorators.idempotent_id('6e85fde4-b3cd-4137-ab72-ed5f418e8c24')
def test_list_flavors_with_detail(self): def test_list_flavors_with_detail(self):
# Detailed list of all flavors should contain the expected flavor """Detailed list of all flavors should contain the expected flavor"""
flavors = self.flavors_client.list_flavors(detail=True)['flavors'] flavors = self.flavors_client.list_flavors(detail=True)['flavors']
flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor'] flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor']
self.assertIn(flavor, flavors) self.assertIn(flavor, flavors)
@ -39,20 +40,20 @@ class FlavorsV2TestJSON(base.BaseV2ComputeTest):
@decorators.attr(type='smoke') @decorators.attr(type='smoke')
@decorators.idempotent_id('1f12046b-753d-40d2-abb6-d8eb8b30cb2f') @decorators.idempotent_id('1f12046b-753d-40d2-abb6-d8eb8b30cb2f')
def test_get_flavor(self): def test_get_flavor(self):
# The expected flavor details should be returned """The expected flavor details should be returned"""
flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor'] flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor']
self.assertEqual(self.flavor_ref, flavor['id']) self.assertEqual(self.flavor_ref, flavor['id'])
@decorators.idempotent_id('8d7691b3-6ed4-411a-abc9-2839a765adab') @decorators.idempotent_id('8d7691b3-6ed4-411a-abc9-2839a765adab')
def test_list_flavors_limit_results(self): def test_list_flavors_limit_results(self):
# Only the expected number of flavors should be returned """Only the expected number of flavors should be returned"""
params = {'limit': 1} params = {'limit': 1}
flavors = self.flavors_client.list_flavors(**params)['flavors'] flavors = self.flavors_client.list_flavors(**params)['flavors']
self.assertEqual(1, len(flavors)) self.assertEqual(1, len(flavors))
@decorators.idempotent_id('b26f6327-2886-467a-82be-cef7a27709cb') @decorators.idempotent_id('b26f6327-2886-467a-82be-cef7a27709cb')
def test_list_flavors_detailed_limit_results(self): def test_list_flavors_detailed_limit_results(self):
# Only the expected number of flavors (detailed) should be returned """Only the expected number of flavors(detailed) should be returned"""
params = {'limit': 1} params = {'limit': 1}
flavors = self.flavors_client.list_flavors(detail=True, flavors = self.flavors_client.list_flavors(detail=True,
**params)['flavors'] **params)['flavors']
@ -60,7 +61,7 @@ class FlavorsV2TestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('e800f879-9828-4bd0-8eae-4f17189951fb') @decorators.idempotent_id('e800f879-9828-4bd0-8eae-4f17189951fb')
def test_list_flavors_using_marker(self): def test_list_flavors_using_marker(self):
# The list of flavors should start from the provided marker """The list of flavors should start from the provided marker"""
flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor'] flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor']
flavor_id = flavor['id'] flavor_id = flavor['id']
@ -71,7 +72,7 @@ class FlavorsV2TestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('6db2f0c0-ddee-4162-9c84-0703d3dd1107') @decorators.idempotent_id('6db2f0c0-ddee-4162-9c84-0703d3dd1107')
def test_list_flavors_detailed_using_marker(self): def test_list_flavors_detailed_using_marker(self):
# The list of flavors should start from the provided marker """The list of flavors should start from the provided marker"""
flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor'] flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor']
flavor_id = flavor['id'] flavor_id = flavor['id']
@ -83,7 +84,7 @@ class FlavorsV2TestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('3df2743e-3034-4e57-a4cb-b6527f6eac79') @decorators.idempotent_id('3df2743e-3034-4e57-a4cb-b6527f6eac79')
def test_list_flavors_detailed_filter_by_min_disk(self): def test_list_flavors_detailed_filter_by_min_disk(self):
# The detailed list of flavors should be filtered by disk space """The detailed list of flavors should be filtered by disk space"""
flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor'] flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor']
flavor_id = flavor['id'] flavor_id = flavor['id']
@ -94,7 +95,7 @@ class FlavorsV2TestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('09fe7509-b4ee-4b34-bf8b-39532dc47292') @decorators.idempotent_id('09fe7509-b4ee-4b34-bf8b-39532dc47292')
def test_list_flavors_detailed_filter_by_min_ram(self): def test_list_flavors_detailed_filter_by_min_ram(self):
# The detailed list of flavors should be filtered by RAM """The detailed list of flavors should be filtered by RAM"""
flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor'] flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor']
flavor_id = flavor['id'] flavor_id = flavor['id']
@ -105,7 +106,7 @@ class FlavorsV2TestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('10645a4d-96f5-443f-831b-730711e11dd4') @decorators.idempotent_id('10645a4d-96f5-443f-831b-730711e11dd4')
def test_list_flavors_filter_by_min_disk(self): def test_list_flavors_filter_by_min_disk(self):
# The list of flavors should be filtered by disk space """The list of flavors should be filtered by disk space"""
flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor'] flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor']
flavor_id = flavor['id'] flavor_id = flavor['id']
@ -115,7 +116,7 @@ class FlavorsV2TestJSON(base.BaseV2ComputeTest):
@decorators.idempotent_id('935cf550-e7c8-4da6-8002-00f92d5edfaa') @decorators.idempotent_id('935cf550-e7c8-4da6-8002-00f92d5edfaa')
def test_list_flavors_filter_by_min_ram(self): def test_list_flavors_filter_by_min_ram(self):
# The list of flavors should be filtered by RAM """The list of flavors should be filtered by RAM"""
flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor'] flavor = self.flavors_client.show_flavor(self.flavor_ref)['flavor']
flavor_id = flavor['id'] flavor_id = flavor['id']