Merge pull request #170 from TimSimpsonR/paging_xml
Fixed XML serializer to work with pagination.
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user