Adding description for testcases - compute part12

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: I5564ff0b71f56445977a79c2c813b2e3e31000c9
partially-implements: blueprint testcase-description
diff --git a/tempest/api/compute/floating_ips/test_floating_ips_actions_negative.py b/tempest/api/compute/floating_ips/test_floating_ips_actions_negative.py
index 9257458..e99e218 100644
--- a/tempest/api/compute/floating_ips/test_floating_ips_actions_negative.py
+++ b/tempest/api/compute/floating_ips/test_floating_ips_actions_negative.py
@@ -25,6 +25,7 @@
 
 
 class FloatingIPsNegativeTestJSON(base.BaseFloatingIPsTest):
+    """Test floating ips API with compute microversion less than 2.36"""
 
     max_microversion = '2.35'
 
@@ -46,8 +47,7 @@
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('6e0f059b-e4dd-48fb-8207-06e3bba5b074')
     def test_allocate_floating_ip_from_nonexistent_pool(self):
-        # Negative test:Allocation of a new floating IP from a nonexistent_pool
-        # to a project should fail
+        """Test allocating floating ip from non existent pool should fail"""
         self.assertRaises(lib_exc.NotFound,
                           self.client.create_floating_ip,
                           pool="non_exist_pool")
@@ -55,15 +55,14 @@
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('ae1c55a8-552b-44d4-bfb6-2a115a15d0ba')
     def test_delete_nonexistent_floating_ip(self):
-        # Negative test:Deletion of a nonexistent floating IP
-        # from project should fail
-
+        """Test deleting non existent floating ip should fail"""
         # Deleting the non existent floating IP
         self.assertRaises(lib_exc.NotFound, self.client.delete_floating_ip,
                           self.non_exist_id)
 
 
 class FloatingIPsAssociationNegativeTestJSON(base.BaseFloatingIPsTest):
+    """Test floating ips API with compute microversion less than 2.44"""
 
     max_microversion = '2.43'
 
@@ -76,8 +75,7 @@
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('595fa616-1a71-4670-9614-46564ac49a4c')
     def test_associate_nonexistent_floating_ip(self):
