Merge lp:~rackspace-titan/nova/servers-response-formatting into lp:~hudson-openstack/nova/trunk
- servers-response-formatting
- Merge into trunk
Status: | Merged | ||||||||
---|---|---|---|---|---|---|---|---|---|
Approved by: | Brian Waldon | ||||||||
Approved revision: | 1297 | ||||||||
Merged at revision: | 1323 | ||||||||
Proposed branch: | lp:~rackspace-titan/nova/servers-response-formatting | ||||||||
Merge into: | lp:~hudson-openstack/nova/trunk | ||||||||
Diff against target: |
918 lines (+658/-63) 2 files modified
nova/api/openstack/views/servers.py (+38/-7) nova/tests/api/openstack/test_servers.py (+620/-56) |
||||||||
To merge this branch: | bzr merge lp:~rackspace-titan/nova/servers-response-formatting | ||||||||
Related bugs: |
|
||||||||
Related blueprints: |
Openstack API 1.1 Finalization
(Essential)
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Brian Waldon (community) | Approve | ||
Vish Ishaya (community) | Approve | ||
Review via email: mp+68119@code.launchpad.net |
Commit message
Description of the change
Updates /servers requests to follow the v1.1 spec. Except for implementation of uuids replacing ids and access ips both of which are not yet implemented. Also, does not include serialized xml responses.
Vish Ishaya (vishvananda) wrote : | # |
Nice work,
Really appreciate all of the tests going in with these branches.
OpenStack Infra (hudson-openstack) wrote : | # |
The attempt to merge lp:~rackspace-titan/nova/servers-response-formatting into lp:nova failed. Below is the output from the failed tests.
FloatingIpTest
test_
test_
test_
test_
test_
test_
test_
FixedIpTest
test_
test_
test_
test_
FlavorsExtraSpe
test_create OK 0.05
test_
test_delete OK 0.05
test_index OK 0.05
test_
test_show OK 0.05
test_
test_
test_
test_
test_
AccountsTest
test_
test_
test_
test_
AdminAPITest
test_
test_
APITest
test_
test_
test_
Test
test_
test_
test_
test_
test_bad_token OK 0.07
test_
test_
test_no_user OK 0.06
test_
test_
Preview Diff
1 | === modified file 'nova/api/openstack/views/servers.py' | |||
2 | --- nova/api/openstack/views/servers.py 2011-07-21 18:21:27 +0000 | |||
3 | +++ nova/api/openstack/views/servers.py 2011-07-26 13:49:41 +0000 | |||
4 | @@ -50,7 +50,7 @@ | |||
5 | 50 | else: | 50 | else: |
6 | 51 | server = self._build_simple(inst) | 51 | server = self._build_simple(inst) |
7 | 52 | 52 | ||
9 | 53 | self._build_extra(server, inst) | 53 | self._build_extra(server['server'], inst) |
10 | 54 | 54 | ||
11 | 55 | return server | 55 | return server |
12 | 56 | 56 | ||
13 | @@ -99,7 +99,6 @@ | |||
14 | 99 | self._build_flavor(inst_dict, inst) | 99 | self._build_flavor(inst_dict, inst) |
15 | 100 | self._build_addresses(inst_dict, inst) | 100 | self._build_addresses(inst_dict, inst) |
16 | 101 | 101 | ||
17 | 102 | inst_dict['uuid'] = inst['uuid'] | ||
18 | 103 | return dict(server=inst_dict) | 102 | return dict(server=inst_dict) |
19 | 104 | 103 | ||
20 | 105 | def _build_addresses(self, response, inst): | 104 | def _build_addresses(self, response, inst): |
21 | @@ -121,6 +120,9 @@ | |||
22 | 121 | class ViewBuilderV10(ViewBuilder): | 120 | class ViewBuilderV10(ViewBuilder): |
23 | 122 | """Model an Openstack API V1.0 server response.""" | 121 | """Model an Openstack API V1.0 server response.""" |
24 | 123 | 122 | ||
25 | 123 | def _build_extra(self, response, inst): | ||
26 | 124 | response['uuid'] = inst['uuid'] | ||
27 | 125 | |||
28 | 124 | def _build_image(self, response, inst): | 126 | def _build_image(self, response, inst): |
29 | 125 | if 'image_ref' in dict(inst): | 127 | if 'image_ref' in dict(inst): |
30 | 126 | image_ref = inst['image_ref'] | 128 | image_ref = inst['image_ref'] |
31 | @@ -145,18 +147,46 @@ | |||
32 | 145 | self.image_builder = image_builder | 147 | self.image_builder = image_builder |
33 | 146 | self.base_url = base_url | 148 | self.base_url = base_url |
34 | 147 | 149 | ||
35 | 150 | def _build_detail(self, inst): | ||
36 | 151 | response = super(ViewBuilderV11, self)._build_detail(inst) | ||
37 | 152 | response['server']['created'] = inst['created_at'] | ||
38 | 153 | response['server']['updated'] = inst['updated_at'] | ||
39 | 154 | if 'status' in response['server']: | ||
40 | 155 | if response['server']['status'] == "ACTIVE": | ||
41 | 156 | response['server']['progress'] = 100 | ||
42 | 157 | elif response['server']['status'] == "BUILD": | ||
43 | 158 | response['server']['progress'] = 0 | ||
44 | 159 | return response | ||
45 | 160 | |||
46 | 148 | def _build_image(self, response, inst): | 161 | def _build_image(self, response, inst): |
47 | 149 | if 'image_ref' in dict(inst): | 162 | if 'image_ref' in dict(inst): |
48 | 150 | image_href = inst['image_ref'] | 163 | image_href = inst['image_ref'] |
52 | 151 | if str(image_href).isdigit(): | 164 | image_id = str(common.get_id_from_href(image_href)) |
53 | 152 | image_href = int(image_href) | 165 | _bookmark = self.image_builder.generate_bookmark(image_id) |
54 | 153 | response['imageRef'] = image_href | 166 | response['image'] = { |
55 | 167 | "id": image_id, | ||
56 | 168 | "links": [ | ||
57 | 169 | { | ||
58 | 170 | "rel": "bookmark", | ||
59 | 171 | "href": _bookmark, | ||
60 | 172 | }, | ||
61 | 173 | ] | ||
62 | 174 | } | ||
63 | 154 | 175 | ||
64 | 155 | def _build_flavor(self, response, inst): | 176 | def _build_flavor(self, response, inst): |
65 | 156 | if "instance_type" in dict(inst): | 177 | if "instance_type" in dict(inst): |
66 | 157 | flavor_id = inst["instance_type"]['flavorid'] | 178 | flavor_id = inst["instance_type"]['flavorid'] |
67 | 158 | flavor_ref = self.flavor_builder.generate_href(flavor_id) | 179 | flavor_ref = self.flavor_builder.generate_href(flavor_id) |
69 | 159 | response["flavorRef"] = flavor_ref | 180 | flavor_bookmark = self.flavor_builder.generate_bookmark(flavor_id) |
70 | 181 | response["flavor"] = { | ||
71 | 182 | "id": str(common.get_id_from_href(flavor_ref)), | ||
72 | 183 | "links": [ | ||
73 | 184 | { | ||
74 | 185 | "rel": "bookmark", | ||
75 | 186 | "href": flavor_bookmark, | ||
76 | 187 | }, | ||
77 | 188 | ] | ||
78 | 189 | } | ||
79 | 160 | 190 | ||
80 | 161 | def _build_addresses(self, response, inst): | 191 | def _build_addresses(self, response, inst): |
81 | 162 | interfaces = inst.get('virtual_interfaces', []) | 192 | interfaces = inst.get('virtual_interfaces', []) |
82 | @@ -164,6 +194,7 @@ | |||
83 | 164 | 194 | ||
84 | 165 | def _build_extra(self, response, inst): | 195 | def _build_extra(self, response, inst): |
85 | 166 | self._build_links(response, inst) | 196 | self._build_links(response, inst) |
86 | 197 | response['uuid'] = inst['uuid'] | ||
87 | 167 | 198 | ||
88 | 168 | def _build_links(self, response, inst): | 199 | def _build_links(self, response, inst): |
89 | 169 | href = self.generate_href(inst["id"]) | 200 | href = self.generate_href(inst["id"]) |
90 | @@ -180,7 +211,7 @@ | |||
91 | 180 | }, | 211 | }, |
92 | 181 | ] | 212 | ] |
93 | 182 | 213 | ||
95 | 183 | response["server"]["links"] = links | 214 | response["links"] = links |
96 | 184 | 215 | ||
97 | 185 | def generate_href(self, server_id): | 216 | def generate_href(self, server_id): |
98 | 186 | """Create an url that refers to a specific server id.""" | 217 | """Create an url that refers to a specific server id.""" |
99 | 187 | 218 | ||
100 | === modified file 'nova/tests/api/openstack/test_servers.py' | |||
101 | --- nova/tests/api/openstack/test_servers.py 2011-07-25 23:38:07 +0000 | |||
102 | +++ nova/tests/api/openstack/test_servers.py 2011-07-26 13:49:41 +0000 | |||
103 | @@ -78,6 +78,12 @@ | |||
104 | 78 | return _return_virtual_interface_by_instance | 78 | return _return_virtual_interface_by_instance |
105 | 79 | 79 | ||
106 | 80 | 80 | ||
107 | 81 | def return_server_with_attributes(**kwargs): | ||
108 | 82 | def _return_server(context, id): | ||
109 | 83 | return stub_instance(id, **kwargs) | ||
110 | 84 | return _return_server | ||
111 | 85 | |||
112 | 86 | |||
113 | 81 | def return_server_with_addresses(private, public): | 87 | def return_server_with_addresses(private, public): |
114 | 82 | def _return_server(context, id): | 88 | def _return_server(context, id): |
115 | 83 | return stub_instance(id, private_address=private, | 89 | return stub_instance(id, private_address=private, |
116 | @@ -85,12 +91,6 @@ | |||
117 | 85 | return _return_server | 91 | return _return_server |
118 | 86 | 92 | ||
119 | 87 | 93 | ||
120 | 88 | def return_server_with_interfaces(interfaces): | ||
121 | 89 | def _return_server(context, id): | ||
122 | 90 | return stub_instance(id, interfaces=interfaces) | ||
123 | 91 | return _return_server | ||
124 | 92 | |||
125 | 93 | |||
126 | 94 | def return_server_with_power_state(power_state): | 94 | def return_server_with_power_state(power_state): |
127 | 95 | def _return_server(context, id): | 95 | def _return_server(context, id): |
128 | 96 | return stub_instance(id, power_state=power_state) | 96 | return stub_instance(id, power_state=power_state) |
129 | @@ -143,14 +143,15 @@ | |||
130 | 143 | 143 | ||
131 | 144 | def stub_instance(id, user_id=1, private_address=None, public_addresses=None, | 144 | def stub_instance(id, user_id=1, private_address=None, public_addresses=None, |
132 | 145 | host=None, power_state=0, reservation_id="", | 145 | host=None, power_state=0, reservation_id="", |
134 | 146 | uuid=FAKE_UUID, interfaces=None): | 146 | uuid=FAKE_UUID, image_ref="10", flavor_id="1", |
135 | 147 | interfaces=None): | ||
136 | 147 | metadata = [] | 148 | metadata = [] |
137 | 148 | metadata.append(InstanceMetadata(key='seq', value=id)) | 149 | metadata.append(InstanceMetadata(key='seq', value=id)) |
138 | 149 | 150 | ||
139 | 150 | if interfaces is None: | 151 | if interfaces is None: |
140 | 151 | interfaces = [] | 152 | interfaces = [] |
141 | 152 | 153 | ||
143 | 153 | inst_type = instance_types.get_instance_type_by_flavor_id(1) | 154 | inst_type = instance_types.get_instance_type_by_flavor_id(int(flavor_id)) |
144 | 154 | 155 | ||
145 | 155 | if public_addresses is None: | 156 | if public_addresses is None: |
146 | 156 | public_addresses = list() | 157 | public_addresses = list() |
147 | @@ -165,10 +166,12 @@ | |||
148 | 165 | 166 | ||
149 | 166 | instance = { | 167 | instance = { |
150 | 167 | "id": int(id), | 168 | "id": int(id), |
151 | 169 | "created_at": "2010-10-10T12:00:00Z", | ||
152 | 170 | "updated_at": "2010-11-11T11:00:00Z", | ||
153 | 168 | "admin_pass": "", | 171 | "admin_pass": "", |
154 | 169 | "user_id": user_id, | 172 | "user_id": user_id, |
155 | 170 | "project_id": "", | 173 | "project_id": "", |
157 | 171 | "image_ref": "10", | 174 | "image_ref": image_ref, |
158 | 172 | "kernel_id": "", | 175 | "kernel_id": "", |
159 | 173 | "ramdisk_id": "", | 176 | "ramdisk_id": "", |
160 | 174 | "launch_index": 0, | 177 | "launch_index": 0, |
161 | @@ -224,6 +227,7 @@ | |||
162 | 224 | class ServersTest(test.TestCase): | 227 | class ServersTest(test.TestCase): |
163 | 225 | 228 | ||
164 | 226 | def setUp(self): | 229 | def setUp(self): |
165 | 230 | self.maxDiff = None | ||
166 | 227 | super(ServersTest, self).setUp() | 231 | super(ServersTest, self).setUp() |
167 | 228 | self.stubs = stubout.StubOutForTesting() | 232 | self.stubs = stubout.StubOutForTesting() |
168 | 229 | fakes.FakeAuthManager.reset_fake_data() | 233 | fakes.FakeAuthManager.reset_fake_data() |
169 | @@ -300,24 +304,274 @@ | |||
170 | 300 | self.assertEqual(res_dict['server']['name'], 'server1') | 304 | self.assertEqual(res_dict['server']['name'], 'server1') |
171 | 301 | 305 | ||
172 | 302 | def test_get_server_by_id_v1_1(self): | 306 | def test_get_server_by_id_v1_1(self): |
191 | 303 | req = webob.Request.blank('/v1.1/servers/1') | 307 | image_bookmark = "http://localhost/images/10" |
192 | 304 | res = req.get_response(fakes.wsgi_app()) | 308 | flavor_ref = "http://localhost/v1.1/flavors/1" |
193 | 305 | res_dict = json.loads(res.body) | 309 | flavor_id = "1" |
194 | 306 | self.assertEqual(res_dict['server']['id'], 1) | 310 | flavor_bookmark = "http://localhost/flavors/1" |
195 | 307 | self.assertEqual(res_dict['server']['name'], 'server1') | 311 | |
196 | 308 | 312 | public_ip = '192.168.0.3' | |
197 | 309 | expected_links = [ | 313 | private_ip = '172.19.0.1' |
198 | 310 | { | 314 | interfaces = [ |
199 | 311 | "rel": "self", | 315 | { |
200 | 312 | "href": "http://localhost/v1.1/servers/1", | 316 | 'network': {'label': 'public'}, |
201 | 313 | }, | 317 | 'fixed_ips': [ |
202 | 314 | { | 318 | {'address': public_ip}, |
203 | 315 | "rel": "bookmark", | 319 | ], |
204 | 316 | "href": "http://localhost/servers/1", | 320 | }, |
205 | 317 | }, | 321 | { |
206 | 318 | ] | 322 | 'network': {'label': 'private'}, |
207 | 319 | 323 | 'fixed_ips': [ | |
208 | 320 | self.assertEqual(res_dict['server']['links'], expected_links) | 324 | {'address': private_ip}, |
209 | 325 | ], | ||
210 | 326 | }, | ||
211 | 327 | ] | ||
212 | 328 | new_return_server = return_server_with_attributes( | ||
213 | 329 | interfaces=interfaces) | ||
214 | 330 | self.stubs.Set(nova.db.api, 'instance_get', new_return_server) | ||
215 | 331 | |||
216 | 332 | req = webob.Request.blank('/v1.1/servers/1') | ||
217 | 333 | res = req.get_response(fakes.wsgi_app()) | ||
218 | 334 | res_dict = json.loads(res.body) | ||
219 | 335 | expected_server = { | ||
220 | 336 | "server": { | ||
221 | 337 | "id": 1, | ||
222 | 338 | "uuid": FAKE_UUID, | ||
223 | 339 | "updated": "2010-11-11T11:00:00Z", | ||
224 | 340 | "created": "2010-10-10T12:00:00Z", | ||
225 | 341 | "progress": 0, | ||
226 | 342 | "name": "server1", | ||
227 | 343 | "status": "BUILD", | ||
228 | 344 | "hostId": '', | ||
229 | 345 | "image": { | ||
230 | 346 | "id": "10", | ||
231 | 347 | "links": [ | ||
232 | 348 | { | ||
233 | 349 | "rel": "bookmark", | ||
234 | 350 | "href": image_bookmark, | ||
235 | 351 | }, | ||
236 | 352 | ], | ||
237 | 353 | }, | ||
238 | 354 | "flavor": { | ||
239 | 355 | "id": "1", | ||
240 | 356 | "links": [ | ||
241 | 357 | { | ||
242 | 358 | "rel": "bookmark", | ||
243 | 359 | "href": flavor_bookmark, | ||
244 | 360 | }, | ||
245 | 361 | ], | ||
246 | 362 | }, | ||
247 | 363 | "addresses": { | ||
248 | 364 | "public": [ | ||
249 | 365 | { | ||
250 | 366 | "version": 4, | ||
251 | 367 | "addr": public_ip, | ||
252 | 368 | }, | ||
253 | 369 | ], | ||
254 | 370 | "private": [ | ||
255 | 371 | { | ||
256 | 372 | "version": 4, | ||
257 | 373 | "addr": private_ip, | ||
258 | 374 | }, | ||
259 | 375 | ], | ||
260 | 376 | }, | ||
261 | 377 | "metadata": { | ||
262 | 378 | "seq": "1", | ||
263 | 379 | }, | ||
264 | 380 | "links": [ | ||
265 | 381 | { | ||
266 | 382 | "rel": "self", | ||
267 | 383 | #FIXME(wwolf) Do we want the links to be id or uuid? | ||
268 | 384 | "href": "http://localhost/v1.1/servers/1", | ||
269 | 385 | }, | ||
270 | 386 | { | ||
271 | 387 | "rel": "bookmark", | ||
272 | 388 | "href": "http://localhost/servers/1", | ||
273 | 389 | }, | ||
274 | 390 | ], | ||
275 | 391 | } | ||
276 | 392 | } | ||
277 | 393 | |||
278 | 394 | self.assertDictMatch(res_dict, expected_server) | ||
279 | 395 | |||
280 | 396 | def test_get_server_with_active_status_by_id_v1_1(self): | ||
281 | 397 | image_bookmark = "http://localhost/images/10" | ||
282 | 398 | flavor_ref = "http://localhost/v1.1/flavors/1" | ||
283 | 399 | flavor_id = "1" | ||
284 | 400 | flavor_bookmark = "http://localhost/flavors/1" | ||
285 | 401 | private_ip = "192.168.0.3" | ||
286 | 402 | public_ip = "1.2.3.4" | ||
287 | 403 | |||
288 | 404 | interfaces = [ | ||
289 | 405 | { | ||
290 | 406 | 'network': {'label': 'public'}, | ||
291 | 407 | 'fixed_ips': [ | ||
292 | 408 | {'address': public_ip}, | ||
293 | 409 | ], | ||
294 | 410 | }, | ||
295 | 411 | { | ||
296 | 412 | 'network': {'label': 'private'}, | ||
297 | 413 | 'fixed_ips': [ | ||
298 | 414 | {'address': private_ip}, | ||
299 | 415 | ], | ||
300 | 416 | }, | ||
301 | 417 | ] | ||
302 | 418 | new_return_server = return_server_with_attributes( | ||
303 | 419 | interfaces=interfaces, power_state=1) | ||
304 | 420 | self.stubs.Set(nova.db.api, 'instance_get', new_return_server) | ||
305 | 421 | |||
306 | 422 | req = webob.Request.blank('/v1.1/servers/1') | ||
307 | 423 | res = req.get_response(fakes.wsgi_app()) | ||
308 | 424 | res_dict = json.loads(res.body) | ||
309 | 425 | expected_server = { | ||
310 | 426 | "server": { | ||
311 | 427 | "id": 1, | ||
312 | 428 | "uuid": FAKE_UUID, | ||
313 | 429 | "updated": "2010-11-11T11:00:00Z", | ||
314 | 430 | "created": "2010-10-10T12:00:00Z", | ||
315 | 431 | "progress": 100, | ||
316 | 432 | "name": "server1", | ||
317 | 433 | "status": "ACTIVE", | ||
318 | 434 | "hostId": '', | ||
319 | 435 | "image": { | ||
320 | 436 | "id": "10", | ||
321 | 437 | "links": [ | ||
322 | 438 | { | ||
323 | 439 | "rel": "bookmark", | ||
324 | 440 | "href": image_bookmark, | ||
325 | 441 | }, | ||
326 | 442 | ], | ||
327 | 443 | }, | ||
328 | 444 | "flavor": { | ||
329 | 445 | "id": "1", | ||
330 | 446 | "links": [ | ||
331 | 447 | { | ||
332 | 448 | "rel": "bookmark", | ||
333 | 449 | "href": flavor_bookmark, | ||
334 | 450 | }, | ||
335 | 451 | ], | ||
336 | 452 | }, | ||
337 | 453 | "addresses": { | ||
338 | 454 | "public": [ | ||
339 | 455 | { | ||
340 | 456 | "version": 4, | ||
341 | 457 | "addr": public_ip, | ||
342 | 458 | }, | ||
343 | 459 | ], | ||
344 | 460 | "private": [ | ||
345 | 461 | { | ||
346 | 462 | "version": 4, | ||
347 | 463 | "addr": private_ip, | ||
348 | 464 | }, | ||
349 | 465 | ], | ||
350 | 466 | }, | ||
351 | 467 | "metadata": { | ||
352 | 468 | "seq": "1", | ||
353 | 469 | }, | ||
354 | 470 | "links": [ | ||
355 | 471 | { | ||
356 | 472 | "rel": "self", | ||
357 | 473 | "href": "http://localhost/v1.1/servers/1", | ||
358 | 474 | }, | ||
359 | 475 | { | ||
360 | 476 | "rel": "bookmark", | ||
361 | 477 | "href": "http://localhost/servers/1", | ||
362 | 478 | }, | ||
363 | 479 | ], | ||
364 | 480 | } | ||
365 | 481 | } | ||
366 | 482 | |||
367 | 483 | self.assertDictMatch(res_dict, expected_server) | ||
368 | 484 | |||
369 | 485 | def test_get_server_with_id_image_ref_by_id_v1_1(self): | ||
370 | 486 | image_ref = "10" | ||
371 | 487 | image_bookmark = "http://localhost/images/10" | ||
372 | 488 | flavor_ref = "http://localhost/v1.1/flavors/1" | ||
373 | 489 | flavor_id = "1" | ||
374 | 490 | flavor_bookmark = "http://localhost/flavors/1" | ||
375 | 491 | private_ip = "192.168.0.3" | ||
376 | 492 | public_ip = "1.2.3.4" | ||
377 | 493 | |||
378 | 494 | interfaces = [ | ||
379 | 495 | { | ||
380 | 496 | 'network': {'label': 'public'}, | ||
381 | 497 | 'fixed_ips': [ | ||
382 | 498 | {'address': public_ip}, | ||
383 | 499 | ], | ||
384 | 500 | }, | ||
385 | 501 | { | ||
386 | 502 | 'network': {'label': 'private'}, | ||
387 | 503 | 'fixed_ips': [ | ||
388 | 504 | {'address': private_ip}, | ||
389 | 505 | ], | ||
390 | 506 | }, | ||
391 | 507 | ] | ||
392 | 508 | new_return_server = return_server_with_attributes( | ||
393 | 509 | interfaces=interfaces, power_state=1, image_ref=image_ref, | ||
394 | 510 | flavor_id=flavor_id) | ||
395 | 511 | self.stubs.Set(nova.db.api, 'instance_get', new_return_server) | ||
396 | 512 | |||
397 | 513 | req = webob.Request.blank('/v1.1/servers/1') | ||
398 | 514 | res = req.get_response(fakes.wsgi_app()) | ||
399 | 515 | res_dict = json.loads(res.body) | ||
400 | 516 | expected_server = { | ||
401 | 517 | "server": { | ||
402 | 518 | "id": 1, | ||
403 | 519 | "uuid": FAKE_UUID, | ||
404 | 520 | "updated": "2010-11-11T11:00:00Z", | ||
405 | 521 | "created": "2010-10-10T12:00:00Z", | ||
406 | 522 | "progress": 100, | ||
407 | 523 | "name": "server1", | ||
408 | 524 | "status": "ACTIVE", | ||
409 | 525 | "hostId": '', | ||
410 | 526 | "image": { | ||
411 | 527 | "id": "10", | ||
412 | 528 | "links": [ | ||
413 | 529 | { | ||
414 | 530 | "rel": "bookmark", | ||
415 | 531 | "href": image_bookmark, | ||
416 | 532 | }, | ||
417 | 533 | ], | ||
418 | 534 | }, | ||
419 | 535 | "flavor": { | ||
420 | 536 | "id": "1", | ||
421 | 537 | "links": [ | ||
422 | 538 | { | ||
423 | 539 | "rel": "bookmark", | ||
424 | 540 | "href": flavor_bookmark, | ||
425 | 541 | }, | ||
426 | 542 | ], | ||
427 | 543 | }, | ||
428 | 544 | "addresses": { | ||
429 | 545 | "public": [ | ||
430 | 546 | { | ||
431 | 547 | "version": 4, | ||
432 | 548 | "addr": public_ip, | ||
433 | 549 | }, | ||
434 | 550 | ], | ||
435 | 551 | "private": [ | ||
436 | 552 | { | ||
437 | 553 | "version": 4, | ||
438 | 554 | "addr": private_ip, | ||
439 | 555 | }, | ||
440 | 556 | ], | ||
441 | 557 | }, | ||
442 | 558 | "metadata": { | ||
443 | 559 | "seq": "1", | ||
444 | 560 | }, | ||
445 | 561 | "links": [ | ||
446 | 562 | { | ||
447 | 563 | "rel": "self", | ||
448 | 564 | "href": "http://localhost/v1.1/servers/1", | ||
449 | 565 | }, | ||
450 | 566 | { | ||
451 | 567 | "rel": "bookmark", | ||
452 | 568 | "href": "http://localhost/servers/1", | ||
453 | 569 | }, | ||
454 | 570 | ], | ||
455 | 571 | } | ||
456 | 572 | } | ||
457 | 573 | |||
458 | 574 | self.assertDictMatch(res_dict, expected_server) | ||
459 | 321 | 575 | ||
460 | 322 | def test_get_server_by_id_with_addresses_xml(self): | 576 | def test_get_server_by_id_with_addresses_xml(self): |
461 | 323 | private = "192.168.0.3" | 577 | private = "192.168.0.3" |
462 | @@ -452,7 +706,8 @@ | |||
463 | 452 | 'fixed_ipv6': '2001:4860::12', | 706 | 'fixed_ipv6': '2001:4860::12', |
464 | 453 | }, | 707 | }, |
465 | 454 | ] | 708 | ] |
467 | 455 | new_return_server = return_server_with_interfaces(interfaces) | 709 | new_return_server = return_server_with_attributes( |
468 | 710 | interfaces=interfaces) | ||
469 | 456 | self.stubs.Set(nova.db.api, 'instance_get', new_return_server) | 711 | self.stubs.Set(nova.db.api, 'instance_get', new_return_server) |
470 | 457 | 712 | ||
471 | 458 | req = webob.Request.blank('/v1.1/servers/1') | 713 | req = webob.Request.blank('/v1.1/servers/1') |
472 | @@ -495,7 +750,8 @@ | |||
473 | 495 | 'fixed_ipv6': '2001:4860::12', | 750 | 'fixed_ipv6': '2001:4860::12', |
474 | 496 | }, | 751 | }, |
475 | 497 | ] | 752 | ] |
477 | 498 | new_return_server = return_server_with_interfaces(interfaces) | 753 | new_return_server = return_server_with_attributes( |
478 | 754 | interfaces=interfaces) | ||
479 | 499 | self.stubs.Set(nova.db.api, 'instance_get', new_return_server) | 755 | self.stubs.Set(nova.db.api, 'instance_get', new_return_server) |
480 | 500 | 756 | ||
481 | 501 | req = webob.Request.blank('/v1.1/servers/1') | 757 | req = webob.Request.blank('/v1.1/servers/1') |
482 | @@ -703,20 +959,20 @@ | |||
483 | 703 | for i, s in enumerate(res_dict['servers']): | 959 | for i, s in enumerate(res_dict['servers']): |
484 | 704 | self.assertEqual(s['id'], i) | 960 | self.assertEqual(s['id'], i) |
485 | 705 | self.assertEqual(s['name'], 'server%d' % i) | 961 | self.assertEqual(s['name'], 'server%d' % i) |
487 | 706 | self.assertEqual(s.get('imageId', None), None) | 962 | self.assertEqual(s.get('image', None), None) |
488 | 707 | 963 | ||
489 | 708 | expected_links = [ | 964 | expected_links = [ |
499 | 709 | { | 965 | { |
500 | 710 | "rel": "self", | 966 | "rel": "self", |
501 | 711 | "href": "http://localhost/v1.1/servers/%d" % (i,), | 967 | "href": "http://localhost/v1.1/servers/%s" % s['id'], |
502 | 712 | }, | 968 | }, |
503 | 713 | { | 969 | { |
504 | 714 | "rel": "bookmark", | 970 | "rel": "bookmark", |
505 | 715 | "href": "http://localhost/servers/%d" % (i,), | 971 | "href": "http://localhost/servers/%s" % s['id'], |
506 | 716 | }, | 972 | }, |
507 | 717 | ] | 973 | ] |
508 | 718 | 974 | ||
510 | 719 | self.assertEqual(s['links'], expected_links) | 975 | self.assertEqual(s['links'], expected_links) |
511 | 720 | 976 | ||
512 | 721 | def test_get_servers_with_limit(self): | 977 | def test_get_servers_with_limit(self): |
513 | 722 | req = webob.Request.blank('/v1.0/servers?limit=3') | 978 | req = webob.Request.blank('/v1.0/servers?limit=3') |
514 | @@ -762,13 +1018,13 @@ | |||
515 | 762 | req = webob.Request.blank('/v1.1/servers?marker=2') | 1018 | req = webob.Request.blank('/v1.1/servers?marker=2') |
516 | 763 | res = req.get_response(fakes.wsgi_app()) | 1019 | res = req.get_response(fakes.wsgi_app()) |
517 | 764 | servers = json.loads(res.body)['servers'] | 1020 | servers = json.loads(res.body)['servers'] |
519 | 765 | self.assertEqual([s['id'] for s in servers], [3, 4]) | 1021 | self.assertEqual([s['name'] for s in servers], ["server3", "server4"]) |
520 | 766 | 1022 | ||
521 | 767 | def test_get_servers_with_limit_and_marker(self): | 1023 | def test_get_servers_with_limit_and_marker(self): |
522 | 768 | req = webob.Request.blank('/v1.1/servers?limit=2&marker=1') | 1024 | req = webob.Request.blank('/v1.1/servers?limit=2&marker=1') |
523 | 769 | res = req.get_response(fakes.wsgi_app()) | 1025 | res = req.get_response(fakes.wsgi_app()) |
524 | 770 | servers = json.loads(res.body)['servers'] | 1026 | servers = json.loads(res.body)['servers'] |
526 | 771 | self.assertEqual([s['id'] for s in servers], [2, 3]) | 1027 | self.assertEqual([s['name'] for s in servers], ['server2', 'server3']) |
527 | 772 | 1028 | ||
528 | 773 | def test_get_servers_with_bad_marker(self): | 1029 | def test_get_servers_with_bad_marker(self): |
529 | 774 | req = webob.Request.blank('/v1.1/servers?limit=2&marker=asdf') | 1030 | req = webob.Request.blank('/v1.1/servers?limit=2&marker=asdf') |
530 | @@ -779,8 +1035,16 @@ | |||
531 | 779 | def _setup_for_create_instance(self): | 1035 | def _setup_for_create_instance(self): |
532 | 780 | """Shared implementation for tests below that create instance""" | 1036 | """Shared implementation for tests below that create instance""" |
533 | 781 | def instance_create(context, inst): | 1037 | def instance_create(context, inst): |
536 | 782 | return {'id': 1, 'display_name': 'server_test', | 1038 | inst_type = instance_types.get_instance_type_by_flavor_id(3) |
537 | 783 | 'uuid': FAKE_UUID} | 1039 | image_ref = 'http://localhost/images/2' |
538 | 1040 | return {'id': 1, | ||
539 | 1041 | 'display_name': 'server_test', | ||
540 | 1042 | 'uuid': FAKE_UUID, | ||
541 | 1043 | 'instance_type': dict(inst_type), | ||
542 | 1044 | 'image_ref': image_ref, | ||
543 | 1045 | 'created_at': '2010-10-10T12:00:00Z', | ||
544 | 1046 | 'updated_at': '2010-11-11T11:00:00Z', | ||
545 | 1047 | } | ||
546 | 784 | 1048 | ||
547 | 785 | def server_update(context, id, params): | 1049 | def server_update(context, id, params): |
548 | 786 | return instance_create(context, id) | 1050 | return instance_create(context, id) |
549 | @@ -980,8 +1244,26 @@ | |||
550 | 980 | def test_create_instance_v1_1(self): | 1244 | def test_create_instance_v1_1(self): |
551 | 981 | self._setup_for_create_instance() | 1245 | self._setup_for_create_instance() |
552 | 982 | 1246 | ||
555 | 983 | image_href = 'http://localhost/v1.1/images/2' | 1247 | image_href = 'http://localhost/images/2' |
556 | 984 | flavor_ref = 'http://localhost/v1.1/flavors/3' | 1248 | flavor_ref = 'http://localhost/flavors/3' |
557 | 1249 | expected_flavor = { | ||
558 | 1250 | "id": "3", | ||
559 | 1251 | "links": [ | ||
560 | 1252 | { | ||
561 | 1253 | "rel": "bookmark", | ||
562 | 1254 | "href": 'http://localhost/flavors/3', | ||
563 | 1255 | }, | ||
564 | 1256 | ], | ||
565 | 1257 | } | ||
566 | 1258 | expected_image = { | ||
567 | 1259 | "id": "2", | ||
568 | 1260 | "links": [ | ||
569 | 1261 | { | ||
570 | 1262 | "rel": "bookmark", | ||
571 | 1263 | "href": 'http://localhost/images/2', | ||
572 | 1264 | }, | ||
573 | 1265 | ], | ||
574 | 1266 | } | ||
575 | 985 | body = { | 1267 | body = { |
576 | 986 | 'server': { | 1268 | 'server': { |
577 | 987 | 'name': 'server_test', | 1269 | 'name': 'server_test', |
578 | @@ -1006,9 +1288,10 @@ | |||
579 | 1006 | server = json.loads(res.body)['server'] | 1288 | server = json.loads(res.body)['server'] |
580 | 1007 | self.assertEqual(16, len(server['adminPass'])) | 1289 | self.assertEqual(16, len(server['adminPass'])) |
581 | 1008 | self.assertEqual('server_test', server['name']) | 1290 | self.assertEqual('server_test', server['name']) |
585 | 1009 | self.assertEqual(1, server['id']) | 1291 | self.assertEqual(expected_flavor, server['flavor']) |
586 | 1010 | self.assertEqual(flavor_ref, server['flavorRef']) | 1292 | self.assertEqual(expected_image, server['image']) |
587 | 1011 | self.assertEqual(image_href, server['imageRef']) | 1293 | self.assertEqual(res.status_int, 200) |
588 | 1294 | #self.assertEqual(1, server['id']) | ||
589 | 1012 | 1295 | ||
590 | 1013 | def test_create_instance_v1_1_invalid_flavor_href(self): | 1296 | def test_create_instance_v1_1_invalid_flavor_href(self): |
591 | 1014 | self._setup_for_create_instance() | 1297 | self._setup_for_create_instance() |
592 | @@ -1061,8 +1344,26 @@ | |||
593 | 1061 | def test_create_instance_v1_1_local_href(self): | 1344 | def test_create_instance_v1_1_local_href(self): |
594 | 1062 | self._setup_for_create_instance() | 1345 | self._setup_for_create_instance() |
595 | 1063 | 1346 | ||
598 | 1064 | image_id = 2 | 1347 | image_id = "2" |
599 | 1065 | flavor_ref = 'http://localhost/v1.1/flavors/3' | 1348 | flavor_ref = 'http://localhost/flavors/3' |
600 | 1349 | expected_flavor = { | ||
601 | 1350 | "id": "3", | ||
602 | 1351 | "links": [ | ||
603 | 1352 | { | ||
604 | 1353 | "rel": "bookmark", | ||
605 | 1354 | "href": 'http://localhost/flavors/3', | ||
606 | 1355 | }, | ||
607 | 1356 | ], | ||
608 | 1357 | } | ||
609 | 1358 | expected_image = { | ||
610 | 1359 | "id": "2", | ||
611 | 1360 | "links": [ | ||
612 | 1361 | { | ||
613 | 1362 | "rel": "bookmark", | ||
614 | 1363 | "href": 'http://localhost/images/2', | ||
615 | 1364 | }, | ||
616 | 1365 | ], | ||
617 | 1366 | } | ||
618 | 1066 | body = { | 1367 | body = { |
619 | 1067 | 'server': { | 1368 | 'server': { |
620 | 1068 | 'name': 'server_test', | 1369 | 'name': 'server_test', |
621 | @@ -1079,9 +1380,8 @@ | |||
622 | 1079 | res = req.get_response(fakes.wsgi_app()) | 1380 | res = req.get_response(fakes.wsgi_app()) |
623 | 1080 | 1381 | ||
624 | 1081 | server = json.loads(res.body)['server'] | 1382 | server = json.loads(res.body)['server'] |
628 | 1082 | self.assertEqual(1, server['id']) | 1383 | self.assertEqual(expected_flavor, server['flavor']) |
629 | 1083 | self.assertEqual(flavor_ref, server['flavorRef']) | 1384 | self.assertEqual(expected_image, server['image']) |
627 | 1084 | self.assertEqual(image_id, server['imageRef']) | ||
630 | 1085 | self.assertEqual(res.status_int, 200) | 1385 | self.assertEqual(res.status_int, 200) |
631 | 1086 | 1386 | ||
632 | 1087 | def test_create_instance_with_admin_pass_v1_0(self): | 1387 | def test_create_instance_with_admin_pass_v1_0(self): |
633 | @@ -1306,6 +1606,24 @@ | |||
634 | 1306 | self.assertEqual(s['metadata']['seq'], str(i)) | 1606 | self.assertEqual(s['metadata']['seq'], str(i)) |
635 | 1307 | 1607 | ||
636 | 1308 | def test_get_all_server_details_v1_1(self): | 1608 | def test_get_all_server_details_v1_1(self): |
637 | 1609 | expected_flavor = { | ||
638 | 1610 | "id": "1", | ||
639 | 1611 | "links": [ | ||
640 | 1612 | { | ||
641 | 1613 | "rel": "bookmark", | ||
642 | 1614 | "href": 'http://localhost/flavors/1', | ||
643 | 1615 | }, | ||
644 | 1616 | ], | ||
645 | 1617 | } | ||
646 | 1618 | expected_image = { | ||
647 | 1619 | "id": "10", | ||
648 | 1620 | "links": [ | ||
649 | 1621 | { | ||
650 | 1622 | "rel": "bookmark", | ||
651 | 1623 | "href": 'http://localhost/images/10', | ||
652 | 1624 | }, | ||
653 | 1625 | ], | ||
654 | 1626 | } | ||
655 | 1309 | req = webob.Request.blank('/v1.1/servers/detail') | 1627 | req = webob.Request.blank('/v1.1/servers/detail') |
656 | 1310 | res = req.get_response(fakes.wsgi_app()) | 1628 | res = req.get_response(fakes.wsgi_app()) |
657 | 1311 | res_dict = json.loads(res.body) | 1629 | res_dict = json.loads(res.body) |
658 | @@ -1314,8 +1632,8 @@ | |||
659 | 1314 | self.assertEqual(s['id'], i) | 1632 | self.assertEqual(s['id'], i) |
660 | 1315 | self.assertEqual(s['hostId'], '') | 1633 | self.assertEqual(s['hostId'], '') |
661 | 1316 | self.assertEqual(s['name'], 'server%d' % i) | 1634 | self.assertEqual(s['name'], 'server%d' % i) |
664 | 1317 | self.assertEqual(s['imageRef'], 10) | 1635 | self.assertEqual(s['image'], expected_image) |
665 | 1318 | self.assertEqual(s['flavorRef'], 'http://localhost/v1.1/flavors/1') | 1636 | self.assertEqual(s['flavor'], expected_flavor) |
666 | 1319 | self.assertEqual(s['status'], 'BUILD') | 1637 | self.assertEqual(s['status'], 'BUILD') |
667 | 1320 | self.assertEqual(s['metadata']['seq'], str(i)) | 1638 | self.assertEqual(s['metadata']['seq'], str(i)) |
668 | 1321 | 1639 | ||
669 | @@ -2559,3 +2877,249 @@ | |||
670 | 2559 | kernel_id, ramdisk_id = create_instance_helper.CreateInstanceHelper. \ | 2877 | kernel_id, ramdisk_id = create_instance_helper.CreateInstanceHelper. \ |
671 | 2560 | _do_get_kernel_ramdisk_from_image(image_meta) | 2878 | _do_get_kernel_ramdisk_from_image(image_meta) |
672 | 2561 | return kernel_id, ramdisk_id | 2879 | return kernel_id, ramdisk_id |
673 | 2880 | |||
674 | 2881 | |||
675 | 2882 | class ServersViewBuilderV11Test(test.TestCase): | ||
676 | 2883 | |||
677 | 2884 | def setUp(self): | ||
678 | 2885 | self.instance = self._get_instance() | ||
679 | 2886 | self.view_builder = self._get_view_builder() | ||
680 | 2887 | |||
681 | 2888 | def tearDown(self): | ||
682 | 2889 | pass | ||
683 | 2890 | |||
684 | 2891 | def _get_instance(self): | ||
685 | 2892 | instance = { | ||
686 | 2893 | "id": 1, | ||
687 | 2894 | "created_at": "2010-10-10T12:00:00Z", | ||
688 | 2895 | "updated_at": "2010-11-11T11:00:00Z", | ||
689 | 2896 | "admin_pass": "", | ||
690 | 2897 | "user_id": "", | ||
691 | 2898 | "project_id": "", | ||
692 | 2899 | "image_ref": "5", | ||
693 | 2900 | "kernel_id": "", | ||
694 | 2901 | "ramdisk_id": "", | ||
695 | 2902 | "launch_index": 0, | ||
696 | 2903 | "key_name": "", | ||
697 | 2904 | "key_data": "", | ||
698 | 2905 | "state": 0, | ||
699 | 2906 | "state_description": "", | ||
700 | 2907 | "memory_mb": 0, | ||
701 | 2908 | "vcpus": 0, | ||
702 | 2909 | "local_gb": 0, | ||
703 | 2910 | "hostname": "", | ||
704 | 2911 | "host": "", | ||
705 | 2912 | "instance_type": { | ||
706 | 2913 | "flavorid": 1, | ||
707 | 2914 | }, | ||
708 | 2915 | "user_data": "", | ||
709 | 2916 | "reservation_id": "", | ||
710 | 2917 | "mac_address": "", | ||
711 | 2918 | "scheduled_at": utils.utcnow(), | ||
712 | 2919 | "launched_at": utils.utcnow(), | ||
713 | 2920 | "terminated_at": utils.utcnow(), | ||
714 | 2921 | "availability_zone": "", | ||
715 | 2922 | "display_name": "test_server", | ||
716 | 2923 | "display_description": "", | ||
717 | 2924 | "locked": False, | ||
718 | 2925 | "metadata": [], | ||
719 | 2926 | #"address": , | ||
720 | 2927 | #"floating_ips": [{"address":ip} for ip in public_addresses]} | ||
721 | 2928 | "uuid": "deadbeef-feed-edee-beef-d0ea7beefedd"} | ||
722 | 2929 | |||
723 | 2930 | return instance | ||
724 | 2931 | |||
725 | 2932 | def _get_view_builder(self): | ||
726 | 2933 | base_url = "http://localhost/v1.1" | ||
727 | 2934 | views = nova.api.openstack.views | ||
728 | 2935 | address_builder = views.addresses.ViewBuilderV11() | ||
729 | 2936 | flavor_builder = views.flavors.ViewBuilderV11(base_url) | ||
730 | 2937 | image_builder = views.images.ViewBuilderV11(base_url) | ||
731 | 2938 | |||
732 | 2939 | view_builder = nova.api.openstack.views.servers.ViewBuilderV11( | ||
733 | 2940 | address_builder, | ||
734 | 2941 | flavor_builder, | ||
735 | 2942 | image_builder, | ||
736 | 2943 | base_url | ||
737 | 2944 | ) | ||
738 | 2945 | return view_builder | ||
739 | 2946 | |||
740 | 2947 | def test_build_server(self): | ||
741 | 2948 | expected_server = { | ||
742 | 2949 | "server": { | ||
743 | 2950 | "id": 1, | ||
744 | 2951 | "uuid": self.instance['uuid'], | ||
745 | 2952 | "name": "test_server", | ||
746 | 2953 | "links": [ | ||
747 | 2954 | { | ||
748 | 2955 | "rel": "self", | ||
749 | 2956 | "href": "http://localhost/v1.1/servers/1", | ||
750 | 2957 | }, | ||
751 | 2958 | { | ||
752 | 2959 | "rel": "bookmark", | ||
753 | 2960 | "href": "http://localhost/servers/1", | ||
754 | 2961 | }, | ||
755 | 2962 | ], | ||
756 | 2963 | } | ||
757 | 2964 | } | ||
758 | 2965 | |||
759 | 2966 | output = self.view_builder.build(self.instance, False) | ||
760 | 2967 | self.assertDictMatch(output, expected_server) | ||
761 | 2968 | |||
762 | 2969 | def test_build_server_detail(self): | ||
763 | 2970 | image_bookmark = "http://localhost/images/5" | ||
764 | 2971 | flavor_bookmark = "http://localhost/flavors/1" | ||
765 | 2972 | expected_server = { | ||
766 | 2973 | "server": { | ||
767 | 2974 | "id": 1, | ||
768 | 2975 | "uuid": self.instance['uuid'], | ||
769 | 2976 | "updated": "2010-11-11T11:00:00Z", | ||
770 | 2977 | "created": "2010-10-10T12:00:00Z", | ||
771 | 2978 | "progress": 0, | ||
772 | 2979 | "name": "test_server", | ||
773 | 2980 | "status": "BUILD", | ||
774 | 2981 | "hostId": '', | ||
775 | 2982 | "image": { | ||
776 | 2983 | "id": "5", | ||
777 | 2984 | "links": [ | ||
778 | 2985 | { | ||
779 | 2986 | "rel": "bookmark", | ||
780 | 2987 | "href": image_bookmark, | ||
781 | 2988 | }, | ||
782 | 2989 | ], | ||
783 | 2990 | }, | ||
784 | 2991 | "flavor": { | ||
785 | 2992 | "id": "1", | ||
786 | 2993 | "links": [ | ||
787 | 2994 | { | ||
788 | 2995 | "rel": "bookmark", | ||
789 | 2996 | "href": flavor_bookmark, | ||
790 | 2997 | }, | ||
791 | 2998 | ], | ||
792 | 2999 | }, | ||
793 | 3000 | "addresses": {}, | ||
794 | 3001 | "metadata": {}, | ||
795 | 3002 | "links": [ | ||
796 | 3003 | { | ||
797 | 3004 | "rel": "self", | ||
798 | 3005 | "href": "http://localhost/v1.1/servers/1", | ||
799 | 3006 | }, | ||
800 | 3007 | { | ||
801 | 3008 | "rel": "bookmark", | ||
802 | 3009 | "href": "http://localhost/servers/1", | ||
803 | 3010 | }, | ||
804 | 3011 | ], | ||
805 | 3012 | } | ||
806 | 3013 | } | ||
807 | 3014 | |||
808 | 3015 | output = self.view_builder.build(self.instance, True) | ||
809 | 3016 | self.assertDictMatch(output, expected_server) | ||
810 | 3017 | |||
811 | 3018 | def test_build_server_detail_active_status(self): | ||
812 | 3019 | #set the power state of the instance to running | ||
813 | 3020 | self.instance['state'] = 1 | ||
814 | 3021 | image_bookmark = "http://localhost/images/5" | ||
815 | 3022 | flavor_bookmark = "http://localhost/flavors/1" | ||
816 | 3023 | expected_server = { | ||
817 | 3024 | "server": { | ||
818 | 3025 | "id": 1, | ||
819 | 3026 | "uuid": self.instance['uuid'], | ||
820 | 3027 | "updated": "2010-11-11T11:00:00Z", | ||
821 | 3028 | "created": "2010-10-10T12:00:00Z", | ||
822 | 3029 | "progress": 100, | ||
823 | 3030 | "name": "test_server", | ||
824 | 3031 | "status": "ACTIVE", | ||
825 | 3032 | "hostId": '', | ||
826 | 3033 | "image": { | ||
827 | 3034 | "id": "5", | ||
828 | 3035 | "links": [ | ||
829 | 3036 | { | ||
830 | 3037 | "rel": "bookmark", | ||
831 | 3038 | "href": image_bookmark, | ||
832 | 3039 | }, | ||
833 | 3040 | ], | ||
834 | 3041 | }, | ||
835 | 3042 | "flavor": { | ||
836 | 3043 | "id": "1", | ||
837 | 3044 | "links": [ | ||
838 | 3045 | { | ||
839 | 3046 | "rel": "bookmark", | ||
840 | 3047 | "href": flavor_bookmark, | ||
841 | 3048 | }, | ||
842 | 3049 | ], | ||
843 | 3050 | }, | ||
844 | 3051 | "addresses": {}, | ||
845 | 3052 | "metadata": {}, | ||
846 | 3053 | "links": [ | ||
847 | 3054 | { | ||
848 | 3055 | "rel": "self", | ||
849 | 3056 | "href": "http://localhost/v1.1/servers/1", | ||
850 | 3057 | }, | ||
851 | 3058 | { | ||
852 | 3059 | "rel": "bookmark", | ||
853 | 3060 | "href": "http://localhost/servers/1", | ||
854 | 3061 | }, | ||
855 | 3062 | ], | ||
856 | 3063 | } | ||
857 | 3064 | } | ||
858 | 3065 | |||
859 | 3066 | output = self.view_builder.build(self.instance, True) | ||
860 | 3067 | self.assertDictMatch(output, expected_server) | ||
861 | 3068 | |||
862 | 3069 | def test_build_server_detail_with_metadata(self): | ||
863 | 3070 | |||
864 | 3071 | metadata = [] | ||
865 | 3072 | metadata.append(InstanceMetadata(key="Open", value="Stack")) | ||
866 | 3073 | metadata.append(InstanceMetadata(key="Number", value=1)) | ||
867 | 3074 | self.instance['metadata'] = metadata | ||
868 | 3075 | |||
869 | 3076 | image_bookmark = "http://localhost/images/5" | ||
870 | 3077 | flavor_bookmark = "http://localhost/flavors/1" | ||
871 | 3078 | expected_server = { | ||
872 | 3079 | "server": { | ||
873 | 3080 | "id": 1, | ||
874 | 3081 | "uuid": self.instance['uuid'], | ||
875 | 3082 | "updated": "2010-11-11T11:00:00Z", | ||
876 | 3083 | "created": "2010-10-10T12:00:00Z", | ||
877 | 3084 | "progress": 0, | ||
878 | 3085 | "name": "test_server", | ||
879 | 3086 | "status": "BUILD", | ||
880 | 3087 | "hostId": '', | ||
881 | 3088 | "image": { | ||
882 | 3089 | "id": "5", | ||
883 | 3090 | "links": [ | ||
884 | 3091 | { | ||
885 | 3092 | "rel": "bookmark", | ||
886 | 3093 | "href": image_bookmark, | ||
887 | 3094 | }, | ||
888 | 3095 | ], | ||
889 | 3096 | }, | ||
890 | 3097 | "flavor": { | ||
891 | 3098 | "id": "1", | ||
892 | 3099 | "links": [ | ||
893 | 3100 | { | ||
894 | 3101 | "rel": "bookmark", | ||
895 | 3102 | "href": flavor_bookmark, | ||
896 | 3103 | }, | ||
897 | 3104 | ], | ||
898 | 3105 | }, | ||
899 | 3106 | "addresses": {}, | ||
900 | 3107 | "metadata": { | ||
901 | 3108 | "Open": "Stack", | ||
902 | 3109 | "Number": "1", | ||
903 | 3110 | }, | ||
904 | 3111 | "links": [ | ||
905 | 3112 | { | ||
906 | 3113 | "rel": "self", | ||
907 | 3114 | "href": "http://localhost/v1.1/servers/1", | ||
908 | 3115 | }, | ||
909 | 3116 | { | ||
910 | 3117 | "rel": "bookmark", | ||
911 | 3118 | "href": "http://localhost/servers/1", | ||
912 | 3119 | }, | ||
913 | 3120 | ], | ||
914 | 3121 | } | ||
915 | 3122 | } | ||
916 | 3123 | |||
917 | 3124 | output = self.view_builder.build(self.instance, True) | ||
918 | 3125 | self.assertDictMatch(output, expected_server) |
Looks good, guys. I love the view builder tests. Looking forward to the xml serialization in the next branch.