summaryrefslogtreecommitdiffstats
path: root/nova/wsgi.py
diff options
context:
space:
mode:
authorNaveed Massjouni <naveedm9@gmail.com>2011-04-06 17:26:50 -0400
committerNaveed Massjouni <naveedm9@gmail.com>2011-04-06 17:26:50 -0400
commit40c923061f86f1046f64bb4b58c088c0b3a5c952 (patch)
tree87dd577a82c69feb0f6cfcbe8aafd75fce565ec8 /nova/wsgi.py
parent3c487493de2a0f827780d54080797bfe70183ba6 (diff)
parent7bd99e33796f1e90b6f8b0b9caa122c541f99015 (diff)
downloadnova-40c923061f86f1046f64bb4b58c088c0b3a5c952.tar.gz
nova-40c923061f86f1046f64bb4b58c088c0b3a5c952.tar.xz
nova-40c923061f86f1046f64bb4b58c088c0b3a5c952.zip
Merge from trunk
Diffstat (limited to 'nova/wsgi.py')
-rw-r--r--nova/wsgi.py29
1 files changed, 24 insertions, 5 deletions
diff --git a/nova/wsgi.py b/nova/wsgi.py
index a550a33b0..72758e50e 100644
--- a/nova/wsgi.py
+++ b/nova/wsgi.py
@@ -355,24 +355,25 @@ class Controller(object):
if type(result) is dict:
content_type = req.best_match_content_type()
- body = self._serialize(result, content_type)
+ default_xmlns = self.get_default_xmlns(req)
+ body = self._serialize(result, content_type, default_xmlns)
response = webob.Response()
response.headers["Content-Type"] = content_type
response.body = body
return response
-
else:
return result
- def _serialize(self, data, content_type):
+ def _serialize(self, data, content_type, default_xmlns):
"""
Serialize the given dict to the provided content_type.
Uses self._serialization_metadata if it exists, which is a dict mapping
MIME types to information needed to serialize to that type.
"""
_metadata = getattr(type(self), "_serialization_metadata", {})
- serializer = Serializer(_metadata)
+
+ serializer = Serializer(_metadata, default_xmlns)
try:
return serializer.serialize(data, content_type)
except exception.InvalidContentType:
@@ -388,19 +389,24 @@ class Controller(object):
serializer = Serializer(_metadata)
return serializer.deserialize(data, content_type)
+ def get_default_xmlns(self, req):
+ """Provide the XML namespace to use if none is otherwise specified."""
+ return None
+
class Serializer(object):
"""
Serializes and deserializes dictionaries to certain MIME types.
"""
- def __init__(self, metadata=None):
+ def __init__(self, metadata=None, default_xmlns=None):
"""
Create a serializer based on the given WSGI environment.
'metadata' is an optional dict mapping MIME types to information
needed to serialize a dictionary to that type.
"""
self.metadata = metadata or {}
+ self.default_xmlns = default_xmlns
def _get_serialize_handler(self, content_type):
handlers = {
@@ -478,11 +484,23 @@ class Serializer(object):
root_key = data.keys()[0]
doc = minidom.Document()
node = self._to_xml_node(doc, metadata, root_key, data[root_key])
+
+ xmlns = node.getAttribute('xmlns')
+ if not xmlns and self.default_xmlns:
+ node.setAttribute('xmlns', self.default_xmlns)
+
return node.toprettyxml(indent=' ')
def _to_xml_node(self, doc, metadata, nodename, data):
"""Recursive method to convert data members to XML nodes."""
result = doc.createElement(nodename)
+
+ # Set the xml namespace if one is specified
+ # TODO(justinsb): We could also use prefixes on the keys
+ xmlns = metadata.get('xmlns', None)
+ if xmlns:
+ result.setAttribute('xmlns', xmlns)
+
if type(data) is list:
collections = metadata.get('list_collections', {})
if nodename in collections:
@@ -550,6 +568,7 @@ def paste_config_file(basename):
"""
configfiles = [basename,
+ os.path.join(FLAGS.state_path, 'etc', 'nova', basename),
os.path.join(FLAGS.state_path, 'etc', basename),
os.path.join(FLAGS.state_path, basename),
'/etc/nova/%s' % basename]