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)