Merge from trunk
This commit is contained in:
29
nova/wsgi.py
29
nova/wsgi.py
@@ -355,24 +355,25 @@ class Controller(object):
|
|||||||
|
|
||||||
if type(result) is dict:
|
if type(result) is dict:
|
||||||
content_type = req.best_match_content_type()
|
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 = webob.Response()
|
||||||
response.headers["Content-Type"] = content_type
|
response.headers["Content-Type"] = content_type
|
||||||
response.body = body
|
response.body = body
|
||||||
return response
|
return response
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return result
|
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.
|
Serialize the given dict to the provided content_type.
|
||||||
Uses self._serialization_metadata if it exists, which is a dict mapping
|
Uses self._serialization_metadata if it exists, which is a dict mapping
|
||||||
MIME types to information needed to serialize to that type.
|
MIME types to information needed to serialize to that type.
|
||||||
"""
|
"""
|
||||||
_metadata = getattr(type(self), "_serialization_metadata", {})
|
_metadata = getattr(type(self), "_serialization_metadata", {})
|
||||||
serializer = Serializer(_metadata)
|
|
||||||
|
serializer = Serializer(_metadata, default_xmlns)
|
||||||
try:
|
try:
|
||||||
return serializer.serialize(data, content_type)
|
return serializer.serialize(data, content_type)
|
||||||
except exception.InvalidContentType:
|
except exception.InvalidContentType:
|
||||||
@@ -388,19 +389,24 @@ class Controller(object):
|
|||||||
serializer = Serializer(_metadata)
|
serializer = Serializer(_metadata)
|
||||||
return serializer.deserialize(data, content_type)
|
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):
|
class Serializer(object):
|
||||||
"""
|
"""
|
||||||
Serializes and deserializes dictionaries to certain MIME types.
|
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.
|
Create a serializer based on the given WSGI environment.
|
||||||
'metadata' is an optional dict mapping MIME types to information
|
'metadata' is an optional dict mapping MIME types to information
|
||||||
needed to serialize a dictionary to that type.
|
needed to serialize a dictionary to that type.
|
||||||
"""
|
"""
|
||||||
self.metadata = metadata or {}
|
self.metadata = metadata or {}
|
||||||
|
self.default_xmlns = default_xmlns
|
||||||
|
|
||||||
def _get_serialize_handler(self, content_type):
|
def _get_serialize_handler(self, content_type):
|
||||||
handlers = {
|
handlers = {
|
||||||
@@ -478,11 +484,23 @@ class Serializer(object):
|
|||||||
root_key = data.keys()[0]
|
root_key = data.keys()[0]
|
||||||
doc = minidom.Document()
|
doc = minidom.Document()
|
||||||
node = self._to_xml_node(doc, metadata, root_key, data[root_key])
|
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=' ')
|
return node.toprettyxml(indent=' ')
|
||||||
|
|
||||||
def _to_xml_node(self, doc, metadata, nodename, data):
|
def _to_xml_node(self, doc, metadata, nodename, data):
|
||||||
"""Recursive method to convert data members to XML nodes."""
|
"""Recursive method to convert data members to XML nodes."""
|
||||||
result = doc.createElement(nodename)
|
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:
|
if type(data) is list:
|
||||||
collections = metadata.get('list_collections', {})
|
collections = metadata.get('list_collections', {})
|
||||||
if nodename in collections:
|
if nodename in collections:
|
||||||
@@ -550,6 +568,7 @@ def paste_config_file(basename):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
configfiles = [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, 'etc', basename),
|
||||||
os.path.join(FLAGS.state_path, basename),
|
os.path.join(FLAGS.state_path, basename),
|
||||||
'/etc/nova/%s' % basename]
|
'/etc/nova/%s' % basename]
|
||||||
|
|||||||
15
setup.py
15
setup.py
@@ -16,6 +16,7 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import glob
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
@@ -86,6 +87,19 @@ try:
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def find_data_files(destdir, srcdir):
|
||||||
|
package_data = []
|
||||||
|
files = []
|
||||||
|
for d in glob.glob('%s/*' % (srcdir, )):
|
||||||
|
if os.path.isdir(d):
|
||||||
|
package_data += find_data_files(
|
||||||
|
os.path.join(destdir, os.path.basename(d)), d)
|
||||||
|
else:
|
||||||
|
files += [d]
|
||||||
|
package_data += [(destdir, files)]
|
||||||
|
return package_data
|
||||||
|
|
||||||
DistUtilsExtra.auto.setup(name='nova',
|
DistUtilsExtra.auto.setup(name='nova',
|
||||||
version=version.canonical_version_string(),
|
version=version.canonical_version_string(),
|
||||||
description='cloud computing fabric controller',
|
description='cloud computing fabric controller',
|
||||||
@@ -96,6 +110,7 @@ DistUtilsExtra.auto.setup(name='nova',
|
|||||||
packages=find_packages(exclude=['bin', 'smoketests']),
|
packages=find_packages(exclude=['bin', 'smoketests']),
|
||||||
include_package_data=True,
|
include_package_data=True,
|
||||||
test_suite='nose.collector',
|
test_suite='nose.collector',
|
||||||
|
data_files=find_data_files('share/nova', 'tools'),
|
||||||
scripts=['bin/nova-ajax-console-proxy',
|
scripts=['bin/nova-ajax-console-proxy',
|
||||||
'bin/nova-api',
|
'bin/nova-api',
|
||||||
'bin/nova-compute',
|
'bin/nova-compute',
|
||||||
|
|||||||
Reference in New Issue
Block a user