Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 13 additions & 21 deletions dev/breeze/src/airflow_breeze/utils/docker_command_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
"""Various utils to prepare docker and docker compose commands."""
from __future__ import annotations

import json
import os
import re
import sys
Expand Down Expand Up @@ -801,30 +800,23 @@ def autodetect_docker_context():

:return: name of the docker context to use
"""
result = run_command(
["docker", "context", "ls", "--format=json"],
capture_output=True,
check=False,
text=True,
)
if result.returncode != 0:
output = run_command(["docker", "context", "ls", "-q"], capture_output=True, check=False, text=True)
if output.returncode != 0:
get_console().print("[warning]Could not detect docker builder. Using default.[/]")
return "default"
known_contexts = {info["Name"]: info for info in json.loads(result.stdout)}
if not known_contexts:
context_list = output.stdout.splitlines()
if not context_list:
get_console().print("[warning]Could not detect docker builder. Using default.[/]")
return "default"
for preferred_context_name in PREFERRED_CONTEXTS:
try:
context = known_contexts[preferred_context_name]
except KeyError:
continue
# On Windows, some contexts are used for WSL2. We don't want to use those.
if context["DockerEndpoint"] == "npipe:////./pipe/dockerDesktopLinuxEngine":
continue
get_console().print(f"[info]Using {preferred_context_name} as context.[/]")
return preferred_context_name
fallback_context = next(iter(known_contexts))
elif len(context_list) == 1:
get_console().print(f"[info]Using {context_list[0]} as context.[/]")
return context_list[0]
else:
for preferred_context in PREFERRED_CONTEXTS:
if preferred_context in context_list:
get_console().print(f"[info]Using {preferred_context} as context.[/]")
return preferred_context
fallback_context = context_list[0]
get_console().print(
f"[warning]Could not use any of the preferred docker contexts {PREFERRED_CONTEXTS}.\n"
f"Using {fallback_context} as context.[/]"
Expand Down
33 changes: 5 additions & 28 deletions dev/breeze/tests/test_docker_command_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,42 +195,19 @@ def test_check_docker_compose_version_ok(mock_get_console, mock_run_command):
)


def _fake_ctx(name: str) -> dict[str, str]:
return {
"Name": name,
"DockerEndpoint": f"unix://{name}",
}


@pytest.mark.parametrize(
"context_output, selected_context, console_output",
[
(
json.dumps([_fake_ctx("default")]),
"default",
"[info]Using default as context",
),
("[]", "default", "[warning]Could not detect docker builder"),
(
json.dumps([_fake_ctx("a"), _fake_ctx("b")]),
"a",
"[warning]Could not use any of the preferred docker contexts",
),
(
json.dumps([_fake_ctx("a"), _fake_ctx("desktop-linux")]),
"desktop-linux",
"[info]Using desktop-linux as context",
),
(
json.dumps([_fake_ctx("a"), _fake_ctx("default")]),
"default",
"[info]Using default as context",
),
(
json.dumps([_fake_ctx("a"), _fake_ctx("default"), _fake_ctx("desktop-linux")]),
"desktop-linux",
"[info]Using desktop-linux as context",
),
("", "default", "[warning]Could not detect docker builder"),
("a\nb", "a", "[warning]Could not use any of the preferred docker contexts"),
("a\ndesktop-linux", "desktop-linux", "[info]Using desktop-linux as context"),
("a\ndefault", "default", "[info]Using default as context"),
("a\ndefault\ndesktop-linux", "desktop-linux", "[info]Using desktop-linux as context"),
],
)
def test_autodetect_docker_context(context_output: str, selected_context: str, console_output: str):
Expand Down