diff --git a/vmware_nsxlib/v3/client.py b/vmware_nsxlib/v3/client.py index 589f91a0..75533972 100644 --- a/vmware_nsxlib/v3/client.py +++ b/vmware_nsxlib/v3/client.py @@ -27,6 +27,7 @@ LOG = log.getLogger(__name__) ERRORS = {requests.codes.NOT_FOUND: exceptions.ResourceNotFound, requests.codes.PRECONDITION_FAILED: exceptions.StaleRevision} DEFAULT_ERROR = exceptions.ManagerError +NULL_CURSOR_PREFIX = '0000' class RESTClient(object): @@ -54,8 +55,8 @@ class RESTClient(object): default_headers=self._default_headers, client_obj=self) - def list(self, headers=None): - return self.url_list('') + def list(self, resource='', headers=None): + return self.url_list(resource, headers=headers) def get(self, uuid, headers=None): return self.url_get(uuid, headers=headers) @@ -70,7 +71,16 @@ class RESTClient(object): return self.url_post(resource, body, headers=headers) def url_list(self, url, headers=None): - return self.url_get(url, headers=headers) + concatenate_response = self.url_get(url, headers=headers) + cursor = concatenate_response.get('cursor', NULL_CURSOR_PREFIX) + op = '&' if urlparse.urlparse(url).query else '?' + url += op + 'cursor=' + + while cursor and not cursor.startswith(NULL_CURSOR_PREFIX): + page = self.url_get(url + cursor, headers=headers) + concatenate_response['results'].extend(page.get('results', [])) + cursor = page.get('cursor', NULL_CURSOR_PREFIX) + return concatenate_response def url_get(self, url, headers=None): return self._rest_call(url, method='GET', headers=headers) diff --git a/vmware_nsxlib/v3/security.py b/vmware_nsxlib/v3/security.py index 7df029d1..52b07f26 100644 --- a/vmware_nsxlib/v3/security.py +++ b/vmware_nsxlib/v3/security.py @@ -159,7 +159,7 @@ class NsxLibNsGroup(utils.NsxLibApiBase): return self.client.create('ns-groups', body) def list(self): - return self.client.get( + return self.client.list( 'ns-groups?populate_references=false').get('results', []) def update(self, nsgroup_id, display_name=None, description=None, @@ -370,7 +370,7 @@ class NsxLibFirewallSection(utils.NsxLibApiBase): def list(self): resource = 'firewall/sections' - return self.client.get(resource).get('results', []) + return self.client.list(resource).get('results', []) def delete(self, section_id): resource = 'firewall/sections/%s?cascade=true' % section_id