def test_execute_interface(docker_container): with patch('reproman.resource.ResourceManager._get_inventory' ) as get_inventory: config = { "status": "running", "engine_url": "unix:///var/run/docker.sock", "type": "docker-container", "name": "testing-container", } get_inventory.return_value = {"testing-container": config} for internal in [False, True]: path = '/tmp/{}'.format(str(uuid.uuid4())) cmd = ['execute', '--resource', 'testing-container'] if internal: cmd.append('--internal') cmd.extend(['mkdir', path]) manager = ResourceManager() with patch("reproman.interface.execute.get_manager", return_value=manager): main(cmd) session = manager.get_resource( "testing-container").get_session() assert session.exists(path) # on 2nd run mkdir should fail since already exists with swallow_outputs() as cmo: with pytest.raises(SystemExit) as cme: main(cmd) assert cme.value.code == 1 assert "File exists" in cmo.err
def test_recursive_transfer(context): run = context["run_fn"] path = context["directory"] jobs = context["jobs_fn"] # Our script takes an inventory of the execute directory so we can be # sure that all of the files have transferred. It then creates a tree # that we verify is returned. create_tree( path, { "script": "find . > out_file ; mkdir out_dir ; touch out_dir/subfile", "in_dir": { "subfile": "" } }) with swallow_outputs() as output: run(command=["sh", "-e", "script"], inputs=["script", "in_dir"], outputs=["out_file", "out_dir"], resref="myshell") try_fetch(lambda: jobs(queries=[], action="fetch", all_=True)) assert op.exists(op.join(path, "out_file")) with open(op.join(path, "out_file")) as fo: lines = [line.strip() for line in fo] assert "./in_dir/subfile" in lines assert op.exists(op.join(path, "out_dir", "subfile"))
def test_run_and_fetch(context): path = context["directory"] run = context["run_fn"] jobs = context["jobs_fn"] registry = context["registry"] create_tree(path, tree={ "js0.yaml": ("resource_name: myshell\n" "command_str: 'touch ok'\n" "outputs: ['ok']") }) run(job_specs=["js0.yaml"]) with swallow_logs(new_level=logging.INFO) as log: with swallow_outputs() as output: jobs(queries=[], status=True) assert "myshell" in output.out assert len(registry.find_job_files()) == 1 jobs(queries=[], action="fetch", all_=True) assert len(registry.find_job_files()) == 0 jobs(queries=[], status=True) assert "No jobs" in log.out assert op.exists(op.join(path, "ok"))
def test_same(): with swallow_outputs() as outputs: args = ['diff', diff_1_yaml, diff_1_yaml] rv = main(args) assert_equal(rv, 0) assert_equal(outputs.out, '') assert_equal(outputs.err, '')
def test_diff_files(): with swallow_outputs() as outputs: args = ['diff', diff_1_yaml, diff_2_yaml] rv = main(args) assert_equal(rv, 3) assert_equal(outputs.err, '') assert_in('Files:', outputs.out) assert_in('< /etc/a', outputs.out) assert_in('> /etc/c', outputs.out) assert_not_in('< /etc/b', outputs.out) assert_not_in('> /etc/b', outputs.out)
def test_jobs_show(context): run = context["run_fn"] jobs = context["jobs_fn"] registry = context["registry"] run(command=["touch", "ok"], outputs=["ok"], resref="myshell") assert len(registry.find_job_files()) == 1 with swallow_outputs() as output: jobs(queries=[], action="show", status=True) # `show`, as opposed to `list`, is detailed, multiline display. assert len(output.out.splitlines()) > 1 assert "myshell" in output.out assert "status:" in output.out
def test_diff_svn(): with swallow_outputs() as outputs: args = ['diff', diff_1_yaml, diff_2_yaml] rv = main(args) assert_equal(rv, 3) assert_equal(outputs.err, '') assert_in('SVN repositories:', outputs.out) assert_in('< c8ed47ab-45c9-818d-5d62-549dcc6d97d4 (/path/to/svn/repo/1/only)', outputs.out) assert_in('> d7192e3a-60de-5caa-ccdc9525dea75aabf (/path/to/svn/repo/2/only)', outputs.out) assert_in('SVN repository 95e4b738-84c7-154c-f082-34d40e21fdd4', outputs.out) assert_in('< 12 (/path/1/to/different/svn/commit)', outputs.out) assert_in('> 14 (/path/2/to/different/svn/commit)', outputs.out) assert_not_in('(/path/1/to/common/svn/repo)', outputs.out) assert_not_in('(/path/2/to/common/svn/repo)', outputs.out)
def test_jobs_auto_fetch_with_query(context): path = context["directory"] run = context["run_fn"] jobs = context["jobs_fn"] registry = context["registry"] run(command=["touch", "ok"], outputs=["ok"], resref="myshell") jobfiles = registry.find_job_files() assert len(jobfiles) == 1 jobid = list(jobfiles.keys())[0] with swallow_outputs(): try_fetch(lambda: jobs(queries=[jobid[3:]])) assert len(registry.find_job_files()) == 0 assert op.exists(op.join(path, "ok"))
def test_diff_debian_packages(): with swallow_outputs() as outputs: args = ['diff', diff_1_yaml, diff_2_yaml] rv = main(args) assert_equal(rv, 3) assert_equal(outputs.err, '') assert_in('Debian packages:', outputs.out) assert_in('< lib1only x86', outputs.out) assert_in('> lib2only x86', outputs.out) assert_in('< libarchdiff x86', outputs.out) assert_in('> libarchdiff amd64', outputs.out) assert_in('Debian package libversdiff x86:', outputs.out) assert_in('< 2.4.6', outputs.out) assert_in('> 2.4.7', outputs.out) assert_not_in('libsame', outputs.out)
def test_diff_satisfies(): with swallow_outputs() as outputs: args = ['diff', '--satisfies', diff_satisfies_1_yaml, diff_satisfies_2_yaml] rv = main(args) assert_equal(rv, 3) assert_in('Files:', outputs.out) assert_in('> /etc/c', outputs.out) assert_in('Debian packages:', outputs.out) assert_in('> lib3 amd64 2.4.6', outputs.out) assert_in('> lib4 x86 2.4.7', outputs.out) assert_not_in('lib2', outputs.out) assert_not_in('lib5', outputs.out) assert_not_in('lib1', outputs.out)
def test_diff_git(): with swallow_outputs() as outputs: args = ['diff', diff_1_yaml, diff_2_yaml] rv = main(args) assert_equal(rv, 3) assert_equal(outputs.err, '') assert_in('Git repositories:', outputs.out) assert_in('< 43e8e6577c7bf493ddb01ea7d49bef7dc7a6643b (/path/to/git/repo/1/only)', outputs.out) assert_in('> 64b1865267891fdd1a45251ca6f32df213dc546e (/path/to/git/repo/2/only)', outputs.out) assert_in('Git repository 5b8267181f6cae8dc37aeef21ea54171bd932522', outputs.out) assert_in('< branch None, commit 3e3aaa73a9c0ca061c7679af5fa7318e70f528ac (/path/1/to/different/git/commit)', outputs.out) assert_in('> branch None, commit 9d199f7fa7e6f691719e0860c5cf81193e815ad5 (/path/2/to/different/git/commit)', outputs.out) assert_not_in('/path/1/to/common/git/repo', outputs.out) assert_not_in('/path/2/to/common/git/repo', outputs.out) assert_not_in('99ac7f69a070077038a9eb9eca61c028db97181d', outputs.out) assert_not_in('d057b128759d80a47500adba0c4d3e95092bb87f', outputs.out)
def test_diff_conda_packages(): with swallow_outputs() as outputs: args = ['diff', diff_1_yaml, diff_2_yaml] rv = main(args) assert_equal(rv, 3) assert_equal(outputs.err, '') assert_in('Conda packages:', outputs.out) assert_in('< c_lib1only py36_0', outputs.out) assert_in('> c_lib2only py36_0', outputs.out) assert_in('< c_libbuilddiff py36_0', outputs.out) assert_in('> c_libbuilddiff hdf63c60_3', outputs.out) # TO DO: ensure the version strings (second and third lines below) # come from the conda report -- these could just match the debian # output checked in test_diff_debian_packages() assert_in('Conda package c_libversdiff py36_0:', outputs.out) assert_in('< 2.4.6', outputs.out) assert_in('> 2.4.7', outputs.out) assert_not_in('c_libsame', outputs.out)
def test_jobs_delete(context): path = context["directory"] run = context["run_fn"] jobs = context["jobs_fn"] registry = context["registry"] run(command=["touch", "ok"], outputs=["ok"], resref="myshell") # Must explicit specify jobs to delete. with pytest.raises(ValueError): jobs(queries=[], action="delete") jobfiles = registry.find_job_files() assert len(jobfiles) == 1 jobid = list(jobfiles.keys())[0] with swallow_outputs(): jobs(queries=[jobid[3:]], action="delete") assert len(registry.find_job_files()) == 0 assert not op.exists(op.join(path, "ok"))
def test_diff_no_distributions(): with swallow_outputs() as outputs: args = ['diff', diff_1_yaml, empty_yaml] rv = main(args) assert_equal(rv, 3) assert_equal(outputs.err, '') assert_in('Debian packages:', outputs.out) assert_in('< lib1only x86', outputs.out) assert_in('< libsame x86', outputs.out) assert_in('< libarchdiff x86', outputs.out) assert_in('< libversdiff x86', outputs.out) assert_in('Conda packages:', outputs.out) assert_in('< c_lib1only py36_0', outputs.out) assert_in('< c_libsame py36_0', outputs.out) assert_in('< c_libbuilddiff py36_0', outputs.out) assert_in('< c_libversdiff py36_0', outputs.out) assert_in('Files:', outputs.out) assert_in('< /etc/a', outputs.out) assert_in('< /etc/b', outputs.out)
def test_diff_satisfies_unsupported_distribution(): # using subprocess.call() here because we're looking for a condition # that raises an exception in main(), so it doesn't return and we # can't catch its return value with swallow_outputs() as outputs: args = ['reproman', 'diff', '--satisfies', diff_satisfies_unsupported_yaml, diff_satisfies_2_yaml] rv = subprocess.call(args) assert_equal(rv, 1) args = ['reproman', 'diff', '--satisfies', diff_satisfies_1_yaml, diff_satisfies_unsupported_yaml] rv = subprocess.call(args) assert_equal(rv, 1)
def test_jobs_orc_error(context): run = context["run_fn"] jobs = context["jobs_fn"] registry = context["registry"] run(command=["doesntmatter1"], resref="myshell") jobfiles = registry.find_job_files() assert len(jobfiles) == 1 with swallow_outputs() as output: with swallow_logs(new_level=logging.ERROR) as log: def die_orc(*args, **kwargs): raise OrchestratorError("resurrection failed") with patch("reproman.interface.jobs.show_oneline", side_effect=die_orc): jobs(queries=[], status=True) assert "myshell" not in output.out assert "resurrection failed" in log.out
def test_jobs_deleted_resource(context): run = context["run_fn"] jobs = context["jobs_fn"] registry = context["registry"] resman = context["resource_manager"] resman.create("todelete", resource_type="shell") run(command=["doesntmatter0"], resref="todelete") run(command=["doesntmatter1"], resref="myshell") resman.delete(resman.get_resource("todelete")) jobfiles = registry.find_job_files() assert len(jobfiles) == 2 with swallow_outputs() as output: with swallow_logs(new_level=logging.ERROR) as log: jobs(queries=[], status=True) assert "todelete" in log.out # The deleted resource won't be there assert "todelete" not in output.out # ... but the alive one will. assert "myshell" in output.out
def test_retrace_normalize_paths(): # Retrace should normalize paths before passing them to tracers. with swallow_outputs() as cm: main(["retrace", "/sbin/../sbin/iptables"]) assert "name: debian" in cm.out
def test_run_list(arg, expected): with swallow_outputs() as output: run(list_=arg) for e in expected: assert e in output.out
def test_retrace_normalize_paths(): # Retrace should normalize paths before passing them to tracers. with swallow_outputs() as cm: main(["retrace", "/bin/.." + COMMON_SYSTEM_PATH]) assert "name: debian" in cm.out