From f1fecdde3ae302025cb7d766b3a8fc6a24ca9db9 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Thu, 7 Mar 2019 16:00:41 +0100 Subject: [PATCH] Enable Armv7 for Add-ons (#936) * Enable Armv7 for Add-ons * Cleanups * fix tests --- hassio/addons/addon.py | 29 +++++++++++++---------------- hassio/addons/validate.py | 2 +- hassio/arch.json | 5 +++++ tests/test_arch.py | 18 +++++++++--------- 4 files changed, 28 insertions(+), 26 deletions(-) diff --git a/hassio/addons/addon.py b/hassio/addons/addon.py index cc77f00e4..85165e76f 100644 --- a/hassio/addons/addon.py +++ b/hassio/addons/addon.py @@ -60,11 +60,6 @@ class Addon(CoreSysAttributes): return await self.instance.attach() - # NOTE: Can't be removed after soon - if ATTR_IMAGE not in self._data.user[self._id]: - self._data.user[self._id][ATTR_IMAGE] = self.image_name - self.save_data() - @property def slug(self): """Return slug/id of add-on.""" @@ -510,19 +505,20 @@ class Addon(CoreSysAttributes): def image(self): """Return image name of add-on.""" if self.is_installed: - # NOTE: cleanup - if ATTR_IMAGE in self._data.user[self._id]: - return self._data.user[self._id][ATTR_IMAGE] - return self.image_name + return self._data.user[self._id].get(ATTR_IMAGE) + return self.image_next @property - def image_name(self): + def image_next(self): """Return image name for install/update.""" if self.is_detached: addon_data = self._data.system.get(self._id) else: addon_data = self._data.cache.get(self._id) + return self._get_image(addon_data) + def _get_image(self, addon_data) -> str: + """Generate image name from data.""" # Repository with Dockerhub images if ATTR_IMAGE in addon_data: arch = self.sys_arch.match(addon_data[ATTR_ARCH]) @@ -724,10 +720,10 @@ class Addon(CoreSysAttributes): await self._install_apparmor() if not await self.instance.install( - self.last_version, self.image_name): + self.last_version, self.image_next): return False - self._set_install(self.image_name, self.last_version) + self._set_install(self.image_next, self.last_version) return True @check_installed @@ -805,9 +801,9 @@ class Addon(CoreSysAttributes): return False if not await self.instance.update( - self.last_version, self.image_name): + self.last_version, self.image_next): return False - self._set_update(self.image_name, self.last_version) + self._set_update(self.image_next, self.last_version) # Setup/Fix AppArmor profile await self._install_apparmor() @@ -952,7 +948,8 @@ class Addon(CoreSysAttributes): # Restore data or reload add-on _LOGGER.info("Restore config for addon %s", self._id) - self._restore_data(data[ATTR_USER], data[ATTR_SYSTEM], self.image_name) + restore_image = self._get_image(data[ATTR_SYSTEM]) + self._restore_data(data[ATTR_USER], data[ATTR_SYSTEM], restore_image) # Check version / restore image version = data[ATTR_VERSION] @@ -963,7 +960,7 @@ class Addon(CoreSysAttributes): if image_file.is_file(): await self.instance.import_image(image_file, version) else: - if await self.instance.install(version, self.image_name): + if await self.instance.install(version, restore_image): await self.instance.cleanup() else: await self.instance.stop() diff --git a/hassio/addons/validate.py b/hassio/addons/validate.py index 077fe1180..8b02e7d0f 100644 --- a/hassio/addons/validate.py +++ b/hassio/addons/validate.py @@ -156,7 +156,7 @@ SCHEMA_BUILD_CONFIG = vol.Schema({ # pylint: disable=no-value-for-parameter SCHEMA_ADDON_USER = vol.Schema({ vol.Required(ATTR_VERSION): vol.Coerce(str), - vol.Optional(ATTR_IMAGE): vol.Maybe(vol.Coerce(str)), + vol.Optional(ATTR_IMAGE): vol.Coerce(str), vol.Optional(ATTR_UUID, default=lambda: uuid.uuid4().hex): UUID_MATCH, vol.Optional(ATTR_ACCESS_TOKEN): SHA256, vol.Optional(ATTR_OPTIONS, default=dict): dict, diff --git a/hassio/arch.json b/hassio/arch.json index 418620122..61d161b0e 100644 --- a/hassio/arch.json +++ b/hassio/arch.json @@ -3,22 +3,27 @@ "armhf" ], "raspberrypi2": [ + "armv7", "armhf" ], "raspberrypi3": [ + "armv7", "armhf" ], "raspberrypi3-64": [ "aarch64", + "armv7", "armhf" ], "tinker": [ + "armv7", "armhf" ], "odroid-c2": [ "aarch64" ], "odroid-xu": [ + "armv7", "armhf" ], "orangepi-prime": [ diff --git a/tests/test_arch.py b/tests/test_arch.py index 8aa039e33..e847e0deb 100644 --- a/tests/test_arch.py +++ b/tests/test_arch.py @@ -46,8 +46,8 @@ async def test_raspberrypi2_arch(coresys, sys_machine): sys_machine.return_value = "raspberrypi2" await coresys.arch.load() - assert coresys.arch.default == "armhf" - assert coresys.arch.supported == ["armhf"] + assert coresys.arch.default == "armv7" + assert coresys.arch.supported == ["armv7", "armhf"] async def test_raspberrypi3_arch(coresys, sys_machine): @@ -55,8 +55,8 @@ async def test_raspberrypi3_arch(coresys, sys_machine): sys_machine.return_value = "raspberrypi3" await coresys.arch.load() - assert coresys.arch.default == "armhf" - assert coresys.arch.supported == ["armhf"] + assert coresys.arch.default == "armv7" + assert coresys.arch.supported == ["armv7", "armhf"] async def test_raspberrypi3_64_arch(coresys, sys_machine): @@ -65,7 +65,7 @@ async def test_raspberrypi3_64_arch(coresys, sys_machine): await coresys.arch.load() assert coresys.arch.default == "aarch64" - assert coresys.arch.supported == ["aarch64", "armhf"] + assert coresys.arch.supported == ["aarch64", "armv7", "armhf"] async def test_tinker_arch(coresys, sys_machine): @@ -73,8 +73,8 @@ async def test_tinker_arch(coresys, sys_machine): sys_machine.return_value = "tinker" await coresys.arch.load() - assert coresys.arch.default == "armhf" - assert coresys.arch.supported == ["armhf"] + assert coresys.arch.default == "armv7" + assert coresys.arch.supported == ["armv7", "armhf"] async def test_odroid_c2_arch(coresys, sys_machine): @@ -91,8 +91,8 @@ async def test_odroid_xu_arch(coresys, sys_machine): sys_machine.return_value = "odroid-xu" await coresys.arch.load() - assert coresys.arch.default == "armhf" - assert coresys.arch.supported == ["armhf"] + assert coresys.arch.default == "armv7" + assert coresys.arch.supported == ["armv7", "armhf"] async def test_orangepi_prime_arch(coresys, sys_machine):