1217
1293
self.assertEqual(len(servers), 1)
1218
1294
self.assertEqual(servers[0]['id'], 100)
1296
def test_get_servers_allows_changes_since_v1_1(self):
1297
def fake_get_all(compute_self, context, search_opts=None):
1298
self.assertNotEqual(search_opts, None)
1299
self.assertTrue('changes-since' in search_opts)
1300
changes_since = datetime.datetime(2011, 1, 24, 17, 8, 1)
1301
self.assertEqual(search_opts['changes-since'], changes_since)
1302
self.assertTrue('deleted' not in search_opts)
1303
return [stub_instance(100)]
1305
self.stubs.Set(nova.compute.API, 'get_all', fake_get_all)
1307
params = 'changes-since=2011-01-24T17:08:01Z'
1308
req = webob.Request.blank('/v1.1/fake/servers?%s' % params)
1309
res = req.get_response(fakes.wsgi_app())
1310
self.assertEqual(res.status_int, 200)
1311
servers = json.loads(res.body)['servers']
1312
self.assertEqual(len(servers), 1)
1313
self.assertEqual(servers[0]['id'], 100)
1315
def test_get_servers_allows_changes_since_bad_value_v1_1(self):
1316
params = 'changes-since=asdf'
1317
req = webob.Request.blank('/v1.1/fake/servers?%s' % params)
1318
res = req.get_response(fakes.wsgi_app())
1319
self.assertEqual(res.status_int, 400)
1220
1321
def test_get_servers_unknown_or_admin_options1(self):
1221
1322
"""Test getting servers by admin-only or unknown options.
1222
1323
This tests when admin_api is off. Make sure the admin and
1579
1684
res = req.get_response(fakes.wsgi_app())
1580
1685
self.assertEqual(res.status_int, 400)
1687
def test_create_instance_with_access_ip_v1_1(self):
1688
self._setup_for_create_instance()
1690
# proper local hrefs must start with 'http://localhost/v1.1/'
1691
image_href = 'http://localhost/v1.1/123/images/2'
1692
flavor_ref = 'http://localhost/123/flavors/3'
1693
access_ipv4 = '1.2.3.4'
1694
access_ipv6 = 'fead::1234'
1700
"href": 'http://localhost/123/flavors/3',
1709
"href": 'http://localhost/123/images/2',
1715
'name': 'server_test',
1716
'imageRef': image_href,
1717
'flavorRef': flavor_ref,
1718
'accessIPv4': access_ipv4,
1719
'accessIPv6': access_ipv6,
1726
"path": "/etc/banner.txt",
1733
req = webob.Request.blank('/v1.1/123/servers')
1735
req.body = json.dumps(body)
1736
req.headers["content-type"] = "application/json"
1738
res = req.get_response(fakes.wsgi_app())
1740
self.assertEqual(res.status_int, 202)
1741
server = json.loads(res.body)['server']
1742
self.assertEqual(16, len(server['adminPass']))
1743
self.assertEqual(1, server['id'])
1744
self.assertEqual(0, server['progress'])
1745
self.assertEqual('server_test', server['name'])
1746
self.assertEqual(expected_flavor, server['flavor'])
1747
self.assertEqual(expected_image, server['image'])
1748
self.assertEqual(access_ipv4, server['accessIPv4'])
1749
self.assertEqual(access_ipv6, server['accessIPv6'])
1582
1751
def test_create_instance_v1_1(self):
1583
1752
self._setup_for_create_instance()
1585
1754
# proper local hrefs must start with 'http://localhost/v1.1/'
1586
1755
image_href = 'http://localhost/v1.1/images/2'
1587
flavor_ref = 'http://localhost/flavors/3'
1756
flavor_ref = 'http://localhost/123/flavors/3'
1588
1757
expected_flavor = {
1592
1761
"rel": "bookmark",
1593
"href": 'http://localhost/flavors/3',
1762
"href": 'http://localhost/fake/flavors/3',
1632
1801
server = json.loads(res.body)['server']
1633
1802
self.assertEqual(16, len(server['adminPass']))
1634
1803
self.assertEqual(1, server['id'])
1804
self.assertEqual("BUILD", server["status"])
1635
1805
self.assertEqual(0, server['progress'])
1636
1806
self.assertEqual('server_test', server['name'])
1637
1807
self.assertEqual(expected_flavor, server['flavor'])
1638
1808
self.assertEqual(expected_image, server['image'])
1809
self.assertEqual('1.2.3.4', server['accessIPv4'])
1810
self.assertEqual('fead::1234', server['accessIPv6'])
1812
def test_create_instance_v1_1_invalid_key_name(self):
1813
self._setup_for_create_instance()
1815
image_href = 'http://localhost/v1.1/images/2'
1816
flavor_ref = 'http://localhost/flavors/3'
1817
body = dict(server=dict(
1818
name='server_test', imageRef=image_href, flavorRef=flavor_ref,
1819
key_name='nonexistentkey'))
1820
req = webob.Request.blank('/v1.1/fake/servers')
1822
req.body = json.dumps(body)
1823
req.headers["content-type"] = "application/json"
1824
res = req.get_response(fakes.wsgi_app())
1825
self.assertEqual(res.status_int, 400)
1827
def test_create_instance_v1_1_valid_key_name(self):
1828
self._setup_for_create_instance()
1830
image_href = 'http://localhost/v1.1/images/2'
1831
flavor_ref = 'http://localhost/flavors/3'
1832
body = dict(server=dict(
1833
name='server_test', imageRef=image_href, flavorRef=flavor_ref,
1835
req = webob.Request.blank('/v1.1/fake/servers')
1837
req.body = json.dumps(body)
1838
req.headers["content-type"] = "application/json"
1839
res = req.get_response(fakes.wsgi_app())
1840
self.assertEqual(res.status_int, 202)
1640
1842
def test_create_instance_v1_1_invalid_flavor_href(self):
1641
1843
self._setup_for_create_instance()
1678
1880
name='server_test', imageRef=image_href, flavorRef=flavor_ref,
1679
1881
metadata={'hello': 'world', 'open': 'stack'},
1680
1882
personality={}))
1681
req = webob.Request.blank('/v1.1/servers')
1683
req.body = json.dumps(body)
1684
req.headers["content-type"] = "application/json"
1685
res = req.get_response(fakes.wsgi_app())
1686
self.assertEqual(res.status_int, 400)
1883
req = webob.Request.blank('/v1.1/fake/servers')
1885
req.body = json.dumps(body)
1886
req.headers["content-type"] = "application/json"
1887
res = req.get_response(fakes.wsgi_app())
1888
self.assertEqual(res.status_int, 400)
1890
def test_create_instance_with_config_drive_v1_1(self):
1891
self.config_drive = True
1892
self._setup_for_create_instance()
1894
image_href = 'http://localhost/v1.1/123/images/2'
1895
flavor_ref = 'http://localhost/v1.1/123/flavors/3'
1898
'name': 'config_drive_test',
1899
'imageRef': image_href,
1900
'flavorRef': flavor_ref,
1906
'config_drive': True,
1910
req = webob.Request.blank('/v1.1/123/servers')
1912
req.body = json.dumps(body)
1913
req.headers["content-type"] = "application/json"
1915
res = req.get_response(fakes.wsgi_app())
1917
self.assertEqual(res.status_int, 202)
1918
server = json.loads(res.body)['server']
1919
self.assertEqual(1, server['id'])
1920
self.assertTrue(server['config_drive'])
1922
def test_create_instance_with_config_drive_as_id_v1_1(self):
1923
self.config_drive = 2
1924
self._setup_for_create_instance()
1926
image_href = 'http://localhost/v1.1/123/images/2'
1927
flavor_ref = 'http://localhost/v1.1/123/flavors/3'
1930
'name': 'config_drive_test',
1931
'imageRef': image_href,
1932
'flavorRef': flavor_ref,
1942
req = webob.Request.blank('/v1.1/123/servers')
1944
req.body = json.dumps(body)
1945
req.headers["content-type"] = "application/json"
1947
res = req.get_response(fakes.wsgi_app())
1949
self.assertEqual(res.status_int, 202)
1950
server = json.loads(res.body)['server']
1951
self.assertEqual(1, server['id'])
1952
self.assertTrue(server['config_drive'])
1953
self.assertEqual(2, server['config_drive'])
1955
def test_create_instance_with_bad_config_drive_v1_1(self):
1956
self.config_drive = "asdf"
1957
self._setup_for_create_instance()
1959
image_href = 'http://localhost/v1.1/123/images/2'
1960
flavor_ref = 'http://localhost/v1.1/123/flavors/3'
1963
'name': 'config_drive_test',
1964
'imageRef': image_href,
1965
'flavorRef': flavor_ref,
1971
'config_drive': 'asdf',
1975
req = webob.Request.blank('/v1.1/123/servers')
1977
req.body = json.dumps(body)
1978
req.headers["content-type"] = "application/json"
1980
res = req.get_response(fakes.wsgi_app())
1981
self.assertEqual(res.status_int, 400)
1983
def test_create_instance_without_config_drive_v1_1(self):
1984
self._setup_for_create_instance()
1986
image_href = 'http://localhost/v1.1/123/images/2'
1987
flavor_ref = 'http://localhost/v1.1/123/flavors/3'
1990
'name': 'config_drive_test',
1991
'imageRef': image_href,
1992
'flavorRef': flavor_ref,
1998
'config_drive': True,
2002
req = webob.Request.blank('/v1.1/123/servers')
2004
req.body = json.dumps(body)
2005
req.headers["content-type"] = "application/json"
2007
res = req.get_response(fakes.wsgi_app())
2008
self.assertEqual(res.status_int, 202)
2009
server = json.loads(res.body)['server']
2010
self.assertEqual(1, server['id'])
2011
self.assertFalse(server['config_drive'])
1688
2013
def test_create_instance_v1_1_bad_href(self):
1689
2014
self._setup_for_create_instance()
1874
2222
self.assertEqual(mock_method.password, 'bacon')
1876
2224
def test_update_server_no_body_v1_1(self):
1877
req = webob.Request.blank('/v1.0/servers/1')
2225
req = webob.Request.blank('/v1.1/fake/servers/1')
1878
2226
req.method = 'PUT'
1879
2227
res = req.get_response(fakes.wsgi_app())
1880
2228
self.assertEqual(res.status_int, 400)
2230
def test_update_server_all_attributes_v1_1(self):
2231
self.stubs.Set(nova.db.api, 'instance_get',
2232
return_server_with_attributes(name='server_test',
2233
access_ipv4='0.0.0.0',
2234
access_ipv6='beef::0123'))
2235
req = webob.Request.blank('/v1.1/123/servers/1')
2237
req.content_type = 'application/json'
2239
'name': 'server_test',
2240
'accessIPv4': '0.0.0.0',
2241
'accessIPv6': 'beef::0123',
2243
req.body = json.dumps(body)
2244
res = req.get_response(fakes.wsgi_app())
2245
self.assertEqual(res.status_int, 200)
2246
res_dict = json.loads(res.body)
2247
self.assertEqual(res_dict['server']['id'], 1)
2248
self.assertEqual(res_dict['server']['name'], 'server_test')
2249
self.assertEqual(res_dict['server']['accessIPv4'], '0.0.0.0')
2250
self.assertEqual(res_dict['server']['accessIPv6'], 'beef::0123')
1882
2252
def test_update_server_name_v1_1(self):
1883
2253
self.stubs.Set(nova.db.api, 'instance_get',
1884
2254
return_server_with_attributes(name='server_test'))
1885
req = webob.Request.blank('/v1.1/servers/1')
2255
req = webob.Request.blank('/v1.1/fake/servers/1')
1886
2256
req.method = 'PUT'
1887
2257
req.content_type = 'application/json'
1888
2258
req.body = json.dumps({'server': {'name': 'server_test'}})
1892
2262
self.assertEqual(res_dict['server']['id'], 1)
1893
2263
self.assertEqual(res_dict['server']['name'], 'server_test')
2265
def test_update_server_access_ipv4_v1_1(self):
2266
self.stubs.Set(nova.db.api, 'instance_get',
2267
return_server_with_attributes(access_ipv4='0.0.0.0'))
2268
req = webob.Request.blank('/v1.1/123/servers/1')
2270
req.content_type = 'application/json'
2271
req.body = json.dumps({'server': {'accessIPv4': '0.0.0.0'}})
2272
res = req.get_response(fakes.wsgi_app())
2273
self.assertEqual(res.status_int, 200)
2274
res_dict = json.loads(res.body)
2275
self.assertEqual(res_dict['server']['id'], 1)
2276
self.assertEqual(res_dict['server']['accessIPv4'], '0.0.0.0')
2278
def test_update_server_access_ipv6_v1_1(self):
2279
self.stubs.Set(nova.db.api, 'instance_get',
2280
return_server_with_attributes(access_ipv6='beef::0123'))
2281
req = webob.Request.blank('/v1.1/123/servers/1')
2283
req.content_type = 'application/json'
2284
req.body = json.dumps({'server': {'accessIPv6': 'beef::0123'}})
2285
res = req.get_response(fakes.wsgi_app())
2286
self.assertEqual(res.status_int, 200)
2287
res_dict = json.loads(res.body)
2288
self.assertEqual(res_dict['server']['id'], 1)
2289
self.assertEqual(res_dict['server']['accessIPv6'], 'beef::0123')
1895
2291
def test_update_server_adminPass_ignored_v1_1(self):
1896
2292
inst_dict = dict(name='server_test', adminPass='bacon')
1897
2293
self.body = json.dumps(dict(server=inst_dict))
2165
2561
self.assertEqual(res.status_int, 204)
2166
2562
self.assertEqual(self.server_delete_called, True)
2168
def test_shutdown_status(self):
2169
new_server = return_server_with_power_state(power_state.SHUTDOWN)
2170
self.stubs.Set(nova.db.api, 'instance_get', new_server)
2171
req = webob.Request.blank('/v1.0/servers/1')
2172
res = req.get_response(fakes.wsgi_app())
2173
self.assertEqual(res.status_int, 200)
2174
res_dict = json.loads(res.body)
2175
self.assertEqual(res_dict['server']['status'], 'SHUTDOWN')
2177
def test_shutoff_status(self):
2178
new_server = return_server_with_power_state(power_state.SHUTOFF)
2179
self.stubs.Set(nova.db.api, 'instance_get', new_server)
2180
req = webob.Request.blank('/v1.0/servers/1')
2181
res = req.get_response(fakes.wsgi_app())
2182
self.assertEqual(res.status_int, 200)
2183
res_dict = json.loads(res.body)
2184
self.assertEqual(res_dict['server']['status'], 'SHUTOFF')
2565
class TestServerStatus(test.TestCase):
2567
def _get_with_state(self, vm_state, task_state=None):
2568
new_server = return_server_with_state(vm_state, task_state)
2569
self.stubs.Set(nova.db.api, 'instance_get', new_server)
2570
request = webob.Request.blank('/v1.0/servers/1')
2571
response = request.get_response(fakes.wsgi_app())
2572
self.assertEqual(response.status_int, 200)
2573
return json.loads(response.body)
2575
def test_active(self):
2576
response = self._get_with_state(vm_states.ACTIVE)
2577
self.assertEqual(response['server']['status'], 'ACTIVE')
2579
def test_reboot(self):
2580
response = self._get_with_state(vm_states.ACTIVE,
2581
task_states.REBOOTING)
2582
self.assertEqual(response['server']['status'], 'REBOOT')
2584
def test_rebuild(self):
2585
response = self._get_with_state(vm_states.REBUILDING)
2586
self.assertEqual(response['server']['status'], 'REBUILD')
2588
def test_rebuild_error(self):
2589
response = self._get_with_state(vm_states.ERROR)
2590
self.assertEqual(response['server']['status'], 'ERROR')
2592
def test_resize(self):
2593
response = self._get_with_state(vm_states.RESIZING)
2594
self.assertEqual(response['server']['status'], 'RESIZE')
2596
def test_verify_resize(self):
2597
response = self._get_with_state(vm_states.ACTIVE,
2598
task_states.RESIZE_VERIFY)
2599
self.assertEqual(response['server']['status'], 'VERIFY_RESIZE')
2601
def test_password_update(self):
2602
response = self._get_with_state(vm_states.ACTIVE,
2603
task_states.UPDATING_PASSWORD)
2604
self.assertEqual(response['server']['status'], 'PASSWORD')
2606
def test_stopped(self):
2607
response = self._get_with_state(vm_states.STOPPED)
2608
self.assertEqual(response['server']['status'], 'STOPPED')
2187
2611
class TestServerCreateRequestXMLDeserializerV10(unittest.TestCase):
2643
3123
self.assertEquals(request['body'], expected)
3125
def test_request_with_empty_networks(self):
3126
serial_request = """
3127
<server xmlns="http://docs.openstack.org/compute/api/v1.1"
3128
name="new-server-test" imageRef="1" flavorRef="1">
3131
request = self.deserializer.deserialize(serial_request, 'create')
3132
expected = {"server": {
3133
"name": "new-server-test",
3138
self.assertEquals(request['body'], expected)
3140
def test_request_with_one_network(self):
3141
serial_request = """
3142
<server xmlns="http://docs.openstack.org/compute/api/v1.1"
3143
name="new-server-test" imageRef="1" flavorRef="1">
3145
<network uuid="1" fixed_ip="10.0.1.12"/>
3148
request = self.deserializer.deserialize(serial_request, 'create')
3149
expected = {"server": {
3150
"name": "new-server-test",
3153
"networks": [{"uuid": "1", "fixed_ip": "10.0.1.12"}],
3155
self.assertEquals(request['body'], expected)
3157
def test_request_with_two_networks(self):
3158
serial_request = """
3159
<server xmlns="http://docs.openstack.org/compute/api/v1.1"
3160
name="new-server-test" imageRef="1" flavorRef="1">
3162
<network uuid="1" fixed_ip="10.0.1.12"/>
3163
<network uuid="2" fixed_ip="10.0.2.12"/>
3166
request = self.deserializer.deserialize(serial_request, 'create')
3167
expected = {"server": {
3168
"name": "new-server-test",
3171
"networks": [{"uuid": "1", "fixed_ip": "10.0.1.12"},
3172
{"uuid": "2", "fixed_ip": "10.0.2.12"}],
3174
self.assertEquals(request['body'], expected)
3176
def test_request_with_second_network_node_ignored(self):
3177
serial_request = """
3178
<server xmlns="http://docs.openstack.org/compute/api/v1.1"
3179
name="new-server-test" imageRef="1" flavorRef="1">
3181
<network uuid="1" fixed_ip="10.0.1.12"/>
3184
<network uuid="2" fixed_ip="10.0.2.12"/>
3187
request = self.deserializer.deserialize(serial_request, 'create')
3188
expected = {"server": {
3189
"name": "new-server-test",
3192
"networks": [{"uuid": "1", "fixed_ip": "10.0.1.12"}],
3194
self.assertEquals(request['body'], expected)
3196
def test_request_with_one_network_missing_id(self):
3197
serial_request = """
3198
<server xmlns="http://docs.openstack.org/compute/api/v1.1"
3199
name="new-server-test" imageRef="1" flavorRef="1">
3201
<network fixed_ip="10.0.1.12"/>
3204
request = self.deserializer.deserialize(serial_request, 'create')
3205
expected = {"server": {
3206
"name": "new-server-test",
3209
"networks": [{"fixed_ip": "10.0.1.12"}],
3211
self.assertEquals(request['body'], expected)
3213
def test_request_with_one_network_missing_fixed_ip(self):
3214
serial_request = """
3215
<server xmlns="http://docs.openstack.org/compute/api/v1.1"
3216
name="new-server-test" imageRef="1" flavorRef="1">
3221
request = self.deserializer.deserialize(serial_request, 'create')
3222
expected = {"server": {
3223
"name": "new-server-test",
3226
"networks": [{"uuid": "1"}],
3228
self.assertEquals(request['body'], expected)
3230
def test_request_with_one_network_empty_id(self):
3231
serial_request = """
3232
<server xmlns="http://docs.openstack.org/compute/api/v1.1"
3233
name="new-server-test" imageRef="1" flavorRef="1">
3235
<network uuid="" fixed_ip="10.0.1.12"/>
3238
request = self.deserializer.deserialize(serial_request, 'create')
3239
expected = {"server": {
3240
"name": "new-server-test",
3243
"networks": [{"uuid": "", "fixed_ip": "10.0.1.12"}],
3245
self.assertEquals(request['body'], expected)
3247
def test_request_with_one_network_empty_fixed_ip(self):
3248
serial_request = """
3249
<server xmlns="http://docs.openstack.org/compute/api/v1.1"
3250
name="new-server-test" imageRef="1" flavorRef="1">
3252
<network uuid="1" fixed_ip=""/>
3255
request = self.deserializer.deserialize(serial_request, 'create')
3256
expected = {"server": {
3257
"name": "new-server-test",
3260
"networks": [{"uuid": "1", "fixed_ip": ""}],
3262
self.assertEquals(request['body'], expected)
3264
def test_request_with_networks_duplicate_ids(self):
3265
serial_request = """
3266
<server xmlns="http://docs.openstack.org/compute/api/v1.1"
3267
name="new-server-test" imageRef="1" flavorRef="1">
3269
<network uuid="1" fixed_ip="10.0.1.12"/>
3270
<network uuid="1" fixed_ip="10.0.2.12"/>
3273
request = self.deserializer.deserialize(serial_request, 'create')
3274
expected = {"server": {
3275
"name": "new-server-test",
3278
"networks": [{"uuid": "1", "fixed_ip": "10.0.1.12"},
3279
{"uuid": "1", "fixed_ip": "10.0.2.12"}],
3281
self.assertEquals(request['body'], expected)
2646
3284
class TestAddressesXMLSerialization(test.TestCase):
3331
4145
expected_flavor_bookmark = self.FLAVOR_BOOKMARK
3332
4146
expected_now = self.TIMESTAMP
3333
4147
expected_uuid = FAKE_UUID
3334
expected = minidom.parseString("""
3336
uuid="%(expected_uuid)s"
3337
xmlns="http://docs.openstack.org/compute/api/v1.1"
3338
xmlns:atom="http://www.w3.org/2005/Atom"
3340
updated="%(expected_now)s"
3341
created="%(expected_now)s"
3342
hostId="e4d909c290d0fb1ca068ffaddf22cbd0"
3345
<atom:link href="%(expected_server_href)s" rel="self"/>
3346
<atom:link href="%(expected_server_bookmark)s" rel="bookmark"/>
3348
<atom:link rel="bookmark" href="%(expected_image_bookmark)s"/>
3351
<atom:link rel="bookmark" href="%(expected_flavor_bookmark)s"/>
3362
<network id="network_one">
3363
<ip version="4" addr="67.23.10.138"/>
3364
<ip version="6" addr="::babe:67.23.10.138"/>
3366
<network id="network_two">
3367
<ip version="4" addr="67.23.10.139"/>
3368
<ip version="6" addr="::babe:67.23.10.139"/>
3372
""".replace(" ", "") % (locals()))
3374
self.assertEqual(expected.toxml(), actual.toxml())
4148
server_dict = fixture['server']
4150
for key in ['name', 'id', 'uuid', 'created', 'accessIPv4',
4151
'updated', 'progress', 'status', 'hostId',
4153
self.assertEqual(root.get(key), str(server_dict[key]))
4155
link_nodes = root.findall('{0}link'.format(ATOMNS))
4156
self.assertEqual(len(link_nodes), 2)
4157
for i, link in enumerate(server_dict['links']):
4158
for key, value in link.items():
4159
self.assertEqual(link_nodes[i].get(key), value)
4161
metadata_root = root.find('{0}metadata'.format(NS))
4162
metadata_elems = metadata_root.findall('{0}meta'.format(NS))
4163
self.assertEqual(len(metadata_elems), 2)
4164
for i, metadata_elem in enumerate(metadata_elems):
4165
(meta_key, meta_value) = server_dict['metadata'].items()[i]
4166
self.assertEqual(str(metadata_elem.get('key')), str(meta_key))
4167
self.assertEqual(str(metadata_elem.text).strip(), str(meta_value))
4169
image_root = root.find('{0}image'.format(NS))
4170
self.assertEqual(image_root.get('id'), server_dict['image']['id'])
4171
link_nodes = image_root.findall('{0}link'.format(ATOMNS))
4172
self.assertEqual(len(link_nodes), 1)
4173
for i, link in enumerate(server_dict['image']['links']):
4174
for key, value in link.items():
4175
self.assertEqual(link_nodes[i].get(key), value)
4177
flavor_root = root.find('{0}flavor'.format(NS))
4178
self.assertEqual(flavor_root.get('id'), server_dict['flavor']['id'])
4179
link_nodes = flavor_root.findall('{0}link'.format(ATOMNS))
4180
self.assertEqual(len(link_nodes), 1)
4181
for i, link in enumerate(server_dict['flavor']['links']):
4182
for key, value in link.items():
4183
self.assertEqual(link_nodes[i].get(key), value)
4185
addresses_root = root.find('{0}addresses'.format(NS))
4186
addresses_dict = server_dict['addresses']
4187
network_elems = addresses_root.findall('{0}network'.format(NS))
4188
self.assertEqual(len(network_elems), 2)
4189
for i, network_elem in enumerate(network_elems):
4190
network = addresses_dict.items()[i]
4191
self.assertEqual(str(network_elem.get('id')), str(network[0]))
4192
ip_elems = network_elem.findall('{0}ip'.format(NS))
4193
for z, ip_elem in enumerate(ip_elems):
4195
self.assertEqual(str(ip_elem.get('version')),
4197
self.assertEqual(str(ip_elem.get('addr')),
3376
4200
def test_create(self):
3377
4201
serializer = servers.ServerXMLSerializer()
3453
4283
expected_flavor_bookmark = self.FLAVOR_BOOKMARK
3454
4284
expected_now = self.TIMESTAMP
3455
4285
expected_uuid = FAKE_UUID
3456
expected = minidom.parseString("""
3458
uuid="%(expected_uuid)s"
3459
xmlns="http://docs.openstack.org/compute/api/v1.1"
3460
xmlns:atom="http://www.w3.org/2005/Atom"
3462
updated="%(expected_now)s"
3463
created="%(expected_now)s"
3464
hostId="e4d909c290d0fb1ca068ffaddf22cbd0"
3466
adminPass="test_password"
3468
<atom:link href="%(expected_server_href)s" rel="self"/>
3469
<atom:link href="%(expected_server_bookmark)s" rel="bookmark"/>
3471
<atom:link rel="bookmark" href="%(expected_image_bookmark)s"/>
3474
<atom:link rel="bookmark" href="%(expected_flavor_bookmark)s"/>
3485
<network id="network_one">
3486
<ip version="4" addr="67.23.10.138"/>
3487
<ip version="6" addr="::babe:67.23.10.138"/>
3489
<network id="network_two">
3490
<ip version="4" addr="67.23.10.139"/>
3491
<ip version="6" addr="::babe:67.23.10.139"/>
3495
""".replace(" ", "") % (locals()))
3497
self.assertEqual(expected.toxml(), actual.toxml())
4286
server_dict = fixture['server']
4288
for key in ['name', 'id', 'uuid', 'created', 'accessIPv4',
4289
'updated', 'progress', 'status', 'hostId',
4290
'accessIPv6', 'adminPass']:
4291
self.assertEqual(root.get(key), str(server_dict[key]))
4293
link_nodes = root.findall('{0}link'.format(ATOMNS))
4294
self.assertEqual(len(link_nodes), 2)
4295
for i, link in enumerate(server_dict['links']):
4296
for key, value in link.items():
4297
self.assertEqual(link_nodes[i].get(key), value)
4299
metadata_root = root.find('{0}metadata'.format(NS))
4300
metadata_elems = metadata_root.findall('{0}meta'.format(NS))
4301
self.assertEqual(len(metadata_elems), 2)
4302
for i, metadata_elem in enumerate(metadata_elems):
4303
(meta_key, meta_value) = server_dict['metadata'].items()[i]
4304
self.assertEqual(str(metadata_elem.get('key')), str(meta_key))
4305
self.assertEqual(str(metadata_elem.text).strip(), str(meta_value))
4307
image_root = root.find('{0}image'.format(NS))
4308
self.assertEqual(image_root.get('id'), server_dict['image']['id'])
4309
link_nodes = image_root.findall('{0}link'.format(ATOMNS))
4310
self.assertEqual(len(link_nodes), 1)
4311
for i, link in enumerate(server_dict['image']['links']):
4312
for key, value in link.items():
4313
self.assertEqual(link_nodes[i].get(key), value)
4315
flavor_root = root.find('{0}flavor'.format(NS))
4316
self.assertEqual(flavor_root.get('id'), server_dict['flavor']['id'])
4317
link_nodes = flavor_root.findall('{0}link'.format(ATOMNS))
4318
self.assertEqual(len(link_nodes), 1)
4319
for i, link in enumerate(server_dict['flavor']['links']):
4320
for key, value in link.items():
4321
self.assertEqual(link_nodes[i].get(key), value)
4323
addresses_root = root.find('{0}addresses'.format(NS))
4324
addresses_dict = server_dict['addresses']
4325
network_elems = addresses_root.findall('{0}network'.format(NS))
4326
self.assertEqual(len(network_elems), 2)
4327
for i, network_elem in enumerate(network_elems):
4328
network = addresses_dict.items()[i]
4329
self.assertEqual(str(network_elem.get('id')), str(network[0]))
4330
ip_elems = network_elem.findall('{0}ip'.format(NS))
4331
for z, ip_elem in enumerate(ip_elems):
4333
self.assertEqual(str(ip_elem.get('version')),
4335
self.assertEqual(str(ip_elem.get('addr')),
3499
4338
def test_index(self):
3500
4339
serializer = servers.ServerXMLSerializer()
3537
4376
output = serializer.serialize(fixture, 'index')
3538
actual = minidom.parseString(output.replace(" ", ""))
3540
expected = minidom.parseString("""
3541
<servers xmlns="http://docs.openstack.org/compute/api/v1.1"
3542
xmlns:atom="http://www.w3.org/2005/Atom">
3543
<server id="1" name="test_server">
3544
<atom:link href="%(expected_server_href)s" rel="self"/>
3545
<atom:link href="%(expected_server_bookmark)s" rel="bookmark"/>
3547
<server id="2" name="test_server_2">
3548
<atom:link href="%(expected_server_href_2)s" rel="self"/>
3549
<atom:link href="%(expected_server_bookmark_2)s" rel="bookmark"/>
3552
""".replace(" ", "") % (locals()))
3554
self.assertEqual(expected.toxml(), actual.toxml())
4378
root = etree.XML(output)
4379
xmlutil.validate_schema(root, 'servers_index')
4380
server_elems = root.findall('{0}server'.format(NS))
4381
self.assertEqual(len(server_elems), 2)
4382
for i, server_elem in enumerate(server_elems):
4383
server_dict = fixture['servers'][i]
4384
for key in ['name', 'id']:
4385
self.assertEqual(server_elem.get(key), str(server_dict[key]))
4387
link_nodes = server_elem.findall('{0}link'.format(ATOMNS))
4388
self.assertEqual(len(link_nodes), 2)
4389
for i, link in enumerate(server_dict['links']):
4390
for key, value in link.items():
4391
self.assertEqual(link_nodes[i].get(key), value)
3556
4393
def test_detail(self):
3557
4394
serializer = servers.ServerXMLSerializer()
3677
4522
output = serializer.serialize(fixture, 'detail')
3678
actual = minidom.parseString(output.replace(" ", ""))
3680
expected = minidom.parseString("""
3681
<servers xmlns="http://docs.openstack.org/compute/api/v1.1"
3682
xmlns:atom="http://www.w3.org/2005/Atom">
3684
uuid="%(expected_uuid)s"
3686
updated="%(expected_now)s"
3687
created="%(expected_now)s"
3688
hostId="e4d909c290d0fb1ca068ffaddf22cbd0"
3691
<atom:link href="%(expected_server_href)s" rel="self"/>
3692
<atom:link href="%(expected_server_bookmark)s" rel="bookmark"/>
3694
<atom:link rel="bookmark" href="%(expected_image_bookmark)s"/>
3697
<atom:link rel="bookmark" href="%(expected_flavor_bookmark)s"/>
3705
<network id="network_one">
3706
<ip version="4" addr="67.23.10.138"/>
3707
<ip version="6" addr="::babe:67.23.10.138"/>
3712
uuid="%(expected_uuid)s"
3713
name="test_server_2"
3714
updated="%(expected_now)s"
3715
created="%(expected_now)s"
3716
hostId="e4d909c290d0fb1ca068ffaddf22cbd0"
3719
<atom:link href="%(expected_server_href_2)s" rel="self"/>
3720
<atom:link href="%(expected_server_bookmark_2)s" rel="bookmark"/>
3722
<atom:link rel="bookmark" href="%(expected_image_bookmark)s"/>
3725
<atom:link rel="bookmark" href="%(expected_flavor_bookmark)s"/>
3733
<network id="network_one">
3734
<ip version="4" addr="67.23.10.138"/>
3735
<ip version="6" addr="::babe:67.23.10.138"/>
3740
""".replace(" ", "") % (locals()))
3742
self.assertEqual(expected.toxml(), actual.toxml())
4524
root = etree.XML(output)
4525
xmlutil.validate_schema(root, 'servers')
4526
server_elems = root.findall('{0}server'.format(NS))
4527
self.assertEqual(len(server_elems), 2)
4528
for i, server_elem in enumerate(server_elems):
4529
server_dict = fixture['servers'][i]
4531
for key in ['name', 'id', 'uuid', 'created', 'accessIPv4',
4532
'updated', 'progress', 'status', 'hostId',
4534
self.assertEqual(server_elem.get(key), str(server_dict[key]))
4536
link_nodes = server_elem.findall('{0}link'.format(ATOMNS))
4537
self.assertEqual(len(link_nodes), 2)
4538
for i, link in enumerate(server_dict['links']):
4539
for key, value in link.items():
4540
self.assertEqual(link_nodes[i].get(key), value)
4542
metadata_root = server_elem.find('{0}metadata'.format(NS))
4543
metadata_elems = metadata_root.findall('{0}meta'.format(NS))
4544
for i, metadata_elem in enumerate(metadata_elems):
4545
(meta_key, meta_value) = server_dict['metadata'].items()[i]
4546
self.assertEqual(str(metadata_elem.get('key')), str(meta_key))
4547
self.assertEqual(str(metadata_elem.text).strip(),
4550
image_root = server_elem.find('{0}image'.format(NS))
4551
self.assertEqual(image_root.get('id'), server_dict['image']['id'])
4552
link_nodes = image_root.findall('{0}link'.format(ATOMNS))
4553
self.assertEqual(len(link_nodes), 1)
4554
for i, link in enumerate(server_dict['image']['links']):
4555
for key, value in link.items():
4556
self.assertEqual(link_nodes[i].get(key), value)
4558
flavor_root = server_elem.find('{0}flavor'.format(NS))
4559
self.assertEqual(flavor_root.get('id'),
4560
server_dict['flavor']['id'])
4561
link_nodes = flavor_root.findall('{0}link'.format(ATOMNS))
4562
self.assertEqual(len(link_nodes), 1)
4563
for i, link in enumerate(server_dict['flavor']['links']):
4564
for key, value in link.items():
4565
self.assertEqual(link_nodes[i].get(key), value)
4567
addresses_root = server_elem.find('{0}addresses'.format(NS))
4568
addresses_dict = server_dict['addresses']
4569
network_elems = addresses_root.findall('{0}network'.format(NS))
4570
for i, network_elem in enumerate(network_elems):
4571
network = addresses_dict.items()[i]
4572
self.assertEqual(str(network_elem.get('id')), str(network[0]))
4573
ip_elems = network_elem.findall('{0}ip'.format(NS))
4574
for z, ip_elem in enumerate(ip_elems):
4576
self.assertEqual(str(ip_elem.get('version')),
4578
self.assertEqual(str(ip_elem.get('addr')),
3744
4581
def test_update(self):
3745
4582
serializer = servers.ServerXMLSerializer()
3814
4655
output = serializer.serialize(fixture, 'update')
3815
actual = minidom.parseString(output.replace(" ", ""))
3817
expected_server_href = self.SERVER_HREF
3818
expected_server_bookmark = self.SERVER_BOOKMARK
3819
expected_image_bookmark = self.IMAGE_BOOKMARK
3820
expected_flavor_bookmark = self.FLAVOR_BOOKMARK
3821
expected_now = self.TIMESTAMP
3822
expected_uuid = FAKE_UUID
3823
expected = minidom.parseString("""
3825
uuid="%(expected_uuid)s"
3826
xmlns="http://docs.openstack.org/compute/api/v1.1"
3827
xmlns:atom="http://www.w3.org/2005/Atom"
3829
updated="%(expected_now)s"
3830
created="%(expected_now)s"
3831
hostId="e4d909c290d0fb1ca068ffaddf22cbd0"
3834
<atom:link href="%(expected_server_href)s" rel="self"/>
3835
<atom:link href="%(expected_server_bookmark)s" rel="bookmark"/>
3837
<atom:link rel="bookmark" href="%(expected_image_bookmark)s"/>
3840
<atom:link rel="bookmark" href="%(expected_flavor_bookmark)s"/>
3851
<network id="network_one">
3852
<ip version="4" addr="67.23.10.138"/>
3853
<ip version="6" addr="::babe:67.23.10.138"/>
3855
<network id="network_two">
3856
<ip version="4" addr="67.23.10.139"/>
3857
<ip version="6" addr="::babe:67.23.10.139"/>
3861
""".replace(" ", "") % (locals()))
3863
self.assertEqual(expected.toxml(), actual.toxml())
4657
root = etree.XML(output)
4658
xmlutil.validate_schema(root, 'server')
4660
expected_server_href = self.SERVER_HREF
4661
expected_server_bookmark = self.SERVER_BOOKMARK
4662
expected_image_bookmark = self.IMAGE_BOOKMARK
4663
expected_flavor_bookmark = self.FLAVOR_BOOKMARK
4664
expected_now = self.TIMESTAMP
4665
expected_uuid = FAKE_UUID
4666
server_dict = fixture['server']
4668
for key in ['name', 'id', 'uuid', 'created', 'accessIPv4',
4669
'updated', 'progress', 'status', 'hostId',
4671
self.assertEqual(root.get(key), str(server_dict[key]))
4673
link_nodes = root.findall('{0}link'.format(ATOMNS))
4674
self.assertEqual(len(link_nodes), 2)
4675
for i, link in enumerate(server_dict['links']):
4676
for key, value in link.items():
4677
self.assertEqual(link_nodes[i].get(key), value)
4679
metadata_root = root.find('{0}metadata'.format(NS))
4680
metadata_elems = metadata_root.findall('{0}meta'.format(NS))
4681
self.assertEqual(len(metadata_elems), 2)
4682
for i, metadata_elem in enumerate(metadata_elems):
4683
(meta_key, meta_value) = server_dict['metadata'].items()[i]
4684
self.assertEqual(str(metadata_elem.get('key')), str(meta_key))
4685
self.assertEqual(str(metadata_elem.text).strip(), str(meta_value))
4687
image_root = root.find('{0}image'.format(NS))
4688
self.assertEqual(image_root.get('id'), server_dict['image']['id'])
4689
link_nodes = image_root.findall('{0}link'.format(ATOMNS))
4690
self.assertEqual(len(link_nodes), 1)
4691
for i, link in enumerate(server_dict['image']['links']):
4692
for key, value in link.items():
4693
self.assertEqual(link_nodes[i].get(key), value)
4695
flavor_root = root.find('{0}flavor'.format(NS))
4696
self.assertEqual(flavor_root.get('id'), server_dict['flavor']['id'])
4697
link_nodes = flavor_root.findall('{0}link'.format(ATOMNS))
4698
self.assertEqual(len(link_nodes), 1)
4699
for i, link in enumerate(server_dict['flavor']['links']):
4700
for key, value in link.items():
4701
self.assertEqual(link_nodes[i].get(key), value)
4703
addresses_root = root.find('{0}addresses'.format(NS))
4704
addresses_dict = server_dict['addresses']
4705
network_elems = addresses_root.findall('{0}network'.format(NS))
4706
self.assertEqual(len(network_elems), 2)
4707
for i, network_elem in enumerate(network_elems):
4708
network = addresses_dict.items()[i]
4709
self.assertEqual(str(network_elem.get('id')), str(network[0]))
4710
ip_elems = network_elem.findall('{0}ip'.format(NS))
4711
for z, ip_elem in enumerate(ip_elems):
4713
self.assertEqual(str(ip_elem.get('version')),
4715
self.assertEqual(str(ip_elem.get('addr')),
4718
def test_action(self):
4719
serializer = servers.ServerXMLSerializer()
4726
"tenant_id": "fake",
4727
'created': self.TIMESTAMP,
4728
'updated': self.TIMESTAMP,
4730
"name": "test_server",
4732
"accessIPv4": "1.2.3.4",
4733
"accessIPv6": "fead::1234",
4734
"hostId": "e4d909c290d0fb1ca068ffaddf22cbd0",
4735
"adminPass": "test_password",
4741
"href": self.IMAGE_BOOKMARK,
4750
"href": self.FLAVOR_BOOKMARK,
4758
"addr": "67.23.10.138",
4762
"addr": "::babe:67.23.10.138",
4768
"addr": "67.23.10.139",
4772
"addr": "::babe:67.23.10.139",
4782
'href': self.SERVER_HREF,
4786
'href': self.SERVER_BOOKMARK,
4793
output = serializer.serialize(fixture, 'action')
4794
root = etree.XML(output)
4795
xmlutil.validate_schema(root, 'server')
4797
expected_server_href = self.SERVER_HREF
4798
expected_server_bookmark = self.SERVER_BOOKMARK
4799
expected_image_bookmark = self.IMAGE_BOOKMARK
4800
expected_flavor_bookmark = self.FLAVOR_BOOKMARK
4801
expected_now = self.TIMESTAMP
4802
expected_uuid = FAKE_UUID
4803
server_dict = fixture['server']
4805
for key in ['name', 'id', 'uuid', 'created', 'accessIPv4',
4806
'updated', 'progress', 'status', 'hostId',
4807
'accessIPv6', 'adminPass']:
4808
self.assertEqual(root.get(key), str(server_dict[key]))
4810
link_nodes = root.findall('{0}link'.format(ATOMNS))
4811
self.assertEqual(len(link_nodes), 2)
4812
for i, link in enumerate(server_dict['links']):
4813
for key, value in link.items():
4814
self.assertEqual(link_nodes[i].get(key), value)
4816
metadata_root = root.find('{0}metadata'.format(NS))
4817
metadata_elems = metadata_root.findall('{0}meta'.format(NS))
4818
self.assertEqual(len(metadata_elems), 2)
4819
for i, metadata_elem in enumerate(metadata_elems):
4820
(meta_key, meta_value) = server_dict['metadata'].items()[i]
4821
self.assertEqual(str(metadata_elem.get('key')), str(meta_key))
4822
self.assertEqual(str(metadata_elem.text).strip(), str(meta_value))
4824
image_root = root.find('{0}image'.format(NS))
4825
self.assertEqual(image_root.get('id'), server_dict['image']['id'])
4826
link_nodes = image_root.findall('{0}link'.format(ATOMNS))
4827
self.assertEqual(len(link_nodes), 1)
4828
for i, link in enumerate(server_dict['image']['links']):
4829
for key, value in link.items():
4830
self.assertEqual(link_nodes[i].get(key), value)
4832
flavor_root = root.find('{0}flavor'.format(NS))
4833
self.assertEqual(flavor_root.get('id'), server_dict['flavor']['id'])
4834
link_nodes = flavor_root.findall('{0}link'.format(ATOMNS))
4835
self.assertEqual(len(link_nodes), 1)
4836
for i, link in enumerate(server_dict['flavor']['links']):
4837
for key, value in link.items():
4838
self.assertEqual(link_nodes[i].get(key), value)
4840
addresses_root = root.find('{0}addresses'.format(NS))
4841
addresses_dict = server_dict['addresses']
4842
network_elems = addresses_root.findall('{0}network'.format(NS))
4843
self.assertEqual(len(network_elems), 2)
4844
for i, network_elem in enumerate(network_elems):
4845
network = addresses_dict.items()[i]
4846
self.assertEqual(str(network_elem.get('id')), str(network[0]))
4847
ip_elems = network_elem.findall('{0}ip'.format(NS))
4848
for z, ip_elem in enumerate(ip_elems):
4850
self.assertEqual(str(ip_elem.get('version')),
4852
self.assertEqual(str(ip_elem.get('addr')),