mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-12-10 00:39:22 -06:00
* Pass registry credentials to add-on build for private base images When building add-ons that use a base image from a private registry, the build would fail because credentials configured via the Supervisor API were not passed to the Docker-in-Docker build container. This fix: - Adds get_docker_config_json() to generate a Docker config.json with registry credentials for the base image - Creates a temporary config file and mounts it into the build container at /root/.docker/config.json so BuildKit can authenticate when pulling the base image - Cleans up the temporary file after build completes Fixes #6354 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix pylint errors * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Refactor registry credential extraction into shared helper Extract duplicate logic for determining which registry matches an image into a shared `get_registry_for_image()` method in `DockerConfig`. This method is now used by both `DockerInterface._get_credentials()` and `AddonBuild.get_docker_config_json()`. Move `DOCKER_HUB` and `IMAGE_WITH_HOST` constants to `docker/const.py` to avoid circular imports between manager.py and interface.py. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * ruff format * Document raises --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Mike Degatano <michael.degatano@gmail.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
50 lines
1.8 KiB
Python
50 lines
1.8 KiB
Python
"""Test docker login."""
|
|
|
|
# pylint: disable=protected-access
|
|
from supervisor.coresys import CoreSys
|
|
from supervisor.docker.const import DOCKER_HUB
|
|
from supervisor.docker.interface import DockerInterface
|
|
|
|
|
|
def test_no_credentials(coresys: CoreSys, test_docker_interface: DockerInterface):
|
|
"""Test no credentials."""
|
|
coresys.docker.config._data["registries"] = {
|
|
DOCKER_HUB: {"username": "Spongebob Squarepants", "password": "Password1!"}
|
|
}
|
|
assert not test_docker_interface._get_credentials("ghcr.io/homeassistant")
|
|
assert not test_docker_interface._get_credentials(
|
|
"ghcr.io/homeassistant/amd64-supervisor"
|
|
)
|
|
|
|
|
|
def test_no_matching_credentials(
|
|
coresys: CoreSys, test_docker_interface: DockerInterface
|
|
):
|
|
"""Test no matching credentials."""
|
|
coresys.docker.config._data["registries"] = {
|
|
DOCKER_HUB: {"username": "Spongebob Squarepants", "password": "Password1!"}
|
|
}
|
|
assert not test_docker_interface._get_credentials("ghcr.io/homeassistant")
|
|
assert not test_docker_interface._get_credentials(
|
|
"ghcr.io/homeassistant/amd64-supervisor"
|
|
)
|
|
|
|
|
|
def test_matching_credentials(coresys: CoreSys, test_docker_interface: DockerInterface):
|
|
"""Test no matching credentials."""
|
|
coresys.docker.config._data["registries"] = {
|
|
"ghcr.io": {"username": "Octocat", "password": "Password1!"},
|
|
DOCKER_HUB: {"username": "Spongebob Squarepants", "password": "Password1!"},
|
|
}
|
|
|
|
credentials = test_docker_interface._get_credentials(
|
|
"ghcr.io/homeassistant/amd64-supervisor"
|
|
)
|
|
assert credentials["registry"] == "ghcr.io"
|
|
|
|
credentials = test_docker_interface._get_credentials(
|
|
"homeassistant/amd64-supervisor"
|
|
)
|
|
assert credentials["username"] == "Spongebob Squarepants"
|
|
assert "registry" not in credentials
|