Пример #1
0
def test_legacy_doesnt_detect():
    # check legacy buildpack doesn't trigger
    with TemporaryDirectory() as repodir:
        with open(pjoin(repodir, "Dockerfile"), "w") as d:
            d.write("FROM andrewosh/some-image")

        with chdir(repodir):
            bp = LegacyBinderDockerBuildPack()
            assert not bp.detect()
Пример #2
0
def test_legacy_raises():
    # check legacy buildpack raises on a repo that triggers it
    with TemporaryDirectory() as repodir:
        with open(pjoin(repodir, "Dockerfile"), "w") as d:
            d.write("FROM andrewosh/binder-base")

        with chdir(repodir):
            bp = LegacyBinderDockerBuildPack()
            with pytest.raises(RuntimeError):
                bp.detect()
Пример #3
0
def test_cache_from_docker(monkeypatch):
    FakeDockerClient = MagicMock()
    cache_from = [
        'image-1:latest'
    ]
    fake_log_value = {'stream': 'fake'}
    fake_client = MagicMock(spec=docker.APIClient)
    fake_client.build.return_value = iter([fake_log_value])

    with TemporaryDirectory() as d:
        # Test docker image
        with open(os.path.join(d, 'Dockerfile'), 'w') as f:
            f.write('FROM scratch\n')

        for line in DockerBuildPack().build(fake_client, 'image-2', '1Gi', {}, cache_from):
            assert line == fake_log_value
        called_args, called_kwargs = fake_client.build.call_args
        assert 'cache_from' in called_kwargs
        assert called_kwargs['cache_from'] == cache_from

        # Test legacy docker image
        with open(os.path.join(d, 'Dockerfile'), 'w') as f:
            f.write('FROM andrewosh/binder-base\n')

        for line in LegacyBinderDockerBuildPack().build(fake_client, 'image-2', '1Gi', {}, cache_from):
            print(line)
            assert line == fake_log_value
        called_args, called_kwargs = fake_client.build.call_args
        assert 'cache_from' in called_kwargs
        assert called_kwargs['cache_from'] == cache_from
Пример #4
0
def test_cache_from_legacy(tmpdir):
    FakeDockerClient = MagicMock()
    cache_from = ['image-1:latest']
    fake_log_value = {'stream': 'fake'}
    fake_client = MagicMock(spec=docker.APIClient)
    fake_client.build.return_value = iter([fake_log_value])

    # Test legacy docker image
    with tmpdir.join("Dockerfile").open('w') as f:
        f.write('FROM andrewosh/binder-base\n')

    for line in LegacyBinderDockerBuildPack().build(fake_client, 'image-2',
                                                    '1Gi', {}, cache_from):
        assert line == fake_log_value
    called_args, called_kwargs = fake_client.build.call_args
    assert 'cache_from' in called_kwargs
    assert called_kwargs['cache_from'] == cache_from
Пример #5
0
def test_cache_from_legacy(tmpdir):
    cache_from = ["image-1:latest"]
    fake_log_value = {"stream": "fake"}
    fake_client = MagicMock(spec=docker.APIClient)
    fake_client.build.return_value = iter([fake_log_value])
    extra_build_kwargs = {"somekey": "somevalue"}

    # Test legacy docker image
    with tmpdir.join("Dockerfile").open("w") as f:
        f.write("FROM andrewosh/binder-base\n")

    for line in LegacyBinderDockerBuildPack().build(fake_client, "image-2",
                                                    100, {}, cache_from,
                                                    extra_build_kwargs):
        assert line == fake_log_value
    called_args, called_kwargs = fake_client.build.call_args
    assert "cache_from" in called_kwargs
    assert called_kwargs["cache_from"] == cache_from
Пример #6
0
def test_legacy_on_repo_without_dockerfile():
    # check legacy buildpack doesn't trigger on a repo w/o Dockerfile
    with TemporaryDirectory() as repodir:
        with chdir(repodir):
            bp = LegacyBinderDockerBuildPack()
            assert not bp.detect()
Пример #7
0
def get_repo_data_from_git(ref, repo_url):
    """
    - get commit date of resolved ref from git history
    - use repo2docker to detect binder_dir and buildpack
    """
    repo_data = {
        "resolved_date":
        datetime.utcnow().replace(second=0, microsecond=0).isoformat(),
        "resolved_ref":
        None,
        "resolved_ref_date":
        None,
        "binder_dir":
        None,
        "buildpack":
        None,
    }
    with tempfile.TemporaryDirectory() as tmp_dir_path:
        command = ["git", "clone", repo_url, tmp_dir_path]
        git_execute(command, env={"GIT_TERMINAL_PROMPT": "0"})

        # check if resolved ref exists in repo
        # it is possible that a commit, which is launched, is removed from history
        # ex: https://github.com/vaughnkoch/test1 and
        # https://github.com/vaughnkoch/test1/commit/464062f227e35eea5d01e138b83bb01912587060
        command = ["git", "checkout", ref]
        try:
            git_execute(command, tmp_dir_path)
        except Exception as e:
            e_txt = e.args[0].strip()
            if f"error: pathspec '{ref}' did not match any file(s) known to git" in e_txt or \
                "fatal: reference is not a tree" in e_txt:
                repo_data["resolved_ref"] = "404"
                # repo_data["resolved_ref_date"] = "404"
                # repo_data["binder_dir"] = "404"
                # repo_data["buildpack"] = "404"
                return repo_data
            else:
                raise e
        else:
            command = ["git", "rev-parse", "HEAD"]
            result = git_execute(command, tmp_dir_path)
            resolved_ref = result.stdout.strip()
            repo_data["resolved_ref"] = resolved_ref

            # get commit date of resolved ref
            command = ["git", "show", "-s", "--format=%cI", resolved_ref]
            result = git_execute(command, tmp_dir_path)
            resolved_ref_date = result.stdout.strip()
            date_ = datetime.fromisoformat(resolved_ref_date)
            # have date in UTC and in isoformat
            # this also removes timezone info
            repo_data["resolved_ref_date"] = datetime.utcfromtimestamp(
                date_.timestamp()).isoformat()

            default_buildpack = PythonBuildPack
            with chdir(tmp_dir_path):
                for BP in BUILDPACKS:
                    bp = BP()
                    try:
                        if bp.detect():
                            picked_buildpack = bp
                            break
                    except RuntimeError as e:
                        if "The legacy buildpack has been removed." == e.args[
                                0]:
                            picked_buildpack = LegacyBinderDockerBuildPack()
                            setattr(picked_buildpack, "binder_dir", "")
                            break
                        else:
                            raise e
                else:
                    picked_buildpack = default_buildpack()

                repo_data["binder_dir"] = picked_buildpack.binder_dir
                repo_data["buildpack"] = picked_buildpack.__class__.__name__
    return repo_data