diff --git a/tempest/api/compute/images/test_images_oneserver.py b/tempest/api/compute/images/test_images_oneserver.py index b81142103d..23f832670e 100644 --- a/tempest/api/compute/images/test_images_oneserver.py +++ b/tempest/api/compute/images/test_images_oneserver.py @@ -22,6 +22,7 @@ CONF = config.CONF class ImagesOneServerTestJSON(base.BaseV2ComputeTest): + """Test server images API""" @classmethod def resource_setup(cls): @@ -54,6 +55,7 @@ class ImagesOneServerTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('3731d080-d4c5-4872-b41a-64d0d0021314') def test_create_delete_image(self): + """Test create/delete server image""" if self.is_requested_microversion_compatible('2.35'): MIN_DISK = 'minDisk' MIN_RAM = 'minRam' @@ -93,6 +95,7 @@ class ImagesOneServerTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('3b7c6fe4-dfe7-477c-9243-b06359db51e6') def test_create_image_specify_multibyte_character_image_name(self): + """Test creating server image with multibyte character image name""" # prefix character is: # http://unicode.org/cldr/utility/character.jsp?a=20A1 diff --git a/tempest/api/compute/images/test_images_oneserver_negative.py b/tempest/api/compute/images/test_images_oneserver_negative.py index 37f9be35bd..0296220bc2 100644 --- a/tempest/api/compute/images/test_images_oneserver_negative.py +++ b/tempest/api/compute/images/test_images_oneserver_negative.py @@ -30,6 +30,8 @@ LOG = logging.getLogger(__name__) class ImagesOneServerNegativeTestJSON(base.BaseV2ComputeTest): + """Negative tests of server images""" + create_default_network = True def tearDown(self): @@ -87,7 +89,7 @@ class ImagesOneServerNegativeTestJSON(base.BaseV2ComputeTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('55d1d38c-dd66-4933-9c8e-7d92aeb60ddc') def test_create_image_specify_invalid_metadata(self): - # Return an error when creating image with invalid metadata + """Test creating server image with invalid metadata should fail""" meta = {'': ''} self.assertRaises(lib_exc.BadRequest, self.create_image_from_server, self.server_id, metadata=meta) @@ -95,7 +97,7 @@ class ImagesOneServerNegativeTestJSON(base.BaseV2ComputeTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('3d24d11f-5366-4536-bd28-cff32b748eca') def test_create_image_specify_metadata_over_limits(self): - # Return an error when creating image with meta data over 255 chars + """Test creating server image with metadata over 255 should fail""" meta = {'a' * 256: 'b' * 256} self.assertRaises(lib_exc.BadRequest, self.create_image_from_server, self.server_id, metadata=meta) @@ -103,8 +105,11 @@ class ImagesOneServerNegativeTestJSON(base.BaseV2ComputeTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('0460efcf-ee88-4f94-acef-1bf658695456') def test_create_second_image_when_first_image_is_being_saved(self): - # Disallow creating another image when first image is being saved + """Test creating another server image when first image is being saved + Creating another server image when first image is being saved is + not allowed. + """ # Create first snapshot image = self.create_image_from_server(self.server_id) self.addCleanup(self._reset_server) @@ -123,8 +128,7 @@ class ImagesOneServerNegativeTestJSON(base.BaseV2ComputeTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('084f0cbc-500a-4963-8a4e-312905862581') def test_create_image_specify_name_over_character_limit(self): - # Return an error if snapshot name over 255 characters is passed - + """Test creating server image with image name over 255 should fail""" snapshot_name = ('a' * 256) self.assertRaises(lib_exc.BadRequest, self.compute_images_client.create_image, @@ -133,8 +137,7 @@ class ImagesOneServerNegativeTestJSON(base.BaseV2ComputeTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('0894954d-2db2-4195-a45b-ffec0bc0187e') def test_delete_image_that_is_not_yet_active(self): - # Return an error while trying to delete an image what is creating - + """Test deleting a non-active server image should fail""" image = self.create_image_from_server(self.server_id) if api_version_utils.compare_version_header_to_response( "OpenStack-API-Version", "compute 2.45", image.response, "lt"): diff --git a/tempest/api/compute/images/test_list_image_filters.py b/tempest/api/compute/images/test_list_image_filters.py index 2ac7de3b2a..7930c6791a 100644 --- a/tempest/api/compute/images/test_list_image_filters.py +++ b/tempest/api/compute/images/test_list_image_filters.py @@ -31,6 +31,8 @@ CONF = config.CONF class ListImageFiltersTestJSON(base.BaseV2ComputeTest): + """Test listing server images with compute microversion less than 2.36""" + max_microversion = '2.35' @classmethod @@ -129,8 +131,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('a3f5b513-aeb3-42a9-b18e-f091ef73254d') def test_list_images_filter_by_status(self): - # The list of images should contain only images with the - # provided status + """Test listing server images filtered by image status + + The list of images should contain only images with the + provided image status. + """ params = {'status': 'ACTIVE'} images = self.client.list_images(**params)['images'] @@ -140,8 +145,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('33163b73-79f5-4d07-a7ea-9213bcc468ff') def test_list_images_filter_by_name(self): - # List of all images should contain the expected images filtered - # by name + """Test listing server images filtered by image name + + The list of images should contain only images with the + provided image name. + """ params = {'name': self.image1['name']} images = self.client.list_images(**params)['images'] @@ -153,7 +161,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest): @testtools.skipUnless(CONF.compute_feature_enabled.snapshot, 'Snapshotting is not available.') def test_list_images_filter_by_server_id(self): - # The images should contain images filtered by server id + """Test listing images filtered by server id + + The list of images should contain only images with the + provided server id. + """ params = {'server': self.server1['id']} images = self.client.list_images(**params)['images'] @@ -169,7 +181,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest): @testtools.skipUnless(CONF.compute_feature_enabled.snapshot, 'Snapshotting is not available.') def test_list_images_filter_by_server_ref(self): - # The list of servers should be filtered by server ref + """Test listing images filtered by server link href + + The list of images should contain only images with the + provided server link href. + """ server_links = self.server2['links'] # Try all server link types @@ -188,7 +204,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest): @testtools.skipUnless(CONF.compute_feature_enabled.snapshot, 'Snapshotting is not available.') def test_list_images_filter_by_type(self): - # The list of servers should be filtered by image type + """Test listing images filtered by image type + + The list of images should contain only images with the + provided image type. + """ params = {'type': 'snapshot'} images = self.client.list_images(**params)['images'] @@ -202,13 +222,22 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('3a484ca9-67ba-451e-b494-7fcf28d32d62') def test_list_images_limit_results(self): - # Verify only the expected number of results are returned + """Test listing images with limited count + + If we use limit=1 when listing images, then only 1 image should be + returned. + """ params = {'limit': '1'} images = self.client.list_images(**params)['images'] self.assertEqual(1, len([x for x in images if 'id' in x])) @decorators.idempotent_id('18bac3ae-da27-436c-92a9-b22474d13aab') def test_list_images_filter_by_changes_since(self): + """Test listing images filtered by changes-since + + The list of images should contain only images updated since the + provided changes-since value. + """ # Verify only updated images are returned in the detailed list # Becoming ACTIVE will modify the updated time @@ -220,8 +249,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('9b0ea018-6185-4f71-948a-a123a107988e') def test_list_images_with_detail_filter_by_status(self): - # Detailed list of all images should only contain images - # with the provided status + """Test listing server images details filtered by image status + + The list of images should contain only images with the + provided image status. + """ params = {'status': 'ACTIVE'} images = self.client.list_images(detail=True, **params)['images'] @@ -231,8 +263,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('644ea267-9bd9-4f3b-af9f-dffa02396a17') def test_list_images_with_detail_filter_by_name(self): - # Detailed list of all images should contain the expected - # images filtered by name + """Test listing server images details filtered by image name + + The list of images should contain only images with the + provided image name. + """ params = {'name': self.image1['name']} images = self.client.list_images(detail=True, **params)['images'] @@ -242,8 +277,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('ba2fa9a9-b672-47cc-b354-3b4c0600e2cb') def test_list_images_with_detail_limit_results(self): - # Verify only the expected number of results (with full details) - # are returned + """Test listing images details with limited count + + If we use limit=1 when listing images with full details, then only 1 + image should be returned. + """ params = {'limit': '1'} images = self.client.list_images(detail=True, **params)['images'] self.assertEqual(1, len(images)) @@ -252,7 +290,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest): @testtools.skipUnless(CONF.compute_feature_enabled.snapshot, 'Snapshotting is not available.') def test_list_images_with_detail_filter_by_server_ref(self): - # Detailed list of servers should be filtered by server ref + """Test listing images details filtered by server link href + + The list of images should contain only images with the + provided server link href. + """ server_links = self.server2['links'] # Try all server link types @@ -271,7 +313,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest): @testtools.skipUnless(CONF.compute_feature_enabled.snapshot, 'Snapshotting is not available.') def test_list_images_with_detail_filter_by_type(self): - # The detailed list of servers should be filtered by image type + """Test listing images details filtered by image type + + The list of images should contain only images with the + provided image type. + """ params = {'type': 'snapshot'} images = self.client.list_images(detail=True, **params)['images'] self.client.show_image(self.image_ref) @@ -286,8 +332,11 @@ class ListImageFiltersTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('7d439e18-ac2e-4827-b049-7e18004712c4') def test_list_images_with_detail_filter_by_changes_since(self): - # Verify an update image is returned + """Test listing images details filtered by changes-since + The list of images should contain only images updated since the + provided changes-since value. + """ # Becoming ACTIVE will modify the updated time # Filter by the image's created time params = {'changes-since': self.image1['created']} diff --git a/tempest/api/compute/images/test_list_image_filters_negative.py b/tempest/api/compute/images/test_list_image_filters_negative.py index 81c59f96b6..f77da4b893 100644 --- a/tempest/api/compute/images/test_list_image_filters_negative.py +++ b/tempest/api/compute/images/test_list_image_filters_negative.py @@ -22,6 +22,12 @@ CONF = config.CONF class ListImageFiltersNegativeTestJSON(base.BaseV2ComputeTest): + """Negative tests of listing images using compute images API + + Negative tests of listing images using compute images API with + microversion less than 2.36. + """ + max_microversion = '2.35' @classmethod @@ -39,7 +45,7 @@ class ListImageFiltersNegativeTestJSON(base.BaseV2ComputeTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('391b0440-432c-4d4b-b5da-c5096aa247eb') def test_get_nonexistent_image(self): - # Check raises a NotFound + """Test getting a non existent image should fail""" nonexistent_image = data_utils.rand_uuid() self.assertRaises(lib_exc.NotFound, self.client.show_image, nonexistent_image) diff --git a/tempest/api/compute/servers/test_server_addresses.py b/tempest/api/compute/servers/test_server_addresses.py index c936ce5aa7..5a3f5d07c7 100644 --- a/tempest/api/compute/servers/test_server_addresses.py +++ b/tempest/api/compute/servers/test_server_addresses.py @@ -19,6 +19,7 @@ from tempest.lib import decorators class ServerAddressesTestJSON(base.BaseV2ComputeTest): + """Test server addresses""" create_default_network = True @classmethod @@ -36,8 +37,10 @@ class ServerAddressesTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('6eb718c0-02d9-4d5e-acd1-4e0c269cef39') @utils.services('network') def test_list_server_addresses(self): - # All public and private addresses for - # a server should be returned + """Test listing server address + + All public and private addresses for a server should be returned. + """ addresses = self.client.list_addresses(self.server['id'])['addresses'] @@ -51,8 +54,11 @@ class ServerAddressesTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('87bbc374-5538-4f64-b673-2b0e4443cc30') @utils.services('network') def test_list_server_addresses_by_network(self): - # Providing a network type should filter - # the addresses return by that type + """Test listing server addresses filtered by network addresses + + Providing a network address should filter the addresses same with + the specified one. + """ addresses = self.client.list_addresses(self.server['id'])['addresses'] diff --git a/tempest/api/compute/servers/test_servers_microversions.py b/tempest/api/compute/servers/test_servers_microversions.py index 2434884ff2..566d04aa8e 100644 --- a/tempest/api/compute/servers/test_servers_microversions.py +++ b/tempest/api/compute/servers/test_servers_microversions.py @@ -32,11 +32,13 @@ from tempest.lib import decorators class ServerShowV254Test(base.BaseV2ComputeTest): + """Test servers API schema for compute microversion greater than 2.53""" min_microversion = '2.54' max_microversion = 'latest' @decorators.idempotent_id('09170a98-4940-4637-add7-1a35121f1a5a') def test_rebuild_server(self): + """Test rebuilding server with microversion greater than 2.53""" server = self.create_test_server(wait_until='ACTIVE') keypair_name = data_utils.rand_name( self.__class__.__name__ + '-keypair') @@ -52,11 +54,13 @@ class ServerShowV254Test(base.BaseV2ComputeTest): class ServerShowV257Test(base.BaseV2ComputeTest): + """Test servers API schema for compute microversion greater than 2.56""" min_microversion = '2.57' max_microversion = 'latest' @decorators.idempotent_id('803df848-080a-4261-8f11-b020cd9b6f60') def test_rebuild_server(self): + """Test rebuilding server with microversion greater than 2.56""" server = self.create_test_server(wait_until='ACTIVE') user_data = "ZWNobyAiaGVsbG8gd29ybGQi" # Checking rebuild API response schema diff --git a/tempest/api/compute/volumes/test_volume_snapshots.py b/tempest/api/compute/volumes/test_volume_snapshots.py index f3ccf8d23f..30bea604db 100644 --- a/tempest/api/compute/volumes/test_volume_snapshots.py +++ b/tempest/api/compute/volumes/test_volume_snapshots.py @@ -24,6 +24,7 @@ CONF = config.CONF class VolumesSnapshotsTestJSON(base.BaseV2ComputeTest): + """Test volume snapshots with compute microversion less than 2.36""" # These tests will fail with a 404 starting from microversion 2.36. For # more information, see: @@ -48,6 +49,7 @@ class VolumesSnapshotsTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('cd4ec87d-7825-450d-8040-6e2068f2da8f') def test_volume_snapshot_create_get_list_delete(self): + """Test create/get/list/delete volume snapshot""" volume = self.create_volume() self.addCleanup(self.delete_volume, volume['id']) diff --git a/tempest/api/compute/volumes/test_volumes_get.py b/tempest/api/compute/volumes/test_volumes_get.py index 0d23c1f089..554f418bb7 100644 --- a/tempest/api/compute/volumes/test_volumes_get.py +++ b/tempest/api/compute/volumes/test_volumes_get.py @@ -25,6 +25,7 @@ CONF = config.CONF class VolumesGetTestJSON(base.BaseV2ComputeTest): + """Test compute volumes API with microversion less than 2.36""" # These tests will fail with a 404 starting from microversion 2.36. For # more information, see: @@ -45,7 +46,7 @@ class VolumesGetTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('f10f25eb-9775-4d9d-9cbe-1cf54dae9d5f') def test_volume_create_get_delete(self): - # CREATE, GET, DELETE Volume + """Test create/get/delete volume""" v_name = data_utils.rand_name(self.__class__.__name__ + '-Volume') metadata = {'Type': 'work'} # Create volume diff --git a/tempest/api/compute/volumes/test_volumes_list.py b/tempest/api/compute/volumes/test_volumes_list.py index 28bc1740cb..0b372645d7 100644 --- a/tempest/api/compute/volumes/test_volumes_list.py +++ b/tempest/api/compute/volumes/test_volumes_list.py @@ -21,6 +21,8 @@ CONF = config.CONF class VolumesTestJSON(base.BaseV2ComputeTest): + """Test listing volumes with compute microversion less than 2.36""" + # NOTE: This test creates a number of 1G volumes. To run successfully, # ensure that the backing file for the volume group that Nova uses # has space for at least 3 1G volumes! @@ -57,7 +59,7 @@ class VolumesTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('bc2dd1a0-15af-48e5-9990-f2e75a48325d') def test_volume_list(self): - # Should return the list of Volumes + """Test listing volumes should return all volumes""" # Fetch all Volumes fetched_list = self.client.list_volumes()['volumes'] # Now check if all the Volumes created in setup are in fetched list @@ -72,7 +74,7 @@ class VolumesTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('bad0567a-5a4f-420b-851e-780b55bb867c') def test_volume_list_with_details(self): - # Should return the list of Volumes with details + """Test listing volumes with detail should return all volumes""" # Fetch all Volumes fetched_list = self.client.list_volumes(detail=True)['volumes'] # Now check if all the Volumes created in setup are in fetched list @@ -87,7 +89,11 @@ class VolumesTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('1048ed81-2baf-487a-b284-c0622b86e7b8') def test_volume_list_param_limit(self): - # Return the list of volumes based on limit set + """Test listing volumes based on limit set + + If we list volumes with limit=2, then only 2 volumes should be + returned. + """ params = {'limit': 2} fetched_vol_list = self.client.list_volumes(**params)['volumes'] @@ -96,7 +102,11 @@ class VolumesTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('33985568-4965-49d5-9bcc-0aa007ca5b7a') def test_volume_list_with_detail_param_limit(self): - # Return the list of volumes with details based on limit set. + """Test listing volumes with detail based on limit set + + If we list volumes with detail with limit=2, then only 2 volumes with + detail should be returned. + """ params = {'limit': 2} fetched_vol_list = self.client.list_volumes(detail=True, **params)['volumes'] @@ -106,7 +116,12 @@ class VolumesTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('51c22651-a074-4ea7-af0b-094f9331303e') def test_volume_list_param_offset_and_limit(self): - # Return the list of volumes based on offset and limit set. + """Test listing volumes based on offset and limit set + + If we list volumes with offset=1 and limit=1, then 1 volume located + in the position 1 in the all volumes list should be returned. + (The items in the all volumes list start from position 0.) + """ # get all volumes list all_vol_list = self.client.list_volumes()['volumes'] params = {'offset': 1, 'limit': 1} @@ -123,7 +138,13 @@ class VolumesTestJSON(base.BaseV2ComputeTest): @decorators.idempotent_id('06b6abc4-3f10-48e9-a7a1-3facc98f03e5') def test_volume_list_with_detail_param_offset_and_limit(self): - # Return the list of volumes details based on offset and limit set. + """Test listing volumes with detail based on offset and limit set + + If we list volumes with detail with offset=1 and limit=1, then 1 + volume with detail located in the position 1 in the all volumes list + should be returned. + (The items in the all volumes list start from position 0.) + """ # get all volumes list all_vol_list = self.client.list_volumes(detail=True)['volumes'] params = {'offset': 1, 'limit': 1} diff --git a/tempest/api/compute/volumes/test_volumes_negative.py b/tempest/api/compute/volumes/test_volumes_negative.py index 444ce937f9..f553e32e04 100644 --- a/tempest/api/compute/volumes/test_volumes_negative.py +++ b/tempest/api/compute/volumes/test_volumes_negative.py @@ -23,6 +23,7 @@ CONF = config.CONF class VolumesNegativeTest(base.BaseV2ComputeTest): + """Negative tests of volumes with compute microversion less than 2.36""" # These tests will fail with a 404 starting from microversion 2.36. For # more information, see: @@ -44,7 +45,7 @@ class VolumesNegativeTest(base.BaseV2ComputeTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('c03ea686-905b-41a2-8748-9635154b7c57') def test_volume_get_nonexistent_volume_id(self): - # Negative: Should not be able to get details of nonexistent volume + """Test getting details of a non existent volume should fail""" # Creating a nonexistent volume id # Trying to GET a non existent volume self.assertRaises(lib_exc.NotFound, self.client.show_volume, @@ -53,7 +54,7 @@ class VolumesNegativeTest(base.BaseV2ComputeTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('54a34226-d910-4b00-9ef8-8683e6c55846') def test_volume_delete_nonexistent_volume_id(self): - # Negative: Should not be able to delete nonexistent Volume + """Test deleting a nonexistent volume should fail""" # Creating nonexistent volume id # Trying to DELETE a non existent volume self.assertRaises(lib_exc.NotFound, self.client.delete_volume, @@ -62,8 +63,7 @@ class VolumesNegativeTest(base.BaseV2ComputeTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('5125ae14-152b-40a7-b3c5-eae15e9022ef') def test_create_volume_with_invalid_size(self): - # Negative: Should not be able to create volume with invalid size - # in request + """Test creating volume with invalid size should fail""" v_name = data_utils.rand_name(self.__class__.__name__ + '-Volume') metadata = {'Type': 'work'} self.assertRaises(lib_exc.BadRequest, self.client.create_volume, @@ -72,8 +72,7 @@ class VolumesNegativeTest(base.BaseV2ComputeTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('131cb3a1-75cc-4d40-b4c3-1317f64719b0') def test_create_volume_without_passing_size(self): - # Negative: Should not be able to create volume without passing size - # in request + """Test creating volume without specifying size should fail""" v_name = data_utils.rand_name(self.__class__.__name__ + '-Volume') metadata = {'Type': 'work'} self.assertRaises(lib_exc.BadRequest, self.client.create_volume, @@ -82,7 +81,7 @@ class VolumesNegativeTest(base.BaseV2ComputeTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('8cce995e-0a83-479a-b94d-e1e40b8a09d1') def test_create_volume_with_size_zero(self): - # Negative: Should not be able to create volume with size zero + """Test creating volume with size=0 should fail""" v_name = data_utils.rand_name(self.__class__.__name__ + '-Volume') metadata = {'Type': 'work'} self.assertRaises(lib_exc.BadRequest, self.client.create_volume, @@ -91,14 +90,13 @@ class VolumesNegativeTest(base.BaseV2ComputeTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('62bab09a-4c03-4617-8cca-8572bc94af9b') def test_get_volume_without_passing_volume_id(self): - # Negative: Should not be able to get volume when empty ID is passed + """Test getting volume details without volume id should fail""" self.assertRaises(lib_exc.NotFound, self.client.show_volume, '') @decorators.attr(type=['negative']) @decorators.idempotent_id('62972737-124b-4513-b6cf-2f019f178494') def test_delete_invalid_volume_id(self): - # Negative: Should not be able to delete volume when invalid ID is - # passed + """Test deleting volume with an invalid volume id should fail""" self.assertRaises(lib_exc.NotFound, self.client.delete_volume, data_utils.rand_name('invalid')) @@ -106,5 +104,5 @@ class VolumesNegativeTest(base.BaseV2ComputeTest): @decorators.attr(type=['negative']) @decorators.idempotent_id('0d1417c5-4ae8-4c2c-adc5-5f0b864253e5') def test_delete_volume_without_passing_volume_id(self): - # Negative: Should not be able to delete volume when empty ID is passed + """Test deleting volume without volume id should fail""" self.assertRaises(lib_exc.NotFound, self.client.delete_volume, '')