summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorMauro S. M. Rodrigues <maurosr@linux.vnet.ibm.com>2012-11-22 13:30:25 -0500
committerMauro S. M. Rodrigues <maurosr@linux.vnet.ibm.com>2012-11-22 13:30:25 -0500
commitf58f2b48a1c5ebb01ef998720e5dbd1d88ed6e5d (patch)
tree5ce55afdf2afc789b128a40e1e03013dfcc146cc /nova
parente6ba5845cd0bebc5c606e976296164081fbbfcd3 (diff)
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
Diffstat (limited to 'nova')
-rw-r--r--nova/api/openstack/compute/contrib/hosts.py16
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_hosts.py11
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 = ("<?xml version='1.0' encoding='UTF-8'?>\n"
- '<updates><status>enabled</status><foo>bar</foo></updates>')
+ exemplar = dict(status='enabled', maintenance_mode='disable')
+ intext = """<?xml version='1.0' encoding='UTF-8'?>
+ <updates>
+ <status>enabled</status>
+ <maintenance_mode>disable</maintenance_mode>
+ </updates>"""
result = self.deserializer.deserialize(intext)
self.assertEqual(dict(body=exemplar), result)