1
# vim: tabstop=4 shiftwidth=4 softtabstop=4
3
# Copyright 2011 OpenStack LLC.
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
10
# http://www.apache.org/licenses/LICENSE-2.0
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
20
from nova.api.openstack import compute
21
from nova.api.openstack.compute import extensions
22
from nova.api.openstack import wsgi
24
from nova import flags
27
from nova.tests.api.openstack import fakes
28
from nova import utils
31
MANUAL_INSTANCE_UUID = fakes.FAKE_UUID
32
AUTO_INSTANCE_UUID = fakes.FAKE_UUID.replace('a', 'b')
34
stub_instance = fakes.stub_instance
38
API_DISK_CONFIG = 'OS-DCF:diskConfig'
41
def instance_addresses(context, instance_id):
45
class DiskConfigTestCase(test.TestCase):
48
super(DiskConfigTestCase, self).setUp()
49
self.flags(verbose=True)
50
fakes.stub_out_nw_api(self.stubs)
53
fakes.stub_instance(1,
54
uuid=MANUAL_INSTANCE_UUID,
55
auto_disk_config=False),
56
fakes.stub_instance(2,
57
uuid=AUTO_INSTANCE_UUID,
58
auto_disk_config=True)
61
def fake_instance_get(context, id_):
62
for instance in FAKE_INSTANCES:
63
if id_ == instance['id']:
66
self.stubs.Set(nova.db, 'instance_get', fake_instance_get)
68
def fake_instance_get_by_uuid(context, uuid):
69
for instance in FAKE_INSTANCES:
70
if uuid == instance['uuid']:
73
self.stubs.Set(nova.db, 'instance_get_by_uuid',
74
fake_instance_get_by_uuid)
76
def fake_instance_get_all(context, *args, **kwargs):
79
self.stubs.Set(nova.db, 'instance_get_all', fake_instance_get_all)
80
self.stubs.Set(nova.db, 'instance_get_all_by_filters',
81
fake_instance_get_all)
83
def fake_instance_create(context, inst_, session=None):
84
class FakeModel(dict):
85
def save(self, session=None):
88
inst = FakeModel(**inst_)
90
inst['uuid'] = AUTO_INSTANCE_UUID
91
inst['created_at'] = datetime.datetime(2010, 10, 10, 12, 0, 0)
92
inst['updated_at'] = datetime.datetime(2010, 10, 10, 12, 0, 0)
94
inst['name'] = 'instance-1' # this is a property
96
def fake_instance_get_for_create(context, id_, *args, **kwargs):
99
self.stubs.Set(nova.db, 'instance_get',
100
fake_instance_get_for_create)
101
self.stubs.Set(nova.db, 'instance_update',
102
fake_instance_get_for_create)
104
def fake_instance_get_all_for_create(context, *args, **kwargs):
106
self.stubs.Set(nova.db, 'instance_get_all',
107
fake_instance_get_all_for_create)
108
self.stubs.Set(nova.db, 'instance_get_all_by_filters',
109
fake_instance_get_all_for_create)
111
def fake_instance_add_security_group(context, instance_id,
115
self.stubs.Set(nova.db,
116
'instance_add_security_group',
117
fake_instance_add_security_group)
121
self.stubs.Set(nova.db, 'instance_create', fake_instance_create)
123
self.app = compute.APIRouter()
125
def assertDiskConfig(self, dict_, value):
126
self.assert_(API_DISK_CONFIG in dict_)
127
self.assertEqual(dict_[API_DISK_CONFIG], value)
129
def test_show_server(self):
130
req = fakes.HTTPRequest.blank(
131
'/fake/servers/%s' % MANUAL_INSTANCE_UUID)
132
res = req.get_response(self.app)
133
server_dict = utils.loads(res.body)['server']
134
self.assertDiskConfig(server_dict, 'MANUAL')
136
req = fakes.HTTPRequest.blank(
137
'/fake/servers/%s' % AUTO_INSTANCE_UUID)
138
res = req.get_response(self.app)
139
server_dict = utils.loads(res.body)['server']
140
self.assertDiskConfig(server_dict, 'AUTO')
142
def test_detail_servers(self):
143
req = fakes.HTTPRequest.blank('/fake/servers/detail')
144
res = req.get_response(self.app)
145
server_dicts = utils.loads(res.body)['servers']
147
expectations = ['MANUAL', 'AUTO']
148
for server_dict, expected in zip(server_dicts, expectations):
149
self.assertDiskConfig(server_dict, expected)
151
def test_show_image(self):
152
req = fakes.HTTPRequest.blank(
153
'/fake/images/a440c04b-79fa-479c-bed1-0b816eaec379')
154
res = req.get_response(self.app)
155
image_dict = utils.loads(res.body)['image']
156
self.assertDiskConfig(image_dict, 'MANUAL')
158
req = fakes.HTTPRequest.blank(
159
'/fake/images/70a599e0-31e7-49b7-b260-868f441e862b')
160
res = req.get_response(self.app)
161
image_dict = utils.loads(res.body)['image']
162
self.assertDiskConfig(image_dict, 'AUTO')
164
def test_detail_image(self):
165
req = fakes.HTTPRequest.blank('/fake/images/detail')
166
res = req.get_response(self.app)
167
image_dicts = utils.loads(res.body)['images']
169
expectations = ['MANUAL', 'AUTO']
170
for image_dict, expected in zip(image_dicts, expectations):
171
# NOTE(sirp): image fixtures 6 and 7 are setup for
172
# auto_disk_config testing
173
if image_dict['id'] in (6, 7):
174
self.assertDiskConfig(image_dict, expected)
176
def test_create_server_override_auto(self):
177
req = fakes.HTTPRequest.blank('/fake/servers')
179
req.content_type = 'application/json'
181
'name': 'server_test',
182
'imageRef': 'cedef40a-ed67-4d10-800e-17455edce175',
184
API_DISK_CONFIG: 'AUTO'
187
req.body = utils.dumps(body)
188
res = req.get_response(self.app)
189
server_dict = utils.loads(res.body)['server']
190
self.assertDiskConfig(server_dict, 'AUTO')
192
def test_create_server_override_manual(self):
193
req = fakes.HTTPRequest.blank('/fake/servers')
195
req.content_type = 'application/json'
197
'name': 'server_test',
198
'imageRef': 'cedef40a-ed67-4d10-800e-17455edce175',
200
API_DISK_CONFIG: 'MANUAL'
203
req.body = utils.dumps(body)
204
res = req.get_response(self.app)
205
server_dict = utils.loads(res.body)['server']
206
self.assertDiskConfig(server_dict, 'MANUAL')
208
def test_create_server_detect_from_image(self):
209
"""If user doesn't pass in diskConfig for server, use image metadata
210
to specify AUTO or MANUAL.
212
req = fakes.HTTPRequest.blank('/fake/servers')
214
req.content_type = 'application/json'
216
'name': 'server_test',
217
'imageRef': 'a440c04b-79fa-479c-bed1-0b816eaec379',
221
req.body = utils.dumps(body)
222
res = req.get_response(self.app)
223
server_dict = utils.loads(res.body)['server']
224
self.assertDiskConfig(server_dict, 'MANUAL')
226
req = fakes.HTTPRequest.blank('/fake/servers')
228
req.content_type = 'application/json'
230
'name': 'server_test',
231
'imageRef': '70a599e0-31e7-49b7-b260-868f441e862b',
235
req.body = utils.dumps(body)
236
res = req.get_response(self.app)
237
server_dict = utils.loads(res.body)['server']
238
self.assertDiskConfig(server_dict, 'AUTO')
240
def test_update_server_invalid_disk_config(self):
241
"""Return BadRequest if user passes an invalid diskConfig value."""
242
req = fakes.HTTPRequest.blank(
243
'/fake/servers/%s' % MANUAL_INSTANCE_UUID)
245
req.content_type = 'application/json'
246
body = {'server': {API_DISK_CONFIG: 'server_test'}}
247
req.body = utils.dumps(body)
248
res = req.get_response(self.app)
249
self.assertEqual(res.status_int, 400)
250
expected_msg = ('{"badRequest": {"message": "%s must be either'
251
' \'MANUAL\' or \'AUTO\'.", "code": 400}}' %
253
self.assertEqual(res.body, expected_msg)