Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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"))
Ejemplo n.º 3
0
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"))
Ejemplo n.º 4
0
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, '')
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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"))
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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)
Ejemplo n.º 12
0
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)
Ejemplo n.º 13
0
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"))
Ejemplo n.º 14
0
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)
Ejemplo n.º 15
0
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)
Ejemplo n.º 16
0
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
Ejemplo n.º 17
0
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
Ejemplo n.º 18
0
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
Ejemplo n.º 19
0
def test_run_list(arg, expected):
    with swallow_outputs() as output:
        run(list_=arg)
        for e in expected:
            assert e in output.out
Ejemplo n.º 20
0
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