blob: 82559d57f5d5e5c6d837b4438284a5152d757abe [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
Sean Dague1937d092013-05-17 16:36:38 -040018from tempest.api.compute import base
nithya-ganesane6a36c82013-02-15 14:38:27 +000019from tempest.common.utils.data_utils import rand_name
nithya-ganesane6a36c82013-02-15 14:38:27 +000020import tempest.config
21from tempest import exceptions
22from tempest.test import attr
nithya-ganesane6a36c82013-02-15 14:38:27 +000023
24
25class ServerRescueTestJSON(base.BaseComputeTest):
26 _interface = 'json'
27
28 run_ssh = tempest.config.TempestConfig().compute.run_ssh
29
30 @classmethod
31 def setUpClass(cls):
32 super(ServerRescueTestJSON, cls).setUpClass()
33 cls.device = 'vdf'
34
Attila Fazekasf7f34f92013-08-01 17:01:44 +020035 # Floating IP creation
nithya-ganesane6a36c82013-02-15 14:38:27 +000036 resp, body = cls.floating_ips_client.create_floating_ip()
37 cls.floating_ip_id = str(body['id']).strip()
38 cls.floating_ip = str(body['ip']).strip()
39
Attila Fazekasf7f34f92013-08-01 17:01:44 +020040 # Security group creation
nithya-ganesane6a36c82013-02-15 14:38:27 +000041 cls.sg_name = rand_name('sg')
42 cls.sg_desc = rand_name('sg-desc')
43 resp, cls.sg = \
Sean Dague14c68182013-04-14 15:34:30 -040044 cls.security_groups_client.create_security_group(cls.sg_name,
45 cls.sg_desc)
nithya-ganesane6a36c82013-02-15 14:38:27 +000046 cls.sg_id = cls.sg['id']
47
48 # Create a volume and wait for it to become ready for attach
49 resp, cls.volume_to_attach = \
Sean Dague14c68182013-04-14 15:34:30 -040050 cls.volumes_extensions_client.create_volume(1,
51 display_name=
52 'test_attach')
Joe Gordone4f2b2e2013-04-04 15:54:10 -070053 cls.volumes_extensions_client.wait_for_volume_status(
Sean Dague14c68182013-04-14 15:34:30 -040054 cls.volume_to_attach['id'], 'available')
nithya-ganesane6a36c82013-02-15 14:38:27 +000055
56 # Create a volume and wait for it to become ready for attach
57 resp, cls.volume_to_detach = \
Sean Dague14c68182013-04-14 15:34:30 -040058 cls.volumes_extensions_client.create_volume(1,
59 display_name=
60 'test_detach')
Joe Gordone4f2b2e2013-04-04 15:54:10 -070061 cls.volumes_extensions_client.wait_for_volume_status(
Sean Dague14c68182013-04-14 15:34:30 -040062 cls.volume_to_detach['id'], 'available')
nithya-ganesane6a36c82013-02-15 14:38:27 +000063
64 # Server for positive tests
65 resp, server = cls.create_server(image_id=cls.image_ref,
66 flavor=cls.flavor_ref,
67 wait_until='BUILD')
68 resp, resc_server = cls.create_server(image_id=cls.image_ref,
69 flavor=cls.flavor_ref,
70 wait_until='ACTIVE')
71 cls.server_id = server['id']
72 cls.password = server['adminPass']
73 cls.servers_client.wait_for_server_status(cls.server_id, 'ACTIVE')
74
75 # Server for negative tests
76 cls.rescue_id = resc_server['id']
77 cls.rescue_password = resc_server['adminPass']
78
79 cls.servers_client.rescue_server(
80 cls.rescue_id, cls.rescue_password)
81 cls.servers_client.wait_for_server_status(cls.rescue_id, 'RESCUE')
82
83 def setUp(self):
84 super(ServerRescueTestJSON, self).setUp()
85
86 @classmethod
87 def tearDownClass(cls):
Attila Fazekasf7f34f92013-08-01 17:01:44 +020088 # Deleting the floating IP which is created in this method
nithya-ganesane6a36c82013-02-15 14:38:27 +000089 cls.floating_ips_client.delete_floating_ip(cls.floating_ip_id)
90 client = cls.volumes_extensions_client
91 client.delete_volume(str(cls.volume_to_attach['id']).strip())
92 client.delete_volume(str(cls.volume_to_detach['id']).strip())
Sean Dague14c68182013-04-14 15:34:30 -040093 resp, cls.sg = cls.security_groups_client.delete_security_group(
94 cls.sg_id)
Dolph Mathews6dbb27c2013-05-09 10:56:24 -050095 super(ServerRescueTestJSON, cls).tearDownClass()
nithya-ganesane6a36c82013-02-15 14:38:27 +000096
97 def tearDown(self):
98 super(ServerRescueTestJSON, self).tearDown()
99
100 def _detach(self, server_id, volume_id):
101 self.servers_client.detach_volume(server_id, volume_id)
102 self.volumes_extensions_client.wait_for_volume_status(volume_id,
103 'available')
104
105 def _delete(self, volume_id):
106 self.volumes_extensions_client.delete_volume(volume_id)
107
Matthew Treinish149142e2013-03-20 16:25:55 -0400108 def _unrescue(self, server_id):
109 resp, body = self.servers_client.unrescue_server(server_id)
110 self.assertEqual(202, resp.status)
111 self.servers_client.wait_for_server_status(server_id, 'ACTIVE')
112
Anju Tiwarib553b132013-07-30 13:22:40 +0530113 def _unpause(self, server_id):
114 resp, body = self.servers_client.unpause_server(server_id)
115 self.assertEqual(202, resp.status)
116 self.servers_client.wait_for_server_status(server_id, 'ACTIVE')
117
nithya-ganesane6a36c82013-02-15 14:38:27 +0000118 @attr(type='smoke')
119 def test_rescue_unrescue_instance(self):
120 resp, body = self.servers_client.rescue_server(
121 self.server_id, self.password)
122 self.assertEqual(200, resp.status)
123 self.servers_client.wait_for_server_status(self.server_id, 'RESCUE')
124 resp, body = self.servers_client.unrescue_server(self.server_id)
125 self.assertEqual(202, resp.status)
126 self.servers_client.wait_for_server_status(self.server_id, 'ACTIVE')
127
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400128 @attr(type=['negative', 'gate'])
Anju Tiwarib553b132013-07-30 13:22:40 +0530129 def test_rescue_paused_instance(self):
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200130 # Rescue a paused server
Anju Tiwarib553b132013-07-30 13:22:40 +0530131 resp, body = self.servers_client.pause_server(
132 self.server_id)
133 self.addCleanup(self._unpause, self.server_id)
134 self.assertEqual(202, resp.status)
135 self.servers_client.wait_for_server_status(self.server_id, 'PAUSED')
136 self.assertRaises(exceptions.Duplicate,
137 self.servers_client.rescue_server,
138 self.server_id)
139
140 @attr(type=['negative', 'gate'])
nithya-ganesane6a36c82013-02-15 14:38:27 +0000141 def test_rescued_vm_reboot(self):
Matthew Treinish149142e2013-03-20 16:25:55 -0400142 self.assertRaises(exceptions.Duplicate, self.servers_client.reboot,
nithya-ganesane6a36c82013-02-15 14:38:27 +0000143 self.rescue_id, 'HARD')
144
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400145 @attr(type=['negative', 'gate'])
Anju Tiwarid0eca672013-07-24 14:27:51 +0530146 def test_rescue_non_existent_server(self):
147 # Rescue a non-existing server
148 self.assertRaises(exceptions.NotFound,
149 self.servers_client.rescue_server,
150 '999erra43')
151
152 @attr(type=['negative', 'gate'])
nithya-ganesane6a36c82013-02-15 14:38:27 +0000153 def test_rescued_vm_rebuild(self):
154 self.assertRaises(exceptions.Duplicate,
155 self.servers_client.rebuild,
156 self.rescue_id,
157 self.image_ref_alt)
158
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400159 @attr(type=['negative', 'gate'])
nithya-ganesane6a36c82013-02-15 14:38:27 +0000160 def test_rescued_vm_attach_volume(self):
nithya-ganesane6a36c82013-02-15 14:38:27 +0000161 # Rescue the server
162 self.servers_client.rescue_server(self.server_id, self.password)
163 self.servers_client.wait_for_server_status(self.server_id, 'RESCUE')
Matthew Treinish149142e2013-03-20 16:25:55 -0400164 self.addCleanup(self._unrescue, self.server_id)
nithya-ganesane6a36c82013-02-15 14:38:27 +0000165
166 # Attach the volume to the server
Matthew Treinish149142e2013-03-20 16:25:55 -0400167 self.assertRaises(exceptions.Duplicate,
168 self.servers_client.attach_volume,
169 self.server_id,
170 self.volume_to_attach['id'],
171 device='/dev/%s' % self.device)
nithya-ganesane6a36c82013-02-15 14:38:27 +0000172
Giampaolo Lauriae9c77022013-05-22 01:23:58 -0400173 @attr(type=['negative', 'gate'])
nithya-ganesane6a36c82013-02-15 14:38:27 +0000174 def test_rescued_vm_detach_volume(self):
175 # Attach the volume to the server
176 self.servers_client.attach_volume(self.server_id,
177 self.volume_to_detach['id'],
178 device='/dev/%s' % self.device)
Joe Gordone4f2b2e2013-04-04 15:54:10 -0700179 self.volumes_extensions_client.wait_for_volume_status(
Sean Dague14c68182013-04-14 15:34:30 -0400180 self.volume_to_detach['id'], 'in-use')
nithya-ganesane6a36c82013-02-15 14:38:27 +0000181
182 # Rescue the server
183 self.servers_client.rescue_server(self.server_id, self.password)
184 self.servers_client.wait_for_server_status(self.server_id, 'RESCUE')
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200185 # addCleanup is a LIFO queue
Joe Gordone4f2b2e2013-04-04 15:54:10 -0700186 self.addCleanup(self._detach, self.server_id,
187 self.volume_to_detach['id'])
Matthew Treinish149142e2013-03-20 16:25:55 -0400188 self.addCleanup(self._unrescue, self.server_id)
nithya-ganesane6a36c82013-02-15 14:38:27 +0000189
Matthew Treinish149142e2013-03-20 16:25:55 -0400190 # Detach the volume from the server expecting failure
191 self.assertRaises(exceptions.Duplicate,
192 self.servers_client.detach_volume,
193 self.server_id,
194 self.volume_to_detach['id'])
nithya-ganesane6a36c82013-02-15 14:38:27 +0000195
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200196 @attr(type='gate')
nithya-ganesane6a36c82013-02-15 14:38:27 +0000197 def test_rescued_vm_associate_dissociate_floating_ip(self):
198 # Rescue the server
199 self.servers_client.rescue_server(
200 self.server_id, self.password)
201 self.servers_client.wait_for_server_status(self.server_id, 'RESCUE')
Joe Gordone4f2b2e2013-04-04 15:54:10 -0700202 self.addCleanup(self._unrescue, self.server_id)
nithya-ganesane6a36c82013-02-15 14:38:27 +0000203
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200204 # Association of floating IP to a rescued vm
nithya-ganesane6a36c82013-02-15 14:38:27 +0000205 client = self.floating_ips_client
Sean Dague14c68182013-04-14 15:34:30 -0400206 resp, body = client.associate_floating_ip_to_server(self.floating_ip,
207 self.server_id)
nithya-ganesane6a36c82013-02-15 14:38:27 +0000208 self.assertEqual(202, resp.status)
209
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200210 # Disassociation of floating IP that was associated in this method
nithya-ganesane6a36c82013-02-15 14:38:27 +0000211 resp, body = \
212 client.disassociate_floating_ip_from_server(self.floating_ip,
213 self.server_id)
214 self.assertEqual(202, resp.status)
215
Giulio Fidenteba3985a2013-05-29 01:46:36 +0200216 @attr(type='gate')
nithya-ganesane6a36c82013-02-15 14:38:27 +0000217 def test_rescued_vm_add_remove_security_group(self):
Prem Karatfbe87a02013-04-22 21:22:06 +0530218 # Rescue the server
219 self.servers_client.rescue_server(
220 self.server_id, self.password)
221 self.servers_client.wait_for_server_status(self.server_id, 'RESCUE')
222
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200223 # Add Security group
nithya-ganesane6a36c82013-02-15 14:38:27 +0000224 resp, body = self.servers_client.add_security_group(self.server_id,
225 self.sg_name)
226 self.assertEqual(202, resp.status)
227
Attila Fazekasf7f34f92013-08-01 17:01:44 +0200228 # Delete Security group
nithya-ganesane6a36c82013-02-15 14:38:27 +0000229 resp, body = self.servers_client.remove_security_group(self.server_id,
Prem Karatfbe87a02013-04-22 21:22:06 +0530230 self.sg_name)
nithya-ganesane6a36c82013-02-15 14:38:27 +0000231 self.assertEqual(202, resp.status)
232
233 # Unrescue the server
234 resp, body = self.servers_client.unrescue_server(self.server_id)
235 self.assertEqual(202, resp.status)
236 self.servers_client.wait_for_server_status(self.server_id, 'ACTIVE')
237
238
239class ServerRescueTestXML(ServerRescueTestJSON):
240 _interface = 'xml'