Exemple #1
0
 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])
Exemple #2
0
 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))
Exemple #3
0
 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))
Exemple #4
0
 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])
Exemple #5
0
 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])
Exemple #6
0
 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))
Exemple #8
0
 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))
Exemple #9
0
 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))
Exemple #10
0
 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])
Exemple #11
0
 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))
Exemple #12
0
 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))
Exemple #13
0
 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))
Exemple #14
0
 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])
Exemple #15
0
 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])
Exemple #16
0
 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), [])
Exemple #17
0
 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))
Exemple #18
0
 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), [])
Exemple #19
0
 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), [])
Exemple #20
0
 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)
Exemple #21
0
 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)
Exemple #22
0
 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), [])
Exemple #23
0
    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
Exemple #26
0
    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}
Exemple #27
0
    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
Exemple #28
0
    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}
Exemple #29
0
    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}
Exemple #30
0
    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}
Exemple #31
0
    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}
Exemple #32
0
    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}
Exemple #33
0
    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
Exemple #35
0
    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
Exemple #37
0
    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}
Exemple #39
0
    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}
Exemple #40
0
    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
Exemple #41
0
    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))
Exemple #43
0
 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))
Exemple #44
0
    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
Exemple #45
0
    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
Exemple #46
0
    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
Exemple #47
0
    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
Exemple #48
0
    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
Exemple #49
0
    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
Exemple #51
0
    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}
Exemple #52
0
    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
Exemple #53
0
    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
Exemple #55
0
    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}
Exemple #56
0
    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))
Exemple #57
0
    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}
Exemple #58
0
    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}
Exemple #59
0
    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