blob: 5db0dc697114ea133b0c4029a68b312edb5aeeee [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
Sean Dague1937d092013-05-17 16:36:38 -040018from tempest.api.identity.base import BaseIdentityAdminTest
Matthew Treinisha83a16e2012-12-07 13:44:02 -050019from tempest import exceptions
Chris Yeoh9465b0b2013-02-09 22:19:15 +103020from tempest.test import attr
Sean Dague2203a1f2013-05-14 11:50:46 -040021from tempest.whitebox import manager
David Kranza55ab262012-08-07 16:11:17 -040022
Jay Pipes051075a2012-04-28 17:39:37 -040023
24@attr(type='whitebox')
Sean Dague2203a1f2013-05-14 11:50:46 -040025class ServersWhiteboxTest(manager.ComputeWhiteboxTest):
Attila Fazekas19044d52013-02-16 07:35:06 +010026 _interface = 'json'
Jay Pipes051075a2012-04-28 17:39:37 -040027
28 @classmethod
29 def setUpClass(cls):
ivan-zhu1feeb382013-01-24 10:14:39 +080030 raise cls.skipException("Until Bug 1034129 is fixed")
Jay Pipes051075a2012-04-28 17:39:37 -040031 super(ServersWhiteboxTest, cls).setUpClass()
Attila Fazekas19044d52013-02-16 07:35:06 +010032 #NOTE(afazekas): Strange relationship
Jay Pipes051075a2012-04-28 17:39:37 -040033 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):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050056 # Disallow server creation when tenant's vcpu quota is full
Jay Pipes051075a2012-04-28 17:39:37 -040057 quotas = self.meta.tables['quotas']
Sean Dague14c68182013-04-14 15:34:30 -040058 stmt = (quotas.select().
59 where(quotas.c.project_id == self.tenant_id).
60 where(quotas.c.resource == 'cores'))
Jay Pipes051075a2012-04-28 17:39:37 -040061 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 Daguef07dd632013-01-24 06:19:46 -050066 stmt = quotas.insert().values(deleted=0,
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):
Sean Dague4dd2c0b2013-01-03 17:50:28 -050088 # Disallow server creation when tenant's memory quota is full
Jay Pipes051075a2012-04-28 17:39:37 -040089 quotas = self.meta.tables['quotas']
Sean Dague14c68182013-04-14 15:34:30 -040090 stmt = (quotas.select().
91 where(quotas.c.project_id == self.tenant_id).
92 where(quotas.c.resource == 'ram'))
Jay Pipes051075a2012-04-28 17:39:37 -040093 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 Daguef07dd632013-01-24 06:19:46 -050098 stmt = quotas.insert().values(deleted=0,
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 Daguef07dd632013-01-24 06:19:46 -0500119 def update_state(self, server_id, vm_state, task_state, deleted=0):
Sean Daguef237ccb2013-01-04 15:19:14 -0500120 """Update states of an instance in database for validation."""
Jay Pipes051075a2012-04-28 17:39:37 -0400121 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(
Zhongyue Luoa1343de2013-01-04 16:21:35 +0800126 deleted=deleted,
127 vm_state=vm_state,
128 task_state=task_state)
Jay Pipes051075a2012-04-28 17:39:37 -0400129 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)
Matthew Treinish05d9fb92012-12-07 16:14:05 -0500152 except Exception:
Jay Pipes051075a2012-04-28 17:39:37 -0400153 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'])
Matthew Treinish05d9fb92012-12-07 16:14:05 -0500167 except Exception:
Jay Pipes051075a2012-04-28 17:39:37 -0400168 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):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500174 # Delete server when instance states are building,networking
Jay Pipes051075a2012-04-28 17:39:37 -0400175 self._test_delete_server_base('building', 'networking')
176
177 def test_delete_server_when_vm_eq_building_task_eq_bdm(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500178 # Delete server when instance states are building,block device mapping
Jay Pipes051075a2012-04-28 17:39:37 -0400179 self._test_delete_server_base('building', 'block_device_mapping')
180
181 def test_delete_server_when_vm_eq_building_task_eq_spawning(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500182 # Delete server when instance states are building,spawning
Jay Pipes051075a2012-04-28 17:39:37 -0400183 self._test_delete_server_base('building', 'spawning')
184
185 def test_delete_server_when_vm_eq_active_task_eq_image_backup(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500186 # Delete server when instance states are active,image_backup
Jay Pipes051075a2012-04-28 17:39:37 -0400187 self._test_delete_server_base('active', 'image_backup')
188
189 def test_delete_server_when_vm_eq_active_task_eq_rebuilding(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500190 # Delete server when instance states are active,rebuilding
Jay Pipes051075a2012-04-28 17:39:37 -0400191 self._test_delete_server_base('active', 'rebuilding')
192
193 def test_delete_server_when_vm_eq_error_task_eq_spawning(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500194 # Delete server when instance states are error,spawning
Jay Pipes051075a2012-04-28 17:39:37 -0400195 self._test_delete_server_base('error', 'spawning')
196
197 def test_delete_server_when_vm_eq_resized_task_eq_resize_prep(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500198 # Delete server when instance states are resized,resize_prep
Jay Pipes051075a2012-04-28 17:39:37 -0400199 self._test_delete_server_403_base('resized', 'resize_prep')
200
201 def test_delete_server_when_vm_eq_resized_task_eq_resize_migrating(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500202 # Delete server when instance states are resized,resize_migrating
Jay Pipes051075a2012-04-28 17:39:37 -0400203 self._test_delete_server_403_base('resized', 'resize_migrating')
204
205 def test_delete_server_when_vm_eq_resized_task_eq_resize_migrated(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500206 # Delete server when instance states are resized,resize_migrated
Jay Pipes051075a2012-04-28 17:39:37 -0400207 self._test_delete_server_403_base('resized', 'resize_migrated')
208
209 def test_delete_server_when_vm_eq_resized_task_eq_resize_finish(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500210 # Delete server when instance states are resized,resize_finish
Jay Pipes051075a2012-04-28 17:39:37 -0400211 self._test_delete_server_403_base('resized', 'resize_finish')
212
213 def test_delete_server_when_vm_eq_resized_task_eq_resize_reverting(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500214 # Delete server when instance states are resized,resize_reverting
Jay Pipes051075a2012-04-28 17:39:37 -0400215 self._test_delete_server_403_base('resized', 'resize_reverting')
216
217 def test_delete_server_when_vm_eq_resized_task_eq_resize_confirming(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500218 # Delete server when instance states are resized,resize_confirming
Jay Pipes051075a2012-04-28 17:39:37 -0400219 self._test_delete_server_403_base('resized', 'resize_confirming')
220
221 def test_delete_server_when_vm_eq_active_task_eq_resize_verify(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500222 # Delete server when instance states are active,resize_verify
Jay Pipes051075a2012-04-28 17:39:37 -0400223 self._test_delete_server_base('active', 'resize_verify')
224
225 def test_delete_server_when_vm_eq_active_task_eq_rebooting(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500226 # Delete server when instance states are active,rebooting
Jay Pipes051075a2012-04-28 17:39:37 -0400227 self._test_delete_server_base('active', 'rebooting')
228
229 def test_delete_server_when_vm_eq_building_task_eq_deleting(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500230 # Delete server when instance states are building,deleting
Jay Pipes051075a2012-04-28 17:39:37 -0400231 self._test_delete_server_base('building', 'deleting')
232
233 def test_delete_server_when_vm_eq_active_task_eq_deleting(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500234 # Delete server when instance states are active,deleting
Jay Pipes051075a2012-04-28 17:39:37 -0400235 self._test_delete_server_base('active', 'deleting')
236
237 def test_delete_server_when_vm_eq_error_task_eq_none(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500238 # Delete server when instance states are error,None
Jay Pipes051075a2012-04-28 17:39:37 -0400239 self._test_delete_server_base('error', None)
240
241 def test_delete_server_when_vm_eq_resized_task_eq_none(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500242 # Delete server when instance states are resized,None
Jay Pipes051075a2012-04-28 17:39:37 -0400243 self._test_delete_server_403_base('resized', None)
244
245 def test_delete_server_when_vm_eq_error_task_eq_resize_prep(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500246 # Delete server when instance states are error,resize_prep
Jay Pipes051075a2012-04-28 17:39:37 -0400247 self._test_delete_server_base('error', 'resize_prep')
248
249 def test_delete_server_when_vm_eq_error_task_eq_error(self):
Sean Dague4dd2c0b2013-01-03 17:50:28 -0500250 # Delete server when instance states are error,error
Jay Pipes051075a2012-04-28 17:39:37 -0400251 self._test_delete_server_base('error', 'error')