1579
1596
res = req.get_response(fakes.wsgi_app())
1580
1597
self.assertEqual(res.status_int, 400)
1599
def test_create_instance_with_access_ip_v1_1(self):
1600
self._setup_for_create_instance()
1602
# proper local hrefs must start with 'http://localhost/v1.1/'
1603
image_href = 'http://localhost/v1.1/images/2'
1604
flavor_ref = 'http://localhost/flavors/3'
1605
access_ipv4 = '1.2.3.4'
1606
access_ipv6 = 'fead::1234'
1612
"href": 'http://localhost/flavors/3',
1621
"href": 'http://localhost/images/2',
1627
'name': 'server_test',
1628
'imageRef': image_href,
1629
'flavorRef': flavor_ref,
1630
'accessIPv4': access_ipv4,
1631
'accessIPv6': access_ipv6,
1638
"path": "/etc/banner.txt",
1645
req = webob.Request.blank('/v1.1/servers')
1647
req.body = json.dumps(body)
1648
req.headers["content-type"] = "application/json"
1650
res = req.get_response(fakes.wsgi_app())
1652
self.assertEqual(res.status_int, 202)
1653
server = json.loads(res.body)['server']
1654
self.assertEqual(16, len(server['adminPass']))
1655
self.assertEqual(1, server['id'])
1656
self.assertEqual(0, server['progress'])
1657
self.assertEqual('server_test', server['name'])
1658
self.assertEqual(expected_flavor, server['flavor'])
1659
self.assertEqual(expected_image, server['image'])
1660
self.assertEqual(access_ipv4, server['accessIPv4'])
1661
self.assertEqual(access_ipv6, server['accessIPv6'])
1582
1663
def test_create_instance_v1_1(self):
1583
1664
self._setup_for_create_instance()
1879
1962
res = req.get_response(fakes.wsgi_app())
1880
1963
self.assertEqual(res.status_int, 400)
1965
def test_update_server_all_attributes_v1_1(self):
1966
self.stubs.Set(nova.db.api, 'instance_get',
1967
return_server_with_attributes(name='server_test',
1968
access_ipv4='0.0.0.0',
1969
access_ipv6='beef::0123'))
1970
req = webob.Request.blank('/v1.1/servers/1')
1972
req.content_type = 'application/json'
1974
'name': 'server_test',
1975
'accessIPv4': '0.0.0.0',
1976
'accessIPv6': 'beef::0123',
1978
req.body = json.dumps(body)
1979
res = req.get_response(fakes.wsgi_app())
1980
self.assertEqual(res.status_int, 200)
1981
res_dict = json.loads(res.body)
1982
self.assertEqual(res_dict['server']['id'], 1)
1983
self.assertEqual(res_dict['server']['name'], 'server_test')
1984
self.assertEqual(res_dict['server']['accessIPv4'], '0.0.0.0')
1985
self.assertEqual(res_dict['server']['accessIPv6'], 'beef::0123')
1882
1987
def test_update_server_name_v1_1(self):
1883
1988
self.stubs.Set(nova.db.api, 'instance_get',
1884
1989
return_server_with_attributes(name='server_test'))
1892
1997
self.assertEqual(res_dict['server']['id'], 1)
1893
1998
self.assertEqual(res_dict['server']['name'], 'server_test')
2000
def test_update_server_access_ipv4_v1_1(self):
2001
self.stubs.Set(nova.db.api, 'instance_get',
2002
return_server_with_attributes(access_ipv4='0.0.0.0'))
2003
req = webob.Request.blank('/v1.1/servers/1')
2005
req.content_type = 'application/json'
2006
req.body = json.dumps({'server': {'accessIPv4': '0.0.0.0'}})
2007
res = req.get_response(fakes.wsgi_app())
2008
self.assertEqual(res.status_int, 200)
2009
res_dict = json.loads(res.body)
2010
self.assertEqual(res_dict['server']['id'], 1)
2011
self.assertEqual(res_dict['server']['accessIPv4'], '0.0.0.0')
2013
def test_update_server_access_ipv6_v1_1(self):
2014
self.stubs.Set(nova.db.api, 'instance_get',
2015
return_server_with_attributes(access_ipv6='beef::0123'))
2016
req = webob.Request.blank('/v1.1/servers/1')
2018
req.content_type = 'application/json'
2019
req.body = json.dumps({'server': {'accessIPv6': 'beef::0123'}})
2020
res = req.get_response(fakes.wsgi_app())
2021
self.assertEqual(res.status_int, 200)
2022
res_dict = json.loads(res.body)
2023
self.assertEqual(res_dict['server']['id'], 1)
2024
self.assertEqual(res_dict['server']['accessIPv6'], 'beef::0123')
1895
2026
def test_update_server_adminPass_ignored_v1_1(self):
1896
2027
inst_dict = dict(name='server_test', adminPass='bacon')
1897
2028
self.body = json.dumps(dict(server=inst_dict))
2492
2623
self.assertEquals(request['body'], expected)
2625
def test_access_ipv4(self):
2626
serial_request = """
2627
<server xmlns="http://docs.openstack.org/compute/api/v1.1"
2628
name="new-server-test"
2631
accessIPv4="1.2.3.4"/>"""
2632
request = self.deserializer.deserialize(serial_request, 'create')
2635
"name": "new-server-test",
2638
"accessIPv4": "1.2.3.4",
2641
self.assertEquals(request['body'], expected)
2643
def test_access_ipv6(self):
2644
serial_request = """
2645
<server xmlns="http://docs.openstack.org/compute/api/v1.1"
2646
name="new-server-test"
2649
accessIPv6="fead::1234"/>"""
2650
request = self.deserializer.deserialize(serial_request, 'create')
2653
"name": "new-server-test",
2656
"accessIPv6": "fead::1234",
2659
self.assertEquals(request['body'], expected)
2661
def test_access_ip(self):
2662
serial_request = """
2663
<server xmlns="http://docs.openstack.org/compute/api/v1.1"
2664
name="new-server-test"
2667
accessIPv4="1.2.3.4"
2668
accessIPv6="fead::1234"/>"""
2669
request = self.deserializer.deserialize(serial_request, 'create')
2672
"name": "new-server-test",
2675
"accessIPv4": "1.2.3.4",
2676
"accessIPv6": "fead::1234",
2679
self.assertEquals(request['body'], expected)
2494
2681
def test_admin_pass(self):
2495
2682
serial_request = """
2496
2683
<server xmlns="http://docs.openstack.org/compute/api/v1.1"
3181
3374
output = self.view_builder.build(self.instance, True)
3182
3375
self.assertDictMatch(output, expected_server)
3377
def test_build_server_detail_with_accessipv4(self):
3379
self.instance['access_ip_v4'] = '1.2.3.4'
3381
image_bookmark = "http://localhost/images/5"
3382
flavor_bookmark = "http://localhost/flavors/1"
3386
"uuid": self.instance['uuid'],
3387
"updated": "2010-11-11T11:00:00Z",
3388
"created": "2010-10-10T12:00:00Z",
3390
"name": "test_server",
3398
"href": image_bookmark,
3407
"href": flavor_bookmark,
3413
"accessIPv4": "1.2.3.4",
3418
"href": "http://localhost/v1.1/servers/1",
3422
"href": "http://localhost/servers/1",
3428
output = self.view_builder.build(self.instance, True)
3429
self.assertDictMatch(output, expected_server)
3431
def test_build_server_detail_with_accessipv6(self):
3433
self.instance['access_ip_v6'] = 'fead::1234'
3435
image_bookmark = "http://localhost/images/5"
3436
flavor_bookmark = "http://localhost/flavors/1"
3440
"uuid": self.instance['uuid'],
3441
"updated": "2010-11-11T11:00:00Z",
3442
"created": "2010-10-10T12:00:00Z",
3444
"name": "test_server",
3452
"href": image_bookmark,
3461
"href": flavor_bookmark,
3468
"accessIPv6": "fead::1234",
3472
"href": "http://localhost/v1.1/servers/1",
3476
"href": "http://localhost/servers/1",
3482
output = self.view_builder.build(self.instance, True)
3483
self.assertDictMatch(output, expected_server)
3184
3485
def test_build_server_detail_with_metadata(self):
3331
3638
expected_flavor_bookmark = self.FLAVOR_BOOKMARK
3332
3639
expected_now = self.TIMESTAMP
3333
3640
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())
3641
server_dict = fixture['server']
3643
for key in ['name', 'id', 'uuid', 'created', 'accessIPv4',
3644
'updated', 'progress', 'status', 'hostId',
3646
self.assertEqual(root.get(key), str(server_dict[key]))
3648
link_nodes = root.findall('{0}link'.format(ATOMNS))
3649
self.assertEqual(len(link_nodes), 2)
3650
for i, link in enumerate(server_dict['links']):
3651
for key, value in link.items():
3652
self.assertEqual(link_nodes[i].get(key), value)
3654
metadata_root = root.find('{0}metadata'.format(NS))
3655
metadata_elems = metadata_root.findall('{0}meta'.format(NS))
3656
self.assertEqual(len(metadata_elems), 2)
3657
for i, metadata_elem in enumerate(metadata_elems):
3658
(meta_key, meta_value) = server_dict['metadata'].items()[i]
3659
self.assertEqual(str(metadata_elem.get('key')), str(meta_key))
3660
self.assertEqual(str(metadata_elem.text).strip(), str(meta_value))
3662
image_root = root.find('{0}image'.format(NS))
3663
self.assertEqual(image_root.get('id'), server_dict['image']['id'])
3664
link_nodes = image_root.findall('{0}link'.format(ATOMNS))
3665
self.assertEqual(len(link_nodes), 1)
3666
for i, link in enumerate(server_dict['image']['links']):
3667
for key, value in link.items():
3668
self.assertEqual(link_nodes[i].get(key), value)
3670
flavor_root = root.find('{0}flavor'.format(NS))
3671
self.assertEqual(flavor_root.get('id'), server_dict['flavor']['id'])
3672
link_nodes = flavor_root.findall('{0}link'.format(ATOMNS))
3673
self.assertEqual(len(link_nodes), 1)
3674
for i, link in enumerate(server_dict['flavor']['links']):
3675
for key, value in link.items():
3676
self.assertEqual(link_nodes[i].get(key), value)
3678
addresses_root = root.find('{0}addresses'.format(NS))
3679
addresses_dict = server_dict['addresses']
3680
network_elems = addresses_root.findall('{0}network'.format(NS))
3681
self.assertEqual(len(network_elems), 2)
3682
for i, network_elem in enumerate(network_elems):
3683
network = addresses_dict.items()[i]
3684
self.assertEqual(str(network_elem.get('id')), str(network[0]))
3685
ip_elems = network_elem.findall('{0}ip'.format(NS))
3686
for z, ip_elem in enumerate(ip_elems):
3688
self.assertEqual(str(ip_elem.get('version')),
3690
self.assertEqual(str(ip_elem.get('addr')),
3376
3693
def test_create(self):
3377
3694
serializer = servers.ServerXMLSerializer()
3453
3774
expected_flavor_bookmark = self.FLAVOR_BOOKMARK
3454
3775
expected_now = self.TIMESTAMP
3455
3776
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())
3777
server_dict = fixture['server']
3779
for key in ['name', 'id', 'uuid', 'created', 'accessIPv4',
3780
'updated', 'progress', 'status', 'hostId',
3781
'accessIPv6', 'adminPass']:
3782
self.assertEqual(root.get(key), str(server_dict[key]))
3784
link_nodes = root.findall('{0}link'.format(ATOMNS))
3785
self.assertEqual(len(link_nodes), 2)
3786
for i, link in enumerate(server_dict['links']):
3787
for key, value in link.items():
3788
self.assertEqual(link_nodes[i].get(key), value)
3790
metadata_root = root.find('{0}metadata'.format(NS))
3791
metadata_elems = metadata_root.findall('{0}meta'.format(NS))
3792
self.assertEqual(len(metadata_elems), 2)
3793
for i, metadata_elem in enumerate(metadata_elems):
3794
(meta_key, meta_value) = server_dict['metadata'].items()[i]
3795
self.assertEqual(str(metadata_elem.get('key')), str(meta_key))
3796
self.assertEqual(str(metadata_elem.text).strip(), str(meta_value))
3798
image_root = root.find('{0}image'.format(NS))
3799
self.assertEqual(image_root.get('id'), server_dict['image']['id'])
3800
link_nodes = image_root.findall('{0}link'.format(ATOMNS))
3801
self.assertEqual(len(link_nodes), 1)
3802
for i, link in enumerate(server_dict['image']['links']):
3803
for key, value in link.items():
3804
self.assertEqual(link_nodes[i].get(key), value)
3806
flavor_root = root.find('{0}flavor'.format(NS))
3807
self.assertEqual(flavor_root.get('id'), server_dict['flavor']['id'])
3808
link_nodes = flavor_root.findall('{0}link'.format(ATOMNS))
3809
self.assertEqual(len(link_nodes), 1)
3810
for i, link in enumerate(server_dict['flavor']['links']):
3811
for key, value in link.items():
3812
self.assertEqual(link_nodes[i].get(key), value)
3814
addresses_root = root.find('{0}addresses'.format(NS))
3815
addresses_dict = server_dict['addresses']
3816
network_elems = addresses_root.findall('{0}network'.format(NS))
3817
self.assertEqual(len(network_elems), 2)
3818
for i, network_elem in enumerate(network_elems):
3819
network = addresses_dict.items()[i]
3820
self.assertEqual(str(network_elem.get('id')), str(network[0]))
3821
ip_elems = network_elem.findall('{0}ip'.format(NS))
3822
for z, ip_elem in enumerate(ip_elems):
3824
self.assertEqual(str(ip_elem.get('version')),
3826
self.assertEqual(str(ip_elem.get('addr')),
3499
3829
def test_index(self):
3500
3830
serializer = servers.ServerXMLSerializer()
3537
3867
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())
3869
root = etree.XML(output)
3870
xmlutil.validate_schema(root, 'servers_index')
3871
server_elems = root.findall('{0}server'.format(NS))
3872
self.assertEqual(len(server_elems), 2)
3873
for i, server_elem in enumerate(server_elems):
3874
server_dict = fixture['servers'][i]
3875
for key in ['name', 'id']:
3876
self.assertEqual(server_elem.get(key), str(server_dict[key]))
3878
link_nodes = server_elem.findall('{0}link'.format(ATOMNS))
3879
self.assertEqual(len(link_nodes), 2)
3880
for i, link in enumerate(server_dict['links']):
3881
for key, value in link.items():
3882
self.assertEqual(link_nodes[i].get(key), value)
3556
3884
def test_detail(self):
3557
3885
serializer = servers.ServerXMLSerializer()
3677
4009
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())
4011
root = etree.XML(output)
4012
xmlutil.validate_schema(root, 'servers')
4013
server_elems = root.findall('{0}server'.format(NS))
4014
self.assertEqual(len(server_elems), 2)
4015
for i, server_elem in enumerate(server_elems):
4016
server_dict = fixture['servers'][i]
4018
for key in ['name', 'id', 'uuid', 'created', 'accessIPv4',
4019
'updated', 'progress', 'status', 'hostId',
4021
self.assertEqual(server_elem.get(key), str(server_dict[key]))
4023
link_nodes = server_elem.findall('{0}link'.format(ATOMNS))
4024
self.assertEqual(len(link_nodes), 2)
4025
for i, link in enumerate(server_dict['links']):
4026
for key, value in link.items():
4027
self.assertEqual(link_nodes[i].get(key), value)
4029
metadata_root = server_elem.find('{0}metadata'.format(NS))
4030
metadata_elems = metadata_root.findall('{0}meta'.format(NS))
4031
for i, metadata_elem in enumerate(metadata_elems):
4032
(meta_key, meta_value) = server_dict['metadata'].items()[i]
4033
self.assertEqual(str(metadata_elem.get('key')), str(meta_key))
4034
self.assertEqual(str(metadata_elem.text).strip(),
4037
image_root = server_elem.find('{0}image'.format(NS))
4038
self.assertEqual(image_root.get('id'), server_dict['image']['id'])
4039
link_nodes = image_root.findall('{0}link'.format(ATOMNS))
4040
self.assertEqual(len(link_nodes), 1)
4041
for i, link in enumerate(server_dict['image']['links']):
4042
for key, value in link.items():
4043
self.assertEqual(link_nodes[i].get(key), value)
4045
flavor_root = server_elem.find('{0}flavor'.format(NS))
4046
self.assertEqual(flavor_root.get('id'),
4047
server_dict['flavor']['id'])
4048
link_nodes = flavor_root.findall('{0}link'.format(ATOMNS))
4049
self.assertEqual(len(link_nodes), 1)
4050
for i, link in enumerate(server_dict['flavor']['links']):
4051
for key, value in link.items():
4052
self.assertEqual(link_nodes[i].get(key), value)
4054
addresses_root = server_elem.find('{0}addresses'.format(NS))
4055
addresses_dict = server_dict['addresses']
4056
network_elems = addresses_root.findall('{0}network'.format(NS))
4057
for i, network_elem in enumerate(network_elems):
4058
network = addresses_dict.items()[i]
4059
self.assertEqual(str(network_elem.get('id')), str(network[0]))
4060
ip_elems = network_elem.findall('{0}ip'.format(NS))
4061
for z, ip_elem in enumerate(ip_elems):
4063
self.assertEqual(str(ip_elem.get('version')),
4065
self.assertEqual(str(ip_elem.get('addr')),
3744
4068
def test_update(self):
3745
4069
serializer = servers.ServerXMLSerializer()
3820
4148
expected_flavor_bookmark = self.FLAVOR_BOOKMARK
3821
4149
expected_now = self.TIMESTAMP
3822
4150
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())
4151
server_dict = fixture['server']
4153
for key in ['name', 'id', 'uuid', 'created', 'accessIPv4',
4154
'updated', 'progress', 'status', 'hostId',
4156
self.assertEqual(root.get(key), str(server_dict[key]))
4158
link_nodes = root.findall('{0}link'.format(ATOMNS))
4159
self.assertEqual(len(link_nodes), 2)
4160
for i, link in enumerate(server_dict['links']):
4161
for key, value in link.items():
4162
self.assertEqual(link_nodes[i].get(key), value)
4164
metadata_root = root.find('{0}metadata'.format(NS))
4165
metadata_elems = metadata_root.findall('{0}meta'.format(NS))
4166
self.assertEqual(len(metadata_elems), 2)
4167
for i, metadata_elem in enumerate(metadata_elems):
4168
(meta_key, meta_value) = server_dict['metadata'].items()[i]
4169
self.assertEqual(str(metadata_elem.get('key')), str(meta_key))
4170
self.assertEqual(str(metadata_elem.text).strip(), str(meta_value))
4172
image_root = root.find('{0}image'.format(NS))
4173
self.assertEqual(image_root.get('id'), server_dict['image']['id'])
4174
link_nodes = image_root.findall('{0}link'.format(ATOMNS))
4175
self.assertEqual(len(link_nodes), 1)
4176
for i, link in enumerate(server_dict['image']['links']):
4177
for key, value in link.items():
4178
self.assertEqual(link_nodes[i].get(key), value)
4180
flavor_root = root.find('{0}flavor'.format(NS))
4181
self.assertEqual(flavor_root.get('id'), server_dict['flavor']['id'])
4182
link_nodes = flavor_root.findall('{0}link'.format(ATOMNS))
4183
self.assertEqual(len(link_nodes), 1)
4184
for i, link in enumerate(server_dict['flavor']['links']):
4185
for key, value in link.items():
4186
self.assertEqual(link_nodes[i].get(key), value)
4188
addresses_root = root.find('{0}addresses'.format(NS))
4189
addresses_dict = server_dict['addresses']
4190
network_elems = addresses_root.findall('{0}network'.format(NS))
4191
self.assertEqual(len(network_elems), 2)
4192
for i, network_elem in enumerate(network_elems):
4193
network = addresses_dict.items()[i]
4194
self.assertEqual(str(network_elem.get('id')), str(network[0]))
4195
ip_elems = network_elem.findall('{0}ip'.format(NS))
4196
for z, ip_elem in enumerate(ip_elems):
4198
self.assertEqual(str(ip_elem.get('version')),
4200
self.assertEqual(str(ip_elem.get('addr')),