def request(self, request): """Returns the task request corresponding to a task ID.""" logging.debug('%s', request) request_key, _ = _to_keys(request.task_id) request_obj = _get_task_request_async(request.task_id, request_key, _VIEW).get_result() return message_conversion.task_request_to_rpc(request_obj)
def new(self, request): """Creates a new task. The task will be enqueued in the tasks list and will be executed at the earliest opportunity by a bot that has at least the dimensions as described in the task request. """ logging.info('%s', request) try: request = message_conversion.new_task_request_from_rpc( request, utils.utcnow()) posted_request = task_request.make_request(request, acl.is_bot_or_admin()) except (datastore_errors.BadValueError, TypeError, ValueError) as e: raise endpoints.BadRequestException(e.message) result_summary = task_scheduler.schedule_request(posted_request) previous_result = None if result_summary.deduped_from: previous_result = message_conversion.task_result_to_rpc(result_summary) return swarming_rpcs.TaskRequestMetadata( request=message_conversion.task_request_to_rpc(posted_request), task_id=task_pack.pack_result_summary_key(result_summary.key), task_result=previous_result)
def new(self, request): """Creates a new task. The task will be enqueued in the tasks list and will be executed at the earliest opportunity by a bot that has at least the dimensions as described in the task request. """ logging.info('%s', request) try: request = message_conversion.new_task_request_from_rpc( request, utils.utcnow()) posted_request = task_request.make_request(request, acl.is_bot_or_admin()) except (datastore_errors.BadValueError, TypeError, ValueError) as e: raise endpoints.BadRequestException(e.message) result_summary = task_scheduler.schedule_request(posted_request) previous_result = None if result_summary.deduped_from: previous_result = message_conversion.task_result_to_rpc( result_summary) return swarming_rpcs.TaskRequestMetadata( request=message_conversion.task_request_to_rpc(posted_request), task_id=task_pack.pack_result_summary_key(result_summary.key), task_result=previous_result)
def request(self, request): """Returns the task request corresponding to a task ID.""" logging.info('%s', request) _, summary_key = get_result_key(request.task_id) request_key = task_pack.result_summary_key_to_request_key(summary_key) return message_conversion.task_request_to_rpc( get_or_raise(request_key))
def requests(self, request): """Returns tasks requests based on the filters. This endpoint is slightly slower than 'list'. Use 'list' or 'count' when possible. """ logging.info('%s', request) if request.include_performance_stats: raise endpoints.BadRequestException( 'Can\'t set include_performance_stats for tasks/list') now = utils.utcnow() try: # Get the TaskResultSummary keys, then fetch the corresponding # TaskRequest entities. keys, cursor = datastore_utils.fetch_page( self._query_from_request(request), request.limit, request.cursor, keys_only=True) items = ndb.get_multi( task_pack.result_summary_key_to_request_key(k) for k in keys) except ValueError as e: raise endpoints.BadRequestException( 'Inappropriate filter for tasks/requests: %s' % e) except datastore_errors.NeedIndexError as e: logging.error('%s', e) raise endpoints.BadRequestException( 'Requires new index, ask admin to create one.') except datastore_errors.BadArgumentError as e: logging.error('%s', e) raise endpoints.BadRequestException( 'This combination is unsupported, sorry.') return swarming_rpcs.TaskRequests( cursor=cursor, items=[message_conversion.task_request_to_rpc(i) for i in items], now=now)
def requests(self, request): """Returns tasks requests based on the filters. This endpoint is slightly slower than 'list'. Use 'list' or 'count' when possible. """ logging.debug('%s', request) if request.include_performance_stats: raise endpoints.BadRequestException( 'Can\'t set include_performance_stats for tasks/list') now = utils.utcnow() try: # Get the TaskResultSummary keys, then fetch the corresponding # TaskRequest entities. keys, cursor = datastore_utils.fetch_page( self._query_from_request(request), request.limit, request.cursor, keys_only=True) items = ndb.get_multi( task_pack.result_summary_key_to_request_key(k) for k in keys) except ValueError as e: raise endpoints.BadRequestException( 'Inappropriate filter for tasks/requests: %s' % e) except datastore_errors.NeedIndexError as e: logging.error('%s', e) raise endpoints.BadRequestException( 'Requires new index, ask admin to create one.') except datastore_errors.BadArgumentError as e: logging.error('%s', e) raise endpoints.BadRequestException( 'This combination is unsupported, sorry.') return swarming_rpcs.TaskRequests( cursor=cursor, items=[message_conversion.task_request_to_rpc(i) for i in items], now=now)
def new(self, request): """Creates a new task. The task will be enqueued in the tasks list and will be executed at the earliest opportunity by a bot that has at least the dimensions as described in the task request. """ sb = (request.properties.secret_bytes if request.properties is not None else None) if sb is not None: request.properties.secret_bytes = "HIDDEN" logging.debug('%s', request) if sb is not None: request.properties.secret_bytes = sb try: request_obj, secret_bytes = message_conversion.new_task_request_from_rpc( request, utils.utcnow()) for index in xrange(request_obj.num_task_slices): apply_server_property_defaults( request_obj.task_slice(index).properties) task_request.init_new_request( request_obj, acl.can_schedule_high_priority_tasks()) # We need to call the ndb.Model pre-put check earlier because the # following checks assume that the request itself is valid and could crash # otherwise. request_obj._pre_put_hook() except (datastore_errors.BadValueError, TypeError, ValueError) as e: logging.exception( 'Here\'s what was wrong in the user new task request:') raise endpoints.BadRequestException(e.message) # Make sure the caller is actually allowed to schedule the task before # asking the token server for a service account token. task_scheduler.check_schedule_request_acl(request_obj) # If request_obj.service_account is an email, contact the token server to # generate "OAuth token grant" (or grab a cached one). By doing this we # check that the given service account usage is allowed by the token server # rules at the time the task is posted. This check is also performed later # (when running the task), when we get the actual OAuth access token. if service_accounts.is_service_account(request_obj.service_account): if not service_accounts.has_token_server(): raise endpoints.BadRequestException( 'This Swarming server doesn\'t support task service accounts ' 'because Token Server URL is not configured') max_lifetime_secs = request_obj.max_lifetime_secs try: # Note: this raises AuthorizationError if the user is not allowed to use # the requested account or service_accounts.InternalError if something # unexpected happens. duration = datetime.timedelta(seconds=max_lifetime_secs) request_obj.service_account_token = ( service_accounts.get_oauth_token_grant( service_account=request_obj.service_account, validity_duration=duration)) except service_accounts.InternalError as exc: raise endpoints.InternalServerErrorException(exc.message) # If the user only wanted to evaluate scheduling the task, but not actually # schedule it, return early without a task_id. if request.evaluate_only: request_obj._pre_put_hook() return swarming_rpcs.TaskRequestMetadata( request=message_conversion.task_request_to_rpc(request_obj)) try: result_summary = task_scheduler.schedule_request( request_obj, secret_bytes) except (datastore_errors.BadValueError, TypeError, ValueError) as e: raise endpoints.BadRequestException(e.message) previous_result = None if result_summary.deduped_from: previous_result = message_conversion.task_result_to_rpc( result_summary, False) return swarming_rpcs.TaskRequestMetadata( request=message_conversion.task_request_to_rpc(request_obj), task_id=task_pack.pack_result_summary_key(result_summary.key), task_result=previous_result)
def request(self, request): """Returns the task request corresponding to a task ID.""" logging.info('%s', request) _, summary_key = get_result_key(request.task_id) request_key = task_pack.result_summary_key_to_request_key(summary_key) return message_conversion.task_request_to_rpc(get_or_raise(request_key))