From 5ecb353f891cf6fc0a132b7cc232e51ea39be348 Mon Sep 17 00:00:00 2001
From: Dean Troyer <dtroyer@gmail.com>
Date: Wed, 25 Jan 2017 11:19:36 -0600
Subject: [PATCH] Add server_boot_from_volume() test

Plucked this test out of I5529f412578c50090e70d17aa0129217bf803fed in
order to validate the current behaviour before applying that change.
It was converted to the new JSON-style.

Change-Id: Ie51b1c375c5940856ec76a5770df3c6bd18a3eba
---
 .../functional/compute/v2/test_server.py      | 115 ++++++++++++++++++
 1 file changed, 115 insertions(+)

diff --git a/openstackclient/tests/functional/compute/v2/test_server.py b/openstackclient/tests/functional/compute/v2/test_server.py
index ffdfa6c812..b6ef85875e 100644
--- a/openstackclient/tests/functional/compute/v2/test_server.py
+++ b/openstackclient/tests/functional/compute/v2/test_server.py
@@ -16,6 +16,7 @@ import time
 from tempest.lib.common.utils import data_utils
 
 from openstackclient.tests.functional import base
+from openstackclient.tests.functional.volume.v2 import test_volume
 from tempest.lib import exceptions
 
 
@@ -318,6 +319,120 @@ class ServerTests(base.TestCase):
         self.assertEqual("", raw_output)
         self.wait_for_status("ACTIVE")
 
+    def test_server_boot_from_volume(self):
+        """Test server create from volume, server delete
+
+        Test steps:
+        1) Create volume from image
+        2) Create empty volume
+        3) Create server from new volumes
+        4) Check for ACTIVE new server status
+        5) Check volumes attached to server
+        """
+        # server_image = self.get_image()
+        # get volume status wait function
+        volume_wait_for = test_volume.VolumeTests(
+            methodName='wait_for',
+        ).wait_for
+
+        # get image size
+        cmd_output = json.loads(self.openstack(
+            'image show -f json ' +
+            self.image_name
+        ))
+        try:
+            image_size = cmd_output['min_disk']
+            if image_size < 1:
+                image_size = 1
+        except ValueError:
+            image_size = 1
+
+        # create volume from image
+        volume_name = data_utils.rand_name('volume', self.image_name)
+        cmd_output = json.loads(self.openstack(
+            'volume create -f json ' +
+            '--image ' + self.image_name + ' ' +
+            '--size ' + str(image_size) + ' ' +
+            volume_name
+        ))
+        self.assertIsNotNone(cmd_output["id"])
+        self.addCleanup(self.openstack, 'volume delete ' + volume_name)
+        self.assertEqual(
+            volume_name,
+            cmd_output['name'],
+        )
+        volume_wait_for("volume", volume_name, "available")
+
+        # create empty volume
+        empty_volume_name = data_utils.rand_name('TestVolume')
+        cmd_output = json.loads(self.openstack(
+            'volume create -f json ' +
+            '--size ' + str(image_size) + ' ' +
+            empty_volume_name
+        ))
+        self.assertIsNotNone(cmd_output["id"])
+        self.addCleanup(self.openstack, 'volume delete ' + empty_volume_name)
+        self.assertEqual(
+            empty_volume_name,
+            cmd_output['name'],
+        )
+        volume_wait_for("volume", empty_volume_name, "available")
+
+        # create server
+        server_name = data_utils.rand_name('TestServer')
+        server = json.loads(self.openstack(
+            'server create -f json ' +
+            '--flavor ' + self.flavor_name + ' ' +
+            '--volume ' + volume_name + ' ' +
+            '--block-device-mapping vdb=' + empty_volume_name + ' ' +
+            self.network_arg + ' ' +
+            server_name
+        ))
+        self.assertIsNotNone(server["id"])
+        self.addCleanup(self.openstack, 'server delete --wait ' + server_name)
+        self.assertEqual(
+            server_name,
+            server['name'],
+        )
+        volume_wait_for("server", server_name, "ACTIVE")
+
+        # check volumes
+        cmd_output = json.loads(self.openstack(
+            'volume show -f json ' +
+            volume_name
+        ))
+        attachments = cmd_output['attachments']
+        self.assertEqual(
+            1,
+            len(attachments),
+        )
+        self.assertEqual(
+            server['id'],
+            attachments[0]['server_id'],
+        )
+        self.assertEqual(
+            "in-use",
+            cmd_output['status'],
+        )
+
+        # NOTE(dtroyer): Prior to https://review.openstack.org/#/c/407111
+        #                --block-device-mapping was ignored if --volume
+        #                present on the command line, so this volume should
+        #                not be attached.
+        cmd_output = json.loads(self.openstack(
+            'volume show -f json ' +
+            empty_volume_name
+        ))
+        attachments = cmd_output['attachments']
+        self.assertEqual(
+            0,
+            len(attachments),
+        )
+        self.assertEqual(
+            "available",
+            cmd_output['status'],
+        )
+
     def wait_for_status(self, expected_status='ACTIVE', wait=900, interval=30):
         """Wait until server reaches expected status."""
         # TODO(thowe): Add a server wait command to osc