blob: 9c8271f9bbbe2d35e227dd5e9321f52dae4b9a71 [file] [log] [blame]
Ken'ichi Ohmichi0d4f9882014-02-20 23:51:21 +09001# Copyright 2012 OpenStack Foundation
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
Ken'ichi Ohmichi5a1ff262014-02-24 23:39:19 +090016import testtools
17
Ken'ichi Ohmichi0d4f9882014-02-20 23:51:21 +090018from tempest.api.compute import base
Ken'ichi Ohmichi09a56842014-02-21 16:49:57 +090019from tempest import config
Ken'ichi Ohmichi0d4f9882014-02-20 23:51:21 +090020from tempest import test
21
Ken'ichi Ohmichi09a56842014-02-21 16:49:57 +090022CONF = config.CONF
23
Ken'ichi Ohmichi0d4f9882014-02-20 23:51:21 +090024
25class DeleteServersTestJSON(base.BaseV2ComputeTest):
Eric Windischb5538072014-03-09 23:47:35 -040026
Ken'ichi Ohmichi0d4f9882014-02-20 23:51:21 +090027 # NOTE: Server creations of each test class should be under 10
28 # for preventing "Quota exceeded for instances"
Ken'ichi Ohmichi0d4f9882014-02-20 23:51:21 +090029
30 @classmethod
31 def setUpClass(cls):
32 super(DeleteServersTestJSON, cls).setUpClass()
33 cls.client = cls.servers_client
34
35 @test.attr(type='gate')
36 def test_delete_server_while_in_building_state(self):
37 # Delete a server while it's VM state is Building
38 resp, server = self.create_test_server(wait_until='BUILD')
39 resp, _ = self.client.delete_server(server['id'])
40 self.assertEqual('204', resp['status'])
Ken'ichi Ohmichic5a27d32014-02-25 22:57:10 +090041 self.client.wait_for_server_termination(server['id'])
Ken'ichi Ohmichi0d4f9882014-02-20 23:51:21 +090042
43 @test.attr(type='gate')
44 def test_delete_active_server(self):
45 # Delete a server while it's VM state is Active
46 resp, server = self.create_test_server(wait_until='ACTIVE')
47 resp, _ = self.client.delete_server(server['id'])
48 self.assertEqual('204', resp['status'])
Ken'ichi Ohmichic5a27d32014-02-25 22:57:10 +090049 self.client.wait_for_server_termination(server['id'])
Ken'ichi Ohmichi0d4f9882014-02-20 23:51:21 +090050
51 @test.attr(type='gate')
52 def test_delete_server_while_in_shutoff_state(self):
53 # Delete a server while it's VM state is Shutoff
54 resp, server = self.create_test_server(wait_until='ACTIVE')
55 resp, body = self.client.stop(server['id'])
56 self.client.wait_for_server_status(server['id'], 'SHUTOFF')
57 resp, _ = self.client.delete_server(server['id'])
58 self.assertEqual('204', resp['status'])
Ken'ichi Ohmichic5a27d32014-02-25 22:57:10 +090059 self.client.wait_for_server_termination(server['id'])
Ken'ichi Ohmichi0d4f9882014-02-20 23:51:21 +090060
Matt Riedemann992162e2014-03-24 09:11:06 -070061 @testtools.skipUnless(CONF.compute_feature_enabled.pause,
62 'Pause is not available.')
Ken'ichi Ohmichi0d4f9882014-02-20 23:51:21 +090063 @test.attr(type='gate')
64 def test_delete_server_while_in_pause_state(self):
65 # Delete a server while it's VM state is Pause
66 resp, server = self.create_test_server(wait_until='ACTIVE')
67 resp, body = self.client.pause_server(server['id'])
68 self.client.wait_for_server_status(server['id'], 'PAUSED')
69 resp, _ = self.client.delete_server(server['id'])
70 self.assertEqual('204', resp['status'])
Ken'ichi Ohmichic5a27d32014-02-25 22:57:10 +090071 self.client.wait_for_server_termination(server['id'])
Ken'ichi Ohmichi0d4f9882014-02-20 23:51:21 +090072
David Shrewsbury25f666f2014-07-22 12:17:59 -040073 @testtools.skipUnless(CONF.compute_feature_enabled.shelve,
74 'Shelve is not available.')
Ken'ichi Ohmichi09a56842014-02-21 16:49:57 +090075 @test.attr(type='gate')
76 def test_delete_server_while_in_shelved_state(self):
77 # Delete a server while it's VM state is Shelved
78 resp, server = self.create_test_server(wait_until='ACTIVE')
79 resp, body = self.client.shelve_server(server['id'])
80 self.assertEqual(202, resp.status)
81
82 offload_time = CONF.compute.shelved_offload_time
83 if offload_time >= 0:
84 self.client.wait_for_server_status(server['id'],
85 'SHELVED_OFFLOADED',
86 extra_timeout=offload_time)
87 else:
88 self.client.wait_for_server_status(server['id'],
89 'SHELVED')
90 resp, _ = self.client.delete_server(server['id'])
91 self.assertEqual('204', resp['status'])
Ken'ichi Ohmichic5a27d32014-02-25 22:57:10 +090092 self.client.wait_for_server_termination(server['id'])
Ken'ichi Ohmichi09a56842014-02-21 16:49:57 +090093
Ken'ichi Ohmichi5a1ff262014-02-24 23:39:19 +090094 @testtools.skipIf(not CONF.compute_feature_enabled.resize,
95 'Resize not available.')
96 @test.attr(type='gate')
97 def test_delete_server_while_in_verify_resize_state(self):
98 # Delete a server while it's VM state is VERIFY_RESIZE
99 resp, server = self.create_test_server(wait_until='ACTIVE')
100 resp, body = self.client.resize(server['id'], self.flavor_ref_alt)
101 self.assertEqual(202, resp.status)
102 self.client.wait_for_server_status(server['id'], 'VERIFY_RESIZE')
103 resp, _ = self.client.delete_server(server['id'])
104 self.assertEqual('204', resp['status'])
105 self.client.wait_for_server_termination(server['id'])
106
Ken'ichi Ohmichi254b81c2014-02-24 22:35:34 +0900107 @test.attr(type='gate')
108 def test_delete_server_while_in_attached_volume(self):
109 # Delete a server while a volume is attached to it
110 volumes_client = self.volumes_extensions_client
111 device = '/dev/%s' % CONF.compute.volume_device_name
112 resp, server = self.create_test_server(wait_until='ACTIVE')
113
114 resp, volume = volumes_client.create_volume(1)
115 self.addCleanup(volumes_client.delete_volume, volume['id'])
116 volumes_client.wait_for_volume_status(volume['id'], 'available')
117 resp, body = self.client.attach_volume(server['id'],
118 volume['id'],
119 device=device)
120 volumes_client.wait_for_volume_status(volume['id'], 'in-use')
121
122 resp, _ = self.client.delete_server(server['id'])
123 self.assertEqual('204', resp['status'])
124 self.client.wait_for_server_termination(server['id'])
125 volumes_client.wait_for_volume_status(volume['id'], 'available')
126
Ken'ichi Ohmichi0d4f9882014-02-20 23:51:21 +0900127
Ken'ichi Ohmichi3c9c3c32014-02-24 22:49:11 +0900128class DeleteServersAdminTestJSON(base.BaseV2ComputeAdminTest):
129 # NOTE: Server creations of each test class should be under 10
130 # for preventing "Quota exceeded for instances".
Ken'ichi Ohmichi3c9c3c32014-02-24 22:49:11 +0900131
132 @classmethod
133 def setUpClass(cls):
134 super(DeleteServersAdminTestJSON, cls).setUpClass()
135 cls.non_admin_client = cls.servers_client
136 cls.admin_client = cls.os_adm.servers_client
137
138 @test.attr(type='gate')
139 def test_delete_server_while_in_error_state(self):
140 # Delete a server while it's VM state is error
141 resp, server = self.create_test_server(wait_until='ACTIVE')
142 resp, body = self.admin_client.reset_state(server['id'], state='error')
143 self.assertEqual(202, resp.status)
144 # Verify server's state
145 resp, server = self.non_admin_client.get_server(server['id'])
146 self.assertEqual(server['status'], 'ERROR')
147 resp, _ = self.non_admin_client.delete_server(server['id'])
148 self.assertEqual('204', resp['status'])
Ken'ichi Ohmichic5a27d32014-02-25 22:57:10 +0900149 self.servers_client.wait_for_server_termination(server['id'],
150 ignore_error=True)
Ken'ichi Ohmichi3c9c3c32014-02-24 22:49:11 +0900151
152 @test.attr(type='gate')
153 def test_admin_delete_servers_of_others(self):
154 # Administrator can delete servers of others
155 resp, server = self.create_test_server(wait_until='ACTIVE')
156 resp, _ = self.admin_client.delete_server(server['id'])
157 self.assertEqual('204', resp['status'])
158 self.servers_client.wait_for_server_termination(server['id'])
159
160
Ken'ichi Ohmichi0d4f9882014-02-20 23:51:21 +0900161class DeleteServersTestXML(DeleteServersTestJSON):
162 _interface = 'xml'
Ken'ichi Ohmichi3c9c3c32014-02-24 22:49:11 +0900163
164
165class DeleteServersAdminTestXML(DeleteServersAdminTestJSON):
166 _interface = 'xml'