From 3f882364957ced1bbf1eecee7e6d339afc0637f8 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Tue, 16 Aug 2022 14:34:32 +0200 Subject: [PATCH] Support for Docker manifests base images add-on build (#3724) * Support for Docker manifests base images add-on build * Set platform for build and tests * Remove empty test Co-authored-by: Mike Degatano --- supervisor/addons/build.py | 5 +++++ supervisor/addons/validate.py | 5 +++-- tests/addons/test_build.py | 21 +++++++++++++++++++++ tests/addons/test_config.py | 7 +++++++ tests/fixtures/build-config-manifest.json | 7 +++++++ 5 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 tests/addons/test_build.py create mode 100644 tests/fixtures/build-config-manifest.json diff --git a/supervisor/addons/build.py b/supervisor/addons/build.py index a011fc092..c7806e876 100644 --- a/supervisor/addons/build.py +++ b/supervisor/addons/build.py @@ -15,6 +15,7 @@ from ..const import ( META_ADDON, ) from ..coresys import CoreSys, CoreSysAttributes +from ..docker.interface import MAP_ARCH from ..exceptions import ConfigurationFileError from ..utils.common import FileConfiguration, find_one_filetype from .validate import SCHEMA_BUILD_CONFIG @@ -50,6 +51,9 @@ class AddonBuild(FileConfiguration, CoreSysAttributes): if not self._data[ATTR_BUILD_FROM]: return f"ghcr.io/home-assistant/{self.sys_arch.default}-base:latest" + if isinstance(self._data[ATTR_BUILD_FROM], str): + return self._data[ATTR_BUILD_FROM] + # Evaluate correct base image arch = self.sys_arch.match(list(self._data[ATTR_BUILD_FROM].keys())) return self._data[ATTR_BUILD_FROM][arch] @@ -87,6 +91,7 @@ class AddonBuild(FileConfiguration, CoreSysAttributes): "pull": True, "forcerm": not self.sys_dev, "squash": self.squash, + "platform": MAP_ARCH[self.sys_arch.match(self.addon.arch)], "labels": { "io.hass.version": version, "io.hass.arch": self.sys_arch.default, diff --git a/supervisor/addons/validate.py b/supervisor/addons/validate.py index 090ae629c..b387f8dbc 100644 --- a/supervisor/addons/validate.py +++ b/supervisor/addons/validate.py @@ -351,8 +351,9 @@ SCHEMA_ADDON_CONFIG = vol.All( # pylint: disable=no-value-for-parameter SCHEMA_BUILD_CONFIG = vol.Schema( { - vol.Optional(ATTR_BUILD_FROM, default=dict): vol.Schema( - {vol.In(ARCH_ALL): vol.Match(RE_DOCKER_IMAGE_BUILD)} + vol.Optional(ATTR_BUILD_FROM, default=dict): vol.Any( + vol.Match(RE_DOCKER_IMAGE_BUILD), + vol.Schema({vol.In(ARCH_ALL): vol.Match(RE_DOCKER_IMAGE_BUILD)}), ), vol.Optional(ATTR_SQUASH, default=False): vol.Boolean(), vol.Optional(ATTR_ARGS, default=dict): vol.Schema({str: str}), diff --git a/tests/addons/test_build.py b/tests/addons/test_build.py new file mode 100644 index 000000000..7e909dc4b --- /dev/null +++ b/tests/addons/test_build.py @@ -0,0 +1,21 @@ +"""Test addon build.""" +from unittest.mock import PropertyMock, patch + +from awesomeversion import AwesomeVersion + +from supervisor.addons.addon import Addon +from supervisor.addons.build import AddonBuild +from supervisor.coresys import CoreSys + + +async def test_platform_set(coresys: CoreSys, install_addon_ssh: Addon): + """Test platform set in docker args.""" + build = AddonBuild(coresys, install_addon_ssh) + with patch.object( + type(coresys.arch), "supported", new=PropertyMock(return_value=["amd64"]) + ), patch.object( + type(coresys.arch), "default", new=PropertyMock(return_value="amd64") + ): + args = build.get_docker_args(AwesomeVersion("latest")) + + assert args["platform"] == "linux/amd64" diff --git a/tests/addons/test_config.py b/tests/addons/test_config.py index 75bf01376..b6febae46 100644 --- a/tests/addons/test_config.py +++ b/tests/addons/test_config.py @@ -146,6 +146,13 @@ def test_valid_basic_build(): vd.SCHEMA_BUILD_CONFIG(config) +async def test_valid_manifest_build(): + """Validate build config with manifest build from.""" + config = load_json_fixture("build-config-manifest.json") + + vd.SCHEMA_BUILD_CONFIG(config) + + def test_valid_machine(): """Validate valid machine config.""" config = load_json_fixture("basic-addon-config.json") diff --git a/tests/fixtures/build-config-manifest.json b/tests/fixtures/build-config-manifest.json new file mode 100644 index 000000000..39d8b7ef6 --- /dev/null +++ b/tests/fixtures/build-config-manifest.json @@ -0,0 +1,7 @@ +{ + "build_from": "mycustom/base-image:latest", + "squash": false, + "args": { + "my_build_arg": "xy" + } +}