From 0e8c78c91a31a8ba2664b84d812f967bc45f0865 Mon Sep 17 00:00:00 2001
From: Kyrylo Romanenko <kromanenko@mirantis.com>
Date: Wed, 16 Mar 2016 20:17:55 +0200
Subject: [PATCH] Update tests for server

Make testcases separate instances of test class.
Use setUp with addCleanup methods for every test case.
Add more descriptive docstrings for tests.

Closes-Bug: #1483422
Partial-Bug: #1566962
Change-Id: I1a16b5bad1dafd19fd7dc94794c0bd4587b7f516
---
 functional/tests/compute/v2/test_server.py | 238 ++++++++++++++++-----
 1 file changed, 181 insertions(+), 57 deletions(-)

diff --git a/functional/tests/compute/v2/test_server.py b/functional/tests/compute/v2/test_server.py
index 1d10bbdb2d..f52cbb0eb3 100644
--- a/functional/tests/compute/v2/test_server.py
+++ b/functional/tests/compute/v2/test_server.py
@@ -11,22 +11,15 @@
 #    under the License.
 
 import time
-import uuid
 
+from tempest_lib.common.utils import data_utils
 import testtools
 
-from functional.common import exceptions
 from functional.common import test
 
 
 class ServerTests(test.TestCase):
-    """Functional tests for server."""
-
-    NAME = uuid.uuid4().hex
-    OTHER_NAME = uuid.uuid4().hex
-    HEADERS = ['"Name"']
-    FIELDS = ['name']
-    IP_POOL = 'public'
+    """Functional tests for openstack server commands."""
 
     @classmethod
     def get_flavor(cls):
@@ -52,99 +45,196 @@ class ServerTests(test.TestCase):
         idx = int(len(ray) / 2)
         return ' --nic net-id=' + ray[idx]
 
-    @classmethod
-    def setUpClass(cls):
-        opts = cls.get_show_opts(cls.FIELDS)
-        flavor = cls.get_flavor()
-        image = cls.get_image()
-        network = cls.get_network()
-        raw_output = cls.openstack('server create --flavor ' + flavor +
-                                   ' --image ' + image + network + ' ' +
-                                   cls.NAME + opts)
-        expected = cls.NAME + '\n'
-        cls.assertOutput(expected, raw_output)
+    def server_create(self, name=None):
+        """Create server. Add cleanup."""
+        name = name or data_utils.rand_uuid()
+        opts = self.get_show_opts(self.FIELDS)
+        flavor = self.get_flavor()
+        image = self.get_image()
+        network = self.get_network()
+        raw_output = self.openstack('--debug server create --flavor ' +
+                                    flavor +
+                                    ' --image ' + image + network + ' ' +
+                                    name + opts)
+        if not raw_output:
+            self.fail('Server has not been created!')
+        self.addCleanup(self.server_delete, name)
 
-    @classmethod
-    def tearDownClass(cls):
-        # Rename test
-        raw_output = cls.openstack('server set --name ' + cls.OTHER_NAME +
-                                   ' ' + cls.NAME)
-        cls.assertOutput("", raw_output)
-        # Delete test
-        raw_output = cls.openstack('server delete ' + cls.OTHER_NAME)
-        cls.assertOutput('', raw_output)
+    def server_list(self, params=[]):
+        """List servers."""
+        opts = self.get_list_opts(params)
+        return self.openstack('server list' + opts)
+
+    def server_delete(self, name):
+        """Delete server by name."""
+        self.openstack('server delete ' + name)
+
+    def setUp(self):
+        """Set necessary variables and create server."""
+        super(ServerTests, self).setUp()
+        self.NAME = data_utils.rand_name('TestServer')
+        self.OTHER_NAME = data_utils.rand_name('TestServer')
+        self.HEADERS = ['"Name"']
+        self.FIELDS = ['name']
+        self.IP_POOL = 'public'
+        self.server_create(self.NAME)
+
+    def test_server_rename(self):
+        """Test server rename command.
+
+        Test steps:
+        1) Boot server in setUp
+        2) Rename server
+        3) Check output
+        4) Rename server back to original name
+        """
+        raw_output = self.openstack('server set --name ' + self.OTHER_NAME +
+                                    ' ' + self.NAME)
+        self.assertOutput("", raw_output)
+        self.assertNotIn(self.NAME, self.server_list(['Name']))
+        self.assertIn(self.OTHER_NAME, self.server_list(['Name']))
+        self.openstack('server set --name ' + self.NAME + ' ' +
+                       self.OTHER_NAME)
 
     def test_server_list(self):
