Merge pull request #170 from TimSimpsonR/paging_xml

Fixed XML serializer to work with pagination.
This commit is contained in:
Tim Simpson
2012-07-26 12:57:58 -07:00
2 changed files with 44 additions and 22 deletions

View File

@@ -24,6 +24,7 @@ import traceback
import webob
import webob.dec
import webob.exc
from xml.dom import minidom
from reddwarf.common import context as rd_context
from reddwarf.common import config
@@ -323,6 +324,34 @@ class ReddwarfXMLDictSerializer(openstack_wsgi.XMLDictSerializer):
def __init__(self, metadata=None, xmlns=None):
super(ReddwarfXMLDictSerializer, self).__init__(metadata, XMLNS)
def default(self, data):
# We expect data to be a dictionary containing a single key as the XML
# root, or two keys, the later being "links."
# We expect data to contain a single key which is the XML root,
has_links = False
root_key = None
for key in data:
if key == "links":
has_links = True
elif root_key is None:
root_key = key
else:
msg = "Xml issue: multiple root keys found in dict!:%s" % data
LOG.error(msg)
raise RuntimeError(msg)
if root_key is None:
msg = "Missing root key in dict:%s" % data
LOG.error(msg)
raise RuntimeError(msg)
doc = minidom.Document()
node = self._to_xml_node(doc, self.metadata, root_key, data[root_key])
if has_links:
# Create a links element, and mix it into the node element.
links_node = self._to_xml_node(doc, self.metadata,
'links', data['links'])
node.appendChild(links_node)
return self.to_xml_string(node)
def _to_xml_node(self, doc, metadata, nodename, data):
metadata['attributes'] = CUSTOM_SERIALIZER_METADATA
if hasattr(data, "to_xml"):
@@ -333,6 +362,8 @@ class ReddwarfXMLDictSerializer(openstack_wsgi.XMLDictSerializer):
data)
class ReddwarfResponseSerializer(openstack_wsgi.ResponseSerializer):
def serialize_body(self, response, data, content_type, action):

View File

@@ -66,36 +66,27 @@ class FakeGuest(object):
def is_root_enabled(self):
return self.root_was_enabled
def list_databases(self, limit=None, marker=None, include_marker=False):
dbs = [self.dbs[name] for name in self.dbs]
names = [db['_name'] for db in dbs]
def _list_resource(self, resource, limit=None, marker=None,
include_marker=False):
names = sorted([name for name in resource])
if marker in names:
if not include_marker:
# Cut off everything left of and including the marker item.
dbs = dbs[names.index(marker) + 1:]
names = names[names.index(marker) + 1:]
else:
dbs = dbs[names.index(marker):]
names = names[names.index(marker):]
next_marker = None
if limit:
if len(dbs) > limit:
next_marker = dbs[limit - 1]['_name']
dbs = dbs[:limit]
return dbs, next_marker
if len(names) > limit:
next_marker = names[limit - 1]
names = names[:limit]
return [resource[name] for name in names], next_marker
def list_databases(self, limit=None, marker=None, include_marker=False):
return self._list_resource(self.dbs, limit, marker, include_marker)
def list_users(self, limit=None, marker=None, include_marker=False):
users = [self.users[name] for name in self.users]
names = [user['_name'] for user in users]
if marker in names:
if not include_marker:
users = users[names.index(marker) + 1:]
else:
users = users[names.index(marker):]
next_marker = None
if limit:
if len(users) > limit:
next_marker = users[limit - 1]['_name']
users = users[:limit]
return users, next_marker
return self._list_resource(self.users, limit, marker, include_marker)
def prepare(self, memory_mb, databases, users, device_path=None,
mount_point=None):