From 2ba27f66cf14e1cb111ebc93d094c6e77c55245f Mon Sep 17 00:00:00 2001 From: Dan Smith Date: Thu, 27 Sep 2012 13:59:29 -0700 Subject: [PATCH] Fix CloudPipe extension XML serialization It is completely broken right now and this fixes it to properly traverse a list of cloudpipe instance dictionaries, resulting in XML output that matches the API spec. Fixes bug: 1056242 Change-Id: Ic768afeaa76d776fd55a4f618d14fa41ed4c8a63 --- nova/api/openstack/compute/contrib/cloudpipe.py | 14 ++++++++++---- .../openstack/compute/contrib/test_cloudpipe.py | 11 +++++------ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/nova/api/openstack/compute/contrib/cloudpipe.py b/nova/api/openstack/compute/contrib/cloudpipe.py index f38a1b12a5a..48b6413480b 100644 --- a/nova/api/openstack/compute/contrib/cloudpipe.py +++ b/nova/api/openstack/compute/contrib/cloudpipe.py @@ -37,15 +37,21 @@ class CloudpipeTemplate(xmlutil.TemplateBuilder): def construct(self): - return xmlutil.MasterTemplate(xmlutil.make_flat_dict('cloudpipe'), 1) + root = xmlutil.TemplateElement('cloudpipe') + elem = xmlutil.SubTemplateElement(root, 'instance_id', + selector='instance_id') + elem.text = str + return xmlutil.MasterTemplate(root, 1) class CloudpipesTemplate(xmlutil.TemplateBuilder): def construct(self): root = xmlutil.TemplateElement('cloudpipes') - elem = xmlutil.make_flat_dict('cloudpipe', selector='cloudpipes', - subselector='cloudpipe') - root.append(elem) + elem1 = xmlutil.SubTemplateElement(root, 'cloudpipe', + selector='cloudpipes') + elem2 = xmlutil.SubTemplateElement(elem1, xmlutil.Selector(0), + selector=xmlutil.get_items) + elem2.text = 1 return xmlutil.MasterTemplate(root, 1) diff --git a/nova/tests/api/openstack/compute/contrib/test_cloudpipe.py b/nova/tests/api/openstack/compute/contrib/test_cloudpipe.py index bb0eafe6689..97b78f81e88 100644 --- a/nova/tests/api/openstack/compute/contrib/test_cloudpipe.py +++ b/nova/tests/api/openstack/compute/contrib/test_cloudpipe.py @@ -152,25 +152,24 @@ def test_default_serializer(self): def test_index_serializer(self): serializer = cloudpipe.CloudpipesTemplate() exemplar = dict(cloudpipes=[ - dict(cloudpipe=dict( + dict( project_id='1234', public_ip='1.2.3.4', public_port='321', instance_id='1234-1234-1234-1234', created_at=timeutils.isotime(), - state='running')), - dict(cloudpipe=dict( + state='running'), + dict( project_id='4321', public_ip='4.3.2.1', public_port='123', - state='pending'))]) + state='pending')]) text = serializer.serialize(exemplar) tree = etree.fromstring(text) self.assertEqual('cloudpipes', tree.tag) self.assertEqual(len(exemplar['cloudpipes']), len(tree)) for idx, cl_pipe in enumerate(tree): - self.assertEqual('cloudpipe', cl_pipe.tag) - kp_data = exemplar['cloudpipes'][idx]['cloudpipe'] + kp_data = exemplar['cloudpipes'][idx] for child in cl_pipe: self.assertTrue(child.tag in kp_data) self.assertEqual(child.text, kp_data[child.tag])