Adding description for testcases - compute part8
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: I858158cf4fb5e75208177f2c49b4e7f350f09a1e
partially-implements: blueprint testcase-description
diff --git a/tempest/api/compute/images/test_images_oneserver.py b/tempest/api/compute/images/test_images_oneserver.py
index b811421..23f8326 100644
--- a/tempest/api/compute/images/test_images_oneserver.py
+++ b/tempest/api/compute/images/test_images_oneserver.py
@@ -22,6 +22,7 @@
class ImagesOneServerTestJSON(base.BaseV2ComputeTest):
+ """Test server images API"""
@classmethod
def resource_setup(cls):
@@ -54,6 +55,7 @@
@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 @@
@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 37f9be3..0296220 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 @@
class ImagesOneServerNegativeTestJSON(base.BaseV2ComputeTest):
+ """Negative tests of server images"""
+
create_default_network = True
def tearDown(self):
@@ -87,7 +89,7 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 2ac7de3..7930c67 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 @@
class ListImageFiltersTestJSON(base.BaseV2ComputeTest):
+ """Test listing server images with compute microversion less than 2.36"""
+
max_microversion = '2.35'
@classmethod
@@ -129,8 +131,11 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 81c59f9..f77da4b 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 @@
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 @@
@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 c936ce5..5a3f5d0 100644
--- a/tempest/api/compute/servers/test_server_addresses.py
+++ b/tempest/api/compute/servers/test_server_addresses.py
@@ -19,6 +19,7 @@
class ServerAddressesTestJSON(base.BaseV2ComputeTest):
+ """Test server addresses"""
create_default_network = True
@classmethod
@@ -36,8 +37,10 @@
@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 @@
@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 2434884..566d04a 100644
--- a/tempest/api/compute/servers/test_servers_microversions.py
+++ b/tempest/api/compute/servers/test_servers_microversions.py
@@ -32,11 +32,13 @@
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 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 f3ccf8d..30bea60 100644
--- a/tempest/api/compute/volumes/test_volume_snapshots.py
+++ b/tempest/api/compute/volumes/test_volume_snapshots.py
@@ -24,6 +24,7 @@
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 @@
@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 0d23c1f..554f418 100644
--- a/tempest/api/compute/volumes/test_volumes_get.py
+++ b/tempest/api/compute/volumes/test_volumes_get.py
@@ -25,6 +25,7 @@
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 @@
@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 28bc174..0b37264 100644
--- a/tempest/api/compute/volumes/test_volumes_list.py
+++ b/tempest/api/compute/volumes/test_volumes_list.py
@@ -21,6 +21,8 @@
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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 444ce93..f553e32 100644
--- a/tempest/api/compute/volumes/test_volumes_negative.py
+++ b/tempest/api/compute/volumes/test_volumes_negative.py
@@ -23,6 +23,7 @@
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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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 @@
@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, '')