blob: 5fc730a4b99ceb24261a68076aabdc64f1afb868 [file] [log] [blame]
nithya-ganesane6a36c82013-02-15 14:38:27 +00001# vim: tabstop=4 shiftwidth=4 softtabstop=4
2
3# Copyright 2013 Hewlett-Packard Development Company, L.P.
4# All Rights Reserved.
5#
6# Licensed under the Apache License, Version 2.0 (the "License"); you may
7# not use this file except in compliance with the License. You may obtain
8# a copy of the License at
9#
10# http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15# License for the specific language governing permissions and limitations
16# under the License.
17
18import base64
19import time
20
21import testtools
22
23from tempest.common.utils.data_utils import rand_name
24from tempest.common.utils.linux.remote_client import RemoteClient
25import tempest.config
26from tempest import exceptions
27from tempest.test import attr
28from tempest.tests import compute
29from tempest.tests.compute import base
30
31
32class ServerRescueTestJSON(base.BaseComputeTest):
33 _interface = 'json'
34
35 run_ssh = tempest.config.TempestConfig().compute.run_ssh
36
37 @classmethod
38 def setUpClass(cls):
39 super(ServerRescueTestJSON, cls).setUpClass()
40 cls.device = 'vdf'
41
42 #Floating IP creation
43 resp, body = cls.floating_ips_client.create_floating_ip()
44 cls.floating_ip_id = str(body['id']).strip()
45 cls.floating_ip = str(body['ip']).strip()
46
47 #Security group creation
48 cls.sg_name = rand_name('sg')
49 cls.sg_desc = rand_name('sg-desc')
50 resp, cls.sg = \
51 cls.security_groups_client.create_security_group(cls.sg_name,
52 cls.sg_desc)
53 cls.sg_id = cls.sg['id']
54
55 # Create a volume and wait for it to become ready for attach
56 resp, cls.volume_to_attach = \
57 cls.volumes_extensions_client.create_volume(1,
58 display_name=
59 'test_attach')
60 cls.volumes_extensions_client.wait_for_volume_status
61 (cls.volume_to_attach['id'], 'available')
62
63 # Create a volume and wait for it to become ready for attach
64 resp, cls.volume_to_detach = \
65 cls.volumes_extensions_client.create_volume(1,
66 display_name=
67 'test_detach')
68 cls.volumes_extensions_client.wait_for_volume_status
69 (cls.volume_to_detach['id'], 'available')
70
71 # Server for positive tests
72 resp, server = cls.create_server(image_id=cls.image_ref,
73 flavor=cls.flavor_ref,
74 wait_until='BUILD')
75 resp, resc_server = cls.create_server(image_id=cls.image_ref,
76 flavor=cls.flavor_ref,
77 wait_until='ACTIVE')
78 cls.server_id = server['id']
79 cls.password = server['adminPass']
80 cls.servers_client.wait_for_server_status(cls.server_id, 'ACTIVE')
81
82 # Server for negative tests
83 cls.rescue_id = resc_server['id']
84 cls.rescue_password = resc_server['adminPass']
85
86 cls.servers_client.rescue_server(
87 cls.rescue_id, cls.rescue_password)
88 cls.servers_client.wait_for_server_status(cls.rescue_id, 'RESCUE')
89
90 def setUp(self):
91 super(ServerRescueTestJSON, self).setUp()
92
93 @classmethod
94 def tearDownClass(cls):
95 super(ServerRescueTestJSON, cls).tearDownClass()
96 #Deleting the floating IP which is created in this method
97 cls.floating_ips_client.delete_floating_ip(cls.floating_ip_id)
98 client = cls.volumes_extensions_client
99 client.delete_volume(str(cls.volume_to_attach['id']).strip())
100 client.delete_volume(str(cls.volume_to_detach['id']).strip())
101 resp, cls.sg = \
102 cls.security_groups_client.delete_security_group(cls.sg_id)
103
104 def tearDown(self):
105 super(ServerRescueTestJSON, self).tearDown()
106
107 def _detach(self, server_id, volume_id):
108 self.servers_client.detach_volume(server_id, volume_id)
109 self.volumes_extensions_client.wait_for_volume_status(volume_id,
110 'available')
111
112 def _delete(self, volume_id):
113 self.volumes_extensions_client.delete_volume(volume_id)
114
115 @attr(type='smoke')
116 def test_rescue_unrescue_instance(self):
117 resp, body = self.servers_client.rescue_server(
118 self.server_id, self.password)
119 self.assertEqual(200, resp.status)
120 self.servers_client.wait_for_server_status(self.server_id, 'RESCUE')
121 resp, body = self.servers_client.unrescue_server(self.server_id)
122 self.assertEqual(202, resp.status)
123 self.servers_client.wait_for_server_status(self.server_id, 'ACTIVE')
124
125 @attr(type='negative')
Matthew Treinish770e5a42013-03-22 15:35:16 -0400126 @testtools.skip("Skipped until Bug #1126163 is resolved")
nithya-ganesane6a36c82013-02-15 14:38:27 +0000127 def test_rescued_vm_reboot(self):
128 self.assertRaises(exceptions.BadRequest, self.servers_client.reboot,
129 self.rescue_id, 'HARD')
130
131 @attr(type='negative')
132 def test_rescued_vm_rebuild(self):
133 self.assertRaises(exceptions.Duplicate,
134 self.servers_client.rebuild,
135 self.rescue_id,
136 self.image_ref_alt)
137
138 @attr(type='positive')
Matthew Treinish770e5a42013-03-22 15:35:16 -0400139 @testtools.skip("Skipped due to Bug #1126187")
nithya-ganesane6a36c82013-02-15 14:38:27 +0000140 def test_rescued_vm_attach_volume(self):
141 client = self.volumes_extensions_client
142
143 # Rescue the server
144 self.servers_client.rescue_server(self.server_id, self.password)
145 self.servers_client.wait_for_server_status(self.server_id, 'RESCUE')
146
147 # Attach the volume to the server
148 resp, body = \
149 self.servers_client.attach_volume(self.server_id,
150 self.volume_to_attach['id'],
151 device='/dev/%s' % self.device)
152 self.assertEqual(200, resp.status)
153 client.wait_for_volume_status(self.volume_to_attach['id'], 'in-use')
154
155 # Detach the volume to the server
156 resp, body = \
157 self.servers_client.detach_volume(self.server_id,
158 self.volume_to_attach['id'])
159 self.assertEqual(202, resp.status)
160 client.wait_for_volume_status(self.volume_to_attach['id'], 'available')
161
162 # Unrescue the server
163 resp, body = self.servers_client.unrescue_server(self.server_id)
164 self.assertEqual(202, resp.status)
165 self.servers_client.wait_for_server_status(self.server_id, 'ACTIVE')
166
167 @attr(type='positive')
Matthew Treinish770e5a42013-03-22 15:35:16 -0400168 @testtools.skip("Skipped until Bug #1126187 is resolved")
nithya-ganesane6a36c82013-02-15 14:38:27 +0000169 def test_rescued_vm_detach_volume(self):
170 # Attach the volume to the server
171 self.servers_client.attach_volume(self.server_id,
172 self.volume_to_detach['id'],
173 device='/dev/%s' % self.device)
174 self.volumes_extensions_client.wait_for_volume_status
175 (self.volume_to_detach['id'], 'in-use')
176
177 # Rescue the server
178 self.servers_client.rescue_server(self.server_id, self.password)
179 self.servers_client.wait_for_server_status(self.server_id, 'RESCUE')
180
181 # Detach the volume to the server
182 resp, body = \
183 self.servers_client.detach_volume(self.server_id,
184 self.volume_to_detach['id'])
185 self.assertEqual(202, resp.status)
186 client = self.volumes_extensions_client
187 client.wait_for_volume_status(self.volume_to_detach['id'], 'available')
188
189 # Unrescue the server
190 resp, body = self.servers_client.unrescue_server(self.server_id)
191 self.assertEqual(202, resp.status)
192 self.servers_client.wait_for_server_status(self.server_id, 'ACTIVE')
193
194 @attr(type='positive')
195 def test_rescued_vm_associate_dissociate_floating_ip(self):
196 # Rescue the server
197 self.servers_client.rescue_server(
198 self.server_id, self.password)
199 self.servers_client.wait_for_server_status(self.server_id, 'RESCUE')
200
201 #Association of floating IP to a rescued vm
202 client = self.floating_ips_client
203 resp, body =\
204 client.associate_floating_ip_to_server(self.floating_ip,
205 self.server_id)
206 self.assertEqual(202, resp.status)
207
208 #Disassociation of floating IP that was associated in this method
209 resp, body = \
210 client.disassociate_floating_ip_from_server(self.floating_ip,
211 self.server_id)
212 self.assertEqual(202, resp.status)
213
214 # Unrescue the server
215 resp, body = self.servers_client.unrescue_server(self.server_id)
216 self.assertEqual(202, resp.status)
217 self.servers_client.wait_for_server_status(self.server_id, 'ACTIVE')
218
219 @attr(type='positive')
Matthew Treinish770e5a42013-03-22 15:35:16 -0400220 @testtools.skip("Skipped until Bug #1126257 is resolved")
nithya-ganesane6a36c82013-02-15 14:38:27 +0000221 def test_rescued_vm_add_remove_security_group(self):
222 #Add Security group
223 resp, body = self.servers_client.add_security_group(self.server_id,
224 self.sg_name)
225 self.assertEqual(202, resp.status)
226
227 #Delete Security group
228 resp, body = self.servers_client.remove_security_group(self.server_id,
229 self.sg_id)
230 self.assertEqual(202, resp.status)
231
232 # Unrescue the server
233 resp, body = self.servers_client.unrescue_server(self.server_id)
234 self.assertEqual(202, resp.status)
235 self.servers_client.wait_for_server_status(self.server_id, 'ACTIVE')
236
237
238class ServerRescueTestXML(ServerRescueTestJSON):
239 _interface = 'xml'