summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Waldon <brian.waldon@rackspace.com>2011-07-26 12:57:06 -0400
committerBrian Waldon <brian.waldon@rackspace.com>2011-07-26 12:57:06 -0400
commit1ad5f2eaf49904d8e14546d59699b1472a1a5bb2 (patch)
tree0b9cd62012e4e3bd394ccdad030858733c6f7ac3
parentf900021b8a0e7df946fd6fabe34e560fe2c30356 (diff)
downloadnova-1ad5f2eaf49904d8e14546d59699b1472a1a5bb2.tar.gz
nova-1ad5f2eaf49904d8e14546d59699b1472a1a5bb2.tar.xz
nova-1ad5f2eaf49904d8e14546d59699b1472a1a5bb2.zip
xml deserialization works now
-rw-r--r--nova/api/openstack/create_instance_helper.py79
-rw-r--r--nova/api/openstack/wsgi.py9
-rw-r--r--nova/tests/api/openstack/test_servers.py162
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": [
{