blob: 980f6cf8aa0f4405dbd5aedaece68819dca1afaf [file] [log] [blame]
Jay Pipes051075a2012-04-28 17:39:37 -04001# vim: tabstop=4 shiftwidth=4 softtabstop=4
2
3# Copyright 2012 OpenStack, LLC
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
18from tempest import exceptions
19from tempest import whitebox
20from tempest.tests.identity.base import BaseIdentityAdminTest
21from nose.plugins.attrib import attr
22
David Kranza55ab262012-08-07 16:11:17 -040023import nose
24
Jay Pipes051075a2012-04-28 17:39:37 -040025
26@attr(type='whitebox')
27class ServersWhiteboxTest(whitebox.ComputeWhiteboxTest):
28
29 @classmethod
30 def setUpClass(cls):
David Kranza55ab262012-08-07 16:11:17 -040031 raise nose.SkipTest("Until Bug 1034129 is fixed")
Jay Pipes051075a2012-04-28 17:39:37 -040032 super(ServersWhiteboxTest, cls).setUpClass()
33 BaseIdentityAdminTest.setUpClass()
34 cls.client = cls.servers_client
35 cls.img_client = cls.images_client
36 cls.admin_client = BaseIdentityAdminTest.client
37
38 cls.connection, cls.meta = cls.get_db_handle_and_meta()
39
40 resp, tenants = cls.admin_client.list_tenants()
Zhongyue Luo79d8d362012-09-25 13:49:27 +080041 cls.tenant_id = [
42 tnt['id']
43 for tnt in tenants if tnt['name'] == cls.config.compute.tenant_name
44 ][0]
Jay Pipes051075a2012-04-28 17:39:37 -040045
46 cls.shared_server = cls.create_server()
47
48 def tearDown(cls):
49 for server in cls.servers:
50 try:
51 cls.client.delete_server(server['id'])
52 except exceptions.NotFound:
53 continue
54
55 def test_create_server_vcpu_quota_full(self):
56 """Disallow server creation when tenant's vcpu quota is full"""
57 quotas = self.meta.tables['quotas']
58 stmt = quotas.select().where(
59 quotas.c.project_id == self.tenant_id).where(
60 quotas.c.resource == 'cores')
61 result = self.connection.execute(stmt).first()
62
63 # Set vcpu quota for tenant if not already set
64 if not result:
65 cores_hard_limit = 2
Sean Dagueaff466e2012-11-19 07:54:55 -050066 stmt = quotas.insert().values(deleted=False,
Zhongyue Luo79d8d362012-09-25 13:49:27 +080067 project_id=self.tenant_id,
68 resource='cores',
69 hard_limit=cores_hard_limit)
Jay Pipes051075a2012-04-28 17:39:37 -040070
71 self.connection.execute(stmt, autocommit=True)
72 else:
73 cores_hard_limit = result.hard_limit
74
75 # Create servers assuming 1 VCPU per instance i.e flavor_id=1
76 try:
77 for count in range(cores_hard_limit + 1):
78 self.create_server()
79 except exceptions.OverLimit:
80 pass
81 else:
82 self.fail("Could create servers over the VCPU quota limit")
83 finally:
84 stmt = quotas.delete()
85 self.connection.execute(stmt, autocommit=True)
86
87 def test_create_server_memory_quota_full(self):
88 """Disallow server creation when tenant's memory quota is full"""
89 quotas = self.meta.tables['quotas']
90 stmt = quotas.select().where(
91 quotas.c.project_id == self.tenant_id).where(
92 quotas.c.resource == 'ram')
93 result = self.connection.execute(stmt).first()
94
95 # Set memory quota for tenant if not already set
96 if not result:
97 ram_hard_limit = 1024
Sean Dagueaff466e2012-11-19 07:54:55 -050098 stmt = quotas.insert().values(deleted=False,
Zhongyue Luo79d8d362012-09-25 13:49:27 +080099 project_id=self.tenant_id,
100 resource='ram',
101 hard_limit=ram_hard_limit)
Jay Pipes051075a2012-04-28 17:39:37 -0400102
103 self.connection.execute(stmt, autocommit=True)
104 else:
105 ram_hard_limit = result.hard_limit
106
107 try:
108 # Set a hard range of 3 servers for reaching the RAM quota
109 for count in range(3):
110 self.create_server()
111 except exceptions.OverLimit:
112 pass
113 else:
114 self.fail("Could create servers over the RAM quota limit")
115 finally:
116 stmt = quotas.delete()
117 self.connection.execute(stmt, autocommit=True)
118
Sean Dagueaff466e2012-11-19 07:54:55 -0500119 def update_state(self, server_id, vm_state, task_state, deleted=False):
Jay Pipes051075a2012-04-28 17:39:37 -0400120 """Update states of an instance in database for validation"""
121 if not task_state:
122 task_state = 'NULL'
123
124 instances = self.meta.tables['instances']
125 stmt = instances.update().where(instances.c.uuid == server_id).values(
126 deleted=deleted,
127 vm_state=vm_state,
128 task_state=task_state)
129 self.connection.execute(stmt, autocommit=True)
130
131 def _test_delete_server_base(self, vm_state, task_state):
132 """
133 Base method for delete server tests based on vm and task states.
134 Validates for successful server termination.
135 """
136 try:
137 server = self.create_server()
138 self.update_state(server['id'], vm_state, task_state)
139
140 resp, body = self.client.delete_server(server['id'])
141 self.assertEqual('204', resp['status'])
142 self.client.wait_for_server_termination(server['id'],
143 ignore_error=True)
144
145 instances = self.meta.tables['instances']
146 stmt = instances.select().where(instances.c.uuid == server['id'])
147 result = self.connection.execute(stmt).first()
148
149 self.assertEqual(1, result.deleted)
150 self.assertEqual('deleted', result.vm_state)
151 self.assertEqual(None, result.task_state)
152 except:
153 self.fail("Should be able to delete a server when vm_state=%s and "
154 "task_state=%s" % (vm_state, task_state))
155
156 def _test_delete_server_403_base(self, vm_state, task_state):
157 """
158 Base method for delete server tests based on vm and task states.
159 Validates for 403 error code.
160 """
161 try:
162 self.update_state(self.shared_server['id'], vm_state, task_state)
163
164 self.assertRaises(exceptions.Unauthorized,
Zhongyue Luo79d8d362012-09-25 13:49:27 +0800165 self.client.delete_server,
166 self.shared_server['id'])
Jay Pipes051075a2012-04-28 17:39:37 -0400167 except:
168 self.fail("Should not allow delete server when vm_state=%s and "
Zhongyue Luo79d8d362012-09-25 13:49:27 +0800169 "task_state=%s" % (vm_state, task_state))
Jay Pipes051075a2012-04-28 17:39:37 -0400170 finally:
171 self.update_state(self.shared_server['id'], 'active', None)
172
173 def test_delete_server_when_vm_eq_building_task_eq_networking(self):
174 """Delete server when instance states are building,networking"""
175 self._test_delete_server_base('building', 'networking')
176
177 def test_delete_server_when_vm_eq_building_task_eq_bdm(self):
178 """
179 Delete server when instance states are building,block device mapping
180 """
181 self._test_delete_server_base('building', 'block_device_mapping')
182
183 def test_delete_server_when_vm_eq_building_task_eq_spawning(self):
184 """Delete server when instance states are building,spawning"""
185 self._test_delete_server_base('building', 'spawning')
186
187 def test_delete_server_when_vm_eq_active_task_eq_image_backup(self):
188 """Delete server when instance states are active,image_backup"""
189 self._test_delete_server_base('active', 'image_backup')
190
191 def test_delete_server_when_vm_eq_active_task_eq_rebuilding(self):
192 """Delete server when instance states are active,rebuilding"""
193 self._test_delete_server_base('active', 'rebuilding')
194
195 def test_delete_server_when_vm_eq_error_task_eq_spawning(self):
196 """Delete server when instance states are error,spawning"""
197 self._test_delete_server_base('error', 'spawning')
198
199 def test_delete_server_when_vm_eq_resized_task_eq_resize_prep(self):
200 """Delete server when instance states are resized,resize_prep"""
201 self._test_delete_server_403_base('resized', 'resize_prep')
202
203 def test_delete_server_when_vm_eq_resized_task_eq_resize_migrating(self):
204 """Delete server when instance states are resized,resize_migrating"""
205 self._test_delete_server_403_base('resized', 'resize_migrating')
206
207 def test_delete_server_when_vm_eq_resized_task_eq_resize_migrated(self):
208 """Delete server when instance states are resized,resize_migrated"""
209 self._test_delete_server_403_base('resized', 'resize_migrated')
210
211 def test_delete_server_when_vm_eq_resized_task_eq_resize_finish(self):
212 """Delete server when instance states are resized,resize_finish"""
213 self._test_delete_server_403_base('resized', 'resize_finish')
214
215 def test_delete_server_when_vm_eq_resized_task_eq_resize_reverting(self):
216 """Delete server when instance states are resized,resize_reverting"""
217 self._test_delete_server_403_base('resized', 'resize_reverting')
218
219 def test_delete_server_when_vm_eq_resized_task_eq_resize_confirming(self):
220 """Delete server when instance states are resized,resize_confirming"""
221 self._test_delete_server_403_base('resized', 'resize_confirming')
222
223 def test_delete_server_when_vm_eq_active_task_eq_resize_verify(self):
224 """Delete server when instance states are active,resize_verify"""
225 self._test_delete_server_base('active', 'resize_verify')
226
227 def test_delete_server_when_vm_eq_active_task_eq_rebooting(self):
228 """Delete server when instance states are active,rebooting"""
229 self._test_delete_server_base('active', 'rebooting')
230
231 def test_delete_server_when_vm_eq_building_task_eq_deleting(self):
232 """Delete server when instance states are building,deleting"""
233 self._test_delete_server_base('building', 'deleting')
234
235 def test_delete_server_when_vm_eq_active_task_eq_deleting(self):
236 """Delete server when instance states are active,deleting"""
237 self._test_delete_server_base('active', 'deleting')
238
239 def test_delete_server_when_vm_eq_error_task_eq_none(self):
240 """Delete server when instance states are error,None"""
241 self._test_delete_server_base('error', None)
242
243 def test_delete_server_when_vm_eq_resized_task_eq_none(self):
244 """Delete server when instance states are resized,None"""
245 self._test_delete_server_403_base('resized', None)
246
247 def test_delete_server_when_vm_eq_error_task_eq_resize_prep(self):
248 """Delete server when instance states are error,resize_prep"""
249 self._test_delete_server_base('error', 'resize_prep')
250
251 def test_delete_server_when_vm_eq_error_task_eq_error(self):
252 """Delete server when instance states are error,error"""
253 self._test_delete_server_base('error', 'error')