def _get_group_types(self, req): """Helper function that returns a list of type dicts.""" params = req.params.copy() marker, limit, offset = common.get_pagination_params(params) sort_keys, sort_dirs = common.get_sort_params(params) filters = {} context = req.environ['cinder.context'] if context.is_admin: # Only admin has query access to all group types filters['is_public'] = api_utils._parse_is_public( req.params.get('is_public', None)) else: filters['is_public'] = True api_utils.remove_invalid_filter_options( context, filters, self._get_grp_type_filter_options()) limited_types = group_types.get_all_group_types(context, filters=filters, marker=marker, limit=limit, sort_keys=sort_keys, sort_dirs=sort_dirs, offset=offset, list_result=True) return limited_types
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() sort_keys, sort_dirs = common.get_sort_params(search_opts) marker, limit, offset = common.get_pagination_params(search_opts) # Filter out invalid options allowed_search_options = ('status', 'volume_id', 'name') api_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.pop('name') snapshots = self.volume_api.get_all_snapshots(context, search_opts=search_opts, marker=marker, limit=limit, sort_keys=sort_keys, sort_dirs=sort_dirs, offset=offset) req.cache_db_snapshots(snapshots.objects) if is_detail: snapshots = self._view_builder.detail_list(req, snapshots.objects) else: snapshots = self._view_builder.summary_list(req, snapshots.objects) return snapshots
def _process_volume_filtering(self, context=None, filters=None, req_version=None): for version, field in self.MV_ADDED_FILTERS: if req_version.matches(None, version): filters.pop(field, None) api_utils.remove_invalid_filter_options( context, filters, self._get_volume_filter_options())
def _process_volume_filtering(self, context=None, filters=None, req_version=None): if req_version.matches(None, mv.MESSAGES): filters.pop('glance_metadata', None) if req_version.matches(None, mv.BACKUP_UPDATE): filters.pop('group_id', None) api_utils.remove_invalid_filter_options( context, filters, self._get_volume_filter_options())
def _get_volume_types(self, req): """Helper function that returns a list of type dicts.""" params = req.params.copy() marker, limit, offset = common.get_pagination_params(params) sort_keys, sort_dirs = common.get_sort_params(params) filters = params context = req.environ['cinder.context'] req_version = req.api_version_request if req_version.matches(mv.SUPPORT_VOLUME_TYPE_FILTER): self._process_volume_type_filtering(context=context, filters=filters, req_version=req_version) else: api_utils.remove_invalid_filter_options( context, filters, self._get_vol_type_filter_options()) if context.is_admin: # Only admin has query access to all volume types filters['is_public'] = api_utils._parse_is_public( req.params.get('is_public', None)) else: filters['is_public'] = True if 'extra_specs' in filters: try: filters['extra_specs'] = ast.literal_eval( filters['extra_specs']) except (ValueError, SyntaxError): LOG.debug( 'Could not evaluate "extra_specs" %s, assuming ' 'dictionary string.', filters['extra_specs']) # Do not allow sensitive extra specs to be used in a filter if # the context only allows access to user visible extra specs. # Removing the filter would yield inaccurate results, so an # empty result is returned because as far as an unauthorized # user goes, the list of volume-types meeting their filtering # criteria is empty. if not context.authorize(extra_specs_policy.READ_SENSITIVE_POLICY, fatal=False): for k in filters['extra_specs'].keys(): if k not in extra_specs_policy.USER_VISIBLE_EXTRA_SPECS: return [] limited_types = volume_types.get_all_types(context, filters=filters, marker=marker, limit=limit, sort_keys=sort_keys, sort_dirs=sort_dirs, offset=offset, list_result=True) return limited_types
def _process_snapshot_filtering(self, context=None, filters=None, req_version=None): """Formats allowed filters""" for version, field in self.MV_ADDED_FILTERS: if req_version.matches(None, version): filters.pop(field, None) # Filter out invalid options allowed_search_options = self._get_snapshot_filter_options() api_utils.remove_invalid_filter_options(context, filters, allowed_search_options)
def _process_snapshot_filtering(self, context=None, filters=None, req_version=None): """Formats allowed filters""" # if the max version is less than SNAPSHOT_LIST_METADATA_FILTER # metadata based filtering is not supported if req_version.matches( None, mv.get_prior_version(mv.SNAPSHOT_LIST_METADATA_FILTER)): filters.pop('metadata', None) # Filter out invalid options allowed_search_options = self._get_snapshot_filter_options() api_utils.remove_invalid_filter_options(context, filters, allowed_search_options)
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, limit, offset = common.get_pagination_params(params) sort_keys, sort_dirs = common.get_sort_params(params) filters = params # NOTE(wanghao): Always removing glance_metadata since we support it # only in API version >= VOLUME_LIST_GLANCE_METADATA. filters.pop('glance_metadata', None) api_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.pop('name') self.volume_api.check_volume_filters(filters) volumes = self.volume_api.get_all(context, marker, limit, sort_keys=sort_keys, sort_dirs=sort_dirs, filters=filters, viewable_admin_meta=True, offset=offset) for volume in volumes: api_utils.add_visible_admin_metadata(volume) req.cache_db_volumes(volumes.objects) if is_detail: volumes = self._view_builder.detail_list(req, volumes) else: volumes = self._view_builder.summary_list(req, volumes) return volumes
def summary(self, req): """Return summary of volumes.""" view_builder_v3 = volume_views_v3.ViewBuilder() context = req.environ['cinder.context'] filters = req.params.copy() api_utils.remove_invalid_filter_options( context, filters, self._get_volume_filter_options()) num_vols, sum_size, metadata = self.volume_api.get_volume_summary( context, filters=filters) req_version = req.api_version_request if req_version.matches(mv.VOLUME_SUMMARY_METADATA): all_distinct_metadata = metadata else: all_distinct_metadata = None return view_builder_v3.quick_summary(num_vols, int(sum_size), all_distinct_metadata)
def index(self, req): """Returns the list of qos_specs.""" context = req.environ['cinder.context'] context.authorize(policy.GET_ALL_POLICY) params = req.params.copy() marker, limit, offset = common.get_pagination_params(params) sort_keys, sort_dirs = common.get_sort_params(params) filters = params allowed_search_options = ('id', 'name', 'consumer') api_utils.remove_invalid_filter_options(context, filters, allowed_search_options) specs = qos_specs.get_all_specs(context, filters=filters, marker=marker, limit=limit, offset=offset, sort_keys=sort_keys, sort_dirs=sort_dirs) return self._view_builder.summary_list(req, specs)
def _get_volume_types(self, req): """Helper function that returns a list of type dicts.""" params = req.params.copy() marker, limit, offset = common.get_pagination_params(params) sort_keys, sort_dirs = common.get_sort_params(params) filters = params context = req.environ['cinder.context'] req_version = req.api_version_request if req_version.matches(mv.SUPPORT_VOLUME_TYPE_FILTER): self._process_volume_type_filtering(context=context, filters=filters, req_version=req_version) else: api_utils.remove_invalid_filter_options( context, filters, self._get_vol_type_filter_options()) if context.is_admin: # Only admin has query access to all volume types filters['is_public'] = api_utils._parse_is_public( req.params.get('is_public', None)) else: filters['is_public'] = True if 'extra_specs' in filters: try: filters['extra_specs'] = ast.literal_eval( filters['extra_specs']) except (ValueError, SyntaxError): LOG.debug( 'Could not evaluate "extra_specs" %s, assuming ' 'dictionary string.', filters['extra_specs']) limited_types = volume_types.get_all_types(context, filters=filters, marker=marker, limit=limit, sort_keys=sort_keys, sort_dirs=sort_dirs, offset=offset, list_result=True) return limited_types
def _process_volume_type_filtering(self, context=None, filters=None, req_version=None): api_utils.remove_invalid_filter_options( context, filters, self._get_vol_type_filter_options())
def _process_attachment_filtering(self, context=None, filters=None, req_version=None): api_utils.remove_invalid_filter_options(context, filters, self.allowed_filters)