From f58f2b48a1c5ebb01ef998720e5dbd1d88ed6e5d Mon Sep 17 00:00:00 2001 From: "Mauro S. M. Rodrigues" Date: Thu, 22 Nov 2012 13:30:25 -0500 Subject: Fix HostDeserializer to enable multiple line xml Fixes bug: 1082132 The current HostDeserializer wasn't able to deal with multiple line xml inputs. Since the HostDeserializer is used only on the update operation this patch renames it to HostUpdateDeserializer, and parses only the valid options (status and maintenance_mode). Change-Id: I9ec3b296a07e0fc903da1c005cf7bd5dcb08fd1b --- nova/api/openstack/compute/contrib/hosts.py | 16 ++++++++++++---- nova/tests/api/openstack/compute/contrib/test_hosts.py | 11 +++++++---- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/nova/api/openstack/compute/contrib/hosts.py b/nova/api/openstack/compute/contrib/hosts.py index 3479e41e2..8982f5724 100644 --- a/nova/api/openstack/compute/contrib/hosts.py +++ b/nova/api/openstack/compute/contrib/hosts.py @@ -70,7 +70,7 @@ class HostShowTemplate(xmlutil.TemplateBuilder): return xmlutil.MasterTemplate(root, 1) -class HostDeserializer(wsgi.XMLDeserializer): +class HostUpdateDeserializer(wsgi.XMLDeserializer): def default(self, string): try: node = minidom.parseString(string) @@ -79,8 +79,16 @@ class HostDeserializer(wsgi.XMLDeserializer): raise exception.MalformedRequestBody(reason=msg) updates = {} - for child in node.childNodes[0].childNodes: - updates[child.tagName] = self.extract_text(child) + updates_node = self.find_first_child_named(node, 'updates') + if updates_node is not None: + maintenance = self.find_first_child_named(updates_node, + 'maintenance_mode') + if maintenance is not None: + updates[maintenance.tagName] = self.extract_text(maintenance) + + status = self.find_first_child_named(updates_node, 'status') + if status is not None: + updates[status.tagName] = self.extract_text(status) return dict(body=updates) @@ -131,7 +139,7 @@ class HostController(object): return {'hosts': _list_hosts(req)} @wsgi.serializers(xml=HostUpdateTemplate) - @wsgi.deserializers(xml=HostDeserializer) + @wsgi.deserializers(xml=HostUpdateDeserializer) @check_host def update(self, req, id, body): authorize(req.environ['nova.context']) diff --git a/nova/tests/api/openstack/compute/contrib/test_hosts.py b/nova/tests/api/openstack/compute/contrib/test_hosts.py index 8313cb00e..f56170a06 100644 --- a/nova/tests/api/openstack/compute/contrib/test_hosts.py +++ b/nova/tests/api/openstack/compute/contrib/test_hosts.py @@ -272,7 +272,7 @@ class HostTestCase(test.TestCase): class HostSerializerTest(test.TestCase): def setUp(self): super(HostSerializerTest, self).setUp() - self.deserializer = os_hosts.HostDeserializer() + self.deserializer = os_hosts.HostUpdateDeserializer() def test_index_serializer(self): serializer = os_hosts.HostIndexTemplate() @@ -336,9 +336,12 @@ class HostSerializerTest(test.TestCase): self.assertEqual(value, tree.get(key)) def test_update_deserializer(self): - exemplar = dict(status='enabled', foo='bar') - intext = ("\n" - 'enabledbar') + exemplar = dict(status='enabled', maintenance_mode='disable') + intext = """ + + enabled + disable + """ result = self.deserializer.deserialize(intext) self.assertEqual(dict(body=exemplar), result) -- cgit