diff --git a/awx/main/isolated/manager.py b/awx/main/isolated/manager.py index 5a51e898e0..8e9d8ac7a2 100644 --- a/awx/main/isolated/manager.py +++ b/awx/main/isolated/manager.py @@ -29,13 +29,14 @@ def set_pythonpath(venv_libdir, env): class IsolatedManager(object): - def __init__(self, cancelled_callback=None): + def __init__(self, cancelled_callback=None, check_callback=None): """ :param cancelled_callback: a callable - which returns `True` or `False` - signifying if the job has been prematurely cancelled """ self.cancelled_callback = cancelled_callback + self.check_callback = check_callback self.idle_timeout = max(60, 2 * settings.AWX_ISOLATED_CONNECTION_TIMEOUT) self.started_at = None @@ -187,6 +188,13 @@ class IsolatedManager(object): self.private_data_dir, extravars=extravars) status, rc = runner_obj.status, runner_obj.rc + if self.check_callback is not None: + command_path = self.path_to('artifacts', self.ident, 'command') + # If the command artifact has been synced back, update the model + if os.path.exists(command_path): + with open(command_path, 'r') as f: + data = json.load(f) + self.check_callback(data['command'], data['cwd'], self.runner_params['envvars'].copy()) self.consume_events(dispatcher) last_check = time.time() diff --git a/awx/main/tasks.py b/awx/main/tasks.py index ede7e04de9..2f580a894e 100644 --- a/awx/main/tasks.py +++ b/awx/main/tasks.py @@ -1077,6 +1077,15 @@ class BaseTask(object): self.instance = self.update_model(self.instance.pk, job_args=json.dumps(runner_config.command), job_cwd=runner_config.cwd, job_env=job_env) + def check_handler(self, command, cwd, env): + ''' + IsolatedManager callback triggered by the repeated checks of the isolated node + ''' + self.instance = self.update_model(self.instance.pk, + job_args=command, + job_cwd=cwd, + job_env=build_safe_env(env)) + @with_path_cleanup def run(self, pk, **kwargs): @@ -1212,7 +1221,8 @@ class BaseTask(object): ) ansible_runner.utils.dump_artifacts(params) isolated_manager_instance = isolated_manager.IsolatedManager( - cancelled_callback=lambda: self.update_model(self.instance.pk).cancel_flag + cancelled_callback=lambda: self.update_model(self.instance.pk).cancel_flag, + check_callback=self.check_callback, ) status, rc = isolated_manager_instance.run(self.instance, private_data_dir,