-        # Negative test:Association of a non existent floating IP
-        # to specific server should fail
+        """Test associating non existent floating ip to server should fail"""
         # Associating non existent floating IP
         self.assertRaises(lib_exc.NotFound,
                           self.client.associate_floating_ip_to_server,
@@ -86,7 +84,7 @@
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('0a081a66-e568-4e6b-aa62-9587a876dca8')
     def test_dissociate_nonexistent_floating_ip(self):
-        # Negative test:Dissociation of a non existent floating IP should fail
+        """Test dissociating non existent floating ip should fail"""
         # Dissociating non existent floating IP
         self.assertRaises(lib_exc.NotFound,
                           self.client.disassociate_floating_ip_from_server,
@@ -95,7 +93,7 @@
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('804b4fcb-bbf5-412f-925d-896672b61eb3')
     def test_associate_ip_to_server_without_passing_floating_ip(self):
-        # Negative test:Association of empty floating IP to specific server
+        """Test associating empty floating ip to server should fail"""
         # should raise NotFound or BadRequest(In case of Nova V2.1) exception.
         self.assertRaises((lib_exc.NotFound, lib_exc.BadRequest),
                           self.client.associate_floating_ip_to_server,
@@ -106,10 +104,13 @@
     @testtools.skipUnless(CONF.network.public_network_id,
                           'The public_network_id option must be specified.')
     def test_associate_ip_to_server_with_floating_ip(self):
-        # The VM have one port
-        # Associate floating IP A to the VM
-        # Associate floating IP B which is from same pool with floating IP A
-        # to the VM, should raise BadRequest exception
+        """Test associating floating ip to server already with floating ip
+
+        1. The VM have one port
+        2. Associate floating IP A to the VM
+        3. Associate floating IP B which is from same pool with floating IP A
+           to the VM, should raise BadRequest exception
+        """
         body = self.client.create_floating_ip(
             pool=CONF.network.public_network_id)['floating_ip']
         self.addCleanup(self.client.delete_floating_ip, body['id'])
diff --git a/tempest/api/compute/floating_ips/test_list_floating_ips.py b/tempest/api/compute/floating_ips/test_list_floating_ips.py
index 944f798..6bfee95 100644
--- a/tempest/api/compute/floating_ips/test_list_floating_ips.py
+++ b/tempest/api/compute/floating_ips/test_list_floating_ips.py
@@ -21,6 +21,7 @@
 
 
 class FloatingIPDetailsTestJSON(base.BaseFloatingIPsTest):
+    """Test floating ip details with compute microversion less than 2.36"""
 
     max_microversion = '2.35'
 
@@ -37,7 +38,7 @@
 
     @decorators.idempotent_id('16db31c3-fb85-40c9-bbe2-8cf7b67ff99f')
     def test_list_floating_ips(self):
-        # Positive test:Should return the list of floating IPs
+        """Test listing floating ips"""
         body = self.client.list_floating_ips()['floating_ips']
         floating_ips = body
         self.assertNotEmpty(floating_ips,
@@ -47,7 +48,7 @@
 
     @decorators.idempotent_id('eef497e0-8ff7-43c8-85ef-558440574f84')
     def test_get_floating_ip_details(self):
-        # Positive test:Should be able to GET the details of floatingIP
+        """Test getting floating ip details"""
         # Creating a floating IP for which details are to be checked
         body = self.client.create_floating_ip(
             pool=CONF.network.floating_network_name)['floating_ip']
@@ -68,7 +69,7 @@
 
     @decorators.idempotent_id('df389fc8-56f5-43cc-b290-20eda39854d3')
     def test_list_floating_ip_pools(self):
-        # Positive test:Should return the list of floating IP Pools
+        """Test listing floating ip pools"""
         floating_ip_pools = self.pools_client.list_floating_ip_pools()
         self.assertNotEmpty(floating_ip_pools['floating_ip_pools'],
                             "Expected floating IP Pools. Got zero.")
diff --git a/tempest/api/compute/floating_ips/test_list_floating_ips_negative.py b/tempest/api/compute/floating_ips/test_list_floating_ips_negative.py
index d69248c..aa0320d 100644
--- a/tempest/api/compute/floating_ips/test_list_floating_ips_negative.py
+++ b/tempest/api/compute/floating_ips/test_list_floating_ips_negative.py
@@ -23,14 +23,18 @@
 
 
 class FloatingIPDetailsNegativeTestJSON(base.BaseFloatingIPsTest):
+    """Negative tests of floating ip detail
+
+    Negative tests of floating ip detail with compute microversion less
+    than 2.36.
+    """
 
     max_microversion = '2.35'
 
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('7ab18834-4a4b-4f28-a2c5-440579866695')
     def test_get_nonexistent_floating_ip_details(self):
-        # Negative test:Should not be able to GET the details
-        # of non-existent floating IP
+        """Test getting non existent floating ip should fail"""
         # Creating a non-existent floatingIP id
         if CONF.service_available.neutron:
             non_exist_id = data_utils.rand_uuid()
diff --git a/tempest/api/compute/servers/test_attach_interfaces.py b/tempest/api/compute/servers/test_attach_interfaces.py
index c1af6c7..0601bbe 100644
--- a/tempest/api/compute/servers/test_attach_interfaces.py
+++ b/tempest/api/compute/servers/test_attach_interfaces.py
@@ -99,6 +99,7 @@
 
 
 class AttachInterfacesTestJSON(AttachInterfacesTestBase):
+    """Test attaching interfaces"""
 
     def wait_for_port_detach(self, port_id):
         """Waits for the port's device_id to be unset.
@@ -230,6 +231,7 @@
     @decorators.idempotent_id('73fe8f02-590d-4bf1-b184-e9ca81065051')
     @utils.services('network')
     def test_create_list_show_delete_interfaces_by_network_port(self):
+        """Test create/list/show/delete interfaces by network port"""
         server, ifs, _ = self._create_server_get_interfaces()
         interface_count = len(ifs)
         self.assertGreater(interface_count, 0)
@@ -262,6 +264,7 @@
     @decorators.idempotent_id('d290c06c-f5b3-11e7-8ec8-002293781009')
     @utils.services('network')
     def test_create_list_show_delete_interfaces_by_fixed_ip(self):
+        """Test create/list/show/delete interfaces by fixed ip"""
         # NOTE(zhufl) By default only project that is admin or network owner
         # or project with role advsvc is authorised to create interfaces with
         # fixed-ip, so if we don't create network for each project, do not
@@ -290,7 +293,7 @@
 
     @decorators.idempotent_id('2f3a0127-95c7-4977-92d2-bc5aec602fb4')
     def test_reassign_port_between_servers(self):
-        """Tests the following:
+        """Tests reassigning port between servers
 
         1. Create a port in Neutron.
         2. Create two servers in Nova.
@@ -343,12 +346,15 @@
 
 
 class AttachInterfacesUnderV243Test(AttachInterfacesTestBase):
+    """Test attaching interfaces with compute microversion less than 2.44"""
+
     max_microversion = '2.43'
 
     @decorators.attr(type='smoke')
     @decorators.idempotent_id('c7e0e60b-ee45-43d0-abeb-8596fd42a2f9')
     @utils.services('network')
     def test_add_remove_fixed_ip(self):
+        """Test adding and removing fixed ip from server"""
         # NOTE(zhufl) By default only project that is admin or network owner
         # or project with role advsvc is authorised to add interfaces with
         # fixed-ip, so if we don't create network for each project, do not
diff --git a/tempest/api/compute/servers/test_device_tagging.py b/tempest/api/compute/servers/test_device_tagging.py
index 8879369..a7e2187 100644
--- a/tempest/api/compute/servers/test_device_tagging.py
+++ b/tempest/api/compute/servers/test_device_tagging.py
@@ -103,6 +103,7 @@
 
 
 class TaggedBootDevicesTest(DeviceTaggingBase):
+    """Test tagged boot device with compute microversion equals 2.32"""
 
     min_microversion = '2.32'
     # NOTE(mriedem): max_version looks odd but it's actually correct. Due to a
@@ -149,6 +150,16 @@
     @decorators.idempotent_id('a2e65a6c-66f1-4442-aaa8-498c31778d96')
     @utils.services('network', 'volume', 'image')
     def test_tagged_boot_devices(self):
+        """Test tagged boot devices
+
+        1. Create volumes
+        2. Create networks
+        3. Create subnets
+        4. Create ports
+        5. Create server, specifying tags for items in networks and
+           block_device_mapping_v2,
+        6. Verify tagged devices are in server via metadata service
+        """
         # Create volumes
         # The create_volume methods waits for the volumes to be available and
         # the base class will clean them up on tearDown.
@@ -300,11 +311,14 @@
 
 
 class TaggedBootDevicesTest_v242(TaggedBootDevicesTest):
+    """Test tagged boot devices with compute microversion greater than 2.41"""
+
     min_microversion = '2.42'
     max_microversion = 'latest'
 
 
 class TaggedAttachmentsTest(DeviceTaggingBase):
+    """Test tagged attachments with compute microversion greater than 2.48"""
 
     min_microversion = '2.49'
     max_microversion = 'latest'
@@ -342,6 +356,16 @@
     @decorators.idempotent_id('3e41c782-2a89-4922-a9d2-9a188c4e7c7c')
     @utils.services('network', 'volume', 'image')
     def test_tagged_attachment(self):
+        """Test tagged attachment
+
+        1. Create network
+        2. Create subnet
+        3. Create volume
+        4. Create server
+        5. Attach tagged networks and volume
+        6. Verify tagged devices are in server via metadata service
+        7. Detach tagged networks and volume
+        """
         # Create network
         net = self.networks_client.create_network(
             name=data_utils.rand_name(
diff --git a/tempest/api/compute/servers/test_instance_actions.py b/tempest/api/compute/servers/test_instance_actions.py
index 00837eb..5ab592a 100644
--- a/tempest/api/compute/servers/test_instance_actions.py
+++ b/tempest/api/compute/servers/test_instance_actions.py
@@ -19,6 +19,8 @@
 
 
 class InstanceActionsTestJSON(base.BaseV2ComputeTest):
+    """Test instance actions API"""
+
     create_default_network = True
 
     @classmethod
@@ -34,7 +36,7 @@
 
     @decorators.idempotent_id('77ca5cc5-9990-45e0-ab98-1de8fead201a')
     def test_list_instance_actions(self):
-        # List actions of the provided server
+        """Test listing actions of the provided server"""
         self.client.reboot_server(self.server['id'], type='HARD')
         waiters.wait_for_server_status(self.client,
                                        self.server['id'], 'ACTIVE')
@@ -47,7 +49,7 @@
 
     @decorators.idempotent_id('aacc71ca-1d70-4aa5-bbf6-0ff71470e43c')
     def test_get_instance_action(self):
-        # Get the action details of the provided server
+        """Test getting the action details of the provided server"""
         body = self.client.show_instance_action(
             self.server['id'], self.request_id)['instanceAction']
         self.assertEqual(self.server['id'], body['instance_uuid'])
@@ -55,6 +57,8 @@
 
 
 class InstanceActionsV221TestJSON(base.BaseV2ComputeTest):
+    """Test instance actions with compute microversion greater than 2.20"""
+
     create_default_network = True
 
     min_microversion = '2.21'
@@ -67,8 +71,11 @@
 
     @decorators.idempotent_id('0a0f85d4-10fa-41f6-bf80-a54fb4aa2ae1')
     def test_get_list_deleted_instance_actions(self):
+        """Test listing actions for deleted instance
 
-        # List actions of the deleted server
+        Listing actions for deleted instance should succeed and the returned
+        actions should contain 'create' and 'delete'.
+        """
         server = self.create_test_server(wait_until='ACTIVE')
         self.client.delete_server(server['id'])
         waiters.wait_for_server_termination(self.client, server['id'])
diff --git a/tempest/api/compute/servers/test_instance_actions_negative.py b/tempest/api/compute/servers/test_instance_actions_negative.py
index 4b5a2c3..dd2bf06 100644
--- a/tempest/api/compute/servers/test_instance_actions_negative.py
+++ b/tempest/api/compute/servers/test_instance_actions_negative.py
@@ -20,6 +20,8 @@
 
 
 class InstanceActionsNegativeTestJSON(base.BaseV2ComputeTest):
+    """Negative tests of instance actions"""
+
     create_default_network = True
 
     @classmethod
@@ -35,7 +37,7 @@
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('67e1fce6-7ec2-45c6-92d4-0a8f1a632910')
     def test_list_instance_actions_non_existent_server(self):
-        # List actions of the non-existent server id
+        """Test listing actions for non existent instance should fail"""
         non_existent_server_id = data_utils.rand_uuid()
         self.assertRaises(lib_exc.NotFound,
                           self.client.list_instance_actions,
@@ -44,6 +46,6 @@
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('0269f40a-6f18-456c-b336-c03623c897f1')
     def test_get_instance_action_invalid_request(self):
-        # Get the action details of the provided server with invalid request
+        """Test getting instance action with invalid request_id should fail"""
         self.assertRaises(lib_exc.NotFound, self.client.show_instance_action,
                           self.server['id'], '999')
diff --git a/tempest/api/compute/servers/test_server_rescue.py b/tempest/api/compute/servers/test_server_rescue.py
index 1247494..5445113 100644
--- a/tempest/api/compute/servers/test_server_rescue.py
+++ b/tempest/api/compute/servers/test_server_rescue.py
@@ -53,9 +53,11 @@
 
 
 class ServerRescueTestJSON(ServerRescueTestBase):
+    """Test server rescue"""
 
     @decorators.idempotent_id('fd032140-714c-42e4-a8fd-adcd8df06be6')
     def test_rescue_unrescue_instance(self):
+        """Test rescue/unrescue server"""
         password = data_utils.rand_password()
         server = self.create_test_server(adminPass=password,
                                          wait_until='ACTIVE')
@@ -68,6 +70,7 @@
 
 
 class ServerRescueTestJSONUnderV235(ServerRescueTestBase):
+    """Test server rescue with compute microversion less than 2.36"""
 
     max_microversion = '2.35'
 
@@ -81,7 +84,7 @@
     @testtools.skipUnless(CONF.network_feature_enabled.floating_ips,
                           "Floating ips are not available")
     def test_rescued_vm_associate_dissociate_floating_ip(self):
-        # Association of floating IP to a rescued vm
+        """Test associate/dissociate floating ip for rescued server"""
         floating_ip_body = self.floating_ips_client.create_floating_ip(
             pool=CONF.network.floating_network_name)['floating_ip']
         self.addCleanup(self.floating_ips_client.delete_floating_ip,
@@ -96,6 +99,7 @@
 
     @decorators.idempotent_id('affca41f-7195-492d-8065-e09eee245404')
     def test_rescued_vm_add_remove_security_group(self):
+        """Test add/remove security group to for rescued server"""
         # Add Security group
         sg = self.create_security_group()
         self.servers_client.add_security_group(self.rescued_server_id,
@@ -154,33 +158,43 @@
 
 
 class ServerStableDeviceRescueTest(BaseServerStableDeviceRescueTest):
+    """Test rescuing server specifying type of device for the rescue disk"""
 
     @decorators.idempotent_id('947004c3-e8ef-47d9-9f00-97b74f9eaf96')
     def test_stable_device_rescue_cdrom_ide(self):
+        """Test rescuing server with cdrom and ide as the rescue disk"""
         server_id, rescue_image_id = self._create_server_and_rescue_image(
             hw_rescue_device='cdrom', hw_rescue_bus='ide')
         self._test_stable_device_rescue(server_id, rescue_image_id)
 
     @decorators.idempotent_id('16865750-1417-4854-bcf7-496e6753c01e')
     def test_stable_device_rescue_disk_virtio(self):
+        """Test rescuing server with disk and virtio as the rescue disk"""
         server_id, rescue_image_id = self._create_server_and_rescue_image(
             hw_rescue_device='disk', hw_rescue_bus='virtio')
         self._test_stable_device_rescue(server_id, rescue_image_id)
 
     @decorators.idempotent_id('12340157-6306-4745-bdda-cfa019908b48')
     def test_stable_device_rescue_disk_scsi(self):
+        """Test rescuing server with disk and scsi as the rescue disk"""
         server_id, rescue_image_id = self._create_server_and_rescue_image(
             hw_rescue_device='disk', hw_rescue_bus='scsi')
         self._test_stable_device_rescue(server_id, rescue_image_id)
 
     @decorators.idempotent_id('647d04cf-ad35-4956-89ab-b05c5c16f30c')
     def test_stable_device_rescue_disk_usb(self):
+        """Test rescuing server with disk and usb as the rescue disk"""
         server_id, rescue_image_id = self._create_server_and_rescue_image(
             hw_rescue_device='disk', hw_rescue_bus='usb')
         self._test_stable_device_rescue(server_id, rescue_image_id)
 
     @decorators.idempotent_id('a3772b42-00bf-4310-a90b-1cc6fd3e7eab')
     def test_stable_device_rescue_disk_virtio_with_volume_attached(self):
+        """Test rescuing server with volume attached
+
+        Attach a volume to the server and then rescue the server with disk
+        and virtio as the rescue disk.
+        """
         server_id, rescue_image_id = self._create_server_and_rescue_image(
             hw_rescue_device='disk', hw_rescue_bus='virtio')
         server = self.servers_client.show_server(server_id)['server']
@@ -192,12 +206,22 @@
 
 
 class ServerBootFromVolumeStableRescueTest(BaseServerStableDeviceRescueTest):
+    """Test rescuing server specifying type of device for the rescue disk
+
+    Test rescuing server specifying type of device for the rescue disk with
+    compute microversion greater than 2.86.
+    """
 
     min_microversion = '2.87'
 
     @decorators.attr(type='slow')
     @decorators.idempotent_id('48f123cb-922a-4065-8db6-b9a9074a556b')
     def test_stable_device_rescue_bfv_blank_volume(self):
+        """Test rescuing server with blank volume as block_device_mapping_v2
+
+        Create a server with block_device_mapping_v2 with blank volume,
+        then rescue the server with disk and virtio as the rescue disk.
+        """
         block_device_mapping_v2 = [{
             "boot_index": "0",
             "source_type": "blank",
@@ -211,6 +235,11 @@
     @decorators.attr(type='slow')
     @decorators.idempotent_id('e4636333-c928-40fc-98b7-70a23eef4224')
     def test_stable_device_rescue_bfv_image_volume(self):
+        """Test rescuing server with blank volume as block_device_mapping_v2
+
+        Create a server with block_device_mapping_v2 with image volume,
+        then rescue the server with disk and virtio as the rescue disk.
+        """
         block_device_mapping_v2 = [{
             "boot_index": "0",
             "source_type": "image",
diff --git a/tempest/api/compute/volumes/test_attach_volume_negative.py b/tempest/api/compute/volumes/test_attach_volume_negative.py
index 9a506af..516f599 100644
--- a/tempest/api/compute/volumes/test_attach_volume_negative.py
+++ b/tempest/api/compute/volumes/test_attach_volume_negative.py
@@ -21,6 +21,8 @@
 
 
 class AttachVolumeNegativeTest(base.BaseV2ComputeTest):
+    """Negative tests of volume attaching"""
+
     create_default_network = True
 
     @classmethod
@@ -34,6 +36,7 @@
     @decorators.related_bug('1630783', status_code=500)
     @decorators.idempotent_id('a313b5cd-fbd0-49cc-94de-870e99f763c7')
     def test_delete_attached_volume(self):
+        """Test deleting attachemd volume should fail"""
         server = self.create_test_server(wait_until='ACTIVE')
         volume = self.create_volume()
         self.attach_volume(server, volume)
@@ -44,10 +47,13 @@
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('aab919e2-d992-4cbb-a4ed-745c2475398c')
     def test_attach_attached_volume_to_same_server(self):
-        # Test attaching the same volume to the same instance once
-        # it's already attached. The nova/cinder validation for this differs
-        # depending on whether or not cinder v3.27 is being used to attach
-        # the volume to the instance.
+        """Test attaching attached volume to same server should fail
+
+        Test attaching the same volume to the same instance once
+        it's already attached. The nova/cinder validation for this differs
+        depending on whether or not cinder v3.27 is being used to attach
+        the volume to the instance.
+        """
         server = self.create_test_server(wait_until='ACTIVE')
         volume = self.create_volume()
 
@@ -59,6 +65,7 @@
     @decorators.attr(type=['negative'])
     @decorators.idempotent_id('ee37a796-2afb-11e7-bc0f-fa163e65f5ce')
     def test_attach_attached_volume_to_different_server(self):
+        """Test attaching attached volume to different server should fail"""
         server1 = self.create_test_server(wait_until='ACTIVE')
         volume = self.create_volume()