From c2ba02722c0bff299343b0315e96ed926abd7948 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 9 May 2017 17:03:59 +0200 Subject: [PATCH] Add arch to addon config / hole api (#38) * Add arch to addon config / hole api * fix wrong copy past --- API.md | 11 +++++++---- hassio/addons/__init__.py | 4 ++++ hassio/addons/data.py | 8 +++++++- hassio/addons/validate.py | 10 ++++++++-- hassio/api/addons.py | 5 +++++ hassio/api/supervisor.py | 4 +++- hassio/const.py | 6 ++++++ 7 files changed, 40 insertions(+), 8 deletions(-) diff --git a/API.md b/API.md index eedc77987..69736bb3f 100644 --- a/API.md +++ b/API.md @@ -32,16 +32,18 @@ The addons from `addons` are only installed one. { "version": "INSTALL_VERSION", "last_version": "LAST_VERSION", + "arch": "armhf|aarch64|i386|amd64", "beta_channel": "true|false", "addons": [ { "name": "xy bla", "slug": "xy", + "description": "description", + "arch": ["armhf", "aarch64", "i386", "amd64"], "repository": "12345678|null", "version": "LAST_VERSION", "installed": "INSTALL_VERSION", - "detached": "bool", - "description": "description" + "detached": "bool" } ], "addons_repositories": [ @@ -60,11 +62,12 @@ Get all available addons { "name": "xy bla", "slug": "xy", + "description": "description", + "arch": ["armhf", "aarch64", "i386", "amd64"], "repository": "core|local|REP_ID", "version": "LAST_VERSION", "installed": "none|INSTALL_VERSION", - "detached": "bool", - "description": "description" + "detached": "bool" } ], "repositories": [ diff --git a/hassio/addons/__init__.py b/hassio/addons/__init__.py index 4ce17a22c..9f43825c1 100644 --- a/hassio/addons/__init__.py +++ b/hassio/addons/__init__.py @@ -108,6 +108,10 @@ class AddonManager(AddonsData): _LOGGER.error("Addon %s not exists for install", addon) return False + if self.arch not in self.get_arch(addon): + _LOGGER.error("Addon %s not supported on %s", addon, self.arch) + return False + if self.is_installed(addon): _LOGGER.error("Addon %s is already installed", addon) return False diff --git a/hassio/addons/data.py b/hassio/addons/data.py index 620311fd8..11589831e 100644 --- a/hassio/addons/data.py +++ b/hassio/addons/data.py @@ -14,7 +14,7 @@ from ..const import ( FILE_HASSIO_ADDONS, ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON, ATTR_STARTUP, ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, BOOT_AUTO, DOCKER_REPO, ATTR_SCHEMA, ATTR_IMAGE, MAP_CONFIG, MAP_SSL, MAP_ADDONS, - MAP_BACKUP, ATTR_REPOSITORY, ATTR_URL) + MAP_BACKUP, ATTR_REPOSITORY, ATTR_URL, ATTR_ARCH) from ..config import Config from ..tools import read_json_file, write_json_file @@ -294,6 +294,12 @@ class AddonsData(Config): """Return url of addon.""" return self._system_data[addon].get(ATTR_URL) + def get_arch(self, addon): + """Return list of supported arch.""" + if addon not in self._addons_cache: + return self._system_data[addon][ATTR_ARCH] + return self._addons_cache[addon][ATTR_ARCH] + def get_image(self, addon): """Return image name of addon.""" addon_data = self._system_data.get( diff --git a/hassio/addons/validate.py b/hassio/addons/validate.py index 264a8ba3f..a2d20b1f3 100644 --- a/hassio/addons/validate.py +++ b/hassio/addons/validate.py @@ -5,7 +5,8 @@ from ..const import ( ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON, ATTR_STARTUP, ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, STARTUP_ONCE, STARTUP_AFTER, STARTUP_BEFORE, BOOT_AUTO, BOOT_MANUAL, ATTR_SCHEMA, ATTR_IMAGE, MAP_SSL, - MAP_CONFIG, MAP_ADDONS, MAP_BACKUP, ATTR_URL, ATTR_MAINTAINER) + MAP_CONFIG, MAP_ADDONS, MAP_BACKUP, ATTR_URL, ATTR_MAINTAINER, ATTR_ARCH, + ARCH_ARMHF, ARCH_AARCH64, ARCH_AMD64, ARCH_I386) V_STR = 'str' V_INT = 'int' @@ -16,12 +17,18 @@ V_URL = 'url' ADDON_ELEMENT = vol.In([V_STR, V_INT, V_FLOAT, V_BOOL, V_EMAIL, V_URL]) +ARCH_ALL = [ + ARCH_ARMHF, ARCH_AARCH64, ARCH_AMD64, ARCH_I386 +] + # pylint: disable=no-value-for-parameter SCHEMA_ADDON_CONFIG = vol.Schema({ vol.Required(ATTR_NAME): vol.Coerce(str), vol.Required(ATTR_VERSION): vol.Coerce(str), vol.Required(ATTR_SLUG): vol.Coerce(str), vol.Required(ATTR_DESCRIPTON): vol.Coerce(str), + vol.Optional(ATTR_URL): vol.Url(), + vol.Optional(ATTR_ARCH, default=ARCH_ALL): [vol.In(ARCH_ALL)], vol.Required(ATTR_STARTUP): vol.In([STARTUP_BEFORE, STARTUP_AFTER, STARTUP_ONCE]), vol.Required(ATTR_BOOT): @@ -30,7 +37,6 @@ SCHEMA_ADDON_CONFIG = vol.Schema({ vol.Optional(ATTR_MAP, default=[]): [ vol.In([MAP_CONFIG, MAP_SSL, MAP_ADDONS, MAP_BACKUP]) ], - vol.Optional(ATTR_URL): vol.Url(), vol.Required(ATTR_OPTIONS): dict, vol.Required(ATTR_SCHEMA): { vol.Coerce(str): vol.Any(ADDON_ELEMENT, [ diff --git a/hassio/api/addons.py b/hassio/api/addons.py index aeca30d12..70de3cdcb 100644 --- a/hassio/api/addons.py +++ b/hassio/api/addons.py @@ -88,6 +88,11 @@ class APIAddons(object): version = body.get( ATTR_VERSION, self.addons.get_last_version(addon)) + # check if arch supported + if self.addons.arch not in self.addons.get_arch(addon): + raise RuntimeError( + "Addon is not supported on {}".format(self.addons.arch)) + return await asyncio.shield( self.addons.install(addon, version), loop=self.loop) diff --git a/hassio/api/supervisor.py b/hassio/api/supervisor.py index ca2c6bc89..ac9381df6 100644 --- a/hassio/api/supervisor.py +++ b/hassio/api/supervisor.py @@ -10,7 +10,7 @@ from ..const import ( ATTR_ADDONS, ATTR_VERSION, ATTR_LAST_VERSION, ATTR_BETA_CHANNEL, HASSIO_VERSION, ATTR_ADDONS_REPOSITORIES, ATTR_REPOSITORIES, ATTR_REPOSITORY, ATTR_DESCRIPTON, ATTR_NAME, ATTR_SLUG, ATTR_INSTALLED, - ATTR_DETACHED, ATTR_SOURCE, ATTR_MAINTAINER, ATTR_URL) + ATTR_DETACHED, ATTR_SOURCE, ATTR_MAINTAINER, ATTR_URL, ATTR_ARCH) _LOGGER = logging.getLogger(__name__) @@ -55,6 +55,7 @@ class APISupervisor(object): ATTR_DESCRIPTON: values[ATTR_DESCRIPTON], ATTR_VERSION: values[ATTR_VERSION], ATTR_INSTALLED: i_version, + ATTR_ARCH: values[ATTR_ARCH], ATTR_DETACHED: addon in detached, ATTR_REPOSITORY: values[ATTR_REPOSITORY], }) @@ -89,6 +90,7 @@ class APISupervisor(object): ATTR_VERSION: HASSIO_VERSION, ATTR_LAST_VERSION: self.config.last_hassio, ATTR_BETA_CHANNEL: self.config.upstream_beta, + ATTR_ARCH: self.addons.arch, ATTR_ADDONS: self._addons_list(only_installed=True), ATTR_ADDONS_REPOSITORIES: self.config.addons_repositories, } diff --git a/hassio/const.py b/hassio/const.py index 77ff63a0a..c3075bf7c 100644 --- a/hassio/const.py +++ b/hassio/const.py @@ -33,6 +33,7 @@ JSON_MESSAGE = 'message' RESULT_ERROR = 'error' RESULT_OK = 'ok' +ATTR_ARCH = 'arch' ATTR_HOSTNAME = 'hostname' ATTR_OS = 'os' ATTR_TYPE = 'type' @@ -75,3 +76,8 @@ MAP_CONFIG = 'config' MAP_SSL = 'ssl' MAP_ADDONS = 'addons' MAP_BACKUP = 'backup' + +ARCH_ARMHF = 'armhf' +ARCH_AARCH64 = 'aarch64' +ARCH_AMD64 = 'amd64' +ARCH_I386 = 'i386'