Skip to content

Commit

Permalink
skip process isolation check for transmit and process (ansible#1084)
Browse files Browse the repository at this point in the history
* skip process isolation check for transmit and process

moving down the process isolation executable so that transmit and
process no longer checks for its existance

ansible-runner worker will still run the check since it will invoke
ansible-runner run with process-isolation-executable and it will still
be checked properly

Co-Authored-By: Jeff Bradberry <685957+jbradberry@users.noreply.github.com>
Signed-off-by: Hao Liu <haoli@redhat.com>
  • Loading branch information
TheRealHaoLiu and jbradberry committed Jun 6, 2022
1 parent fef8f3e commit dede318
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 6 deletions.
12 changes: 6 additions & 6 deletions ansible_runner/interface.py
Expand Up @@ -83,12 +83,6 @@ def init_runner(**kwargs):
if logfile:
output.set_logfile(logfile)

if kwargs.get("process_isolation", False):
pi_executable = kwargs.get("process_isolation_executable", "podman")
if not check_isolation_executable_installed(pi_executable):
print(f'Unable to find process isolation executable: {pi_executable}')
sys.exit(1)

event_callback_handler = kwargs.pop('event_handler', None)
status_callback_handler = kwargs.pop('status_handler', None)
artifacts_handler = kwargs.pop('artifacts_handler', None)
Expand Down Expand Up @@ -118,6 +112,12 @@ def init_runner(**kwargs):
**kwargs)
return stream_processor

if kwargs.get("process_isolation", False):
pi_executable = kwargs.get("process_isolation_executable", "podman")
if not check_isolation_executable_installed(pi_executable):
print(f'Unable to find process isolation executable: {pi_executable}')
sys.exit(1)

kwargs.pop('_input', None)
kwargs.pop('_output', None)
rc = RunnerConfig(**kwargs)
Expand Down
60 changes: 60 additions & 0 deletions test/integration/test_transmit_worker_process.py
Expand Up @@ -168,6 +168,66 @@ def process_method(results_sockfile_read):

self.check_artifacts(str(process_dir), job_type)

def test_process_isolation_executable_not_exist(self, tmp_path, mocker):
"""Case transmit should not fail if process isolation executable does not exist and
worker should fail if process isolation executable does not exist
"""
mocker.patch.object(ansible_runner.interface, 'check_isolation_executable_installed', return_value=False)

job_kwargs = self.get_job_kwargs('run')
job_kwargs['process_isolation'] = True
job_kwargs['process_isolation_executable'] = 'does_not_exist'

outgoing_buffer_file = tmp_path / 'buffer_out'
outgoing_buffer_file.touch()
outgoing_buffer = outgoing_buffer_file.open('b+r')

transmitter = ansible_runner.interface.run(
streamer='transmit',
_output=outgoing_buffer,
**job_kwargs,
)

# valide process_isolation kwargs are passed to transmitter
assert transmitter.kwargs['process_isolation'] == job_kwargs['process_isolation']
assert transmitter.kwargs['process_isolation_executable'] == job_kwargs['process_isolation_executable']

# validate that transmit did not fail due to missing process isolation executable
assert transmitter.rc in (None, 0)

# validate that transmit buffer is not empty
outgoing_buffer.seek(0)
sent = outgoing_buffer.read()
assert sent # should not be blank at least

# validate buffer contains kwargs
assert b'kwargs' in sent

# validate kwargs in buffer contain correct process_isolation and process_isolation_executable
for line in sent.decode('utf-8').split('\n'):
if "kwargs" in line:
kwargs = json.loads(line).get("kwargs", {})
assert kwargs['process_isolation'] == job_kwargs['process_isolation']
assert kwargs['process_isolation_executable'] == job_kwargs['process_isolation_executable']
break

worker_dir = tmp_path / 'for_worker'
incoming_buffer_file = tmp_path / 'buffer_in'
incoming_buffer_file.touch()
incoming_buffer = incoming_buffer_file.open('b+r')

outgoing_buffer.seek(0)

# validate that worker fails raise sys.exit(1) when process isolation executable does not exist
with pytest.raises(SystemExit) as exc:
ansible_runner.interface.run(
streamer='worker',
_input=outgoing_buffer,
_output=incoming_buffer,
private_data_dir=worker_dir,
)
assert exc.value.code == 1


@pytest.fixture
def transmit_stream(project_fixtures, tmp_path):
Expand Down

0 comments on commit dede318

Please sign in to comment.