def _do_run(self, runner, runnertype_db, action_db, liveaction_db): # Create a temporary auth token which will be available # for the duration of the action execution. runner.auth_token = self._create_auth_token(runner.context) updated_liveaction_db = None try: # Finalized parameters are resolved and then rendered. This process could # fail. Handle the exception and report the error correctly. runner_params, action_params = param_utils.get_finalized_params( runnertype_db.runner_parameters, action_db.parameters, liveaction_db.parameters, liveaction_db.context) runner.runner_parameters = runner_params LOG.debug('Performing pre-run for runner: %s', runner.runner_id) runner.pre_run() # Mask secret parameters in the log context resolved_action_params = ResolvedActionParameters( action_db=action_db, runner_type_db=runnertype_db, runner_parameters=runner_params, action_parameters=action_params) extra = {'runner': runner, 'parameters': resolved_action_params} LOG.debug('Performing run for runner: %s' % (runner.runner_id), extra=extra) (status, result, context) = runner.run(action_params) try: result = json.loads(result) except: pass action_completed = status in action_constants.COMPLETED_STATES if isinstance(runner, AsyncActionRunner) and not action_completed: self._setup_async_query(liveaction_db.id, runnertype_db, context) except: LOG.exception('Failed to run action.') _, ex, tb = sys.exc_info() # mark execution as failed. status = action_constants.LIVEACTION_STATUS_FAILED # include the error message and traceback to try and provide some hints. result = { 'error': str(ex), 'traceback': ''.join(traceback.format_tb(tb, 20)) } context = None finally: # Log action completion extra = {'result': result, 'status': status} LOG.debug('Action "%s" completed.' % (action_db.name), extra=extra) # Always clean-up the auth_token try: LOG.debug('Setting status: %s for liveaction: %s', status, liveaction_db.id) updated_liveaction_db = self._update_live_action_db( liveaction_db.id, status, result, context) except: error = 'Cannot update LiveAction object for id: %s, status: %s, result: %s.' % ( liveaction_db.id, status, result) LOG.exception(error) raise executions.update_execution(updated_liveaction_db) extra = {'liveaction_db': updated_liveaction_db} LOG.debug('Updated liveaction after run', extra=extra) # Deletion of the runner generated auth token is delayed until the token expires. # Async actions such as Mistral workflows uses the auth token to launch other # actions in the workflow. If the auth token is deleted here, then the actions # in the workflow will fail with unauthorized exception. is_async_runner = isinstance(runner, AsyncActionRunner) action_completed = status in action_constants.COMPLETED_STATES if not is_async_runner or (is_async_runner and action_completed): try: self._delete_auth_token(runner.auth_token) except: LOG.exception('Unable to clean-up auth_token.') LOG.debug('Performing post_run for runner: %s', runner.runner_id) runner.post_run(status, result) runner.container_service = None LOG.debug('Runner do_run result', extra={'result': updated_liveaction_db.result}) LOG.audit('Liveaction completed', extra={'liveaction_db': updated_liveaction_db}) return updated_liveaction_db
def _do_run(self, runner, runnertype_db, action_db, liveaction_db): # Create a temporary auth token which will be available # for the duration of the action execution. runner.auth_token = self._create_auth_token( context=runner.context, action_db=action_db, liveaction_db=liveaction_db) try: # Finalized parameters are resolved and then rendered. This process could # fail. Handle the exception and report the error correctly. try: runner_params, action_params = param_utils.render_final_params( runnertype_db.runner_parameters, action_db.parameters, liveaction_db.parameters, liveaction_db.context) runner.runner_parameters = runner_params except ParamException as e: raise actionrunner.ActionRunnerException(str(e)) LOG.debug('Performing pre-run for runner: %s', runner.runner_id) runner.pre_run() # Mask secret parameters in the log context resolved_action_params = ResolvedActionParameters( action_db=action_db, runner_type_db=runnertype_db, runner_parameters=runner_params, action_parameters=action_params) extra = {'runner': runner, 'parameters': resolved_action_params} LOG.debug('Performing run for runner: %s' % (runner.runner_id), extra=extra) (status, result, context) = runner.run(action_params) try: result = json.loads(result) except: pass action_completed = status in action_constants.LIVEACTION_COMPLETED_STATES if isinstance(runner, AsyncActionRunner) and not action_completed: self._setup_async_query(liveaction_db.id, runnertype_db, context) except: LOG.exception('Failed to run action.') _, ex, tb = sys.exc_info() # mark execution as failed. status = action_constants.LIVEACTION_STATUS_FAILED # include the error message and traceback to try and provide some hints. result = { 'error': str(ex), 'traceback': ''.join(traceback.format_tb(tb, 20)) } context = None finally: # Log action completion extra = {'result': result, 'status': status} LOG.debug('Action "%s" completed.' % (action_db.name), extra=extra) # Update the final status of liveaction and corresponding action execution. liveaction_db = self._update_status(liveaction_db.id, status, result, context) # Always clean-up the auth_token # This method should be called in the finally block to ensure post_run is not impacted. self._clean_up_auth_token(runner=runner, status=status) LOG.debug('Performing post_run for runner: %s', runner.runner_id) runner.post_run(status=status, result=result) LOG.debug('Runner do_run result', extra={'result': liveaction_db.result}) LOG.audit('Liveaction completed', extra={'liveaction_db': liveaction_db}) return liveaction_db
def _do_run(self, runner): # Create a temporary auth token which will be available # for the duration of the action execution. runner.auth_token = self._create_auth_token( context=runner.context, action_db=runner.action, liveaction_db=runner.liveaction, ) try: # Finalized parameters are resolved and then rendered. This process could # fail. Handle the exception and report the error correctly. try: runner_params, action_params = param_utils.render_final_params( runner.runner_type.runner_parameters, runner.action.parameters, runner.liveaction.parameters, runner.liveaction.context, ) runner.runner_parameters = runner_params except ParamException as e: raise actionrunner.ActionRunnerException(six.text_type(e)) LOG.debug("Performing pre-run for runner: %s", runner.runner_id) runner.pre_run() # Mask secret parameters in the log context resolved_action_params = ResolvedActionParameters( action_db=runner.action, runner_type_db=runner.runner_type, runner_parameters=runner_params, action_parameters=action_params, ) extra = {"runner": runner, "parameters": resolved_action_params} LOG.debug("Performing run for runner: %s" % (runner.runner_id), extra=extra) with CounterWithTimer(key="action.executions"): with CounterWithTimer(key="action.%s.executions" % (runner.action.ref)): (status, result, context) = runner.run(action_params) result = jsonify.try_loads(result) action_completed = status in action_constants.LIVEACTION_COMPLETED_STATES if (isinstance(runner, PollingAsyncActionRunner) and runner.is_polling_enabled() and not action_completed): queries.setup_query(runner.liveaction.id, runner.runner_type, context) except: LOG.exception("Failed to run action.") _, ex, tb = sys.exc_info() # mark execution as failed. status = action_constants.LIVEACTION_STATUS_FAILED # include the error message and traceback to try and provide some hints. result = { "error": str(ex), "traceback": "".join(traceback.format_tb(tb, 20)), } context = None finally: # Log action completion extra = {"result": result, "status": status} LOG.debug('Action "%s" completed.' % (runner.action.name), extra=extra) # Update the final status of liveaction and corresponding action execution. with Timer(key="action.executions.update_status"): runner.liveaction = self._update_status( runner.liveaction.id, status, result, context) # Always clean-up the auth_token # This method should be called in the finally block to ensure post_run is not impacted. self._clean_up_auth_token(runner=runner, status=status) LOG.debug("Performing post_run for runner: %s", runner.runner_id) runner.post_run(status=status, result=result) LOG.debug("Runner do_run result", extra={"result": runner.liveaction.result}) LOG.audit("Liveaction completed", extra={"liveaction_db": runner.liveaction}) return runner.liveaction