mirror of
https://github.com/home-assistant/supervisor.git
synced 2026-02-14 23:19:37 +00:00
Update get_docker_args() to return mounts not volumes (#6499)
* Update `get_docker_args()` to return `mounts` not `volumes` * fix more mocks to return PurePaths
This commit is contained in:
@@ -24,7 +24,7 @@ from ..const import (
|
||||
CpuArch,
|
||||
)
|
||||
from ..coresys import CoreSys, CoreSysAttributes
|
||||
from ..docker.const import DOCKER_HUB, DOCKER_HUB_LEGACY
|
||||
from ..docker.const import DOCKER_HUB, DOCKER_HUB_LEGACY, DockerMount, MountType
|
||||
from ..docker.interface import MAP_ARCH
|
||||
from ..exceptions import (
|
||||
AddonBuildArchitectureNotSupportedError,
|
||||
@@ -232,24 +232,38 @@ class AddonBuild(FileConfiguration, CoreSysAttributes):
|
||||
self.addon.path_location
|
||||
)
|
||||
|
||||
volumes = {
|
||||
SOCKET_DOCKER: {"bind": "/var/run/docker.sock", "mode": "rw"},
|
||||
addon_extern_path: {"bind": "/addon", "mode": "ro"},
|
||||
}
|
||||
mounts = [
|
||||
DockerMount(
|
||||
type=MountType.BIND,
|
||||
source=SOCKET_DOCKER.as_posix(),
|
||||
target="/var/run/docker.sock",
|
||||
read_only=False,
|
||||
),
|
||||
DockerMount(
|
||||
type=MountType.BIND,
|
||||
source=addon_extern_path.as_posix(),
|
||||
target="/addon",
|
||||
read_only=True,
|
||||
),
|
||||
]
|
||||
|
||||
# Mount Docker config with registry credentials if available
|
||||
if docker_config_path:
|
||||
docker_config_extern_path = self.sys_config.local_to_extern_path(
|
||||
docker_config_path
|
||||
)
|
||||
volumes[docker_config_extern_path] = {
|
||||
"bind": "/root/.docker/config.json",
|
||||
"mode": "ro",
|
||||
}
|
||||
mounts.append(
|
||||
DockerMount(
|
||||
type=MountType.BIND,
|
||||
source=docker_config_extern_path.as_posix(),
|
||||
target="/root/.docker/config.json",
|
||||
read_only=True,
|
||||
)
|
||||
)
|
||||
|
||||
return {
|
||||
"command": build_cmd,
|
||||
"volumes": volumes,
|
||||
"mounts": mounts,
|
||||
"working_dir": PurePath("/addon"),
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ import asyncio
|
||||
from datetime import timedelta
|
||||
import errno
|
||||
from http import HTTPStatus
|
||||
from pathlib import Path
|
||||
from pathlib import Path, PurePath
|
||||
from typing import Any
|
||||
from unittest.mock import MagicMock, PropertyMock, call, patch
|
||||
|
||||
@@ -851,7 +851,7 @@ async def test_addon_loads_wrong_image(
|
||||
patch.object(
|
||||
type(coresys.config),
|
||||
"local_to_extern_path",
|
||||
return_value="/addon/path/on/host",
|
||||
return_value=PurePath("/addon/path/on/host"),
|
||||
),
|
||||
):
|
||||
await install_addon_ssh.load()
|
||||
@@ -899,7 +899,7 @@ async def test_addon_loads_missing_image(coresys: CoreSys, install_addon_ssh: Ad
|
||||
patch.object(
|
||||
type(coresys.config),
|
||||
"local_to_extern_path",
|
||||
return_value="/addon/path/on/host",
|
||||
return_value=PurePath("/addon/path/on/host"),
|
||||
),
|
||||
):
|
||||
await install_addon_ssh.load()
|
||||
@@ -937,7 +937,9 @@ async def test_addon_load_succeeds_with_docker_errors(
|
||||
with (
|
||||
patch("pathlib.Path.is_file", return_value=True),
|
||||
patch.object(
|
||||
CoreConfig, "local_to_extern_path", return_value="/addon/path/on/host"
|
||||
CoreConfig,
|
||||
"local_to_extern_path",
|
||||
return_value=PurePath("/addon/path/on/host"),
|
||||
),
|
||||
patch.object(
|
||||
DockerAPI, "run_command", return_value=CommandReturn(1, ["error"])
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
import base64
|
||||
import json
|
||||
from pathlib import Path
|
||||
from pathlib import Path, PurePath
|
||||
from unittest.mock import PropertyMock, patch
|
||||
|
||||
from awesomeversion import AwesomeVersion
|
||||
@@ -11,7 +11,7 @@ import pytest
|
||||
from supervisor.addons.addon import Addon
|
||||
from supervisor.addons.build import AddonBuild
|
||||
from supervisor.coresys import CoreSys
|
||||
from supervisor.docker.const import DOCKER_HUB
|
||||
from supervisor.docker.const import DOCKER_HUB, MountType
|
||||
from supervisor.exceptions import AddonBuildDockerfileMissingError
|
||||
|
||||
from tests.common import is_in_list
|
||||
@@ -31,7 +31,7 @@ async def test_platform_set(coresys: CoreSys, install_addon_ssh: Addon):
|
||||
patch.object(
|
||||
type(coresys.config),
|
||||
"local_to_extern_path",
|
||||
return_value="/addon/path/on/host",
|
||||
return_value=PurePath("/addon/path/on/host"),
|
||||
),
|
||||
):
|
||||
args = await coresys.run_in_executor(
|
||||
@@ -55,7 +55,7 @@ async def test_dockerfile_evaluation(coresys: CoreSys, install_addon_ssh: Addon)
|
||||
patch.object(
|
||||
type(coresys.config),
|
||||
"local_to_extern_path",
|
||||
return_value="/addon/path/on/host",
|
||||
return_value=PurePath("/addon/path/on/host"),
|
||||
),
|
||||
):
|
||||
args = await coresys.run_in_executor(
|
||||
@@ -83,7 +83,7 @@ async def test_dockerfile_evaluation_arch(coresys: CoreSys, install_addon_ssh: A
|
||||
patch.object(
|
||||
type(coresys.config),
|
||||
"local_to_extern_path",
|
||||
return_value="/addon/path/on/host",
|
||||
return_value=PurePath("/addon/path/on/host"),
|
||||
),
|
||||
):
|
||||
args = await coresys.run_in_executor(
|
||||
@@ -231,7 +231,7 @@ async def test_docker_args_with_config_path(coresys: CoreSys, install_addon_ssh:
|
||||
patch.object(
|
||||
type(coresys.config),
|
||||
"local_to_extern_path",
|
||||
side_effect=lambda p: f"/extern{p}",
|
||||
side_effect=lambda p: PurePath(f"/extern{p}"),
|
||||
),
|
||||
):
|
||||
config_path = Path("/data/supervisor/tmp/config.json")
|
||||
@@ -242,13 +242,14 @@ async def test_docker_args_with_config_path(coresys: CoreSys, install_addon_ssh:
|
||||
config_path,
|
||||
)
|
||||
|
||||
# Check that config is mounted
|
||||
assert "/extern/data/supervisor/tmp/config.json" in args["volumes"]
|
||||
assert (
|
||||
args["volumes"]["/extern/data/supervisor/tmp/config.json"]["bind"]
|
||||
== "/root/.docker/config.json"
|
||||
# Check that config is mounted (3 mounts: docker socket, addon path, config)
|
||||
assert len(args["mounts"]) == 3
|
||||
config_mount = next(
|
||||
m for m in args["mounts"] if m.target == "/root/.docker/config.json"
|
||||
)
|
||||
assert args["volumes"]["/extern/data/supervisor/tmp/config.json"]["mode"] == "ro"
|
||||
assert config_mount.source == "/extern/data/supervisor/tmp/config.json"
|
||||
assert config_mount.read_only is True
|
||||
assert config_mount.type == MountType.BIND
|
||||
|
||||
|
||||
async def test_docker_args_without_config_path(
|
||||
@@ -267,7 +268,7 @@ async def test_docker_args_without_config_path(
|
||||
patch.object(
|
||||
type(coresys.config),
|
||||
"local_to_extern_path",
|
||||
return_value="/addon/path/on/host",
|
||||
return_value=PurePath("/addon/path/on/host"),
|
||||
),
|
||||
):
|
||||
args = await coresys.run_in_executor(
|
||||
@@ -275,7 +276,7 @@ async def test_docker_args_without_config_path(
|
||||
)
|
||||
|
||||
# Only docker socket and addon path should be mounted
|
||||
assert len(args["volumes"]) == 2
|
||||
assert len(args["mounts"]) == 2
|
||||
# Verify no docker config mount
|
||||
for bind in args["volumes"].values():
|
||||
assert bind["bind"] != "/root/.docker/config.json"
|
||||
for mount in args["mounts"]:
|
||||
assert mount.target != "/root/.docker/config.json"
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
import asyncio
|
||||
from collections.abc import Awaitable, Callable
|
||||
from pathlib import PurePath
|
||||
from unittest.mock import MagicMock, PropertyMock, patch
|
||||
|
||||
import aiodocker
|
||||
@@ -240,7 +241,7 @@ async def test_api_addon_rebuild_healthcheck(
|
||||
patch.object(
|
||||
type(coresys.config),
|
||||
"local_to_extern_path",
|
||||
return_value="/addon/path/on/host",
|
||||
return_value=PurePath("/addon/path/on/host"),
|
||||
),
|
||||
):
|
||||
resp = await api_client.post("/addons/local_ssh/rebuild")
|
||||
@@ -334,7 +335,7 @@ async def test_api_addon_rebuild_force(
|
||||
patch.object(
|
||||
type(coresys.config),
|
||||
"local_to_extern_path",
|
||||
return_value="/addon/path/on/host",
|
||||
return_value=PurePath("/addon/path/on/host"),
|
||||
),
|
||||
):
|
||||
resp = await api_client.post("/addons/local_ssh/rebuild", json={"force": True})
|
||||
|
||||
Reference in New Issue
Block a user