From 78a8486d1cfe608858e85545f2d49ee8dd6a91c0 Mon Sep 17 00:00:00 2001 From: Ryan Bak Date: Tue, 8 Nov 2016 16:13:15 -0700 Subject: [PATCH] Add list_next for pagination Preserves the 'next' link from list queries to allow pagination and adds a new command to pick the last query where the limit stopped it Change-Id: I564c3824b0dd8458e3d6237ec546b4e6e1052334 --- monascaclient/common/monasca_manager.py | 34 ++++++++++++ monascaclient/v2_0/alarm_definitions.py | 15 +----- monascaclient/v2_0/alarms.py | 13 +---- monascaclient/v2_0/metrics.py | 72 +++---------------------- monascaclient/v2_0/notifications.py | 11 +--- monascaclient/v2_0/notificationtypes.py | 11 +--- 6 files changed, 44 insertions(+), 112 deletions(-) diff --git a/monascaclient/common/monasca_manager.py b/monascaclient/common/monasca_manager.py index 8eae6eb..d946dba 100644 --- a/monascaclient/common/monasca_manager.py +++ b/monascaclient/common/monasca_manager.py @@ -15,12 +15,39 @@ from monascaclient.apiclient import base +from six.moves.urllib import parse +from six.moves.urllib_parse import unquote + class MonascaManager(base.BaseManager): def __init__(self, client, **kwargs): super(MonascaManager, self).__init__(client) + def _parse_body(self, body): + if type(body) is dict: + self.next = None + for link in body['links']: + if link['rel'] == 'next': + self.next = link['href'] + return body['elements'] + else: + return body + + def _list(self, path, dim_key=None, **kwargs): + """Get a list of metrics.""" + url_str = self.base_url + path + newheaders = self.get_headers() + if dim_key and dim_key in kwargs: + dimstr = self.get_dimensions_url_string(kwargs[dim_key]) + kwargs[dim_key] = dimstr + + if kwargs: + url_str += '?%s' % parse.urlencode(kwargs, True) + resp, body = self.client.json_request( + 'GET', url_str, headers=newheaders) + return self._parse_body(body) + def get_headers(self): headers = self.client.credentials_headers() return headers @@ -37,3 +64,10 @@ class MonascaManager(base.BaseManager): dim_str = k dim_list.append(dim_str) return ','.join(dim_list) + + def list_next(self): + if hasattr(self, 'next') and self.next: + self.next = unquote(self.next) + path = self.next.split(self.base_url, 1)[-1] + return self._list(path) + return None diff --git a/monascaclient/v2_0/alarm_definitions.py b/monascaclient/v2_0/alarm_definitions.py index 2d8b963..589d5a7 100644 --- a/monascaclient/v2_0/alarm_definitions.py +++ b/monascaclient/v2_0/alarm_definitions.py @@ -13,8 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from six.moves.urllib import parse - from monascaclient.apiclient import base from monascaclient.common import monasca_manager @@ -47,18 +45,7 @@ class AlarmDefinitionsManager(monasca_manager.MonascaManager): def list(self, **kwargs): """Get a list of alarm definitions.""" - url_str = self.base_url - newheaders = self.get_headers() - if 'dimensions' in kwargs: - dimstr = self.get_dimensions_url_string(kwargs['dimensions']) - kwargs['dimensions'] = dimstr - - if kwargs: - url_str = url_str + '?%s' % parse.urlencode(kwargs, True) - # print url_str - resp, body = self.client.json_request( - 'GET', url_str, headers=newheaders) - return body['elements'] if type(body) is dict else body + return self._list('', 'dimensions', **kwargs) def delete(self, **kwargs): """Delete a specific alarm definition.""" diff --git a/monascaclient/v2_0/alarms.py b/monascaclient/v2_0/alarms.py index 784a2f7..db21110 100644 --- a/monascaclient/v2_0/alarms.py +++ b/monascaclient/v2_0/alarms.py @@ -39,18 +39,7 @@ class AlarmsManager(monasca_manager.MonascaManager): def list(self, **kwargs): """Get a list of alarms.""" - url_str = self.base_url - newheaders = self.get_headers() - if 'metric_dimensions' in kwargs: - dimstr = self.get_dimensions_url_string(kwargs['metric_dimensions']) - kwargs['metric_dimensions'] = dimstr - - if kwargs: - url_str = url_str + '?%s' % parse.urlencode(kwargs, True) - # print url_str - resp, body = self.client.json_request( - 'GET', url_str, headers=newheaders) - return body['elements'] if type(body) is dict else body + return self._list('', 'metric_dimensions', **kwargs) def delete(self, **kwargs): """Delete a specific alarm.""" diff --git a/monascaclient/v2_0/metrics.py b/monascaclient/v2_0/metrics.py index 709b0c9..b54fb8d 100644 --- a/monascaclient/v2_0/metrics.py +++ b/monascaclient/v2_0/metrics.py @@ -15,8 +15,6 @@ from copy import deepcopy -from six.moves.urllib import parse - from monascaclient.apiclient import base from monascaclient.common import monasca_manager @@ -51,82 +49,24 @@ class MetricsManager(monasca_manager.MonascaManager): def list(self, **kwargs): """Get a list of metrics.""" - url_str = self.base_url - newheaders = self.get_headers() - if 'dimensions' in kwargs: - dimstr = self.get_dimensions_url_string(kwargs['dimensions']) - kwargs['dimensions'] = dimstr - - if kwargs: - url_str = url_str + '?%s' % parse.urlencode(kwargs, True) - # print url_str - resp, body = self.client.json_request( - 'GET', url_str, headers=newheaders) - return body['elements'] if type(body) is dict else body + return self._list('', 'dimensions', **kwargs) def list_names(self, **kwargs): """Get a list of metric names.""" - url_str = self.base_url + '/names' - newheaders = self.get_headers() - if 'dimensions' in kwargs: - dimstr = self.get_dimensions_url_string(kwargs['dimensions']) - kwargs['dimensions'] = dimstr - - if kwargs: - url_str = url_str + '?%s' % parse.urlencode(kwargs, True) - # print url_str - resp, body = self.client.json_request( - 'GET', url_str, headers=newheaders) - return body['elements'] if type(body) is dict else body + return self._list('/names', 'dimensions', **kwargs) def list_measurements(self, **kwargs): """Get a list of measurements based on metric definition filters.""" - url_str = self.base_url + '/measurements' - newheaders = self.get_headers() - if 'dimensions' in kwargs: - dimstr = self.get_dimensions_url_string(kwargs['dimensions']) - kwargs['dimensions'] = dimstr - - if kwargs: - url_str = url_str + '?%s' % parse.urlencode(kwargs, True) - # print url_str - resp, body = self.client.json_request( - 'GET', url_str, headers=newheaders) - return body['elements'] if type(body) is dict else body + return self._list('/measurements', 'dimensions', **kwargs) def list_statistics(self, **kwargs): """Get a list of measurement statistics based on metric def filters.""" - url_str = self.base_url + '/statistics' - newheaders = self.get_headers() - if 'dimensions' in kwargs: - dimstr = self.get_dimensions_url_string(kwargs['dimensions']) - kwargs['dimensions'] = dimstr - - if kwargs: - url_str = url_str + '?%s' % parse.urlencode(kwargs, True) - # print url_str - resp, body = self.client.json_request( - 'GET', url_str, headers=newheaders) - return body['elements'] if type(body) is dict else body + return self._list('/statistics', 'dimensions', **kwargs) def list_dimension_names(self, **kwargs): """Get a list of metric dimension names.""" - url_str = self.base_url + '/dimensions/names' - new_headers = self.get_headers() - if kwargs: - url_str += '?%s' % parse.urlencode(kwargs, True) - # print url_str - resp, body = self.client.json_request( - 'GET', url_str, headers=new_headers) - return body['elements'] if type(body) is dict else body + return self._list('/dimensions/names', **kwargs) def list_dimension_values(self, **kwargs): """Get a list of metric dimension values.""" - url_str = self.base_url + '/dimensions/names/values' - new_headers = self.get_headers() - if kwargs: - url_str += '?%s' % parse.urlencode(kwargs, True) - # print url_str - resp, body = self.client.json_request( - 'GET', url_str, headers=new_headers) - return body['elements'] if type(body) is dict else body + return self._list('/dimensions/names/values', **kwargs) diff --git a/monascaclient/v2_0/notifications.py b/monascaclient/v2_0/notifications.py index adaf57d..9616eca 100644 --- a/monascaclient/v2_0/notifications.py +++ b/monascaclient/v2_0/notifications.py @@ -15,8 +15,6 @@ from copy import deepcopy -from six.moves.urllib import parse - from monascaclient.apiclient import base from monascaclient.common import monasca_manager @@ -49,14 +47,7 @@ class NotificationsManager(monasca_manager.MonascaManager): def list(self, **kwargs): """Get a list of notifications.""" - newheaders = self.get_headers() - url_str = self.base_url - if kwargs: - url_str = url_str + '?%s' % parse.urlencode(kwargs, True) - - resp, body = self.client.json_request('GET', url_str, - headers=newheaders) - return body['elements'] if type(body) is dict else body + return self._list('', **kwargs) def delete(self, **kwargs): """Delete a notification.""" diff --git a/monascaclient/v2_0/notificationtypes.py b/monascaclient/v2_0/notificationtypes.py index a7fbde0..cb3dba1 100644 --- a/monascaclient/v2_0/notificationtypes.py +++ b/monascaclient/v2_0/notificationtypes.py @@ -13,8 +13,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from six.moves.urllib import parse - from monascaclient.apiclient import base from monascaclient.common import monasca_manager @@ -31,11 +29,4 @@ class NotificationTypesManager(monasca_manager.MonascaManager): def list(self, **kwargs): """Get a list of notifications.""" - newheaders = self.get_headers() - url_str = self.base_url - if kwargs: - url_str = url_str + '?%s' % parse.urlencode(kwargs, True) - - resp, body = self.client.json_request('GET', url_str, - headers=newheaders) - return body['elements'] if type(body) is dict else body + return self._list('', **kwargs)