blob: 46e7ed506b5510d6b40d37c28449bba3ca702052 [file] [log] [blame]
Daryl Wallecked8bef32011-12-05 23:02:08 -06001import base64
Daryl Walleckb43ce8a2012-02-26 19:14:25 -06002import time
Daryl Wallecked8bef32011-12-05 23:02:08 -06003
Brian Waldon738cd632011-12-12 18:45:09 -05004from nose.plugins.attrib import attr
5import unittest2 as unittest
sapan-konaf1e3f002011-12-22 23:18:44 +05306from tempest import exceptions
Brian Waldon738cd632011-12-12 18:45:09 -05007from tempest.common.utils.data_utils import rand_name
8import tempest.config
9from tempest import openstack
10
Daryl Wallecked8bef32011-12-05 23:02:08 -060011
12class ServerActionsTest(unittest.TestCase):
Brian Waldon738cd632011-12-12 18:45:09 -050013
Daryl Wallecked8bef32011-12-05 23:02:08 -060014 resize_available = tempest.config.TempestConfig().env.resize_available
15
16 @classmethod
17 def setUpClass(cls):
18 cls.os = openstack.Manager()
19 cls.client = cls.os.servers_client
20 cls.config = cls.os.config
21 cls.image_ref = cls.config.env.image_ref
22 cls.image_ref_alt = cls.config.env.image_ref_alt
23 cls.flavor_ref = cls.config.env.flavor_ref
24 cls.flavor_ref_alt = cls.config.env.flavor_ref_alt
Daryl Walleckb43ce8a2012-02-26 19:14:25 -060025 cls.build_interval = cls.config.nova.build_interval
26 cls.build_timeout = cls.config.nova.build_timeout
Daryl Wallecked8bef32011-12-05 23:02:08 -060027
28 def setUp(self):
29 self.name = rand_name('server')
Brian Waldon3bde07f2011-12-13 15:11:22 -050030 resp, server = self.client.create_server(self.name,
31 self.image_ref,
32 self.flavor_ref)
33 self.server_id = server['id']
34
35 self.client.wait_for_server_status(self.server_id, 'ACTIVE')
Daryl Wallecked8bef32011-12-05 23:02:08 -060036
37 def tearDown(self):
Brian Waldon3bde07f2011-12-13 15:11:22 -050038 self.client.delete_server(self.server_id)
Daryl Wallecked8bef32011-12-05 23:02:08 -060039
40 @attr(type='smoke')
41 def test_change_server_password(self):
42 """The server's password should be set to the provided password"""
Brian Waldon3bde07f2011-12-13 15:11:22 -050043 resp, body = self.client.change_password(self.server_id, 'newpass')
Daryl Wallecked8bef32011-12-05 23:02:08 -060044 self.assertEqual(202, resp.status)
Brian Waldon3bde07f2011-12-13 15:11:22 -050045 self.client.wait_for_server_status(self.server_id, 'ACTIVE')
Daryl Wallecked8bef32011-12-05 23:02:08 -060046
47 @attr(type='smoke')
48 def test_reboot_server_hard(self):
49 """ The server should be power cycled """
Brian Waldon3bde07f2011-12-13 15:11:22 -050050 resp, body = self.client.reboot(self.server_id, 'HARD')
Daryl Wallecked8bef32011-12-05 23:02:08 -060051 self.assertEqual(202, resp.status)
Brian Waldon3bde07f2011-12-13 15:11:22 -050052 self.client.wait_for_server_status(self.server_id, 'ACTIVE')
Daryl Wallecked8bef32011-12-05 23:02:08 -060053
54 @attr(type='smoke')
55 def test_reboot_server_soft(self):
56 """The server should be signaled to reboot gracefully"""
Brian Waldon3bde07f2011-12-13 15:11:22 -050057 resp, body = self.client.reboot(self.server_id, 'SOFT')
Daryl Wallecked8bef32011-12-05 23:02:08 -060058 self.assertEqual(202, resp.status)
Brian Waldon3bde07f2011-12-13 15:11:22 -050059 self.client.wait_for_server_status(self.server_id, 'ACTIVE')
Daryl Wallecked8bef32011-12-05 23:02:08 -060060
61 @attr(type='smoke')
62 def test_rebuild_server(self):
63 """ The server should be rebuilt using the provided image and data """
64 meta = {'rebuild': 'server'}
Brian Waldon738cd632011-12-12 18:45:09 -050065 new_name = rand_name('server')
Daryl Wallecked8bef32011-12-05 23:02:08 -060066 file_contents = 'Test server rebuild.'
67 personality = [{'path': '/etc/rebuild.txt',
68 'contents': base64.b64encode(file_contents)}]
69
Brian Waldon3bde07f2011-12-13 15:11:22 -050070 resp, rebuilt_server = self.client.rebuild(self.server_id,
Daryl Wallecked8bef32011-12-05 23:02:08 -060071 self.image_ref_alt,
Brian Waldon738cd632011-12-12 18:45:09 -050072 name=new_name, meta=meta,
Daryl Wallecked8bef32011-12-05 23:02:08 -060073 personality=personality,
74 adminPass='rebuild')
75
76 #Verify the properties in the initial response are correct
Brian Waldon3bde07f2011-12-13 15:11:22 -050077 self.assertEqual(self.server_id, rebuilt_server['id'])
Eoghan Glynn57c1a3d2012-03-01 16:50:29 -050078 rebuilt_image_id = rebuilt_server['image']['id']
79 self.assertTrue(self.image_ref_alt.endswith(rebuilt_image_id))
Daryl Wallecked8bef32011-12-05 23:02:08 -060080 self.assertEqual(self.flavor_ref, rebuilt_server['flavor']['id'])
81
82 #Verify the server properties after the rebuild completes
83 self.client.wait_for_server_status(rebuilt_server['id'], 'ACTIVE')
84 resp, server = self.client.get_server(rebuilt_server['id'])
Eoghan Glynn57c1a3d2012-03-01 16:50:29 -050085 rebuilt_image_id = rebuilt_server['image']['id']
86 self.assertTrue(self.image_ref_alt.endswith(rebuilt_image_id))
Brian Waldon738cd632011-12-12 18:45:09 -050087 self.assertEqual(new_name, rebuilt_server['name'])
Daryl Wallecked8bef32011-12-05 23:02:08 -060088
89 @attr(type='smoke')
90 @unittest.skipIf(not resize_available, 'Resize not available.')
91 def test_resize_server_confirm(self):
92 """
93 The server's RAM and disk space should be modified to that of
94 the provided flavor
95 """
96
Brian Waldon3bde07f2011-12-13 15:11:22 -050097 resp, server = self.client.resize(self.server_id, self.flavor_ref_alt)
Daryl Wallecked8bef32011-12-05 23:02:08 -060098 self.assertEqual(202, resp.status)
Brian Waldon3bde07f2011-12-13 15:11:22 -050099 self.client.wait_for_server_status(self.server_id, 'VERIFY_RESIZE')
Daryl Wallecked8bef32011-12-05 23:02:08 -0600100
Brian Waldon3bde07f2011-12-13 15:11:22 -0500101 self.client.confirm_resize(self.server_id)
102 self.client.wait_for_server_status(self.server_id, 'ACTIVE')
Daryl Wallecked8bef32011-12-05 23:02:08 -0600103
Brian Waldon3bde07f2011-12-13 15:11:22 -0500104 resp, server = self.client.get_server(self.server_id)
Daryl Wallecked8bef32011-12-05 23:02:08 -0600105 self.assertEqual(self.flavor_ref_alt, server['flavor']['id'])
106
107 @attr(type='smoke')
108 @unittest.skipIf(not resize_available, 'Resize not available.')
109 def test_resize_server_revert(self):
110 """
111 The server's RAM and disk space should return to its original
112 values after a resize is reverted
113 """
114
Brian Waldon3bde07f2011-12-13 15:11:22 -0500115 resp, server = self.client.resize(self.server_id, self.flavor_ref_alt)
Daryl Wallecked8bef32011-12-05 23:02:08 -0600116 self.assertEqual(202, resp.status)
Brian Waldon3bde07f2011-12-13 15:11:22 -0500117 self.client.wait_for_server_status(self.server_id, 'VERIFY_RESIZE')
Daryl Wallecked8bef32011-12-05 23:02:08 -0600118
Brian Waldon3bde07f2011-12-13 15:11:22 -0500119 self.client.revert_resize(self.server_id)
120 self.client.wait_for_server_status(self.server_id, 'ACTIVE')
Daryl Wallecked8bef32011-12-05 23:02:08 -0600121
Daryl Walleckb43ce8a2012-02-26 19:14:25 -0600122 # Need to poll for the id change until lp#924371 is fixed
Brian Waldon3bde07f2011-12-13 15:11:22 -0500123 resp, server = self.client.get_server(self.server_id)
Daryl Walleckb43ce8a2012-02-26 19:14:25 -0600124 start = int(time.time())
125
126 while server['flavor']['id'] != self.flavor_ref:
127 time.sleep(self.build_interval)
128 resp, server = self.client.get_server(self.server_id)
129
130 if int(time.time()) - start >= self.build_timeout:
131 message = 'Server %s failed to revert resize within the \
132 required time (%s s).' % (self.server_id, self.build_timeout)
133 raise exceptions.TimeoutException(message)
sapan-konaf1e3f002011-12-22 23:18:44 +0530134
135 @attr(type='negative')
136 def test_reboot_nonexistant_server_soft(self):
137 """
138 Negative Test: The server reboot on non existant server should return
139 an error
140 """
David Kranz5a23d862012-02-14 09:48:55 -0500141 self.assertRaises(exceptions.NotFound, self.client.reboot, 999, 'SOFT')
sapan-konaf1e3f002011-12-22 23:18:44 +0530142
143 @attr(type='negative')
144 def test_rebuild_nonexistant_server(self):
145 """
146 Negative test: The server rebuild for a non existing server should not
147 be allowed
148 """
149 meta = {'rebuild': 'server'}
150 new_name = rand_name('server')
151 file_contents = 'Test server rebuild.'
152 personality = [{'path': '/etc/rebuild.txt',
153 'contents': base64.b64encode(file_contents)}]
154 try:
155 resp, rebuilt_server = self.client.rebuild(999,
156 self.image_ref_alt, name=new_name,
157 meta=meta, personality=personality,
158 adminPass='rebuild')
159 except exceptions.NotFound:
160 pass
161 else:
162 self.fail('The server rebuild for a non existing server should not'
163 ' be allowed')