Merge from trunk

This commit is contained in:
Naveed Massjouni
2011-04-06 17:26:50 -04:00
2 changed files with 39 additions and 5 deletions

View File

@@ -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]

View File

@@ -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',