From 479b55aefadd88e59a6cd489a39df53fecc46bdf Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Wed, 6 Jul 2011 13:19:37 -0400 Subject: updated expected xml in images show test to represent current spec --- nova/tests/api/openstack/test_images.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index 1e046531c..9291997bc 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -1161,7 +1161,9 @@ class ImageXMLSerializationTest(test.TestCase): TIMESTAMP = "2010-10-11T10:30:22Z" SERVER_HREF = 'http://localhost/v1.1/servers/123' + SERVER_BOOKMARK = 'http://localhost/servers/123' IMAGE_HREF = 'http://localhost/v1.1/images/%s' + IMAGE_BOOKMARK = 'http://localhost/images/%s' def test_show(self): serializer = images.ImageXMLSerializer() @@ -1181,7 +1183,6 @@ class ImageXMLSerializationTest(test.TestCase): { 'href': self.IMAGE_HREF % (1,), 'rel': 'bookmark', - 'type': 'application/json', }, ], }, @@ -1191,24 +1192,27 @@ class ImageXMLSerializationTest(test.TestCase): actual = minidom.parseString(output.replace(" ", "")) expected_server_href = self.SERVER_HREF + expected_server_bookmark = self.SERVER_BOOKMARK_ expected_href = self.IMAGE_HREF % (1, ) + expected_bookmark = self.IMAGE_BOOKMARK % (1, ) expected_now = self.TIMESTAMP expected = minidom.parseString(""" - - - + progress="80"> + + + + + + - - value1 - + value1 """.replace(" ", "") % (locals())) -- cgit From 94a6af26e46d4df35294ad0bf4dc4883b7bf052e Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Wed, 6 Jul 2011 14:47:41 -0400 Subject: Further test update and begin correcting serialization --- nova/api/openstack/images.py | 5 +++-- nova/tests/api/openstack/test_images.py | 30 ++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py index bde9507c8..2e3d4f157 100644 --- a/nova/api/openstack/images.py +++ b/nova/api/openstack/images.py @@ -267,8 +267,9 @@ class ImageXMLSerializer(wsgi.XMLDictSerializer): metadata = { "attributes": { "image": ["id", "name", "updated", "created", "status", - "serverId", "progress", "serverRef"], - "link": ["rel", "type", "href"], + "serverId", "progress"], + "link": ["rel", "href"], + "server": ["name", "id"], }, } diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index 9291997bc..4f00ac1f8 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -1168,14 +1168,29 @@ class ImageXMLSerializationTest(test.TestCase): def test_show(self): serializer = images.ImageXMLSerializer() + #so we can see the full diff in the output + self.maxDiff = None fixture = { 'image': { 'id': 1, 'name': 'Image1', 'created': self.TIMESTAMP, 'updated': self.TIMESTAMP, - 'serverRef': self.SERVER_HREF, 'status': 'ACTIVE', + 'server': { + 'id': 1, + 'name': 'Server1', + 'links': [ + { + 'href': self.SERVER_BOOKMARK, + 'rel': 'bookmark', + }, + { + 'href': self.SERVER_HREF, + 'rel': 'self', + }, + ], + }, 'metadata': { 'key1': 'value1', }, @@ -1184,6 +1199,10 @@ class ImageXMLSerializationTest(test.TestCase): 'href': self.IMAGE_HREF % (1,), 'rel': 'bookmark', }, + { + 'href': self.IMAGE_BOOKMARK % (1,), + 'rel': 'self', + }, ], }, } @@ -1192,7 +1211,7 @@ class ImageXMLSerializationTest(test.TestCase): actual = minidom.parseString(output.replace(" ", "")) expected_server_href = self.SERVER_HREF - expected_server_bookmark = self.SERVER_BOOKMARK_ + expected_server_bookmark = self.SERVER_BOOKMARK expected_href = self.IMAGE_HREF % (1, ) expected_bookmark = self.IMAGE_BOOKMARK % (1, ) expected_now = self.TIMESTAMP @@ -1205,18 +1224,21 @@ class ImageXMLSerializationTest(test.TestCase): created="%(expected_now)s" status="ACTIVE" progress="80"> - + - value1 + + value1 + """.replace(" ", "") % (locals())) + print actual.toxml() self.assertEqual(expected.toxml(), actual.toxml()) def test_show_zero_metadata(self): -- cgit From 0415c413872697c6f9fecc28928af0525780f868 Mon Sep 17 00:00:00 2001 From: Mark Washenberger Date: Wed, 6 Jul 2011 16:40:00 -0400 Subject: correct test_show --- nova/api/openstack/images.py | 70 ++++++++++++++++++++++----------- nova/tests/api/openstack/test_images.py | 23 ++++++----- 2 files changed, 61 insertions(+), 32 deletions(-) diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py index 2e3d4f157..750b034b9 100644 --- a/nova/api/openstack/images.py +++ b/nova/api/openstack/images.py @@ -262,34 +262,60 @@ class ControllerV11(Controller): return {'instance_ref': server_ref} -class ImageXMLSerializer(wsgi.XMLDictSerializer): +class ImageXMLSerializer(wsgi.DictSerializer): - metadata = { - "attributes": { - "image": ["id", "name", "updated", "created", "status", - "serverId", "progress"], - "link": ["rel", "href"], - "server": ["name", "id"], - }, - } - - xmlns = wsgi.XMLNS_V11 + xmlns = {'': wsgi.XMLNS_V11, 'atom': "http://www.w3.org/2005/Atom"} def __init__(self): self.metadata_serializer = image_metadata.ImageMetadataXMLSerializer() + def _add_xmlns(self, node): + for key, ns in self.xmlns.iteritems(): + if key is not '': + name = 'xmlns:%s' % key + else: + name = 'xmlns' + node.setAttribute(name, ns) + def _image_to_xml(self, xml_doc, image): - try: - metadata = image.pop('metadata').items() - except Exception: - LOG.debug(_("Image object missing metadata attribute")) - metadata = {} + image_node = xml_doc.createElement('image') + self._add_image_attributes(image_node, image) - node = self._to_xml_node(xml_doc, self.metadata, 'image', image) - metadata_node = self.metadata_serializer.meta_list_to_xml(xml_doc, - metadata) - node.appendChild(metadata_node) - return node + server_node = self._create_server_node(xml_doc, image['server']) + image_node.appendChild(server_node) + + metadata = image.get('metadata', {}) + metadata_node = self._create_metadata_node(xml_doc, metadata.items()) + image_node.appendChild(metadata_node) + + self._add_atom_links(xml_doc, image_node, image['links']) + + return image_node + + def _add_image_attributes(self, node, image): + node.setAttribute('id', str(image['id'])) + node.setAttribute('name', image['name']) + node.setAttribute('created', image['created']) + node.setAttribute('updated', image['updated']) + node.setAttribute('status', image['status']) + node.setAttribute('progress', str(image['progress'])) + + def _create_server_node(self, xml_doc, server): + server_node = xml_doc.createElement('server') + server_node.setAttribute('id', str(server['id'])) + server_node.setAttribute('name', server['name']) + self._add_atom_links(xml_doc, server_node, server['links']) + return server_node + + def _create_metadata_node(self, xml_doc, metadata): + return self.metadata_serializer.meta_list_to_xml(xml_doc, metadata) + + def _add_atom_links(self, xml_doc, node, links): + for link in links: + link_node = xml_doc.createElement('atom:link') + link_node.setAttribute('rel', link['rel']) + link_node.setAttribute('href', link['href']) + node.appendChild(link_node) def _image_list_to_xml(self, xml_doc, images): container_node = xml_doc.createElement('images') @@ -307,7 +333,7 @@ class ImageXMLSerializer(wsgi.XMLDictSerializer): def _image_list_to_xml_string(self, images): xml_doc = minidom.Document() container_node = self._image_list_to_xml(xml_doc, images) - self._add_xmlns(container_node) + self._add_xmlns(item_node) return container_node.toprettyxml(indent=' ') def detail(self, images_dict): diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index 4f00ac1f8..873607997 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -1177,18 +1177,19 @@ class ImageXMLSerializationTest(test.TestCase): 'created': self.TIMESTAMP, 'updated': self.TIMESTAMP, 'status': 'ACTIVE', + 'progress': 80, 'server': { 'id': 1, 'name': 'Server1', 'links': [ - { - 'href': self.SERVER_BOOKMARK, - 'rel': 'bookmark', - }, { 'href': self.SERVER_HREF, 'rel': 'self', }, + { + 'href': self.SERVER_BOOKMARK, + 'rel': 'bookmark', + }, ], }, 'metadata': { @@ -1197,11 +1198,11 @@ class ImageXMLSerializationTest(test.TestCase): 'links': [ { 'href': self.IMAGE_HREF % (1,), - 'rel': 'bookmark', + 'rel': 'self', }, { 'href': self.IMAGE_BOOKMARK % (1,), - 'rel': 'self', + 'rel': 'bookmark', }, ], }, @@ -1225,19 +1226,21 @@ class ImageXMLSerializationTest(test.TestCase): status="ACTIVE" progress="80"> - - + + - - value1 + + """.replace(" ", "") % (locals())) + print expected.toxml() + print '---' print actual.toxml() self.assertEqual(expected.toxml(), actual.toxml()) -- cgit From 8caf69dc93d9112e9be8989cd2136a407e09df44 Mon Sep 17 00:00:00 2001 From: Mark Washenberger Date: Thu, 7 Jul 2011 09:24:40 -0400 Subject: progress and server are optional --- nova/api/openstack/images.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py index 750b034b9..eaa7aef5a 100644 --- a/nova/api/openstack/images.py +++ b/nova/api/openstack/images.py @@ -281,8 +281,9 @@ class ImageXMLSerializer(wsgi.DictSerializer): image_node = xml_doc.createElement('image') self._add_image_attributes(image_node, image) - server_node = self._create_server_node(xml_doc, image['server']) - image_node.appendChild(server_node) + if 'server' in image: + server_node = self._create_server_node(xml_doc, image['server']) + image_node.appendChild(server_node) metadata = image.get('metadata', {}) metadata_node = self._create_metadata_node(xml_doc, metadata.items()) @@ -298,7 +299,8 @@ class ImageXMLSerializer(wsgi.DictSerializer): node.setAttribute('created', image['created']) node.setAttribute('updated', image['updated']) node.setAttribute('status', image['status']) - node.setAttribute('progress', str(image['progress'])) + if 'progress' in image: + node.setAttribute('progress', str(image['progress'])) def _create_server_node(self, xml_doc, server): server_node = xml_doc.createElement('server') @@ -333,7 +335,7 @@ class ImageXMLSerializer(wsgi.DictSerializer): def _image_list_to_xml_string(self, images): xml_doc = minidom.Document() container_node = self._image_list_to_xml(xml_doc, images) - self._add_xmlns(item_node) + self._add_xmlns(container_node) return container_node.toprettyxml(indent=' ') def detail(self, images_dict): -- cgit From b50e92d43f958bf966fce4f608daa467b40453c1 Mon Sep 17 00:00:00 2001 From: Mark Washenberger Date: Thu, 7 Jul 2011 10:48:17 -0400 Subject: make server and image metadata optional --- nova/api/openstack/images.py | 7 +- nova/tests/api/openstack/test_images.py | 158 +++++++++++++++++++++++++------- 2 files changed, 128 insertions(+), 37 deletions(-) diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py index eaa7aef5a..8746db4e0 100644 --- a/nova/api/openstack/images.py +++ b/nova/api/openstack/images.py @@ -285,9 +285,10 @@ class ImageXMLSerializer(wsgi.DictSerializer): server_node = self._create_server_node(xml_doc, image['server']) image_node.appendChild(server_node) - metadata = image.get('metadata', {}) - metadata_node = self._create_metadata_node(xml_doc, metadata.items()) - image_node.appendChild(metadata_node) + metadata = image.get('metadata', {}).items() + if len(metadata) > 0: + metadata_node = self._create_metadata_node(xml_doc, metadata) + image_node.appendChild(metadata_node) self._add_atom_links(xml_doc, image_node, image['links']) diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index 873607997..25c7001f5 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -1197,11 +1197,11 @@ class ImageXMLSerializationTest(test.TestCase): }, 'links': [ { - 'href': self.IMAGE_HREF % (1,), + 'href': self.IMAGE_HREF % 1, 'rel': 'self', }, { - 'href': self.IMAGE_BOOKMARK % (1,), + 'href': self.IMAGE_BOOKMARK % 1, 'rel': 'bookmark', }, ], @@ -1213,8 +1213,8 @@ class ImageXMLSerializationTest(test.TestCase): expected_server_href = self.SERVER_HREF expected_server_bookmark = self.SERVER_BOOKMARK - expected_href = self.IMAGE_HREF % (1, ) - expected_bookmark = self.IMAGE_BOOKMARK % (1, ) + expected_href = self.IMAGE_HREF % 1 + expected_bookmark = self.IMAGE_BOOKMARK % 1 expected_now = self.TIMESTAMP expected = minidom.parseString(""" """.replace(" ", "") % (locals())) - print expected.toxml() - print '---' - print actual.toxml() self.assertEqual(expected.toxml(), actual.toxml()) def test_show_zero_metadata(self): serializer = images.ImageXMLSerializer() + self.maxDiff = None fixture = { 'image': { 'id': 1, 'name': 'Image1', 'created': self.TIMESTAMP, 'updated': self.TIMESTAMP, - 'serverRef': self.SERVER_HREF, 'status': 'ACTIVE', + 'server': { + 'id': 1, + 'name': 'Server1', + 'links': [ + { + 'href': self.SERVER_HREF, + 'rel': 'self', + }, + { + 'href': self.SERVER_BOOKMARK, + 'rel': 'bookmark', + }, + ], + }, 'metadata': {}, 'links': [ { - 'href': self.IMAGE_HREF % (1,), + 'href': self.IMAGE_HREF % 1, + 'rel': 'self', + }, + { + 'href': self.IMAGE_BOOKMARK % 1, 'rel': 'bookmark', - 'type': 'application/json', }, ], }, @@ -1270,21 +1284,24 @@ class ImageXMLSerializationTest(test.TestCase): actual = minidom.parseString(output.replace(" ", "")) expected_server_href = self.SERVER_HREF - expected_href = self.IMAGE_HREF % (1, ) + expected_server_bookmark = self.SERVER_BOOKMARK + expected_href = self.IMAGE_HREF % 1 + expected_bookmark = self.IMAGE_BOOKMARK % 1 expected_now = self.TIMESTAMP expected = minidom.parseString(""" - - - - + status="ACTIVE"> + + + + + + """.replace(" ", "") % (locals())) @@ -1293,22 +1310,38 @@ class ImageXMLSerializationTest(test.TestCase): def test_show_image_no_metadata_key(self): serializer = images.ImageXMLSerializer() + self.maxDiff = None fixture = { 'image': { 'id': 1, 'name': 'Image1', 'created': self.TIMESTAMP, 'updated': self.TIMESTAMP, - 'serverRef': self.SERVER_HREF, 'status': 'ACTIVE', + 'server': { + 'id': 1, + 'name': 'Server1', + 'links': [ + { + 'href': self.SERVER_HREF, + 'rel': 'self', + }, + { + 'href': self.SERVER_BOOKMARK, + 'rel': 'bookmark', + }, + ], + }, 'links': [ { - 'href': self.IMAGE_HREF % (1,), + 'href': self.IMAGE_HREF % 1, + 'rel': 'self', + }, + { + 'href': self.IMAGE_BOOKMARK % 1, 'rel': 'bookmark', - 'type': 'application/json', }, ], - }, } @@ -1316,21 +1349,78 @@ class ImageXMLSerializationTest(test.TestCase): actual = minidom.parseString(output.replace(" ", "")) expected_server_href = self.SERVER_HREF - expected_href = self.IMAGE_HREF % (1, ) + expected_server_bookmark = self.SERVER_BOOKMARK + expected_href = self.IMAGE_HREF % 1 + expected_bookmark = self.IMAGE_BOOKMARK % 1 expected_now = self.TIMESTAMP expected = minidom.parseString(""" - - - - + status="ACTIVE"> + + + + + + + + """.replace(" ", "") % (locals())) + + self.assertEqual(expected.toxml(), actual.toxml()) + + def test_show_no_server(self): + serializer = images.ImageXMLSerializer() + + #so we can see the full diff in the output + self.maxDiff = None + fixture = { + 'image': { + 'id': 1, + 'name': 'Image1', + 'created': self.TIMESTAMP, + 'updated': self.TIMESTAMP, + 'status': 'ACTIVE', + 'metadata': { + 'key1': 'value1', + }, + 'links': [ + { + 'href': self.IMAGE_HREF % 1, + 'rel': 'self', + }, + { + 'href': self.IMAGE_BOOKMARK % 1, + 'rel': 'bookmark', + }, + ], + }, + } + + output = serializer.serialize(fixture, 'show') + actual = minidom.parseString(output.replace(" ", "")) + + expected_href = self.IMAGE_HREF % 1 + expected_bookmark = self.IMAGE_BOOKMARK % 1 + expected_now = self.TIMESTAMP + expected = minidom.parseString(""" + + + + value1 + + + + """.replace(" ", "") % (locals())) @@ -1528,7 +1618,7 @@ class ImageXMLSerializationTest(test.TestCase): }, 'links': [ { - 'href': self.IMAGE_HREF % (1,), + 'href': self.IMAGE_HREF % 1, 'rel': 'bookmark', 'type': 'application/json', }, @@ -1540,7 +1630,7 @@ class ImageXMLSerializationTest(test.TestCase): actual = minidom.parseString(output.replace(" ", "")) expected_server_href = self.SERVER_HREF - expected_href = self.IMAGE_HREF % (1, ) + expected_href = self.IMAGE_HREF % 1 expected_now = self.TIMESTAMP expected = minidom.parseString(""" Date: Thu, 7 Jul 2011 11:06:35 -0400 Subject: Updated test_detail --- nova/tests/api/openstack/test_images.py | 117 +++++++++++++++++++------------- 1 file changed, 69 insertions(+), 48 deletions(-) diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index 701d8be8a..3e8d4700d 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -1473,84 +1473,105 @@ class ImageXMLSerializationTest(test.TestCase): def test_detail(self): serializer = images.ImageXMLSerializer() - fixtures = { + #so we can see the full diff in the output + self.maxDiff = None + fixture = { 'images': [ { 'id': 1, 'name': 'Image1', 'created': self.TIMESTAMP, 'updated': self.TIMESTAMP, - 'serverRef': self.SERVER_HREF, 'status': 'ACTIVE', - 'metadata': { - 'key1': 'value1', - 'key2': 'value2', + 'server': { + 'id': 1, + 'name': 'Server1', + 'links': [ + { + 'href': self.SERVER_HREF, + 'rel': 'self', + }, + { + 'href': self.SERVER_BOOKMARK, + 'rel': 'bookmark', + }, + ], }, 'links': [ { - 'href': 'http://localhost/v1.1/images/1', + 'href': self.IMAGE_HREF % 1, + 'rel': 'self', + }, + { + 'href': self.IMAGE_BOOKMARK % 1, 'rel': 'bookmark', - 'type': 'application/json', }, ], }, { 'id': 2, - 'name': 'queued image', + 'name': 'Image2', 'created': self.TIMESTAMP, 'updated': self.TIMESTAMP, - 'serverRef': self.SERVER_HREF, - 'metadata': {}, - 'status': 'QUEUED', + 'status': 'SAVING', + 'progress': 80, + 'metadata': { + 'key1': 'value1', + }, 'links': [ { - 'href': 'http://localhost/v1.1/images/2', + 'href': self.IMAGE_HREF % 2, + 'rel': 'self', + }, + { + 'href': self.IMAGE_BOOKMARK % 2, 'rel': 'bookmark', - 'type': 'application/json', }, ], }, - ], + ] } - output = serializer.serialize(fixtures, 'detail') + output = serializer.serialize(fixture, 'detail') actual = minidom.parseString(output.replace(" ", "")) - expected_serverRef = self.SERVER_HREF + expected_server_href = self.SERVER_HREF + expected_server_bookmark = self.SERVER_BOOKMARK + expected_href = self.IMAGE_HREF % 1 + expected_bookmark = self.IMAGE_BOOKMARK % 1 + expected_href_two = self.IMAGE_HREF % 2 + expected_bookmark_two = self.IMAGE_BOOKMARK % 2 expected_now = self.TIMESTAMP expected = minidom.parseString(""" - - - - - - - - value2 - - - value1 - - - - - - - - - + + + + + + + + + + + + + value1 + + + + + """.replace(" ", "") % (locals())) -- cgit From 63d579523985cbd4c896d9a05e523761e1cadb3a Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 7 Jul 2011 11:11:40 -0400 Subject: fixed image create response test --- nova/tests/api/openstack/test_images.py | 44 +++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index 3e8d4700d..c8e7df096 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -1580,22 +1580,41 @@ class ImageXMLSerializationTest(test.TestCase): def test_create(self): serializer = images.ImageXMLSerializer() + #so we can see the full diff in the output + self.maxDiff = None fixture = { 'image': { 'id': 1, 'name': 'Image1', 'created': self.TIMESTAMP, 'updated': self.TIMESTAMP, - 'serverRef': self.SERVER_HREF, - 'status': 'ACTIVE', + 'status': 'SAVING', + 'progress': 80, + 'server': { + 'id': 1, + 'name': 'Server1', + 'links': [ + { + 'href': self.SERVER_HREF, + 'rel': 'self', + }, + { + 'href': self.SERVER_BOOKMARK, + 'rel': 'bookmark', + }, + ], + }, 'metadata': { 'key1': 'value1', }, 'links': [ { 'href': self.IMAGE_HREF % 1, + 'rel': 'self', + }, + { + 'href': self.IMAGE_BOOKMARK % 1, 'rel': 'bookmark', - 'type': 'application/json', }, ], }, @@ -1605,25 +1624,30 @@ class ImageXMLSerializationTest(test.TestCase): actual = minidom.parseString(output.replace(" ", "")) expected_server_href = self.SERVER_HREF + expected_server_bookmark = self.SERVER_BOOKMARK expected_href = self.IMAGE_HREF % 1 + expected_bookmark = self.IMAGE_BOOKMARK % 1 expected_now = self.TIMESTAMP expected = minidom.parseString(""" - - - + status="SAVING" + progress="80"> + + + + value1 + + """.replace(" ", "") % (locals())) -- cgit From ddc33b8163423c5138b40885cb3430104896c676 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 7 Jul 2011 11:36:45 -0400 Subject: Added image index --- nova/api/openstack/images.py | 41 ++++++++++++++----- nova/tests/api/openstack/test_images.py | 71 +++++++++++++-------------------- 2 files changed, 60 insertions(+), 52 deletions(-) diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py index 8746db4e0..a81dd4299 100644 --- a/nova/api/openstack/images.py +++ b/nova/api/openstack/images.py @@ -278,6 +278,13 @@ class ImageXMLSerializer(wsgi.DictSerializer): node.setAttribute(name, ns) def _image_to_xml(self, xml_doc, image): + image_node = xml_doc.createElement('image') + image_node.setAttribute('id', str(image['id'])) + image_node.setAttribute('name', image['name']) + self._add_atom_links(xml_doc, image_node, image['links']) + return image_node + + def _image_to_xml_detailed(self, xml_doc, image): image_node = xml_doc.createElement('image') self._add_image_attributes(image_node, image) @@ -320,33 +327,49 @@ class ImageXMLSerializer(wsgi.DictSerializer): link_node.setAttribute('href', link['href']) node.appendChild(link_node) - def _image_list_to_xml(self, xml_doc, images): + def _image_list_to_xml(self, xml_doc, images, image_to_xml): container_node = xml_doc.createElement('images') for image in images: - item_node = self._image_to_xml(xml_doc, image) + item_node = image_to_xml(xml_doc, image) container_node.appendChild(item_node) return container_node - def _image_to_xml_string(self, image): + def _image_to_xml_string(self, image, detailed): xml_doc = minidom.Document() - item_node = self._image_to_xml(xml_doc, image) + if detailed: + image_to_xml = self._image_to_xml_detailed + else: + image_to_xml = self._image_to_xml + item_node = image_to_xml(xml_doc, image) self._add_xmlns(item_node) return item_node.toprettyxml(indent=' ') - def _image_list_to_xml_string(self, images): + def _image_list_to_xml_string(self, images, detailed): xml_doc = minidom.Document() - container_node = self._image_list_to_xml(xml_doc, images) + if detailed: + image_to_xml = self._image_to_xml_detailed + else: + image_to_xml = self._image_to_xml + container_node = self._image_list_to_xml(xml_doc, images, image_to_xml) + self._add_xmlns(container_node) return container_node.toprettyxml(indent=' ') + def index(self, images_dict): + return self._image_list_to_xml_string(images_dict['images'], + detailed=False) + def detail(self, images_dict): - return self._image_list_to_xml_string(images_dict['images']) + return self._image_list_to_xml_string(images_dict['images'], + detailed=True) def show(self, image_dict): - return self._image_to_xml_string(image_dict['image']) + return self._image_to_xml_string(image_dict['image'], + detailed=True) def create(self, image_dict): - return self._image_to_xml_string(image_dict['image']) + return self._image_to_xml_string(image_dict['image'], + detailed=True) def create_resource(version='1.0'): diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index c8e7df096..cf68f5f53 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -1383,70 +1383,53 @@ class ImageXMLSerializationTest(test.TestCase): def test_index(self): serializer = images.ImageXMLSerializer() - fixtures = { + #so we can see the full diff in the output + self.maxDiff = None + fixture = { 'images': [ { 'id': 1, 'name': 'Image1', - 'created': self.TIMESTAMP, - 'updated': self.TIMESTAMP, - 'serverRef': self.SERVER_HREF, - 'status': 'ACTIVE', 'links': [ { - 'href': 'http://localhost/v1.1/images/1', - 'rel': 'bookmark', - 'type': 'application/json', + 'href': self.IMAGE_HREF % 1, + 'rel': 'self', }, ], }, { 'id': 2, - 'name': 'queued image', - 'created': self.TIMESTAMP, - 'updated': self.TIMESTAMP, - 'serverRef': self.SERVER_HREF, - 'status': 'QUEUED', + 'name': 'Image2', 'links': [ { - 'href': 'http://localhost/v1.1/images/2', - 'rel': 'bookmark', - 'type': 'application/json', + 'href': self.IMAGE_HREF % 2, + 'rel': 'self', }, ], }, - ], + ] } - output = serializer.serialize(fixtures, 'index') + output = serializer.serialize(fixture, 'index') actual = minidom.parseString(output.replace(" ", "")) - expected_serverRef = self.SERVER_HREF + expected_server_href = self.SERVER_HREF + expected_server_bookmark = self.SERVER_BOOKMARK + expected_href = self.IMAGE_HREF % 1 + expected_bookmark = self.IMAGE_BOOKMARK % 1 + expected_href_two = self.IMAGE_HREF % 2 + expected_bookmark_two = self.IMAGE_BOOKMARK % 2 expected_now = self.TIMESTAMP expected = minidom.parseString(""" - - - - - - - - - - - + + + + + + + """.replace(" ", "") % (locals())) @@ -1465,7 +1448,9 @@ class ImageXMLSerializationTest(test.TestCase): expected_serverRef = self.SERVER_HREF expected_now = self.TIMESTAMP expected = minidom.parseString(""" - + """.replace(" ", "") % (locals())) self.assertEqual(expected.toxml(), actual.toxml()) -- cgit From 49683f2f84a9eb4436c63465d11ae8f451265eae Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 7 Jul 2011 14:08:57 -0400 Subject: Dried up images XML serialization --- nova/api/openstack/images.py | 80 ++++++++++++++++++------------------------- nova/api/openstack/servers.py | 12 +++++++ nova/api/openstack/wsgi.py | 12 +++++++ 3 files changed, 58 insertions(+), 46 deletions(-) diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py index a81dd4299..bc7517c40 100644 --- a/nova/api/openstack/images.py +++ b/nova/api/openstack/images.py @@ -27,6 +27,7 @@ from nova import utils from nova.api.openstack import common from nova.api.openstack import faults from nova.api.openstack import image_metadata +from nova.api.openstack import servers from nova.api.openstack.views import images as images_view from nova.api.openstack import wsgi @@ -262,26 +263,19 @@ class ControllerV11(Controller): return {'instance_ref': server_ref} -class ImageXMLSerializer(wsgi.DictSerializer): +class ImageXMLSerializer(wsgi.XMLDictSerializer): - xmlns = {'': wsgi.XMLNS_V11, 'atom': "http://www.w3.org/2005/Atom"} + xmlns = wsgi.XMLNS_V11 def __init__(self): self.metadata_serializer = image_metadata.ImageMetadataXMLSerializer() - - def _add_xmlns(self, node): - for key, ns in self.xmlns.iteritems(): - if key is not '': - name = 'xmlns:%s' % key - else: - name = 'xmlns' - node.setAttribute(name, ns) + self.server_serializer = servers.ServerXMLSerializer() def _image_to_xml(self, xml_doc, image): image_node = xml_doc.createElement('image') image_node.setAttribute('id', str(image['id'])) image_node.setAttribute('name', image['name']) - self._add_atom_links(xml_doc, image_node, image['links']) + self._create_link_nodes(xml_doc, image_node, image['links']) return image_node def _image_to_xml_detailed(self, xml_doc, image): @@ -297,7 +291,7 @@ class ImageXMLSerializer(wsgi.DictSerializer): metadata_node = self._create_metadata_node(xml_doc, metadata) image_node.appendChild(metadata_node) - self._add_atom_links(xml_doc, image_node, image['links']) + self._create_link_nodes(xml_doc, image_node, image['links']) return image_node @@ -310,25 +304,19 @@ class ImageXMLSerializer(wsgi.DictSerializer): if 'progress' in image: node.setAttribute('progress', str(image['progress'])) - def _create_server_node(self, xml_doc, server): - server_node = xml_doc.createElement('server') - server_node.setAttribute('id', str(server['id'])) - server_node.setAttribute('name', server['name']) - self._add_atom_links(xml_doc, server_node, server['links']) - return server_node - def _create_metadata_node(self, xml_doc, metadata): return self.metadata_serializer.meta_list_to_xml(xml_doc, metadata) - def _add_atom_links(self, xml_doc, node, links): - for link in links: - link_node = xml_doc.createElement('atom:link') - link_node.setAttribute('rel', link['rel']) - link_node.setAttribute('href', link['href']) - node.appendChild(link_node) + def _create_server_node(self, xml_doc, server): + return self.server_serializer.server_to_xml(xml_doc, server) - def _image_list_to_xml(self, xml_doc, images, image_to_xml): + def _image_list_to_xml(self, xml_doc, images, detailed): container_node = xml_doc.createElement('images') + if detailed: + image_to_xml = self._image_to_xml_detailed + else: + image_to_xml = self._image_to_xml + for image in images: item_node = image_to_xml(xml_doc, image) container_node.appendChild(item_node) @@ -342,34 +330,34 @@ class ImageXMLSerializer(wsgi.DictSerializer): image_to_xml = self._image_to_xml item_node = image_to_xml(xml_doc, image) self._add_xmlns(item_node) - return item_node.toprettyxml(indent=' ') - - def _image_list_to_xml_string(self, images, detailed): - xml_doc = minidom.Document() - if detailed: - image_to_xml = self._image_to_xml_detailed - else: - image_to_xml = self._image_to_xml - container_node = self._image_list_to_xml(xml_doc, images, image_to_xml) - - self._add_xmlns(container_node) - return container_node.toprettyxml(indent=' ') + self._add_atom_xmlns(item_node) + return item_node.toprettyxml(indent=' ', encoding='UTF-8') def index(self, images_dict): - return self._image_list_to_xml_string(images_dict['images'], - detailed=False) + xml_doc = minidom.Document() + node = self._image_list_to_xml(xml_doc, + images_dict['images'], + detailed=False) + return self.xml_string(node) def detail(self, images_dict): - return self._image_list_to_xml_string(images_dict['images'], - detailed=True) + xml_doc = minidom.Document() + node = self._image_list_to_xml(xml_doc, + images_dict['images'], + detailed=True) + return self.xml_string(node) def show(self, image_dict): - return self._image_to_xml_string(image_dict['image'], - detailed=True) + xml_doc = minidom.Document() + node = self._image_to_xml_detailed(xml_doc, + image_dict['image']) + return self.xml_string(node) def create(self, image_dict): - return self._image_to_xml_string(image_dict['image'], - detailed=True) + xml_doc = minidom.Document() + node = self._image_to_xml_detailed(xml_doc, + image_dict['image']) + return self.xml_string(node) def create_resource(version='1.0'): diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index fc1ab8d46..cff4e9b82 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -627,3 +627,15 @@ def create_resource(version='1.0'): return wsgi.Resource(controller, serializers=serializers, deserializers=deserializers) + + +class ServerXMLSerializer(wsgi.XMLDictSerializer): + def __init__(self, xmlns=wsgi.XMLNS_V11): + super(ServerXMLSerializer, self).__init__(xmlns=xmlns) + + def server_to_xml(self, xml_doc, server): + server_node = xml_doc.createElement('server') + server_node.setAttribute('id', str(server['id'])) + server_node.setAttribute('name', server['name']) + self._create_link_nodes(xml_doc, server_node, server['links']) + return server_node diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index 5b6e3cb1d..693c85b97 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -236,9 +236,14 @@ class XMLDictSerializer(DictSerializer): return node.toprettyxml(indent=' ', encoding='utf-8') + def xml_string(self, node): + self._add_xmlns(node) + return node.toprettyxml(indent=' ', encoding='UTF-8') + def _add_xmlns(self, node): if self.xmlns is not None: node.setAttribute('xmlns', self.xmlns) + node.setAttribute('xmlns:atom', "http://www.w3.org/2005/Atom") def _to_xml_node(self, doc, metadata, nodename, data): """Recursive method to convert data members to XML nodes.""" @@ -294,6 +299,13 @@ class XMLDictSerializer(DictSerializer): result.appendChild(node) return result + def _create_link_nodes(self, xml_doc, node, links): + for link in links: + link_node = xml_doc.createElement('atom:link') + link_node.setAttribute('rel', link['rel']) + link_node.setAttribute('href', link['href']) + node.appendChild(link_node) + class ResponseSerializer(object): """Encode the necessary pieces into a response object""" -- cgit From 14ee32f07536f5686794d2dbe8f1fad159af4dfe Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 7 Jul 2011 14:09:23 -0400 Subject: Dried up images XML serialization --- nova/api/openstack/images.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py index bc7517c40..c540037fa 100644 --- a/nova/api/openstack/images.py +++ b/nova/api/openstack/images.py @@ -322,17 +322,6 @@ class ImageXMLSerializer(wsgi.XMLDictSerializer): container_node.appendChild(item_node) return container_node - def _image_to_xml_string(self, image, detailed): - xml_doc = minidom.Document() - if detailed: - image_to_xml = self._image_to_xml_detailed - else: - image_to_xml = self._image_to_xml - item_node = image_to_xml(xml_doc, image) - self._add_xmlns(item_node) - self._add_atom_xmlns(item_node) - return item_node.toprettyxml(indent=' ', encoding='UTF-8') - def index(self, images_dict): xml_doc = minidom.Document() node = self._image_list_to_xml(xml_doc, -- cgit From 162b9651c3e251d8acae764f08372f764597f8ca Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 7 Jul 2011 14:27:27 -0400 Subject: Added param to keep current things from breaking until we update all of the xml serializers and view builders to reflect the current spec --- nova/api/openstack/images.py | 8 ++++---- nova/api/openstack/wsgi.py | 15 ++++++++------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py index c540037fa..8f75fae4c 100644 --- a/nova/api/openstack/images.py +++ b/nova/api/openstack/images.py @@ -327,26 +327,26 @@ class ImageXMLSerializer(wsgi.XMLDictSerializer): node = self._image_list_to_xml(xml_doc, images_dict['images'], detailed=False) - return self.xml_string(node) + return self.xml_string(node, True) def detail(self, images_dict): xml_doc = minidom.Document() node = self._image_list_to_xml(xml_doc, images_dict['images'], detailed=True) - return self.xml_string(node) + return self.xml_string(node, True) def show(self, image_dict): xml_doc = minidom.Document() node = self._image_to_xml_detailed(xml_doc, image_dict['image']) - return self.xml_string(node) + return self.xml_string(node, True) def create(self, image_dict): xml_doc = minidom.Document() node = self._image_to_xml_detailed(xml_doc, image_dict['image']) - return self.xml_string(node) + return self.xml_string(node, True) def create_resource(version='1.0'): diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index 693c85b97..4ac7b56c9 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -232,18 +232,19 @@ class XMLDictSerializer(DictSerializer): doc = minidom.Document() node = self._to_xml_node(doc, self.metadata, root_key, data[root_key]) - self._add_xmlns(node) + return self.xml_string(node) - return node.toprettyxml(indent=' ', encoding='utf-8') - - def xml_string(self, node): - self._add_xmlns(node) + def xml_string(self, node, has_atom=False): + self._add_xmlns(node, has_atom) return node.toprettyxml(indent=' ', encoding='UTF-8') - def _add_xmlns(self, node): + #NOTE (ameade): the has_atom should be removed after all of the + # xml serializers and view builders have been updated + def _add_xmlns(self, node, has_atom=False): if self.xmlns is not None: node.setAttribute('xmlns', self.xmlns) - node.setAttribute('xmlns:atom', "http://www.w3.org/2005/Atom") + if has_atom: + node.setAttribute('xmlns:atom', "http://www.w3.org/2005/Atom") def _to_xml_node(self, doc, metadata, nodename, data): """Recursive method to convert data members to XML nodes.""" -- cgit From e9d712c52830725b24f20da7ff8662e97d22014d Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 7 Jul 2011 14:51:12 -0400 Subject: Removed bookmark link from non detailed image viewbuilder --- nova/api/openstack/views/images.py | 13 ++++++------- nova/tests/api/openstack/test_images.py | 4 ---- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/nova/api/openstack/views/images.py b/nova/api/openstack/views/images.py index 005341c62..fc4c1b55e 100644 --- a/nova/api/openstack/views/images.py +++ b/nova/api/openstack/views/images.py @@ -108,18 +108,17 @@ class ViewBuilderV11(ViewBuilder): href = self.generate_href(image_obj["id"]) bookmark = self.generate_bookmark(image_obj["id"]) - if detail: - image["metadata"] = image_obj.get("properties", {}) - image["links"] = [{ "rel": "self", "href": href, - }, - { - "rel": "bookmark", - "href": bookmark, }] + if detail: + image["metadata"] = image_obj.get("properties", {}) + image["links"].append({"rel": "bookmark", + "href": bookmark, + }) + return image def generate_bookmark(self, image_id): diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index cf68f5f53..d45195286 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -559,10 +559,6 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): "links": [{ "rel": "self", "href": href, - }, - { - "rel": "bookmark", - "href": bookmark, }], } self.assertTrue(test_image in response_list) -- cgit From 1940ccffb6c22c39d6c21be4e84f20e350599f71 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 7 Jul 2011 16:19:21 -0400 Subject: Removed serverRef from some tests and viewbuilder --- nova/api/openstack/views/images.py | 4 +++- nova/tests/api/openstack/test_images.py | 33 ++------------------------------- 2 files changed, 5 insertions(+), 32 deletions(-) diff --git a/nova/api/openstack/views/images.py b/nova/api/openstack/views/images.py index fc4c1b55e..ae8e73678 100644 --- a/nova/api/openstack/views/images.py +++ b/nova/api/openstack/views/images.py @@ -98,7 +98,9 @@ class ViewBuilderV11(ViewBuilder): def _build_server(self, image, image_obj): try: - image['serverRef'] = image_obj['properties']['instance_ref'] + serverRef = image_obj['properties']['instance_ref'] + #TODO (ameade) get the server information + #image['server'] = ? except KeyError: return diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index d45195286..7e2240830 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -401,12 +401,13 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): href = "http://localhost/v1.1/images/124" bookmark = "http://localhost/images/124" + server_href = "http://localhost/v1.1/servers/42" + server_bookmark = "http://localhost/servers/42" expected_image = { "image": { "id": 124, "name": "queued snapshot", - "serverRef": "http://localhost/v1.1/servers/42", "updated": self.NOW_API_FORMAT, "created": self.NOW_API_FORMAT, "status": "QUEUED", @@ -648,7 +649,6 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): u'instance_ref': u'http://localhost/v1.1/servers/42', u'user_id': u'1', }, - 'serverRef': "http://localhost/v1.1/servers/42", 'updated': self.NOW_API_FORMAT, 'created': self.NOW_API_FORMAT, 'status': 'QUEUED', @@ -668,7 +668,6 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): u'instance_ref': u'http://localhost/v1.1/servers/42', u'user_id': u'1', }, - 'serverRef': "http://localhost/v1.1/servers/42", 'updated': self.NOW_API_FORMAT, 'created': self.NOW_API_FORMAT, 'status': 'SAVING', @@ -689,7 +688,6 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): u'instance_ref': u'http://localhost/v1.1/servers/42', u'user_id': u'1', }, - 'serverRef': "http://localhost/v1.1/servers/42", 'updated': self.NOW_API_FORMAT, 'created': self.NOW_API_FORMAT, 'status': 'ACTIVE', @@ -709,7 +707,6 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): u'instance_ref': u'http://localhost/v1.1/servers/42', u'user_id': u'1', }, - 'serverRef': "http://localhost/v1.1/servers/42", 'updated': self.NOW_API_FORMAT, 'created': self.NOW_API_FORMAT, 'status': 'FAILED', @@ -1029,30 +1026,6 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): response = req.get_response(fakes.wsgi_app()) self.assertEqual(200, response.status_int) - def test_create_image_v1_1_actual_server_ref(self): - - serverRef = 'http://localhost/v1.1/servers/1' - body = dict(image=dict(serverRef=serverRef, name='Backup 1')) - req = webob.Request.blank('/v1.1/images') - req.method = 'POST' - req.body = json.dumps(body) - req.headers["content-type"] = "application/json" - response = req.get_response(fakes.wsgi_app()) - self.assertEqual(200, response.status_int) - result = json.loads(response.body) - self.assertEqual(result['image']['serverRef'], serverRef) - - def test_create_image_v1_1_server_ref_bad_hostname(self): - - serverRef = 'http://asdf/v1.1/servers/1' - body = dict(image=dict(serverRef=serverRef, name='Backup 1')) - req = webob.Request.blank('/v1.1/images') - req.method = 'POST' - req.body = json.dumps(body) - req.headers["content-type"] = "application/json" - response = req.get_response(fakes.wsgi_app()) - self.assertEqual(400, response.status_int) - def test_create_image_v1_1_no_server_ref(self): body = dict(image=dict(name='Snapshot 1')) @@ -1441,8 +1414,6 @@ class ImageXMLSerializationTest(test.TestCase): output = serializer.serialize(fixtures, 'index') actual = minidom.parseString(output.replace(" ", "")) - expected_serverRef = self.SERVER_HREF - expected_now = self.TIMESTAMP expected = minidom.parseString(""" Date: Thu, 7 Jul 2011 16:29:17 -0400 Subject: Temporarily moved create server node functionality into images.py Temporarily changed image XML tests to expect server entities with only ids --- nova/api/openstack/images.py | 7 +++++-- nova/api/openstack/servers.py | 12 ------------ nova/tests/api/openstack/test_images.py | 25 +++++-------------------- 3 files changed, 10 insertions(+), 34 deletions(-) diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py index 8f75fae4c..a6af6da6f 100644 --- a/nova/api/openstack/images.py +++ b/nova/api/openstack/images.py @@ -269,7 +269,6 @@ class ImageXMLSerializer(wsgi.XMLDictSerializer): def __init__(self): self.metadata_serializer = image_metadata.ImageMetadataXMLSerializer() - self.server_serializer = servers.ServerXMLSerializer() def _image_to_xml(self, xml_doc, image): image_node = xml_doc.createElement('image') @@ -308,7 +307,11 @@ class ImageXMLSerializer(wsgi.XMLDictSerializer): return self.metadata_serializer.meta_list_to_xml(xml_doc, metadata) def _create_server_node(self, xml_doc, server): - return self.server_serializer.server_to_xml(xml_doc, server) + server_node = xml_doc.createElement('server') + server_node.setAttribute('id', str(server['id'])) + #server_node.setAttribute('name', server['name']) + #self._create_link_nodes(xml_doc, server_node, server['links']) + return server_node def _image_list_to_xml(self, xml_doc, images, detailed): container_node = xml_doc.createElement('images') diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index cff4e9b82..fc1ab8d46 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -627,15 +627,3 @@ def create_resource(version='1.0'): return wsgi.Resource(controller, serializers=serializers, deserializers=deserializers) - - -class ServerXMLSerializer(wsgi.XMLDictSerializer): - def __init__(self, xmlns=wsgi.XMLNS_V11): - super(ServerXMLSerializer, self).__init__(xmlns=xmlns) - - def server_to_xml(self, xml_doc, server): - server_node = xml_doc.createElement('server') - server_node.setAttribute('id', str(server['id'])) - server_node.setAttribute('name', server['name']) - self._create_link_nodes(xml_doc, server_node, server['links']) - return server_node diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index 7e2240830..d407057a8 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -1148,10 +1148,7 @@ class ImageXMLSerializationTest(test.TestCase): created="%(expected_now)s" status="ACTIVE" progress="80"> - - - - + value1 @@ -1219,10 +1216,7 @@ class ImageXMLSerializationTest(test.TestCase): updated="%(expected_now)s" created="%(expected_now)s" status="ACTIVE"> - - - - + @@ -1284,10 +1278,7 @@ class ImageXMLSerializationTest(test.TestCase): updated="%(expected_now)s" created="%(expected_now)s" status="ACTIVE"> - - - - + @@ -1503,10 +1494,7 @@ class ImageXMLSerializationTest(test.TestCase): updated="%(expected_now)s" created="%(expected_now)s" status="ACTIVE"> - - - - + @@ -1589,10 +1577,7 @@ class ImageXMLSerializationTest(test.TestCase): created="%(expected_now)s" status="SAVING" progress="80"> - - - - + value1 -- cgit From 7c90561e7288967c364a874cde13d88a8cb8fab4 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 7 Jul 2011 16:32:17 -0400 Subject: Changed name of xml_string to to_xml_string --- nova/api/openstack/images.py | 8 ++++---- nova/api/openstack/wsgi.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py index a6af6da6f..e5496ed94 100644 --- a/nova/api/openstack/images.py +++ b/nova/api/openstack/images.py @@ -330,26 +330,26 @@ class ImageXMLSerializer(wsgi.XMLDictSerializer): node = self._image_list_to_xml(xml_doc, images_dict['images'], detailed=False) - return self.xml_string(node, True) + return self.to_xml_string(node, True) def detail(self, images_dict): xml_doc = minidom.Document() node = self._image_list_to_xml(xml_doc, images_dict['images'], detailed=True) - return self.xml_string(node, True) + return self.to_xml_string(node, True) def show(self, image_dict): xml_doc = minidom.Document() node = self._image_to_xml_detailed(xml_doc, image_dict['image']) - return self.xml_string(node, True) + return self.to_xml_string(node, True) def create(self, image_dict): xml_doc = minidom.Document() node = self._image_to_xml_detailed(xml_doc, image_dict['image']) - return self.xml_string(node, True) + return self.to_xml_string(node, True) def create_resource(version='1.0'): diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index 4ac7b56c9..f13bd6cc1 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -232,9 +232,9 @@ class XMLDictSerializer(DictSerializer): doc = minidom.Document() node = self._to_xml_node(doc, self.metadata, root_key, data[root_key]) - return self.xml_string(node) + return self.to_xml_string(node) - def xml_string(self, node, has_atom=False): + def to_xml_string(self, node, has_atom=False): self._add_xmlns(node, has_atom) return node.toprettyxml(indent=' ', encoding='UTF-8') -- cgit From d4540d2abde8db9519d8e4dad9b57a116a2c8b9e Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 7 Jul 2011 16:41:22 -0400 Subject: Updated _create_link_nodes to be consistent with other create_*_nodes --- nova/api/openstack/images.py | 15 ++++++++++++--- nova/api/openstack/wsgi.py | 6 ++++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py index e5496ed94..bf98a5cdd 100644 --- a/nova/api/openstack/images.py +++ b/nova/api/openstack/images.py @@ -274,7 +274,10 @@ class ImageXMLSerializer(wsgi.XMLDictSerializer): image_node = xml_doc.createElement('image') image_node.setAttribute('id', str(image['id'])) image_node.setAttribute('name', image['name']) - self._create_link_nodes(xml_doc, image_node, image['links']) + link_nodes = self._create_link_nodes(xml_doc, + image['links']) + for link_node in link_nodes: + image_node.appendChild(link_node) return image_node def _image_to_xml_detailed(self, xml_doc, image): @@ -290,7 +293,10 @@ class ImageXMLSerializer(wsgi.XMLDictSerializer): metadata_node = self._create_metadata_node(xml_doc, metadata) image_node.appendChild(metadata_node) - self._create_link_nodes(xml_doc, image_node, image['links']) + link_nodes = self._create_link_nodes(xml_doc, + image['links']) + for link_node in link_nodes: + image_node.appendChild(link_node) return image_node @@ -310,7 +316,10 @@ class ImageXMLSerializer(wsgi.XMLDictSerializer): server_node = xml_doc.createElement('server') server_node.setAttribute('id', str(server['id'])) #server_node.setAttribute('name', server['name']) - #self._create_link_nodes(xml_doc, server_node, server['links']) + #link_nodes = self._create_link_nodes(xml_doc, + # image['links']) + #for link_node in link_nodes: + # server_node.appendChild(link_node) return server_node def _image_list_to_xml(self, xml_doc, images, detailed): diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index f13bd6cc1..03f83001a 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -300,12 +300,14 @@ class XMLDictSerializer(DictSerializer): result.appendChild(node) return result - def _create_link_nodes(self, xml_doc, node, links): + def _create_link_nodes(self, xml_doc, links): + link_nodes = [] for link in links: link_node = xml_doc.createElement('atom:link') link_node.setAttribute('rel', link['rel']) link_node.setAttribute('href', link['href']) - node.appendChild(link_node) + link_nodes.append(link_node) + return link_nodes class ResponseSerializer(object): -- cgit From a8c9082c701a65f221f218cd8baa92b3859fc0ab Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Thu, 7 Jul 2011 16:52:32 -0400 Subject: Added server entity to images that only has id --- nova/api/openstack/views/images.py | 5 +++-- nova/tests/api/openstack/test_images.py | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/nova/api/openstack/views/images.py b/nova/api/openstack/views/images.py index ae8e73678..d1f89a785 100644 --- a/nova/api/openstack/views/images.py +++ b/nova/api/openstack/views/images.py @@ -99,8 +99,9 @@ class ViewBuilderV11(ViewBuilder): def _build_server(self, image, image_obj): try: serverRef = image_obj['properties']['instance_ref'] - #TODO (ameade) get the server information - #image['server'] = ? + image['server'] = { + "id": common.get_id_from_href(serverRef), + } except KeyError: return diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index d407057a8..87e5c6d7f 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -411,6 +411,9 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): "updated": self.NOW_API_FORMAT, "created": self.NOW_API_FORMAT, "status": "QUEUED", + 'server': { + 'id': 42, + }, "metadata": { "instance_ref": "http://localhost/v1.1/servers/42", "user_id": "1", @@ -652,6 +655,9 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): 'updated': self.NOW_API_FORMAT, 'created': self.NOW_API_FORMAT, 'status': 'QUEUED', + 'server': { + 'id': 42, + }, "links": [{ "rel": "self", "href": "http://localhost/v1.1/images/124", @@ -672,6 +678,9 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): 'created': self.NOW_API_FORMAT, 'status': 'SAVING', 'progress': 0, + 'server': { + 'id': 42, + }, "links": [{ "rel": "self", "href": "http://localhost/v1.1/images/125", @@ -691,6 +700,9 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): 'updated': self.NOW_API_FORMAT, 'created': self.NOW_API_FORMAT, 'status': 'ACTIVE', + 'server': { + 'id': 42, + }, "links": [{ "rel": "self", "href": "http://localhost/v1.1/images/126", @@ -710,6 +722,9 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): 'updated': self.NOW_API_FORMAT, 'created': self.NOW_API_FORMAT, 'status': 'FAILED', + 'server': { + 'id': 42, + }, "links": [{ "rel": "self", "href": "http://localhost/v1.1/images/127", -- cgit From 495137fb383766ae5345fd8b30610a93483c0eaf Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Tue, 12 Jul 2011 12:01:13 -0400 Subject: Updated remove_version_from_href to be more intelligent Added tests --- nova/api/openstack/common.py | 14 ++++++++++-- nova/tests/api/openstack/test_common.py | 39 +++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/nova/api/openstack/common.py b/nova/api/openstack/common.py index 9aa384f33..83854b13f 100644 --- a/nova/api/openstack/common.py +++ b/nova/api/openstack/common.py @@ -136,11 +136,21 @@ def get_id_from_href(href): raise webob.exc.HTTPBadRequest(_('could not parse id from href')) -def remove_version_from_href(base_url): +def remove_version_from_href(href): """Removes the api version from the href. Given: 'http://www.nova.com/v1.1/123' Returns: 'http://www.nova.com/123' """ - return base_url.rsplit('/', 1).pop(0) + try: + #matches /v#.# + new_href = re.sub(r'[/][v][0-9]*.[0-9]*', '', href) + if new_href == href: + msg = _('href does not contain version') + raise webob.exc.HTTPBadRequest(explanation=msg) + return new_href + except: + LOG.debug(_("Error removing version from href: %s") % href) + msg = _('could not parse version from href') + raise webob.exc.HTTPBadRequest(explanation=msg) diff --git a/nova/tests/api/openstack/test_common.py b/nova/tests/api/openstack/test_common.py index 29cb8b944..584953c3a 100644 --- a/nova/tests/api/openstack/test_common.py +++ b/nova/tests/api/openstack/test_common.py @@ -190,3 +190,42 @@ class PaginationParamsTest(test.TestCase): req = Request.blank('/?limit=20&marker=40') self.assertEqual(common.get_pagination_params(req), {'marker': 40, 'limit': 20}) + + +class MiscFunctionsTest(test.TestCase): + + def test_remove_version_from_href(self): + + fixture = 'http://www.testsite.com/v1.1/images' + expected = 'http://www.testsite.com/images' + actual = common.remove_version_from_href(fixture) + self.assertEqual(actual, expected) + + def test_remove_version_from_href_2(self): + + fixture = 'http://www.testsite.com/v1.1/' + expected = 'http://www.testsite.com/' + actual = common.remove_version_from_href(fixture) + self.assertEqual(actual, expected) + + def test_remove_version_from_href_bad_request(self): + + fixture = 'http://www.testsite.com/1.1/images' + self.assertRaises(webob.exc.HTTPBadRequest, + common.remove_version_from_href, + fixture) + + def test_get_id_from_href(self): + + fixture = 'http://www.testsite.com/dir/45' + actual = common.get_id_from_href(fixture) + expected = 45 + self.assertEqual(actual, expected) + + def test_get_id_from_href_bad_request(self): + + fixture = 'http://45' + self.assertRaises(webob.exc.HTTPBadRequest, + common.get_id_from_href, + fixture) + -- cgit From 50357685282b9200ccc8c82361c5266f1f413531 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Tue, 12 Jul 2011 12:11:49 -0400 Subject: pep8 --- nova/tests/api/openstack/test_common.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/nova/tests/api/openstack/test_common.py b/nova/tests/api/openstack/test_common.py index 584953c3a..1143fb502 100644 --- a/nova/tests/api/openstack/test_common.py +++ b/nova/tests/api/openstack/test_common.py @@ -195,37 +195,31 @@ class PaginationParamsTest(test.TestCase): class MiscFunctionsTest(test.TestCase): def test_remove_version_from_href(self): - fixture = 'http://www.testsite.com/v1.1/images' expected = 'http://www.testsite.com/images' actual = common.remove_version_from_href(fixture) self.assertEqual(actual, expected) def test_remove_version_from_href_2(self): - fixture = 'http://www.testsite.com/v1.1/' expected = 'http://www.testsite.com/' actual = common.remove_version_from_href(fixture) self.assertEqual(actual, expected) def test_remove_version_from_href_bad_request(self): - fixture = 'http://www.testsite.com/1.1/images' self.assertRaises(webob.exc.HTTPBadRequest, common.remove_version_from_href, fixture) def test_get_id_from_href(self): - fixture = 'http://www.testsite.com/dir/45' actual = common.get_id_from_href(fixture) expected = 45 self.assertEqual(actual, expected) def test_get_id_from_href_bad_request(self): - fixture = 'http://45' self.assertRaises(webob.exc.HTTPBadRequest, common.get_id_from_href, fixture) - -- cgit From 5ab2fd27ea930669c01f309dbbfb794fd7c37ad6 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Tue, 12 Jul 2011 12:42:56 -0400 Subject: updated images tests --- nova/tests/api/openstack/test_images.py | 74 ++++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index 306c0b1db..696493d4f 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -413,6 +413,14 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): "status": "QUEUED", 'server': { 'id': 42, + "links": [{ + "rel": "self", + "href": server_href, + }, + { + "rel": "bookmark", + "href": server_bookmark, + }], }, "metadata": { "instance_ref": "http://localhost/v1.1/servers/42", @@ -628,6 +636,8 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): response_dict = json.loads(response.body) response_list = response_dict["images"] + server_href = "http://localhost/v1.1/servers/42" + server_bookmark = "http://localhost/servers/42" expected = [{ 'id': 123, @@ -657,6 +667,14 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): 'status': 'QUEUED', 'server': { 'id': 42, + "links": [{ + "rel": "self", + "href": server_href, + }, + { + "rel": "bookmark", + "href": server_bookmark, + }], }, "links": [{ "rel": "self", @@ -680,6 +698,14 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): 'progress': 0, 'server': { 'id': 42, + "links": [{ + "rel": "self", + "href": server_href, + }, + { + "rel": "bookmark", + "href": server_bookmark, + }], }, "links": [{ "rel": "self", @@ -702,6 +728,14 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): 'status': 'ACTIVE', 'server': { 'id': 42, + "links": [{ + "rel": "self", + "href": server_href, + }, + { + "rel": "bookmark", + "href": server_bookmark, + }], }, "links": [{ "rel": "self", @@ -724,6 +758,14 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): 'status': 'FAILED', 'server': { 'id': 42, + "links": [{ + "rel": "self", + "href": server_href, + }, + { + "rel": "bookmark", + "href": server_bookmark, + }], }, "links": [{ "rel": "self", @@ -1044,6 +1086,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): def test_create_image_v1_1_actual_server_ref(self): serverRef = 'http://localhost/v1.1/servers/1' + serverBookmark = 'http://localhost/servers/1' body = dict(image=dict(serverRef=serverRef, name='Backup 1')) req = webob.Request.blank('/v1.1/images') req.method = 'POST' @@ -1052,11 +1095,25 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): response = req.get_response(fakes.wsgi_app()) self.assertEqual(200, response.status_int) result = json.loads(response.body) - self.assertEqual(result['image']['serverRef'], serverRef) + expected = { + 'id': '1', + 'links': [ + { + 'rel': 'self', + 'href': serverRef, + }, + { + 'rel': 'bookmark', + 'href': serverBookmark, + }, + ] + } + self.assertEqual(result['image']['server'], expected) def test_create_image_v1_1_actual_server_ref_port(self): serverRef = 'http://localhost:8774/v1.1/servers/1' + serverBookmark = 'http://localhost:8774/servers/1' body = dict(image=dict(serverRef=serverRef, name='Backup 1')) req = webob.Request.blank('/v1.1/images') req.method = 'POST' @@ -1065,7 +1122,20 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): response = req.get_response(fakes.wsgi_app()) self.assertEqual(200, response.status_int) result = json.loads(response.body) - self.assertEqual(result['image']['serverRef'], serverRef) + expected = { + 'id': '1', + 'links': [ + { + 'rel': 'self', + 'href': serverRef, + }, + { + 'rel': 'bookmark', + 'href': serverBookmark, + }, + ] + } + self.assertEqual(result['image']['server'], expected) def test_create_image_v1_1_server_ref_bad_hostname(self): -- cgit From 3c8de7e99e7cd8868f63fb0d15845b2462b77b3e Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Tue, 12 Jul 2011 12:46:15 -0400 Subject: Updated images viewbuilder to return links in server entity --- nova/api/openstack/views/images.py | 10 ++++++++++ nova/tests/api/openstack/test_images.py | 4 ++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/nova/api/openstack/views/images.py b/nova/api/openstack/views/images.py index d1f89a785..5c0510377 100644 --- a/nova/api/openstack/views/images.py +++ b/nova/api/openstack/views/images.py @@ -101,6 +101,16 @@ class ViewBuilderV11(ViewBuilder): serverRef = image_obj['properties']['instance_ref'] image['server'] = { "id": common.get_id_from_href(serverRef), + "links": [ + { + "rel": "self", + "href": serverRef, + }, + { + "rel": "bookmark", + "href": common.remove_version_from_href(serverRef), + }, + ] } except KeyError: return diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index 696493d4f..c1ead6e28 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -1096,7 +1096,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): self.assertEqual(200, response.status_int) result = json.loads(response.body) expected = { - 'id': '1', + 'id': 1, 'links': [ { 'rel': 'self', @@ -1123,7 +1123,7 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): self.assertEqual(200, response.status_int) result = json.loads(response.body) expected = { - 'id': '1', + 'id': 1, 'links': [ { 'rel': 'self', -- cgit From f4dc32ad0729b40ebe5765a57edff9535b992953 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Tue, 12 Jul 2011 12:55:37 -0400 Subject: Updated ImageXMLSerializer to serialize links in the server entity --- nova/api/openstack/images.py | 9 ++++----- nova/tests/api/openstack/test_images.py | 30 ++++++++++++++++++++---------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py index 873e025c7..d0317583e 100644 --- a/nova/api/openstack/images.py +++ b/nova/api/openstack/images.py @@ -325,11 +325,10 @@ class ImageXMLSerializer(wsgi.XMLDictSerializer): def _create_server_node(self, xml_doc, server): server_node = xml_doc.createElement('server') server_node.setAttribute('id', str(server['id'])) - #server_node.setAttribute('name', server['name']) - #link_nodes = self._create_link_nodes(xml_doc, - # image['links']) - #for link_node in link_nodes: - # server_node.appendChild(link_node) + link_nodes = self._create_link_nodes(xml_doc, + server['links']) + for link_node in link_nodes: + server_node.appendChild(link_node) return server_node def _image_list_to_xml(self, xml_doc, images, detailed): diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index c1ead6e28..f0d7be2b9 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -1225,7 +1225,6 @@ class ImageXMLSerializationTest(test.TestCase): 'progress': 80, 'server': { 'id': 1, - 'name': 'Server1', 'links': [ { 'href': self.SERVER_HREF, @@ -1270,7 +1269,10 @@ class ImageXMLSerializationTest(test.TestCase): created="%(expected_now)s" status="ACTIVE" progress="80"> - + + + + value1 @@ -1296,7 +1298,6 @@ class ImageXMLSerializationTest(test.TestCase): 'status': 'ACTIVE', 'server': { 'id': 1, - 'name': 'Server1', 'links': [ { 'href': self.SERVER_HREF, @@ -1338,7 +1339,10 @@ class ImageXMLSerializationTest(test.TestCase): updated="%(expected_now)s" created="%(expected_now)s" status="ACTIVE"> - + + + + @@ -1359,7 +1363,6 @@ class ImageXMLSerializationTest(test.TestCase): 'status': 'ACTIVE', 'server': { 'id': 1, - 'name': 'Server1', 'links': [ { 'href': self.SERVER_HREF, @@ -1400,7 +1403,10 @@ class ImageXMLSerializationTest(test.TestCase): updated="%(expected_now)s" created="%(expected_now)s" status="ACTIVE"> - + + + + @@ -1550,7 +1556,6 @@ class ImageXMLSerializationTest(test.TestCase): 'status': 'ACTIVE', 'server': { 'id': 1, - 'name': 'Server1', 'links': [ { 'href': self.SERVER_HREF, @@ -1616,7 +1621,10 @@ class ImageXMLSerializationTest(test.TestCase): updated="%(expected_now)s" created="%(expected_now)s" status="ACTIVE"> - + + + + @@ -1654,7 +1662,6 @@ class ImageXMLSerializationTest(test.TestCase): 'progress': 80, 'server': { 'id': 1, - 'name': 'Server1', 'links': [ { 'href': self.SERVER_HREF, @@ -1699,7 +1706,10 @@ class ImageXMLSerializationTest(test.TestCase): created="%(expected_now)s" status="SAVING" progress="80"> - + + + + value1 -- cgit From 7a700362d63de1da51e9a890d854c3b0eeb97aae Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Tue, 12 Jul 2011 13:29:26 -0400 Subject: minor cleanup --- nova/api/openstack/wsgi.py | 4 +++- nova/tests/api/openstack/test_images.py | 12 ------------ 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index 4e4ce4121..c3f841aa5 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -277,7 +277,9 @@ class XMLDictSerializer(DictSerializer): return node.toprettyxml(indent=' ', encoding='UTF-8') #NOTE (ameade): the has_atom should be removed after all of the - # xml serializers and view builders have been updated + # xml serializers and view builders have been updated to the current + # spec that required all responses include the xmlns:atom, the has_atom + # flag is to prevent current tests from breaking def _add_xmlns(self, node, has_atom=False): if self.xmlns is not None: node.setAttribute('xmlns', self.xmlns) diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index f0d7be2b9..716b73f6c 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -1213,8 +1213,6 @@ class ImageXMLSerializationTest(test.TestCase): def test_show(self): serializer = images.ImageXMLSerializer() - #so we can see the full diff in the output - self.maxDiff = None fixture = { 'image': { 'id': 1, @@ -1288,7 +1286,6 @@ class ImageXMLSerializationTest(test.TestCase): def test_show_zero_metadata(self): serializer = images.ImageXMLSerializer() - self.maxDiff = None fixture = { 'image': { 'id': 1, @@ -1353,7 +1350,6 @@ class ImageXMLSerializationTest(test.TestCase): def test_show_image_no_metadata_key(self): serializer = images.ImageXMLSerializer() - self.maxDiff = None fixture = { 'image': { 'id': 1, @@ -1417,8 +1413,6 @@ class ImageXMLSerializationTest(test.TestCase): def test_show_no_server(self): serializer = images.ImageXMLSerializer() - #so we can see the full diff in the output - self.maxDiff = None fixture = { 'image': { 'id': 1, @@ -1471,8 +1465,6 @@ class ImageXMLSerializationTest(test.TestCase): def test_index(self): serializer = images.ImageXMLSerializer() - #so we can see the full diff in the output - self.maxDiff = None fixture = { 'images': [ { @@ -1544,8 +1536,6 @@ class ImageXMLSerializationTest(test.TestCase): def test_detail(self): serializer = images.ImageXMLSerializer() - #so we can see the full diff in the output - self.maxDiff = None fixture = { 'images': [ { @@ -1650,8 +1640,6 @@ class ImageXMLSerializationTest(test.TestCase): def test_create(self): serializer = images.ImageXMLSerializer() - #so we can see the full diff in the output - self.maxDiff = None fixture = { 'image': { 'id': 1, -- cgit From c085294ccb6a8d449ccfd5739be67ee12538f48f Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Tue, 12 Jul 2011 14:19:30 -0400 Subject: Updated some common.py functions to raise ValueErrors instead of HTTPBadRequests --- nova/api/openstack/common.py | 13 +++++++------ nova/tests/api/openstack/test_common.py | 4 ++-- nova/tests/api/openstack/test_images.py | 22 ++++++++++++++++++++++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/nova/api/openstack/common.py b/nova/api/openstack/common.py index 83854b13f..79969d393 100644 --- a/nova/api/openstack/common.py +++ b/nova/api/openstack/common.py @@ -133,7 +133,7 @@ def get_id_from_href(href): return int(urlparse(href).path.split('/')[-1]) except: LOG.debug(_("Error extracting id from href: %s") % href) - raise webob.exc.HTTPBadRequest(_('could not parse id from href')) + raise ValueError(_('could not parse id from href')) def remove_version_from_href(href): @@ -146,11 +146,12 @@ def remove_version_from_href(href): try: #matches /v#.# new_href = re.sub(r'[/][v][0-9]*.[0-9]*', '', href) - if new_href == href: - msg = _('href does not contain version') - raise webob.exc.HTTPBadRequest(explanation=msg) - return new_href except: LOG.debug(_("Error removing version from href: %s") % href) msg = _('could not parse version from href') - raise webob.exc.HTTPBadRequest(explanation=msg) + raise ValueError(msg) + + if new_href == href: + msg = _('href does not contain version') + raise ValueError(msg) + return new_href diff --git a/nova/tests/api/openstack/test_common.py b/nova/tests/api/openstack/test_common.py index 1143fb502..7440bccfb 100644 --- a/nova/tests/api/openstack/test_common.py +++ b/nova/tests/api/openstack/test_common.py @@ -208,7 +208,7 @@ class MiscFunctionsTest(test.TestCase): def test_remove_version_from_href_bad_request(self): fixture = 'http://www.testsite.com/1.1/images' - self.assertRaises(webob.exc.HTTPBadRequest, + self.assertRaises(ValueError, common.remove_version_from_href, fixture) @@ -220,6 +220,6 @@ class MiscFunctionsTest(test.TestCase): def test_get_id_from_href_bad_request(self): fixture = 'http://45' - self.assertRaises(webob.exc.HTTPBadRequest, + self.assertRaises(ValueError, common.get_id_from_href, fixture) diff --git a/nova/tests/api/openstack/test_images.py b/nova/tests/api/openstack/test_images.py index 716b73f6c..c1bdd6906 100644 --- a/nova/tests/api/openstack/test_images.py +++ b/nova/tests/api/openstack/test_images.py @@ -1158,6 +1158,28 @@ class ImageControllerWithGlanceServiceTest(test.TestCase): response = req.get_response(fakes.wsgi_app()) self.assertEqual(400, response.status_int) + def test_create_image_v1_1_server_ref_missing_version(self): + + serverRef = 'http://localhost/servers/1' + body = dict(image=dict(serverRef=serverRef, name='Backup 1')) + req = webob.Request.blank('/v1.1/images') + req.method = 'POST' + req.body = json.dumps(body) + req.headers["content-type"] = "application/json" + response = req.get_response(fakes.wsgi_app()) + self.assertEqual(400, response.status_int) + + def test_create_image_v1_1_server_ref_missing_id(self): + + serverRef = 'http://localhost/v1.1/servers' + body = dict(image=dict(serverRef=serverRef, name='Backup 1')) + req = webob.Request.blank('/v1.1/images') + req.method = 'POST' + req.body = json.dumps(body) + req.headers["content-type"] = "application/json" + response = req.get_response(fakes.wsgi_app()) + self.assertEqual(400, response.status_int) + @classmethod def _make_image_fixtures(cls): image_id = 123 -- cgit