+        """Test server list command.
+
+        Test steps:
+        1) Boot server in setUp
+        2) List servers
+        3) Check output
+        """
         opts = self.get_list_opts(self.HEADERS)
         raw_output = self.openstack('server list' + opts)
         self.assertIn(self.NAME, raw_output)
 
     def test_server_show(self):
+        """Test server show command.
+
+        Test steps:
+        1) Boot server in setUp
+        2) Show server
+        3) Check output
+        """
         opts = self.get_show_opts(self.FIELDS)
         raw_output = self.openstack('server show ' + self.NAME + opts)
         self.assertEqual(self.NAME + "\n", raw_output)
 
-    def wait_for(self, desired, wait=120, interval=5, failures=['ERROR']):
-        # TODO(thowe): Add a server wait command to osc
-        status = "notset"
-        total_sleep = 0
-        opts = self.get_show_opts(['status'])
-        while total_sleep < wait:
-            status = self.openstack('server show ' + self.NAME + opts)
-            status = status.rstrip()
-            print('Waiting for {} current status: {}'.format(desired, status))
-            if status == desired:
-                break
-            self.assertNotIn(status, failures)
-            time.sleep(interval)
-            total_sleep += interval
-        self.assertEqual(desired, status)
+    def test_server_metadata(self):
+        """Test command to set server metadata.
 
-    @testtools.skip('skipping due to bug 1483422')
-    def test_server_up_test(self):
-        self.wait_for("ACTIVE")
-        # give it a little bit more time
-        time.sleep(5)
+        Test steps:
+        1) Boot server in setUp
+        2) Set properties for server
+        3) Check server properties in server show output
+        """
+        self.wait_for_status("ACTIVE")
         # metadata
         raw_output = self.openstack(
             'server set --property a=b --property c=d ' + self.NAME)
         opts = self.get_show_opts(["name", "properties"])
         raw_output = self.openstack('server show ' + self.NAME + opts)
         self.assertEqual(self.NAME + "\na='b', c='d'\n", raw_output)
+
+    def test_server_suspend_resume(self):
+        """Test server suspend and resume commands.
+
+        Test steps:
+        1) Boot server in setUp
+        2) Suspend server
+        3) Check for SUSPENDED server status
+        4) Resume server
+        5) Check for ACTIVE server status
+        """
+        self.wait_for_status("ACTIVE")
         # suspend
         raw_output = self.openstack('server suspend ' + self.NAME)
         self.assertEqual("", raw_output)
-        self.wait_for("SUSPENDED")
+        self.wait_for_status("SUSPENDED")
         # resume
         raw_output = self.openstack('server resume ' + self.NAME)
         self.assertEqual("", raw_output)
-        self.wait_for("ACTIVE")
+        self.wait_for_status("ACTIVE")
+
+    def test_server_lock_unlock(self):
+        """Test server lock and unlock commands.
+
+        Test steps:
+        1) Boot server in setUp
+        2) Lock server
+        3) Check output
+        4) Unlock server
+        5) Check output
+        """
+        self.wait_for_status("ACTIVE")
         # lock
         raw_output = self.openstack('server lock ' + self.NAME)
         self.assertEqual("", raw_output)
         # unlock
         raw_output = self.openstack('server unlock ' + self.NAME)
         self.assertEqual("", raw_output)
+
+    def test_server_pause_unpause(self):
+        """Test server pause and unpause commands.
+
+        Test steps:
+        1) Boot server in setUp
+        2) Pause server
+        3) Check for PAUSED server status
+        4) Unpause server
+        5) Check for ACTIVE server status
+        """
+        self.wait_for_status("ACTIVE")
         # pause
         raw_output = self.openstack('server pause ' + self.NAME)
         self.assertEqual("", raw_output)
