Merge "Adding description for testcases - compute part8"
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, '')