diff options
| author | Brian Waldon <brian.waldon@rackspace.com> | 2011-07-26 12:57:06 -0400 |
|---|---|---|
| committer | Brian Waldon <brian.waldon@rackspace.com> | 2011-07-26 12:57:06 -0400 |
| commit | 1ad5f2eaf49904d8e14546d59699b1472a1a5bb2 (patch) | |
| tree | 0b9cd62012e4e3bd394ccdad030858733c6f7ac3 | |
| parent | f900021b8a0e7df946fd6fabe34e560fe2c30356 (diff) | |
| download | nova-1ad5f2eaf49904d8e14546d59699b1472a1a5bb2.tar.gz nova-1ad5f2eaf49904d8e14546d59699b1472a1a5bb2.tar.xz nova-1ad5f2eaf49904d8e14546d59699b1472a1a5bb2.zip | |
xml deserialization works now
| -rw-r--r-- | nova/api/openstack/create_instance_helper.py | 79 | ||||
| -rw-r--r-- | nova/api/openstack/wsgi.py | 9 | ||||
| -rw-r--r-- | nova/tests/api/openstack/test_servers.py | 162 |
3 files changed, 90 insertions, 160 deletions
diff --git a/nova/api/openstack/create_instance_helper.py b/nova/api/openstack/create_instance_helper.py index 03272443a..b717b8ac0 100644 --- a/nova/api/openstack/create_instance_helper.py +++ b/nova/api/openstack/create_instance_helper.py @@ -303,79 +303,30 @@ class ServerXMLDeserializer(wsgi.MetadataXMLDeserializer): """Marshal the server attribute of a parsed request""" server = {} server_node = self.find_first_child_named(node, 'server') - for attr in ["name", "imageId", "flavorId"]: + + attributes = ["name", "imageId", "flavorId", "imageRef", + "flavorRef", "adminPass"] + for attr in attributes: if server_node.getAttribute(attr): server[attr] = server_node.getAttribute(attr) - image = self._extract_image(server_node) - if image is not None: - server["image"] = image - flavor = self._extract_flavor(server_node) - if flavor is not None: - server["flavor"] = flavor - metadata_node = self.find_first_child_named(server_node, "metadata") - metadata = self.extract_metadata(metadata_node) - if metadata is not None: - server["metadata"] = metadata - personality = self._extract_personality(server_node) - if personality is not None: - server["personality"] = personality - return server - - def _extract_image(self, server_node): - """Retrieve an image entity from the server node""" - image_node = self.find_first_child_named(server_node, "image") - if image_node is None: - return None - - image = {} - image_id = image_node.getAttribute('id') - if image_id is not None: - image['id'] = image_id - - image['links'] = self._extract_links_from_node(image_node) - - return image - def _extract_flavor(self, server_node): - """Retrieve a flavor entity from the server node""" - flavor_node = self.find_first_child_named(server_node, "flavor") - if flavor_node is None: - return None - - flavor = {} - flavor_id = flavor_node.getAttribute('id') - if flavor_id: - flavor['id'] = flavor_id - - flavor['links'] = self._extract_links_from_node(flavor_node) - - return flavor - - def _extract_links_from_node(self, parent_node): - """Retrieve link entities from a links container provided node""" - links = [] + metadata_node = self.find_first_child_named(server_node, "metadata") + server["metadata"] = self.extract_metadata(metadata_node) - for link_node in self.find_children_named(parent_node, 'atom:link'): - link = { - 'rel': link_node.getAttribute('rel'), - 'href': link_node.getAttribute('href'), - } - if link['rel'] is not None and link['href'] is not None: - links.append(link) + server["personality"] = self._extract_personality(server_node) - return links + return server def _extract_personality(self, server_node): """Marshal the personality attribute of a parsed request""" personality_node = \ self.find_first_child_named(server_node, "personality") - if personality_node is None: - return None personality = [] - for file_node in self.find_children_named(personality_node, "file"): - item = {} - if file_node.hasAttribute("path"): - item["path"] = file_node.getAttribute("path") - item["contents"] = self.extract_text(file_node) - personality.append(item) + if personality_node is not None: + for file_node in self.find_children_named(personality_node, "file"): + item = {} + if file_node.hasAttribute("path"): + item["path"] = file_node.getAttribute("path") + item["contents"] = self.extract_text(file_node) + personality.append(item) return personality diff --git a/nova/api/openstack/wsgi.py b/nova/api/openstack/wsgi.py index a28443d12..53dab22e8 100644 --- a/nova/api/openstack/wsgi.py +++ b/nova/api/openstack/wsgi.py @@ -165,12 +165,11 @@ class MetadataXMLDeserializer(XMLDeserializer): def extract_metadata(self, metadata_node): """Marshal the metadata attribute of a parsed request""" - if metadata_node is None: - return None metadata = {} - for meta_node in self.find_children_named(metadata_node, "meta"): - key = meta_node.getAttribute("key") - metadata[key] = self.extract_text(meta_node) + if metadata_node is not None: + for meta_node in self.find_children_named(metadata_node, "meta"): + key = meta_node.getAttribute("key") + metadata[key] = self.extract_text(meta_node) return metadata diff --git a/nova/tests/api/openstack/test_servers.py b/nova/tests/api/openstack/test_servers.py index 9ff0a3d04..97cebd29c 100644 --- a/nova/tests/api/openstack/test_servers.py +++ b/nova/tests/api/openstack/test_servers.py @@ -2530,77 +2530,85 @@ class TestServerCreateRequestXMLDeserializerV11(unittest.TestCase): def test_minimal_request(self): serial_request = """ -<server name="new-server-test"> - <image id="1"/> - <flavor id="2"/> -</server>""" +<server xmlns="http://docs.openstack.org/compute/api/v1.1" + name="new-server-test" + imageRef="1" + flavorRef="2"/>""" + request = self.deserializer.deserialize(serial_request, 'create') + expected = { + "server": { + "name": "new-server-test", + "imageRef": "1", + "flavorRef": "2", + "metadata": {}, + "personality": [], + }, + } + self.assertEquals(request['body'], expected) + + def test_admin_pass(self): + serial_request = """ +<server xmlns="http://docs.openstack.org/compute/api/v1.1" + name="new-server-test" + imageRef="1" + flavorRef="2" + adminPass="1234"/>""" request = self.deserializer.deserialize(serial_request, 'create') expected = { "server": { "name": "new-server-test", - "image": {"id": "1", "links": []}, - "flavor": {"id": "2", "links": []}, + "imageRef": "1", + "flavorRef": "2", + "adminPass": "1234", + "metadata": {}, + "personality": [], }, } self.assertEquals(request['body'], expected) + def test_image_link(self): serial_request = """ -<server xmlns:atom="http://www.w3.org/2005/Atom" name="new-server-test"> - <image id="1"> - <atom:link rel="bookmark" href="http://localhost:8774/v1.1/images/2"/> - </image> - <flavor id="3"/> -</server>""" +<server xmlns="http://docs.openstack.org/compute/api/v1.1" + name="new-server-test" + imageRef="http://localhost:8774/v1.1/images/2" + flavorRef="3"/>""" request = self.deserializer.deserialize(serial_request, 'create') expected = { "server": { "name": "new-server-test", - "image": { - "id": "1", - "links": [ - { - "rel": "bookmark", - "href": "http://localhost:8774/v1.1/images/2", - }, - ], - }, - "flavor": {"id": "3", "links": []}, + "imageRef": "http://localhost:8774/v1.1/images/2", + "flavorRef": "3", + "metadata": {}, + "personality": [], }, } self.assertEquals(request['body'], expected) def test_flavor_link(self): serial_request = """ -<server xmlns:atom="http://www.w3.org/2005/Atom" name="new-server-test"> - <image id="1"/> - <flavor id="2"> - <atom:link rel="bookmark" href="http://localhost:8774/v1.1/flavors/3"/> - </flavor> -</server>""" +<server xmlns="http://docs.openstack.org/compute/api/v1.1" + name="new-server-test" + imageRef="1" + flavorRef="http://localhost:8774/v1.1/flavors/3"/>""" request = self.deserializer.deserialize(serial_request, 'create') expected = { "server": { "name": "new-server-test", - "image": {"id": "1", "links": []}, - "flavor": { - "id": "2", - "links": [ - { - "rel": "bookmark", - "href": "http://localhost:8774/v1.1/flavors/3", - }, - ], - }, + "imageRef": "1", + "flavorRef": "http://localhost:8774/v1.1/flavors/3", + "metadata": {}, + "personality": [], }, } self.assertEquals(request['body'], expected) def test_empty_metadata_personality(self): serial_request = """ -<server name="new-server-test"> - <image id="1"/> - <flavor id="2"/> +<server xmlns="http://docs.openstack.org/compute/api/v1.1" + name="new-server-test" + imageRef="1" + flavorRef="2"> <metadata/> <personality/> </server>""" @@ -2608,8 +2616,8 @@ class TestServerCreateRequestXMLDeserializerV11(unittest.TestCase): expected = { "server": { "name": "new-server-test", - "image": {"id": "1", "links": []}, - "flavor": {"id": "2", "links": []}, + "imageRef": "1", + "flavorRef": "2", "metadata": {}, "personality": [], }, @@ -2618,9 +2626,10 @@ class TestServerCreateRequestXMLDeserializerV11(unittest.TestCase): def test_multiple_metadata_items(self): serial_request = """ -<server name="new-server-test"> - <image id="1"/> - <flavor id="2"/> +<server xmlns="http://docs.openstack.org/compute/api/v1.1" + name="new-server-test" + imageRef="1" + flavorRef="2"> <metadata> <meta key="one">two</meta> <meta key="open">snack</meta> @@ -2630,18 +2639,20 @@ class TestServerCreateRequestXMLDeserializerV11(unittest.TestCase): expected = { "server": { "name": "new-server-test", - "image": {"id": "1", "links": []}, - "flavor": {"id": "2", "links": []}, + "imageRef": "1", + "flavorRef": "2", "metadata": {"one": "two", "open": "snack"}, + "personality": [], }, } self.assertEquals(request['body'], expected) def test_multiple_personality_files(self): serial_request = """ -<server name="new-server-test"> - <image id="1"/> - <flavor id="2"/> +<server xmlns="http://docs.openstack.org/compute/api/v1.1" + name="new-server-test" + imageRef="1" + flavorRef="2"> <personality> <file path="/etc/banner.txt">MQ==</file> <file path="/etc/hosts">Mg==</file> @@ -2651,8 +2662,9 @@ class TestServerCreateRequestXMLDeserializerV11(unittest.TestCase): expected = { "server": { "name": "new-server-test", - "image": {"id": "1", "links": []}, - "flavor": {"id": "2", "links": []}, + "imageRef": "1", + "flavorRef": "2", + "metadata": {}, "personality": [ {"path": "/etc/banner.txt", "contents": "MQ=="}, {"path": "/etc/hosts", "contents": "Mg=="}, @@ -2662,59 +2674,27 @@ class TestServerCreateRequestXMLDeserializerV11(unittest.TestCase): self.assertEquals(request['body'], expected) def test_spec_request(self): - image_self_link = "http://servers.api.openstack.org/v1.1/1234/" + \ - "images/52415800-8b69-11e0-9b19-734f6f006e54" image_bookmark_link = "http://servers.api.openstack.org/1234/" + \ "images/52415800-8b69-11e0-9b19-734f6f006e54" serial_request = """ <server xmlns="http://docs.openstack.org/compute/api/v1.1" - xmlns:atom="http://www.w3.org/2005/Atom" + imageRef="%s" + flavorRef="52415800-8b69-11e0-9b19-734f1195ff37" name="new-server-test"> - <image id="52415800-8b69-11e0-9b19-734f6f006e54" - name="CentOS 5.2" - updated="2010-10-10T12:00:00Z" - created="2010-08-10T12:00:00Z" - status="ACTIVE"> - <atom:link - rel="self" - href="%s"/> - <atom:link - rel="bookmark" - href="%s"/> - </image> - <flavor id="52415800-8b69-11e0-9b19-734f1195ff37" /> <metadata> <meta key="My Server Name">Apache1</meta> </metadata> <personality> <file path="/etc/banner.txt">Mg==</file> </personality> -</server>""" % (image_self_link, image_bookmark_link) +</server>""" % (image_bookmark_link) request = self.deserializer.deserialize(serial_request, 'create') expected = { "server": { "name": "new-server-test", - "image": { - "id": "52415800-8b69-11e0-9b19-734f6f006e54", - "links": [ - { - "rel": "self", - "href": "http://servers.api.openstack.org/" + \ - "v1.1/1234/images/52415800-8b69-11" + \ - "e0-9b19-734f6f006e54", - }, - { - "rel": "bookmark", - "href": "http://servers.api.openstack.org/" + \ - "1234/images/52415800-8b69-11e0-9b" + \ - "19-734f6f006e54", - }, - ], - }, - "flavor": { - "id": "52415800-8b69-11e0-9b19-734f1195ff37", - "links": [], - }, + "imageRef": "http://servers.api.openstack.org/1234/" + \ + "images/52415800-8b69-11e0-9b19-734f6f006e54", + "flavorRef": "52415800-8b69-11e0-9b19-734f1195ff37", "metadata": {"My Server Name": "Apache1"}, "personality": [ { |
