Merge lp:~rackspace-titan/nova/osapi-addresses-serialization into lp:~hudson-openstack/nova/trunk

Proposed by Brian Waldon
Status: Merged
Approved by: Devin Carlen
Approved revision: 1312
Merged at revision: 1319
Proposed branch: lp:~rackspace-titan/nova/osapi-addresses-serialization
Merge into: lp:~hudson-openstack/nova/trunk
Diff against target: 163 lines (+104/-11)
2 files modified
nova/api/openstack/ips.py (+46/-10)
nova/tests/api/openstack/test_servers.py (+58/-1)
To merge this branch: bzr merge lp:~rackspace-titan/nova/osapi-addresses-serialization
Reviewer Review Type Date Requested Status
Devin Carlen (community) Approve
Vish Ishaya (community) Approve
Review via email: mp+69168@code.launchpad.net

Description of the change

Adds proper xml serialization for /servers/<id>/ips and /servers/<id>/ips/<network_name>

To post a comment you must log in.
Revision history for this message
Vish Ishaya (vishvananda) wrote :

lgtm

review: Approve
Revision history for this message
Devin Carlen (devcamcar) wrote :

lgtm

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'nova/api/openstack/ips.py'
2--- nova/api/openstack/ips.py 2011-07-21 14:02:16 +0000
3+++ nova/api/openstack/ips.py 2011-07-25 21:12:27 +0000
4@@ -16,6 +16,7 @@
5 # under the License.
6
7 import time
8+from xml.dom import minidom
9
10 from webob import exc
11
12@@ -100,17 +101,51 @@
13 return nova.api.openstack.views.addresses.ViewBuilderV11()
14
15
16+class IPXMLSerializer(wsgi.XMLDictSerializer):
17+ def __init__(self, xmlns=wsgi.XMLNS_V11):
18+ super(IPXMLSerializer, self).__init__(xmlns=xmlns)
19+
20+ def _ip_to_xml(self, xml_doc, ip_dict):
21+ ip_node = xml_doc.createElement('ip')
22+ ip_node.setAttribute('addr', ip_dict['addr'])
23+ ip_node.setAttribute('version', str(ip_dict['version']))
24+ return ip_node
25+
26+ def _network_to_xml(self, xml_doc, network_id, ip_dicts):
27+ network_node = xml_doc.createElement('network')
28+ network_node.setAttribute('id', network_id)
29+
30+ for ip_dict in ip_dicts:
31+ ip_node = self._ip_to_xml(xml_doc, ip_dict)
32+ network_node.appendChild(ip_node)
33+
34+ return network_node
35+
36+ def networks_to_xml(self, xml_doc, networks_container):
37+ addresses_node = xml_doc.createElement('addresses')
38+ for (network_id, ip_dicts) in networks_container.items():
39+ network_node = self._network_to_xml(xml_doc, network_id, ip_dicts)
40+ addresses_node.appendChild(network_node)
41+ return addresses_node
42+
43+ def show(self, network_container):
44+ (network_id, ip_dicts) = network_container.items()[0]
45+ xml_doc = minidom.Document()
46+ node = self._network_to_xml(xml_doc, network_id, ip_dicts)
47+ return self.to_xml_string(node, False)
48+
49+ def index(self, addresses_container):
50+ xml_doc = minidom.Document()
51+ node = self.networks_to_xml(xml_doc, addresses_container['addresses'])
52+ return self.to_xml_string(node, False)
53+
54+
55 def create_resource(version):
56 controller = {
57 '1.0': ControllerV10,
58 '1.1': ControllerV11,
59 }[version]()
60
61- xmlns = {
62- '1.0': wsgi.XMLNS_V10,
63- '1.1': wsgi.XMLNS_V11,
64- }[version]
65-
66 metadata = {
67 'list_collections': {
68 'public': {'item_name': 'ip', 'item_key': 'addr'},
69@@ -118,10 +153,11 @@
70 },
71 }
72
73- body_serializers = {
74- 'application/xml': wsgi.XMLDictSerializer(metadata=metadata,
75- xmlns=xmlns),
76- }
77- serializer = wsgi.ResponseSerializer(body_serializers)
78+ xml_serializer = {
79+ '1.0': wsgi.XMLDictSerializer(metadata=metadata, xmlns=wsgi.XMLNS_V11),
80+ '1.1': IPXMLSerializer(),
81+ }[version]
82+
83+ serializer = wsgi.ResponseSerializer({'application/xml': xml_serializer})
84
85 return wsgi.Resource(controller, serializer=serializer)
86
87=== modified file 'nova/tests/api/openstack/test_servers.py'
88--- nova/tests/api/openstack/test_servers.py 2011-07-25 19:36:28 +0000
89+++ nova/tests/api/openstack/test_servers.py 2011-07-25 21:12:27 +0000
90@@ -30,8 +30,9 @@
91 from nova import test
92 from nova import utils
93 import nova.api.openstack
94+from nova.api.openstack import create_instance_helper
95 from nova.api.openstack import servers
96-from nova.api.openstack import create_instance_helper
97+from nova.api.openstack import wsgi
98 import nova.compute.api
99 from nova.compute import instance_types
100 from nova.compute import power_state
101@@ -2200,6 +2201,62 @@
102 "http://localhost:8774/v1.1/images/1")
103
104
105+class TextAddressesXMLSerialization(test.TestCase):
106+
107+ serializer = nova.api.openstack.ips.IPXMLSerializer()
108+
109+ def test_show(self):
110+ fixture = {
111+ 'network_2': [
112+ {'addr': '192.168.0.1', 'version': 4},
113+ {'addr': 'fe80::beef', 'version': 6},
114+ ],
115+ }
116+ output = self.serializer.serialize(fixture, 'show')
117+ actual = minidom.parseString(output.replace(" ", ""))
118+
119+ expected = minidom.parseString("""
120+ <network xmlns="http://docs.openstack.org/compute/api/v1.1"
121+ id="network_2">
122+ <ip version="4" addr="192.168.0.1"/>
123+ <ip version="6" addr="fe80::beef"/>
124+ </network>
125+ """.replace(" ", ""))
126+
127+ self.assertEqual(expected.toxml(), actual.toxml())
128+
129+ def test_index(self):
130+ fixture = {
131+ 'addresses': {
132+ 'network_1': [
133+ {'addr': '192.168.0.3', 'version': 4},
134+ {'addr': '192.168.0.5', 'version': 4},
135+ ],
136+ 'network_2': [
137+ {'addr': '192.168.0.1', 'version': 4},
138+ {'addr': 'fe80::beef', 'version': 6},
139+ ],
140+ },
141+ }
142+ output = self.serializer.serialize(fixture, 'index')
143+ actual = minidom.parseString(output.replace(" ", ""))
144+
145+ expected = minidom.parseString("""
146+ <addresses xmlns="http://docs.openstack.org/compute/api/v1.1">
147+ <network id="network_2">
148+ <ip version="4" addr="192.168.0.1"/>
149+ <ip version="6" addr="fe80::beef"/>
150+ </network>
151+ <network id="network_1">
152+ <ip version="4" addr="192.168.0.3"/>
153+ <ip version="4" addr="192.168.0.5"/>
154+ </network>
155+ </addresses>
156+ """.replace(" ", ""))
157+
158+ self.assertEqual(expected.toxml(), actual.toxml())
159+
160+
161 class TestServerInstanceCreation(test.TestCase):
162
163 def setUp(self):