diff options
author | Ken Pepple <ken.pepple@gmail.com> | 2011-04-06 15:55:55 -0700 |
---|---|---|
committer | Ken Pepple <ken.pepple@gmail.com> | 2011-04-06 15:55:55 -0700 |
commit | f2928ba331234f53e3051cf0ea1a5492593bedf1 (patch) | |
tree | 6afbfa938b5287af3ce9d0cb08112be770b98dfd /nova/wsgi.py | |
parent | dc8b3cb3fa124755ed3e5282b2d11a811f1db2d5 (diff) | |
parent | 7bd99e33796f1e90b6f8b0b9caa122c541f99015 (diff) | |
download | nova-f2928ba331234f53e3051cf0ea1a5492593bedf1.tar.gz nova-f2928ba331234f53e3051cf0ea1a5492593bedf1.tar.xz nova-f2928ba331234f53e3051cf0ea1a5492593bedf1.zip |
merged trunk
Diffstat (limited to 'nova/wsgi.py')
-rw-r--r-- | nova/wsgi.py | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/nova/wsgi.py b/nova/wsgi.py index ba0819466..94aafdf1c 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: singular = metadata.get('plurals', {}).get(nodename, None) if singular is None: @@ -532,6 +550,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] |