Merge "Verify that instance can boot after volume retype with migration"
diff --git a/tempest/scenario/test_volume_migrate_attached.py b/tempest/scenario/test_volume_migrate_attached.py
index 5005346..f34bfd6 100644
--- a/tempest/scenario/test_volume_migrate_attached.py
+++ b/tempest/scenario/test_volume_migrate_attached.py
@@ -96,10 +96,7 @@
         waiters.wait_for_volume_retype(self.volumes_client,
                                        volume_id, new_volume_type)
 
-    @decorators.attr(type='slow')
-    @decorators.idempotent_id('deadd2c2-beef-4dce-98be-f86765ff311b')
-    @utils.services('compute', 'volume')
-    def test_volume_retype_attached(self):
+    def _test_volume_retype_attached(self, dev_name=None):
         LOG.info("Creating keypair and security group")
         keypair = self.create_keypair()
         security_group = self.create_security_group()
@@ -108,18 +105,30 @@
         LOG.info("Creating Volume types")
         source_type, dest_type = self._create_volume_types()
 
-        # create an instance from volume
-        LOG.info("Booting instance from volume")
-        volume_id = self.create_volume(imageRef=CONF.compute.image_ref,
-                                       volume_type=source_type['name'])['id']
+        if dev_name is None:
+            # create an instance from volume
+            LOG.info("Booting instance from volume")
+            volume_id = self.create_volume(
+                imageRef=CONF.compute.image_ref,
+                volume_type=source_type['name'])['id']
 
-        instance = self._boot_instance_from_volume(volume_id, keypair,
-                                                   security_group)
+            instance = self._boot_instance_from_volume(volume_id, keypair,
+                                                       security_group)
+        else:
+            LOG.info("Booting instance from image and attaching data volume")
+            key_name = keypair['name']
+            security_groups = [{'name': security_group['name']}]
+            instance = self.create_server(key_name=key_name,
+                                          security_groups=security_groups)
+            volume = self.create_volume(volume_type=source_type['name'])
+            volume_id = volume['id']
+            volume = self.nova_volume_attach(instance, volume)
 
         # write content to volume on instance
         LOG.info("Setting timestamp in instance %s", instance['id'])
         ip_instance = self.get_server_ip(instance)
         timestamp = self.create_timestamp(ip_instance,
+                                          dev_name=dev_name,
                                           private_key=keypair['private_key'],
                                           server=instance)
 
@@ -134,6 +143,7 @@
         LOG.info("Getting timestamp in postmigrated instance %s",
                  instance['id'])
         timestamp2 = self.get_timestamp(ip_instance,
+                                        dev_name=dev_name,
                                         private_key=keypair['private_key'],
                                         server=instance)
         self.assertEqual(timestamp, timestamp2)
@@ -152,10 +162,35 @@
             instance['id'])['volumeAttachments']
         self.assertEqual(volume_id, attached_volumes[0]['id'])
 
+        # Reboot the instance and verify it boots successfully
+        LOG.info("Hard rebooting instance %s", instance['id'])
+        self.servers_client.reboot_server(instance['id'], type='HARD')
+        waiters.wait_for_server_status(
+            self.servers_client, instance['id'], 'ACTIVE')
+
+        # check the content of written file to verify the instance is working
+        # after being rebooted
+        LOG.info("Getting timestamp in postmigrated rebooted instance %s",
+                 instance['id'])
+        timestamp2 = self.get_timestamp(ip_instance,
+                                        dev_name=dev_name,
+                                        private_key=keypair['private_key'],
+                                        server=instance)
+        self.assertEqual(timestamp, timestamp2)
+
     @decorators.attr(type='slow')
-    @decorators.idempotent_id('fe47b1ed-640e-4e3b-a090-200e25607362')
+    @decorators.idempotent_id('deadd2c2-beef-4dce-98be-f86765ff311b')
     @utils.services('compute', 'volume')
