def test_limiter_offset_zero(self): """ Test offset key works with 0. """ req = webob.Request.blank('/?offset=0') self.assertEqual(common.limited(self.tiny, req), self.tiny) self.assertEqual(common.limited(self.small, req), self.small) self.assertEqual(common.limited(self.medium, req), self.medium) self.assertEqual(common.limited(self.large, req), self.large[:1000])
def test_limiter_offset_zero(self): """Test offset key works with 0.""" req = webob.Request.blank('/?offset=0') self.assertEqual(self.tiny, common.limited(self.tiny, req)) self.assertEqual(self.small, common.limited(self.small, req)) self.assertEqual(self.medium, common.limited(self.medium, req)) self.assertEqual(self.large[:1000], common.limited(self.large, req))
def test_limiter_offset_medium(self): """Test offset key works with a medium sized number.""" req = webob.Request.blank('/?offset=10') self.assertEqual([], common.limited(self.tiny, req)) self.assertEqual(self.small[10:], common.limited(self.small, req)) self.assertEqual(self.medium[10:], common.limited(self.medium, req)) self.assertEqual(self.large[10:1010], common.limited(self.large, req))
def test_limiter_limit_zero(self): """Test limit of zero.""" req = webob.Request.blank('/?limit=0') self.assertEqual(common.limited(self.tiny, req), self.tiny) self.assertEqual(common.limited(self.small, req), self.small) self.assertEqual(common.limited(self.medium, req), self.medium) self.assertEqual(common.limited(self.large, req), self.large[:1000])
def test_limiter_nothing(self): """ Test request with no offset or limit """ req = webob.Request.blank('/') self.assertEqual(common.limited(self.tiny, req), self.tiny) self.assertEqual(common.limited(self.small, req), self.small) self.assertEqual(common.limited(self.medium, req), self.medium) self.assertEqual(common.limited(self.large, req), self.large[:1000])
def test_limiter_limit_medium(self): """ Test limit of 10. """ req = webob.Request.blank('/?limit=10') self.assertEqual(common.limited(self.tiny, req), self.tiny) self.assertEqual(common.limited(self.small, req), self.small) self.assertEqual(common.limited(self.medium, req), self.medium[:10]) self.assertEqual(common.limited(self.large, req), self.large[:10])
def test_limiter_limit_zero(self): """Test limit of zero.""" req = webob.Request.blank('/?limit=0') self.assertEqual(self.tiny, common.limited(self.tiny, req)) self.assertEqual(self.small, common.limited(self.small, req)) self.assertEqual(self.medium, common.limited(self.medium, req)) self.assertEqual(self.large[:1000], common.limited(self.large, req))
def test_limiter_nothing(self): """Test request with no offset or limit.""" req = webob.Request.blank('/') self.assertEqual(self.tiny, common.limited(self.tiny, req)) self.assertEqual(self.small, common.limited(self.small, req)) self.assertEqual(self.medium, common.limited(self.medium, req)) self.assertEqual(self.large[:1000], common.limited(self.large, req))
def test_limiter_limit_over_max(self): """Test limit of 3000.""" req = webob.Request.blank('/?limit=3000') self.assertEqual(self.tiny, common.limited(self.tiny, req)) self.assertEqual(self.small, common.limited(self.small, req)) self.assertEqual(self.medium, common.limited(self.medium, req)) self.assertEqual(self.large[:1000], common.limited(self.large, req))
def test_limiter_limit_over_max(self): """ Test limit of 3000. """ req = webob.Request.blank('/?limit=3000') self.assertEqual(common.limited(self.tiny, req), self.tiny) self.assertEqual(common.limited(self.small, req), self.small) self.assertEqual(common.limited(self.medium, req), self.medium) self.assertEqual(common.limited(self.large, req), self.large[:1000])
def test_limiter_limit_zero(self): """Test limit of zero.""" req = webob.Request.blank("/?limit=0") self.assertEqual(self.tiny, common.limited(self.tiny, req)) self.assertEqual(self.small, common.limited(self.small, req)) self.assertEqual(self.medium, common.limited(self.medium, req)) self.assertEqual(self.large[:1000], common.limited(self.large, req))
def test_limiter_offset_over_max(self): """Test offset key works with a number over 1000 (max_limit).""" req = webob.Request.blank("/?offset=1001") self.assertEqual([], common.limited(self.tiny, req)) self.assertEqual([], common.limited(self.small, req)) self.assertEqual([], common.limited(self.medium, req)) self.assertEqual(self.large[1001:2001], common.limited(self.large, req))
def test_limiter_limit_medium(self): """Test limit of 10.""" req = webob.Request.blank('/?limit=10') self.assertEqual(self.tiny, common.limited(self.tiny, req)) self.assertEqual(self.small, common.limited(self.small, req)) self.assertEqual(self.medium[:10], common.limited(self.medium, req)) self.assertEqual(self.large[:10], common.limited(self.large, req))
def test_limiter_offset_medium(self): """ Test offset key works with a medium sized number. """ req = webob.Request.blank('/?offset=10') self.assertEqual(common.limited(self.tiny, req), []) self.assertEqual(common.limited(self.small, req), self.small[10:]) self.assertEqual(common.limited(self.medium, req), self.medium[10:]) self.assertEqual(common.limited(self.large, req), self.large[10:1010])
def test_limiter_offset_over_max(self): """ Test offset key works with a number over 1000 (max_limit). """ req = webob.Request.blank('/?offset=1001') self.assertEqual(common.limited(self.tiny, req), []) self.assertEqual(common.limited(self.small, req), []) self.assertEqual(common.limited(self.medium, req), []) self.assertEqual(common.limited(self.large, req), self.large[1001:2001])
def test_limiter_limit_and_offset(self): """ Test request with both limit and offset. """ items = range(2000) req = webob.Request.blank('/?offset=1&limit=3') self.assertEqual(common.limited(items, req), items[1:4]) req = webob.Request.blank('/?offset=3&limit=0') self.assertEqual(common.limited(items, req), items[3:1003]) req = webob.Request.blank('/?offset=3&limit=1500') self.assertEqual(common.limited(items, req), items[3:1003]) req = webob.Request.blank('/?offset=3000&limit=10') self.assertEqual(common.limited(items, req), [])
def test_limiter_custom_max_limit(self): """Test a max_limit other than 1000.""" items = list(range(2000)) req = webob.Request.blank("/?offset=1&limit=3") self.assertEqual(items[1:4], common.limited(items, req, max_limit=2000)) req = webob.Request.blank("/?offset=3&limit=0") self.assertEqual(items[3:], common.limited(items, req, max_limit=2000)) req = webob.Request.blank("/?offset=3&limit=2500") self.assertEqual(items[3:], common.limited(items, req, max_limit=2000)) req = webob.Request.blank("/?offset=3000&limit=10") self.assertEqual([], common.limited(items, req, max_limit=2000))
def test_limiter_limit_and_offset(self): """Test request with both limit and offset.""" items = range(2000) req = webob.Request.blank('/?offset=1&limit=3') self.assertEqual(common.limited(items, req), items[1:4]) req = webob.Request.blank('/?offset=3&limit=0') self.assertEqual(common.limited(items, req), items[3:1003]) req = webob.Request.blank('/?offset=3&limit=1500') self.assertEqual(common.limited(items, req), items[3:1003]) req = webob.Request.blank('/?offset=3000&limit=10') self.assertEqual(common.limited(items, req), [])
def test_limiter_custom_max_limit(self): """ Test a max_limit other than 1000. """ items = range(2000) req = webob.Request.blank('/?offset=1&limit=3') self.assertEqual(common.limited(items, req, max_limit=2000), items[1:4]) req = webob.Request.blank('/?offset=3&limit=0') self.assertEqual(common.limited(items, req, max_limit=2000), items[3:]) req = webob.Request.blank('/?offset=3&limit=2500') self.assertEqual(common.limited(items, req, max_limit=2000), items[3:]) req = webob.Request.blank('/?offset=3000&limit=10') self.assertEqual(common.limited(items, req, max_limit=2000), [])
def test_limiter_limit_and_offset(self): """Test request with both limit and offset.""" items = list(range(2000)) req = webob.Request.blank("/?offset=1&limit=3") self.assertEqual(items[1:4], common.limited(items, req)) req = webob.Request.blank("/?offset=3&limit=0") self.assertEqual(items[3:1003], common.limited(items, req)) req = webob.Request.blank("/?offset=3&limit=1500") self.assertEqual(items[3:1003], common.limited(items, req)) req = webob.Request.blank("/?offset=3000&limit=10") self.assertEqual([], common.limited(items, req)) req = webob.Request.blank("/?offset=30034522235674530&limit=10") self.assertRaises(webob.exc.HTTPBadRequest, common.limited, items, req)
def test_limiter_limit_and_offset(self): """Test request with both limit and offset.""" items = list(range(2000)) req = webob.Request.blank('/?offset=1&limit=3') self.assertEqual(items[1:4], common.limited(items, req)) req = webob.Request.blank('/?offset=3&limit=0') self.assertEqual(items[3:1003], common.limited(items, req)) req = webob.Request.blank('/?offset=3&limit=1500') self.assertEqual(items[3:1003], common.limited(items, req)) req = webob.Request.blank('/?offset=3000&limit=10') self.assertEqual([], common.limited(items, req)) req = webob.Request.blank('/?offset=30034522235674530&limit=10') self.assertRaises(webob.exc.HTTPBadRequest, common.limited, items, req)
def test_limiter_custom_max_limit(self): """Test a max_limit other than 1000.""" items = range(2000) req = webob.Request.blank('/?offset=1&limit=3') self.assertEqual( common.limited(items, req, max_limit=2000), items[1:4]) req = webob.Request.blank('/?offset=3&limit=0') self.assertEqual( common.limited(items, req, max_limit=2000), items[3:]) req = webob.Request.blank('/?offset=3&limit=2500') self.assertEqual( common.limited(items, req, max_limit=2000), items[3:]) req = webob.Request.blank('/?offset=3000&limit=10') self.assertEqual(common.limited(items, req, max_limit=2000), [])
def _get_transfers(self, req, is_detail): """Returns a list of transfers, transformed through view builder.""" context = req.environ['cinder.context'] req_version = req.api_version_request params = req.params.copy() marker = limit = offset = None if req_version.matches(mv.SUPPORT_TRANSFER_PAGINATION): marker, limit, offset = common.get_pagination_params(params) sort_keys, sort_dirs = common.get_sort_params(params) else: # NOTE(yikun): After microversion SUPPORT_TRANSFER_PAGINATION, # transfers list api use the ['created_at'], ['asc'] # as default order, but we should keep the compatible in here. sort_keys, sort_dirs = ['created_at', 'id'], ['asc', 'asc'] filters = params LOG.debug('Listing volume transfers') transfers = self.transfer_api.get_all(context, marker=marker, limit=limit, sort_keys=sort_keys, sort_dirs=sort_dirs, filters=filters, offset=offset) transfer_count = len(transfers) limited_list = common.limited(transfers, req) if is_detail: transfers = self._view_builder.detail_list(req, limited_list, transfer_count) else: transfers = self._view_builder.summary_list(req, limited_list, transfer_count) return transfers
def _items(self, req, is_detail=True): """Returns a list of snapshots, transformed through view builder.""" context = req.environ['cinder.context'] # Pop out non search_opts and create local variables search_opts = req.GET.copy() search_opts.pop('limit', None) search_opts.pop('offset', None) # Filter out invalid options allowed_search_options = ('status', 'volume_id', 'name') utils.remove_invalid_filter_options(context, search_opts, allowed_search_options) # NOTE(thingee): v2 API allows name instead of display_name if 'name' in search_opts: search_opts['display_name'] = search_opts['name'] del search_opts['name'] snapshots = self.volume_api.get_all_snapshots(context, search_opts=search_opts) limited_list = common.limited(snapshots.objects, req) req.cache_db_snapshots(limited_list) snapshot_count = len(snapshots) if is_detail: snapshots = self._view_builder.detail_list(req, limited_list, snapshot_count) else: snapshots = self._view_builder.summary_list( req, limited_list, snapshot_count) return snapshots
def _get_relationships(self, req, is_detail): """Returns a list of replications, transformed through view builder.""" context = req.environ['cinder.context'] params = req.params.copy() marker = params.pop('marker', None) limit = params.pop('limit', None) sort_key = params.pop('sort_key', 'id') sort_dir = params.pop('sort_dir', 'desc') params.pop('offset', None) filters = params allowed_filters = ['primary_id', 'secondary_id', 'status'] unknown_opts = [opt for opt in filters if opt not in allowed_filters] if unknown_opts: bad_opts = ", ".join(unknown_opts) log_msg = _("Removing options '%s' from query") % bad_opts LOG.debug(log_msg) for opt in unknown_opts: del filters[opt] reps = self.replication_api.get_all(context, marker=marker, limit=limit, sort_key=sort_key, sort_dir=sort_dir, filters=filters) reps = [dict(rep.iteritems()) for rep in reps] limited_list = common.limited(reps, req) if is_detail: relationships = self._view_builder.detail_list(req, limited_list) else: relationships = self._view_builder.summary_list(req, limited_list) return relationships
def _items(self, req, entity_maker): """Returns a list of snapshots, transformed through entity_maker.""" context = req.environ['cinder.context'] #pop out limit and offset , they are not search_opts search_opts = req.GET.copy() search_opts.pop('limit', None) search_opts.pop('offset', None) #filter out invalid option allowed_search_options = ('status', 'volume_id', 'name') utils.remove_invalid_filter_options(context, search_opts, allowed_search_options) # NOTE(thingee): v2 API allows name instead of display_name if 'name' in search_opts: search_opts['display_name'] = search_opts['name'] del search_opts['name'] snapshots = self.volume_api.get_all_snapshots(context, search_opts=search_opts) limited_list = common.limited(snapshots, req) req.cache_db_snapshots(limited_list) res = [entity_maker(context, snapshot) for snapshot in limited_list] return {'snapshots': res}
def _get_volumes(self, req, is_detail): """Returns a list of volumes, transformed through view builder.""" context = req.environ["cinder.context"] params = req.params.copy() marker = params.pop("marker", None) limit = params.pop("limit", None) sort_key = params.pop("sort_key", "created_at") sort_dir = params.pop("sort_dir", "desc") params.pop("offset", None) filters = params remove_invalid_options(context, filters, self._get_volume_filter_options()) # NOTE(thingee): v2 API allows name instead of display_name if "name" in filters: filters["display_name"] = filters["name"] del filters["name"] if "metadata" in filters: filters["metadata"] = ast.literal_eval(filters["metadata"]) volumes = self.volume_api.get_all(context, marker, limit, sort_key, sort_dir, filters) limited_list = common.limited(volumes, req) if is_detail: volumes = self._view_builder.detail_list(req, limited_list) else: volumes = self._view_builder.summary_list(req, limited_list) return volumes
def _items(self, req, entity_maker): """Returns a list of volumes, transformed through entity_maker.""" # pop out limit and offset , they are not search_opts search_opts = req.GET.copy() search_opts.pop("limit", None) search_opts.pop("offset", None) if "metadata" in search_opts: search_opts["metadata"] = ast.literal_eval(search_opts["metadata"]) context = req.environ["cinder.context"] remove_invalid_options(context, search_opts, self._get_volume_search_options()) volumes = self.volume_api.get_all( context, marker=None, limit=None, sort_key="created_at", sort_dir="desc", filters=search_opts ) volumes = [dict(vol.iteritems()) for vol in volumes] for volume in volumes: self._add_visible_admin_metadata(context, volume) limited_list = common.limited(volumes, req) res = [entity_maker(context, vol) for vol in limited_list] return {"volumes": res}
def _get_group_snapshots(self, req, is_detail): """Returns a list of group_snapshots through view builder.""" context = req.environ['cinder.context'] group_snapshots = self.group_snapshot_api.get_all_group_snapshots( context) limited_list = common.limited(group_snapshots, req) if is_detail: group_snapshots = self._view_builder.detail_list(req, limited_list) else: group_snapshots = self._view_builder.summary_list(req, limited_list) new_group_snapshots = [] for grp_snap in group_snapshots['group_snapshots']: try: # Only show group snapshots not migrated from CG snapshots self._check_default_cgsnapshot_type(grp_snap['group_type_id']) if not is_detail: grp_snap.pop('group_type_id', None) new_group_snapshots.append(grp_snap) except exc.HTTPBadRequest: # Skip migrated group snapshot pass return {'group_snapshots': new_group_snapshots}
def _items(self, req, entity_maker): """Returns a list of volumes, transformed through entity_maker.""" # pop out limit and offset , they are not search_opts search_opts = req.GET.copy() search_opts.pop('limit', None) search_opts.pop('offset', None) for k, v in search_opts.items(): try: search_opts[k] = ast.literal_eval(v) except (ValueError, SyntaxError): LOG.debug('Could not evaluate value %s, assuming string', v) context = req.environ['cinder.context'] utils.remove_invalid_filter_options(context, search_opts, self._get_volume_search_options()) volumes = self.volume_api.get_all(context, marker=None, limit=None, sort_keys=['created_at'], sort_dirs=['desc'], filters=search_opts, viewable_admin_meta=True) for volume in volumes: utils.add_visible_admin_metadata(volume) limited_list = common.limited(volumes.objects, req) req.cache_db_volumes(limited_list) res = [entity_maker(context, vol) for vol in limited_list] return {'volumes': res}
def _get_backups(self, req, is_detail): """Returns a list of backups, transformed through view builder.""" context = req.environ['cinder.context'] filters = req.params.copy() utils.remove_invalid_filter_options(context, filters, self._get_backup_filter_options()) if 'name' in filters: filters['display_name'] = filters['name'] del filters['name'] backups = self.backup_api.get_all(context, search_opts=filters) backup_count = len(backups) limited_list = common.limited(backups.objects, req) req.cache_db_backups(limited_list) if is_detail: backups = self._view_builder.detail_list(req, limited_list, backup_count) else: backups = self._view_builder.summary_list(req, limited_list, backup_count) return backups
def _items(self, req, is_detail=True): """Returns a list of snapshots, transformed through view builder.""" context = req.environ['cinder.context'] # Pop out non search_opts and create local variables search_opts = req.GET.copy() search_opts.pop('limit', None) search_opts.pop('offset', None) # Filter out invalid options allowed_search_options = ('status', 'volume_id', 'name') utils.remove_invalid_filter_options(context, search_opts, allowed_search_options) # NOTE(thingee): v2 API allows name instead of display_name if 'name' in search_opts: search_opts['display_name'] = search_opts['name'] del search_opts['name'] snapshots = self.volume_api.get_all_snapshots(context, search_opts=search_opts) limited_list = common.limited(snapshots.objects, req) req.cache_db_snapshots(limited_list) snapshot_count = len(snapshots) if is_detail: snapshots = self._view_builder.detail_list(req, limited_list, snapshot_count) else: snapshots = self._view_builder.summary_list(req, limited_list, snapshot_count) return snapshots
def _get_transfers(self, req, is_detail): """Returns a list of transfers, transformed through view builder.""" context = req.environ['cinder.context'] req_version = req.api_version_request params = req.params.copy() marker = limit = offset = None if req_version.matches(mv.SUPPORT_TRANSFER_PAGINATION): marker, limit, offset = common.get_pagination_params(params) sort_keys, sort_dirs = common.get_sort_params(params) else: # NOTE(yikun): After microversion SUPPORT_TRANSFER_PAGINATION, # transfers list api use the ['created_at'], ['asc'] # as default order, but we should keep the compatible in here. sort_keys, sort_dirs = ['created_at', 'id'], ['asc', 'asc'] filters = params LOG.debug('Listing volume transfers') transfers = self.transfer_api.get_all(context, marker=marker, limit=limit, sort_keys=sort_keys, sort_dirs=sort_dirs, filters=filters, offset=offset) transfer_count = len(transfers) limited_list = common.limited(transfers, req) if is_detail: transfers = self._view_builder.detail_list(req, limited_list, transfer_count) else: transfers = self._view_builder.summary_list( req, limited_list, transfer_count) return transfers
def _get_volumes(self, req, is_detail): """Returns a list of volumes, transformed through view builder.""" context = req.environ['cinder.context'] params = req.params.copy() marker = params.pop('marker', None) limit = params.pop('limit', None) sort_key = params.pop('sort_key', 'created_at') sort_dir = params.pop('sort_dir', 'desc') params.pop('offset', None) filters = params remove_invalid_options(context, filters, self._get_volume_filter_options()) # NOTE(thingee): v2 API allows name instead of display_name if 'name' in filters: filters['display_name'] = filters['name'] del filters['name'] volumes = self.volume_api.get_all(context, marker, limit, sort_key, sort_dir, filters) limited_list = common.limited(volumes, req) if is_detail: volumes = self._view_builder.detail_list(req, limited_list) else: volumes = self._view_builder.summary_list(req, limited_list) return volumes
def _items(self, req, entity_maker): """Returns a list of volumes, transformed through entity_maker.""" #pop out limit and offset , they are not search_opts search_opts = req.GET.copy() search_opts.pop('limit', None) search_opts.pop('offset', None) if 'metadata' in search_opts: search_opts['metadata'] = ast.literal_eval(search_opts['metadata']) context = req.environ['cinder.context'] remove_invalid_options(context, search_opts, self._get_volume_search_options()) volumes = self.volume_api.get_all(context, marker=None, limit=None, sort_key='created_at', sort_dir='desc', filters=search_opts) volumes = [dict(vol.iteritems()) for vol in volumes] for volume in volumes: self._add_visible_admin_metadata(context, volume) limited_list = common.limited(volumes, req) req.cache_resource(limited_list) res = [entity_maker(context, vol) for vol in limited_list] return {'volumes': res}
def _get_group_snapshots(self, req, is_detail): """Returns a list of group_snapshots through view builder.""" context = req.environ['cinder.context'] group_snapshots = self.group_snapshot_api.get_all_group_snapshots( context) limited_list = common.limited(group_snapshots, req) if is_detail: group_snapshots = self._view_builder.detail_list(req, limited_list) else: group_snapshots = self._view_builder.summary_list( req, limited_list) new_group_snapshots = [] for grp_snap in group_snapshots['group_snapshots']: try: # Only show group snapshots not migrated from CG snapshots self._check_default_cgsnapshot_type(grp_snap['group_type_id']) if not is_detail: grp_snap.pop('group_type_id', None) new_group_snapshots.append(grp_snap) except exc.HTTPBadRequest: # Skip migrated group snapshot pass return {'group_snapshots': new_group_snapshots}
def _items(self, req, entity_maker): """Returns a list of volumes, transformed through entity_maker.""" #pop out limit and offset , they are not search_opts search_opts = req.GET.copy() search_opts.pop('limit', None) search_opts.pop('offset', None) if 'metadata' in search_opts: search_opts['metadata'] = ast.literal_eval(search_opts['metadata']) context = req.environ['cinder.context'] remove_invalid_options(context, search_opts, self._get_volume_search_options()) volumes = self.volume_api.get_all(context, marker=None, limit=None, sort_key='created_at', sort_dir='desc', filters=search_opts) volumes = [dict(vol.iteritems()) for vol in volumes] for volume in volumes: self._add_visible_admin_metadata(context, volume) limited_list = common.limited(volumes, req) res = [entity_maker(context, vol) for vol in limited_list] return {'volumes': res}
def _get_backups(self, req, is_detail): """Returns a list of backups, transformed through view builder.""" context = req.environ['cinder.context'] filters = req.params.copy() utils.remove_invalid_filter_options(context, filters, self._get_backup_filter_options()) if 'name' in filters: filters['display_name'] = filters['name'] del filters['name'] backups = self.backup_api.get_all(context, search_opts=filters) backup_count = len(backups) limited_list = common.limited(backups, req) req.cache_db_backups(limited_list) if is_detail: backups = self._view_builder.detail_list(req, limited_list, backup_count) else: backups = self._view_builder.summary_list(req, limited_list, backup_count) return backups
def _get_volumes(self, req, is_detail): """Returns a list of volumes, transformed through view builder.""" context = req.environ['cinder.context'] params = req.params.copy() marker = params.pop('marker', None) limit = params.pop('limit', None) sort_key = params.pop('sort_key', 'created_at') sort_dir = params.pop('sort_dir', 'desc') params.pop('offset', None) filters = params remove_invalid_options(context, filters, self._get_volume_filter_options()) # NOTE(thingee): v2 API allows name instead of display_name if 'name' in filters: filters['display_name'] = filters['name'] del filters['name'] if 'metadata' in filters: filters['metadata'] = ast.literal_eval(filters['metadata']) volumes = self.volume_api.get_all(context, marker, limit, sort_key, sort_dir, filters) limited_list = common.limited(volumes, req) if is_detail: volumes = self._view_builder.detail_list(req, limited_list) else: volumes = self._view_builder.summary_list(req, limited_list) return volumes
def test_limiter_with_offset_limit_max_limit(self, req, slice_start, slice_end, max_limit=None): """Test with both parameters offset and limit and custom max_limit.""" # NOTE(mdovgal): using 0 as slice_start and slice_end we will # get empty list as a result # [3:None] equal to [3:] req = webob.Request.blank(req) self.assertEqual(ITEMS[slice_start:slice_end], common.limited(ITEMS, req, max_limit=max_limit))
def _get_consistencygroups(self, req, is_detail): """Returns a list of consistency groups through view builder.""" context = req.environ["cinder.context"] consistencygroups = self.consistencygroup_api.get_all(context) limited_list = common.limited(consistencygroups, req) if is_detail: consistencygroups = self._view_builder.detail_list(req, limited_list) else: consistencygroups = self._view_builder.summary_list(req, limited_list) return consistencygroups
def _get_backups(self, req, is_detail): """Returns a list of backups, transformed through view builder.""" context = req.environ['cinder.context'] backups = self.backup_api.get_all(context) limited_list = common.limited(backups, req) if is_detail: backups = self._view_builder.detail_list(req, limited_list) else: backups = self._view_builder.summary_list(req, limited_list) return backups
def _get_cgsnapshots(self, req, is_detail): """Returns a list of cgsnapshots, transformed through view builder.""" context = req.environ["cinder.context"] cgsnapshots = self.cgsnapshot_api.get_all_cgsnapshots(context) limited_list = common.limited(cgsnapshots, req) if is_detail: cgsnapshots = self._view_builder.detail_list(req, limited_list) else: cgsnapshots = self._view_builder.summary_list(req, limited_list) return cgsnapshots
def _get_cgsnapshots(self, req, is_detail): """Returns a list of cgsnapshots, transformed through view builder.""" context = req.environ['cinder.context'] cgsnapshots = self.cgsnapshot_api.get_all_cgsnapshots(context) limited_list = common.limited(cgsnapshots, req) if is_detail: cgsnapshots = self._view_builder.detail_list(req, limited_list) else: cgsnapshots = self._view_builder.summary_list(req, limited_list) return cgsnapshots
def _get_volumes(self, req, is_detail): """Returns a list of volumes, transformed through view builder.""" context = req.environ['cinder.context'] params = req.params.copy() marker = params.pop('marker', None) limit = params.pop('limit', None) sort_keys, sort_dirs = common.get_sort_params(params) params.pop('offset', None) filters = params utils.remove_invalid_filter_options(context, filters, self._get_volume_filter_options()) # NOTE(thingee): v2 API allows name instead of display_name if 'name' in sort_keys: sort_keys[sort_keys.index('name')] = 'display_name' if 'name' in filters: filters['display_name'] = filters['name'] del filters['name'] for k, v in filters.items(): try: filters[k] = ast.literal_eval(v) except (ValueError, SyntaxError): LOG.debug('Could not evaluate value %s, assuming string', v) volumes = self.volume_api.get_all(context, marker, limit, sort_keys=sort_keys, sort_dirs=sort_dirs, filters=filters, viewable_admin_meta=True) volumes = [dict(vol) for vol in volumes] for volume in volumes: utils.add_visible_admin_metadata(volume) limited_list = common.limited(volumes, req) volume_count = len(volumes) req.cache_db_volumes(limited_list) if is_detail: volumes = self._view_builder.detail_list(req, limited_list, volume_count) else: volumes = self._view_builder.summary_list(req, limited_list, volume_count) return volumes
def _get_consistencygroups(self, req, is_detail): """Returns a list of consistency groups through view builder.""" context = req.environ['cinder.context'] consistencygroups = self.consistencygroup_api.get_all(context) limited_list = common.limited(consistencygroups, req) if is_detail: consistencygroups = self._view_builder.detail_list( req, limited_list) else: consistencygroups = self._view_builder.summary_list( req, limited_list) return consistencygroups
def _items(self, req, entity_maker): """Returns a list of volumes, transformed through entity_maker.""" search_opts = {} search_opts.update(req.GET) context = req.environ["cinder.context"] remove_invalid_options(context, search_opts, self._get_volume_search_options()) volumes = self.volume_api.get_all(context, search_opts=search_opts) limited_list = common.limited(volumes, req) res = [entity_maker(context, vol) for vol in limited_list] return {"volumes": res}
def _get_transfers(self, req, is_detail): """Returns a list of transfers, transformed through view builder.""" context = req.environ['cinder.context'] LOG.debug(_('Listing volume transfers')) transfers = self.transfer_api.get_all(context) limited_list = common.limited(transfers, req) if is_detail: transfers = self._view_builder.detail_list(req, limited_list) else: transfers = self._view_builder.summary_list(req, limited_list) return transfers
def _get_group_snapshots(self, req, is_detail): """Returns a list of group_snapshots through view builder.""" context = req.environ['cinder.context'] group_snapshots = self.group_snapshot_api.get_all_group_snapshots( context) limited_list = common.limited(group_snapshots, req) if is_detail: group_snapshots = self._view_builder.detail_list(req, limited_list) else: group_snapshots = self._view_builder.summary_list(req, limited_list) return group_snapshots
def _items(self, req, entity_maker): """Returns a list of snapshots, transformed through entity_maker.""" context = req.environ['cinder.context'] search_opts = {} search_opts.update(req.GET) allowed_search_options = ('status', 'volume_id', 'display_name') volumes.remove_invalid_options(context, search_opts, allowed_search_options) snapshots = self.volume_api.get_all_snapshots(context, search_opts=search_opts) limited_list = common.limited(snapshots, req) res = [entity_maker(context, snapshot) for snapshot in limited_list] return {'snapshots': res}
def test_limiter(self, req, values): """Test limited method with different input parameters. This test includes next test cases: 1) Test offset key works with 0; 2) Test offset key works with a medium sized number; 3) Test offset key works with a number over 1000 (max_limit); 4) Test request with no offset or limit; 5) Test limit of zero; 6) Test limit of 10; 7) Test limit of 3000; """ req = webob.Request.blank(req) for expected, value, in values: self.assertEqual(expected, common.limited(value, req))
def _items(self, req, entity_maker): """Returns a list of volumes, transformed through entity_maker.""" search_opts = {} search_opts.update(req.GET) context = req.environ['cinder.context'] remove_invalid_options(context, search_opts, self._get_volume_search_options()) volumes = self.volume_api.get_all(context, marker=None, limit=None, sort_key='created_at', sort_dir='desc', filters=search_opts) limited_list = common.limited(volumes, req) res = [entity_maker(context, vol) for vol in limited_list] return {'volumes': res}
def _items(self, req, entity_maker): """Returns a list of snapshots, transformed through entity_maker.""" context = req.environ['cinder.context'] #pop out limit and offset , they are not search_opts search_opts = req.GET.copy() search_opts.pop('limit', None) search_opts.pop('offset', None) #filter out invalid option allowed_search_options = ('status', 'volume_id', 'display_name') volumes.remove_invalid_options(context, search_opts, allowed_search_options) snapshots = self.volume_api.get_all_snapshots(context, search_opts=search_opts) limited_list = common.limited(snapshots, req) res = [entity_maker(context, snapshot) for snapshot in limited_list] return {'snapshots': res}
def _get_transfers(self, req, is_detail): """Returns a list of transfers, transformed through view builder.""" context = req.environ['cinder.context'] filters = req.params.copy() LOG.debug('Listing volume transfers') transfers = self.transfer_api.get_all(context, filters=filters, sort_keys=['created_at', 'id'], sort_dirs=['asc', 'asc']) transfer_count = len(transfers) limited_list = common.limited(transfers, req) if is_detail: transfers = self._view_builder.detail_list(req, limited_list, transfer_count) else: transfers = self._view_builder.summary_list(req, limited_list, transfer_count) return transfers