def _get_nodes_collection(self, marker, limit, sort_key, sort_dir, expand=False, resource_url=None): limit = api_utils.validate_limit(limit) sort_dir = api_utils.validate_sort_dir(sort_dir) marker_obj = None if marker: marker_obj = objects.Node.get_by_uuid(pecan.request.context, marker) if sort_key in self.invalid_sort_key_list: raise exception.InvalidParameterValue( _("The sort_key value %(key)s is an invalid field for " "sorting") % {'key': sort_key}) filters = {} nodes = objects.Node.list(pecan.request.context, limit, marker_obj, sort_key=sort_key, sort_dir=sort_dir, filters=filters) parameters = {'sort_key': sort_key, 'sort_dir': sort_dir} return NodeCollection.convert_with_locates(nodes, limit, url=resource_url, expand=expand, **parameters)
def _get_fleets_collection(self, marker, limit, sort_key, sort_dir, fields=None): limit = api_utils.validate_limit(limit) sort_dir = api_utils.validate_sort_dir(sort_dir) marker_obj = None if marker: marker_obj = objects.Fleet.get_by_uuid(pecan.request.context, marker) if sort_key in self.invalid_sort_key_list: raise exception.InvalidParameterValue( ("The sort_key value %(key)s is an invalid field for " "sorting") % {'key': sort_key}) filters = {} fleets = objects.Fleet.list(pecan.request.context, limit, marker_obj, sort_key=sort_key, sort_dir=sort_dir, filters=filters) parameters = {'sort_key': sort_key, 'sort_dir': sort_dir} return FleetCollection.convert_with_links(fleets, limit, fields=fields, **parameters)
def _get_boards_collection(self, status, marker, limit, sort_key, sort_dir, project=None, resource_url=None, fields=None): limit = api_utils.validate_limit(limit) sort_dir = api_utils.validate_sort_dir(sort_dir) marker_obj = None if marker: marker_obj = objects.Board.get_by_uuid(pecan.request.context, marker) if sort_key in self.invalid_sort_key_list: raise exception.InvalidParameterValue( ("The sort_key value %(key)s is an invalid field for " "sorting") % {'key': sort_key}) filters = {} # bounding the request to a project if project: if pecan.request.context.is_admin: filters['project_id'] = project else: msg = ("Project parameter can be used only " "by the administrator.") raise wsme.exc.ClientSideError(msg, status_code=400) else: filters['project_id'] = pecan.request.context.project_id if status: filters['status'] = status boards = objects.Board.list(pecan.request.context, limit, marker_obj, sort_key=sort_key, sort_dir=sort_dir, filters=filters) parameters = {'sort_key': sort_key, 'sort_dir': sort_dir} return BoardCollection.convert_with_links(boards, limit, url=resource_url, fields=fields, **parameters)
def check_for_invalid_fields(fields, object_fields): """Check for requested non-existent fields. Check if the user requested non-existent fields. :param fields: A list of fields requested by the user :object_fields: A list of fields supported by the object. :raises: InvalidParameterValue if invalid fields were requested. """ invalid_fields = set(fields) - set(object_fields) if invalid_fields: raise exception.InvalidParameterValue( _('Field(s) "%s" are not valid') % ', '.join(invalid_fields))
def _validate_temp_url_config(self): """Validate the required settings for a temporary URL.""" if not CONF.glance.swift_temp_url_key: raise exc.MissingParameterValue( _('Swift temporary URLs require a shared secret to be created. ' 'You must provide "swift_temp_url_key" as a config option.')) if not CONF.glance.swift_endpoint_url: raise exc.MissingParameterValue( _('Swift temporary URLs require a Swift endpoint URL. ' 'You must provide "swift_endpoint_url" as a config option.')) if not CONF.glance.swift_account: raise exc.MissingParameterValue( _('Swift temporary URLs require a Swift account string. ' 'You must provide "swift_account" as a config option.')) if CONF.glance.swift_temp_url_duration < 0: raise exc.InvalidParameterValue( _('"swift_temp_url_duration" must be a positive integer.')) seed_num_chars = CONF.glance.swift_store_multiple_containers_seed if (seed_num_chars is None or seed_num_chars < 0 or seed_num_chars > 32): raise exc.InvalidParameterValue( _("An integer value between 0 and 32 is required for" " swift_store_multiple_containers_seed."))
def update_service(self, service_id, values): # NOTE(dtantsur): this can lead to very strange errors if 'uuid' in values: msg = _("Cannot overwrite UUID for an existing Service.") raise exception.InvalidParameterValue(err=msg) try: return self._do_update_service(service_id, values) except db_exc.DBDuplicateEntry as e: if 'name' in e.columns: raise exception.DuplicateName(name=values['name']) elif 'uuid' in e.columns: raise exception.ServiceAlreadyExists(uuid=values['uuid']) else: raise e
def _paginate_query(model, limit=None, marker=None, sort_key=None, sort_dir=None, query=None): if not query: query = model_query(model) sort_keys = ['id'] if sort_key and sort_key not in sort_keys: sort_keys.insert(0, sort_key) try: query = db_utils.paginate_query(query, model, limit, sort_keys, marker=marker, sort_dir=sort_dir) except db_exc.InvalidSortKey: raise exception.InvalidParameterValue( _('The sort_key value "%(key)s" is an invalid field for sorting') % {'key': sort_key}) return query.all()
def update_injection_plugin(self, plugin_injection_id, values): if 'uuid' in values: msg = _("Cannot overwrite UUID for an existing Plugin.") raise exception.InvalidParameterValue(err=msg) try: return self._do_update_injection_plugin( plugin_injection_id, values) except db_exc.DBDuplicateEntry as e: if 'name' in e.columns: raise exception.DuplicateName(name=values['name']) elif 'uuid' in e.columns: raise exception.PluginAlreadyExists(uuid=values['uuid']) else: raise e
def _get_ports_collection(self, marker, limit, sort_key, sort_dir, fields=None, with_public=False, all_ports=False): limit = api_utils.validate_limit(limit) sort_dir = api_utils.validate_sort_dir(sort_dir) marker_obj = None if marker: marker_obj = objects.Port.get_by_uuid(pecan.request.context, marker) if sort_key in self.invalid_sort_key_list: raise exception.InvalidParameterValue( ("The sort_key value %(key)s is an invalid field for " "sorting") % {'key': sort_key}) filters = {} # if all_ports and not pecan.request.context.is_admin: # msg = ("all_ports parameter can only be used " # "by the administrator.") # raise wsme.exc.ClientSideError(msg, # status_code=400) # else: # if not all_ports: # filters['owner'] = pecan.request.context.user_id # if with_public: # filters['with_public'] = with_public ports = objects.Port.list(pecan.request.context, limit, marker_obj, sort_key=sort_key, sort_dir=sort_dir, filters=filters) parameters = {'sort_key': sort_key, 'sort_dir': sort_dir} return PortCollection.convert_with_links(ports, limit, fields=fields, **parameters)
def post(self, plugin_ident, PluginAction): if not PluginAction.action: raise exception.MissingParameterValue(("Action is not specified.")) if not PluginAction.parameters: PluginAction.parameters = {} rpc_board = api_utils.get_rpc_board(self.board_ident) rpc_plugin = api_utils.get_rpc_plugin(plugin_ident) try: cdict = pecan.request.context.to_policy_values() cdict['owner'] = rpc_board.owner policy.authorize('iot:plugin_action:post', cdict, cdict) if not rpc_plugin.public: cdict = pecan.request.context.to_policy_values() cdict['owner'] = rpc_plugin.owner policy.authorize('iot:plugin_action:post', cdict, cdict) except exception: return exception rpc_board.check_if_online() if objects.plugin.want_customs_params(PluginAction.action): valid_keys = list(rpc_plugin.parameters.keys()) if not all(k in PluginAction.parameters for k in valid_keys): raise exception.InvalidParameterValue( "Parameters are different from the valid ones") result = pecan.request.rpcapi.action_plugin(pecan.request.context, rpc_plugin.uuid, rpc_board.uuid, PluginAction.action, PluginAction.parameters) return result