def gw_task_revoked(sender=None, request=None, **rest): try: sender.job_manager = _job_manager(headers=request.message.headers, kwargs=request.kwargsrepr) _update_status(sender, JobStatus.CANCELED) except AttributeError: pass except JobSpecNotFound: logger.warn( 'No jobInfoSpec. Unable to move \'%s\' into CANCELED state.')
def gw_task_prerun(task=None, sender=None, task_id=None, args=None, kwargs=None, **rest): """Deserialize the jobInfoSpec passed in through the headers. This provides the a JobManager class as an attribute of the task before task execution. decorated functions may bind to their task and have access to the job_manager for logging and updating their status in girder. """ if is_builtin_celery_task(sender.name): return try: task.job_manager = _job_manager(task.request, task.request.headers) _update_status(task, JobStatus.RUNNING) except JobSpecNotFound: task.job_manager = None logger.warn('No jobInfoSpec. Setting job_manager to None.') except StateTransitionException: # Fetch the current status of the job status = task.job_manager.refreshStatus() # If we are canceling we want to stay in that state if status != JobStatus.CANCELING: raise try: task.girder_client = GirderClient(apiUrl=task.request.girder_api_url) task.girder_client.token = task.request.girder_client_token except AttributeError: task.girder_client = None # Deserialize girder_result_hooks if they exist if hasattr(task.request, 'girder_result_hooks'): u = jsonpickle.unpickler.Unpickler() task.request.girder_result_hooks = \ [u.restore(grh) for grh in task.request.girder_result_hooks]
def attach_girder_api_url(sender=None, body=None, exchange=None, routing_key=None, headers=None, properties=None, declare=None, retry_policy=None, **kwargs): parent_task = current_app.current_task try: if parent_task is None: raise MissingJobArguments('Parent task is None') if parent_task.request is None: raise MissingJobArguments("Parent task's request is None") if not hasattr(parent_task.request, 'girder_api_url'): raise MissingJobArguments( "Parent task's request does not contain girder_api_url") headers['girder_api_url'] = parent_task.request.girder_api_url except MissingJobArguments as e: logger.warn('Could not get girder_api_url from parent task: {}'.format( str(e)))
def create_task_job(job_defaults, sender=None, body=None, exchange=None, routing_key=None, headers=None, properties=None, declare=None, retry_policy=None, **kwargs): parent_task = current_app.current_task try: if parent_task is None: raise MissingJobArguments('Parent task is None') if parent_task.request is None: raise MissingJobArguments("Parent task's request is None") if not hasattr(parent_task.request, 'girder_api_url'): raise MissingJobArguments( "Parent task's request does not contain girder_api_url") if not hasattr(parent_task.request, 'girder_client_token'): raise MissingJobArguments( "Parent task's request does not contain girder_client_token") if not hasattr(parent_task.request, 'id'): raise MissingJobArguments( "Parent task's request does not contain id") if 'id' not in headers: raise MissingJobArguments('id is not in headers') gc = GirderClient(apiUrl=parent_task.request.girder_api_url) gc.token = parent_task.request.girder_client_token task_args = tuple(_walk_obj(body[0], _maybe_model_repr)) task_kwargs = _walk_obj(body[1], _maybe_model_repr) parameters = { 'title': headers.pop('girder_job_title', job_defaults.get('girder_job_title', '')), 'type': headers.pop('girder_job_type', job_defaults.get('girder_job_type', '')), 'handler': headers.pop('girder_job_handler', job_defaults.get('girder_job_handler', '')), 'public': headers.pop('girder_job_public', job_defaults.get('girder_job_public', '')), 'args': json.dumps(task_args), 'kwargs': task_kwargs, 'otherFields': json.dumps( dict(celeryTaskId=headers['id'], celeryParentTaskId=parent_task.request.id, **headers.pop( 'girder_job_other_fields', job_defaults.get('girder_job_other_fields', '')))) } try: response = gc.post('job', parameters=parameters, jsonResp=False) if response.ok: headers['jobInfoSpec'] = response.json().get('jobInfoSpec') except requests.exceptions.RequestException as e: logger.warn('Failed to post job: {}'.format(e)) except MissingJobArguments as e: logger.warn('Girder job not created: {}'.format(str(e)))