-        self.wait_for("PAUSED")
+        self.wait_for_status("PAUSED")
         # unpause
         raw_output = self.openstack('server unpause ' + self.NAME)
         self.assertEqual("", raw_output)
-        self.wait_for("ACTIVE")
+        self.wait_for_status("ACTIVE")
+
+    def test_server_rescue_unrescue(self):
+        """Test server rescue and unrescue commands.
+
+        Test steps:
+        1) Boot server in setUp
+        2) Rescue server
+        3) Check for RESCUE server status
+        4) Unrescue server
+        5) Check for ACTIVE server status
+        """
+        self.wait_for_status("ACTIVE")
         # rescue
         opts = self.get_show_opts(["adminPass"])
         raw_output = self.openstack('server rescue ' + self.NAME + opts)
         self.assertNotEqual("", raw_output)
-        self.wait_for("RESCUE")
+        self.wait_for_status("RESCUE")
         # unrescue
         raw_output = self.openstack('server unrescue ' + self.NAME)
         self.assertEqual("", raw_output)
-        self.wait_for("ACTIVE")
+        self.wait_for_status("ACTIVE")
+
+    @testtools.skip('this test needs to be re-worked completely')
+    def test_server_attach_detach_floating_ip(self):
+        """Test commands to attach and detach floating IP for server.
+
+        Test steps:
+        1) Boot server in setUp
+        2) Create floating IP
+        3) Add floating IP to server
+        4) Check for floating IP in server show output
+        5) Remove floating IP from server
+        6) Check that floating IP is  not in server show output
+        7) Delete floating IP
+        8) Check output
+        """
+        self.wait_for_status("ACTIVE")
         # attach ip
         opts = self.get_show_opts(["id", "ip"])
-        raw_output = self.openstack('ip floating create ' + self.IP_POOL +
+        raw_output = self.openstack('ip floating create '
+                                    '--debug ' +
+                                    self.IP_POOL +
                                     opts)
         ipid, ip, rol = tuple(raw_output.split('\n'))
         self.assertNotEqual("", ipid)
@@ -153,6 +243,7 @@ class ServerTests(test.TestCase):
         self.assertEqual("", raw_output)
         raw_output = self.openstack('server show ' + self.NAME)
         self.assertIn(ip, raw_output)
+
         # detach ip
         raw_output = self.openstack('ip floating remove ' + ip + ' ' +
                                     self.NAME)
@@ -161,7 +252,40 @@ class ServerTests(test.TestCase):
         self.assertNotIn(ip, raw_output)
         raw_output = self.openstack('ip floating delete ' + ipid)
         self.assertEqual("", raw_output)
+
+    def test_server_reboot(self):
+        """Test server reboot command.
+
+        Test steps:
+        1) Boot server in setUp
+        2) Reboot server
+        3) Check for ACTIVE server status
+        """
+        self.wait_for_status("ACTIVE")
         # reboot
         raw_output = self.openstack('server reboot ' + self.NAME)
         self.assertEqual("", raw_output)
-        self.wait_for("ACTIVE")
+        self.wait_for_status("ACTIVE")
+
+    def wait_for_status(self, expected_status='ACTIVE', wait=600, interval=30):
+        """Wait until server reaches expected status."""
+        # TODO(thowe): Add a server wait command to osc
+        failures = ['ERROR']
+        total_sleep = 0
+        opts = self.get_show_opts(['status'])
+        while total_sleep < wait:
+            status = self.openstack('server show ' + self.NAME + opts)
+            status = status.rstrip()
+            print('Waiting for {} current status: {}'.format(expected_status,
+                                                             status))
+            if status == expected_status:
+                break
+            self.assertNotIn(status, failures)
+            time.sleep(interval)
+            total_sleep += interval
+
+        status = self.openstack('server show ' + self.NAME + opts)
+        status = status.rstrip()
+        self.assertEqual(status, expected_status)
+        # give it a little bit more time
+        time.sleep(5)