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 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'nova/api') 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']) -- cgit