def test_compose_run(arrow_compose_path): expected_calls = [ "run --rm conda-cpp", ] compose = DockerCompose(arrow_compose_path) with assert_compose_calls(compose, expected_calls): compose.run('conda-cpp') expected_calls = ["run --rm conda-python"] expected_env = PartialEnv(PYTHON='3.6') with assert_compose_calls(compose, expected_calls, env=expected_env): compose.run('conda-python') compose = DockerCompose(arrow_compose_path, params=dict(PYTHON='3.8')) expected_env = PartialEnv(PYTHON='3.8') with assert_compose_calls(compose, expected_calls, env=expected_env): compose.run('conda-python') compose = DockerCompose(arrow_compose_path, params=dict(PYTHON='3.8')) for command in ["bash", "echo 1"]: expected_calls = [["run", "--rm", "conda-python", command]] expected_env = PartialEnv(PYTHON='3.8') with assert_compose_calls(compose, expected_calls, env=expected_env): compose.run('conda-python', command) expected_calls = [ ("run --rm -e CONTAINER_ENV_VAR_A=a -e CONTAINER_ENV_VAR_B=b " "conda-python") ] compose = DockerCompose(arrow_compose_path) expected_env = PartialEnv(PYTHON='3.6') with assert_compose_calls(compose, expected_calls, env=expected_env): env = collections.OrderedDict([("CONTAINER_ENV_VAR_A", "a"), ("CONTAINER_ENV_VAR_B", "b")]) compose.run('conda-python', env=env)
def test_image_with_gpu(arrow_compose_path): compose = DockerCompose(arrow_compose_path) expected_calls = [[ "run", "--rm", "--gpus", "all", "-e", "CUDA_ENV=1", "-e", "OTHER_ENV=2", "-v", "/host:/container:rw", "org/ubuntu-cuda", '/bin/bash -c "echo 1 > /tmp/dummy && cat /tmp/dummy"' ]] with assert_docker_calls(compose, expected_calls): compose.run('ubuntu-cuda')
def test_image_with_gpu(arrow_compose_path): compose = DockerCompose(arrow_compose_path) expected_calls = [[ "run", "--rm", "-it", "--gpus", "all", "-e", "CUDA_ENV=1", "-e", "OTHER_ENV=2", "-v", "/host:/container:rw", "dummy-cuda", "/bin/bash", "-c", "echo 1 > /tmp/dummy && cat /tmp/dummy" ]] with assert_docker_calls(compose, expected_calls): compose.run('ubuntu-cuda', force_pull=False, force_build=False)
def test_compose_run_with_resource_limits(arrow_compose_path): expected_calls = [ format_run([ "--cpuset-cpus=0,1", "--memory=7g", "--memory-swap=7g", "org/conda-cpp" ]), ] compose = DockerCompose(arrow_compose_path) with assert_docker_calls(compose, expected_calls): compose.run('conda-cpp', resource_limit="github")
def test_compose_error(arrow_compose_path): compose = DockerCompose(arrow_compose_path, params=dict(PYTHON='3.8', PANDAS='master')) error = subprocess.CalledProcessError(99, []) with mock.patch('subprocess.run', side_effect=error): with pytest.raises(RuntimeError) as exc: compose.run('conda-cpp') exception_message = str(exc.value) assert "exited with a non-zero exit code 99" in exception_message assert "PANDAS: latest" in exception_message assert "export PANDAS=master" in exception_message
def test_compose_run_force_pull_and_build(arrow_compose_path): compose = DockerCompose(arrow_compose_path) expected_calls = [ "pull --ignore-pull-failures conda-cpp", format_run("conda-cpp") ] with assert_compose_calls(compose, expected_calls): compose.run('conda-cpp', force_pull=True) expected_calls = [ "build conda-cpp", format_run("conda-cpp") ] with assert_compose_calls(compose, expected_calls): compose.run('conda-cpp', force_build=True) expected_calls = [ "pull --ignore-pull-failures conda-cpp", "build conda-cpp", format_run("conda-cpp") ] with assert_compose_calls(compose, expected_calls): compose.run('conda-cpp', force_pull=True, force_build=True) expected_calls = [ "pull --ignore-pull-failures conda-cpp", "pull --ignore-pull-failures conda-python", "pull --ignore-pull-failures conda-python-pandas", "build conda-cpp", "build conda-python", "build conda-python-pandas", format_run("conda-python-pandas bash") ] with assert_compose_calls(compose, expected_calls): compose.run('conda-python-pandas', command='bash', force_build=True, force_pull=True) expected_calls = [ "pull --ignore-pull-failures conda-cpp", "pull --ignore-pull-failures conda-python", "build conda-cpp", "build conda-python", "build --no-cache conda-python-pandas", format_run("conda-python-pandas bash") ] with assert_compose_calls(compose, expected_calls): compose.run('conda-python-pandas', command='bash', force_build=True, force_pull=True, use_leaf_cache=False)
def test_compose_run(arrow_compose_path): expected_calls = [ format_run("conda-cpp"), ] compose = DockerCompose(arrow_compose_path) with assert_compose_calls(compose, expected_calls): compose.run('conda-cpp') expected_calls = [ format_run("conda-python") ] expected_env = PartialEnv(PYTHON='3.6') with assert_compose_calls(compose, expected_calls, env=expected_env): compose.run('conda-python') compose = DockerCompose(arrow_compose_path, params=dict(PYTHON='3.8')) expected_env = PartialEnv(PYTHON='3.8') with assert_compose_calls(compose, expected_calls, env=expected_env): compose.run('conda-python') compose = DockerCompose(arrow_compose_path, params=dict(PYTHON='3.8')) for command in ["bash", "echo 1"]: expected_calls = [ format_run(["conda-python", command]), ] expected_env = PartialEnv(PYTHON='3.8') with assert_compose_calls(compose, expected_calls, env=expected_env): compose.run('conda-python', command) expected_calls = [ ( format_run("-e CONTAINER_ENV_VAR_A=a -e CONTAINER_ENV_VAR_B=b " "conda-python") ) ] compose = DockerCompose(arrow_compose_path) expected_env = PartialEnv(PYTHON='3.6') with assert_compose_calls(compose, expected_calls, env=expected_env): env = collections.OrderedDict([ ("CONTAINER_ENV_VAR_A", "a"), ("CONTAINER_ENV_VAR_B", "b") ]) compose.run('conda-python', env=env) expected_calls = [ ( format_run("--volume /host/build:/build --volume " "/host/ccache:/ccache:delegated conda-python") ) ] compose = DockerCompose(arrow_compose_path) with assert_compose_calls(compose, expected_calls): volumes = ("/host/build:/build", "/host/ccache:/ccache:delegated") compose.run('conda-python', volumes=volumes)