-    def test_volume_migrate_attached(self):
+    def test_volume_retype_attached(self):
+        self._test_volume_retype_attached()
+
+    @decorators.attr(type='slow')
+    @decorators.idempotent_id('122e070c-a5b2-470c-af2b-81e9dbefb9e8')
+    @utils.services('compute', 'volume')
+    def test_volume_retype_attached_data_volume(self):
+        self._test_volume_retype_attached(dev_name='vdb')
+
+    def _test_volume_migrate_attached(self, dev_name=None):
         LOG.info("Creating keypair and security group")
         keypair = self.create_keypair()
         security_group = self.create_security_group()
@@ -163,16 +198,26 @@
         LOG.info("Creating volume")
         # Create a unique volume type to avoid using the backend default
         migratable_type = self.create_volume_type()['name']
-        volume_id = self.create_volume(imageRef=CONF.compute.image_ref,
-                                       volume_type=migratable_type)['id']
-        volume = self.admin_volumes_client.show_volume(volume_id)
 
-        LOG.info("Booting instance from volume")
-        instance = self._boot_instance_from_volume(volume_id, keypair,
-                                                   security_group)
+        if dev_name is None:
+            volume_id = self.create_volume(imageRef=CONF.compute.image_ref,
+                                           volume_type=migratable_type)['id']
+            LOG.info("Booting instance from volume")
+            instance = self._boot_instance_from_volume(volume_id, keypair,
+                                                       security_group)
+        else:
+            LOG.info("Booting instance from image and attaching data volume")
+            key_name = keypair['name']
+            security_groups = [{'name': security_group['name']}]
+            instance = self.create_server(key_name=key_name,
+                                          security_groups=security_groups)
+            volume = self.create_volume(volume_type=migratable_type)
+            volume_id = volume['id']
+            volume = self.nova_volume_attach(instance, volume)
 
         # Identify the source and destination hosts for the migration
-        src_host = volume['volume']['os-vol-host-attr:host']
+        volume = self.admin_volumes_client.show_volume(volume_id)['volume']
+        src_host = volume['os-vol-host-attr:host']
 
         # Select the first c-vol host that isn't hosting the volume as the dest
         # host['host_name'] should take the format of host@backend.
@@ -186,6 +231,7 @@
 
         ip_instance = self.get_server_ip(instance)
         timestamp = self.create_timestamp(ip_instance,
+                                          dev_name=dev_name,
                                           private_key=keypair['private_key'],
                                           server=instance)
 
@@ -202,6 +248,7 @@
         LOG.info("Getting timestamp in postmigrated instance %s",
                  instance['id'])
         timestamp2 = self.get_timestamp(ip_instance,
+                                        dev_name=dev_name,
                                         private_key=keypair['private_key'],
                                         server=instance)
         self.assertEqual(timestamp, timestamp2)
@@ -216,3 +263,31 @@
             instance['id'])['volumeAttachments']
         attached_volume_id = attached_volumes[0]['id']
         self.assertEqual(volume_id, attached_volume_id)
+
+        # Reboot the instance and verify it boots successfully
+        LOG.info("Hard rebooting instance %s", instance['id'])
+        self.servers_client.reboot_server(instance['id'], type='HARD')
+        waiters.wait_for_server_status(
+            self.servers_client, instance['id'], 'ACTIVE')
+
+        # check the content of written file to verify the instance is working
+        # after being rebooted
+        LOG.info("Getting timestamp in postmigrated rebooted instance %s",
+                 instance['id'])
+        timestamp2 = self.get_timestamp(ip_instance,
+                                        dev_name=dev_name,
+                                        private_key=keypair['private_key'],
+                                        server=instance)
+        self.assertEqual(timestamp, timestamp2)
+
+    @decorators.attr(type='slow')
+    @decorators.idempotent_id('fe47b1ed-640e-4e3b-a090-200e25607362')
+    @utils.services('compute', 'volume')
+    def test_volume_migrate_attached(self):
+        self._test_volume_migrate_attached()
+
+    @decorators.attr(type='slow')
+    @decorators.idempotent_id('1b8661cb-db93-4110-860b-201295027b78')
+    @utils.services('compute', 'volume')
+    def test_volume_migrate_attached_data_volume(self):
+        self._test_volume_migrate_attached(dev_name='vdb')