def test_doesnt_raise_for_nonzero_status(self, monkeypatch): task = WaitOnContainer(container_id="noise", raise_on_exit_code=False) api = MagicMock() monkeypatch.setattr("docker.APIClient", api) api.return_value.wait.return_value = {"StatusCode": 1, "Error": "oops!"} task.run()
def test_raises_for_error(self, monkeypatch): task = WaitOnContainer(container_id="noise") api = MagicMock() monkeypatch.setattr("docker.APIClient", api) api.return_value.wait.return_value = {"Error": "oops!"} with pytest.raises(FAIL): task.run()
def test_raises_for_nonzero_status(self, monkeypatch): task = WaitOnContainer(container_id="noise") api = MagicMock() monkeypatch.setattr("docker.APIClient", api) api.return_value.wait.return_value = {"StatusCode": 1} with pytest.raises(FAIL): task.run()
def test_container_id_run_value_is_used(self, monkeypatch): task = WaitOnContainer(container_id="init") api = MagicMock() monkeypatch.setattr("docker.APIClient", api) api.return_value.wait.return_value = {} task.run(container_id="test") assert api.return_value.wait.call_args[1]["container"] == "test"
def test_doesnt_log_on_param_failure(self, monkeypatch, caplog): task = WaitOnContainer() api = MagicMock() monkeypatch.setattr("docker.APIClient", api) self.assert_doesnt_log_on_param_failure(task, caplog)
def test_logs_twice_on_success(self, monkeypatch, caplog): task = WaitOnContainer(container_id="noise", raise_on_exit_code=False) api = MagicMock() monkeypatch.setattr("docker.APIClient", api) self.assert_logs_twice_on_success(task, caplog)
def test_filled_initialization(self): task = WaitOnContainer(container_id="test", docker_server_url="test", raise_on_exit_code=False) assert task.container_id == "test" assert task.docker_server_url == "test" assert task.raise_on_exit_code is False
def test_logs_once_on_docker_api_failure(self, monkeypatch, caplog): task = WaitOnContainer(container_id="noise") api = MagicMock() wait_container_mock = MagicMock( side_effect=docker.errors.DockerException( "A docker specific exception")) api.return_value.wait = wait_container_mock monkeypatch.setattr("docker.APIClient", api) self.assert_logs_once_on_docker_api_failure(task, caplog)
def test_invalid_container_id_raises_error(self): task = WaitOnContainer() with pytest.raises(ValueError): task.run(container_id=None)
def test_empty_container_id_raises_error(self): task = WaitOnContainer() with pytest.raises(ValueError): task.run()
def test_empty_initialization(self): task = WaitOnContainer() assert not task.container_id assert task.docker_server_url == "unix:///var/run/docker.sock" assert task.raise_on_exit_code is True
from prefect.tasks.docker import ( CreateContainer, GetContainerLogs, StartContainer, WaitOnContainer, ) from prefect.triggers import always_run ## initialize tasks container = CreateContainer( image_name="prefecthq/prefect", command='''python -c "from prefect import Flow; f = Flow('empty'); f.run()"''', ) start = StartContainer() logs = GetContainerLogs(trigger=always_run) status_code = WaitOnContainer() ## set task dependencies via functional API with Flow("Run a Prefect Flow in Docker") as flow: start_container = start(container_id=container) code = status_code(container_id=container, upstream_tasks=[start_container]) collect_logs = logs(container_id=container, upstream_tasks=[code]) ## run flow and print logs flow_state = flow.run() print("=" * 30) print("Container Logs") print("=" * 30)
# Pass the host of the Docker daemon to each task image = PullImage( docker_server_url="tcp://localhost:2375", repository="prefecthq/prefect", tag="latest", ) container = CreateContainer( docker_server_url="tcp://localhost:2375", image_name="prefecthq/prefect:latest", command= '''python -c "from prefect import Flow; f = Flow('empty'); f.run()"''', ) start = StartContainer(docker_server_url="tcp://localhost:2375", ) logs = GetContainerLogs(docker_server_url="tcp://localhost:2375", trigger=always_run) status_code = WaitOnContainer(docker_server_url="tcp://localhost:2375", ) flow = Flow( "Run a Prefect Flow in Docker", environment=KubernetesJobEnvironment(job_spec_file="job_spec.yaml"), storage=Docker( registry_url="joshmeek18", image_name="flows", ), ) # set task dependencies using imperative API container.set_upstream(image, flow=flow) start.set_upstream(container, flow=flow, key="container_id") logs.set_upstream(container, flow=flow, key="container_id") status_code.set_upstream(container, flow=flow, key="container_id")
from prefect.tasks.docker import ( CreateContainer, StartContainer, GetContainerLogs, WaitOnContainer, ) from prefect.triggers import always_run container = CreateContainer( image_name="prefecthq/prefect", command= '''python -c "from prefect import Flow; f = Flow("empty"); f.run()"''', ) start = StartContainer() logs = GetContainerLogs(trigger=always_run) status_code = WaitOnContainer() flow = Flow("Run a Prefect Flow in Docker") ## set individual task dependencies using imperative API start.set_upstream(container, flow=flow, key="container_id") logs.set_upstream(container, flow=flow, key="container_id") status_code.set_upstream(container, flow=flow, key="container_id") status_code.set_upstream(start, flow=flow) logs.set_upstream(status_code, flow=flow) ## run flow and print logs flow_state = flow.run() print("=" * 30) print("Container Logs")
from prefect import task, Flow from prefect.tasks.docker import ( CreateContainer, StartContainer, GetContainerLogs, WaitOnContainer, ) create = CreateContainer(image_name="prefecthq/prefect", command="echo 12345") start = StartContainer() wait = WaitOnContainer() logs = GetContainerLogs() @task def see_output(out): print(out) with Flow("docker-flow") as flow: container_id = create() s = start(container_id=container_id) w = wait(container_id=container_id) l = logs(container_id=container_id) l.set_upstream(w) see_output(l) flow.run()