diff --git a/hassio/addons/addon.py b/hassio/addons/addon.py index c5b048fe7..cea570caa 100644 --- a/hassio/addons/addon.py +++ b/hassio/addons/addon.py @@ -336,6 +336,36 @@ class Addon(object): return vol.Schema(dict) return vol.Schema(vol.All(dict, validate_options(raw_schema))) + def test_udpate_schema(self): + """Check if the exists config valid after update.""" + if not self.is_installed or self.is_detached: + return True + + # load next schema + new_raw_schema = self.data.cache[self._id][ATTR_SCHEMA] + default_options = self.data.cache[self._id][ATTR_OPTIONS] + + # if disabled + if isinstance(new_raw_schema, bool): + return True + + # merge options + options = { + **self.data.user[self._id][ATTR_OPTIONS], + **default_options, + } + + # create voluptuous + new_schema = \ + vol.Schema(vol.All(dict, validate_options(new_raw_schema))) + + # validate + try: + new_schema(options) + except vol.Invalid: + return False + return True + async def install(self, version=None): """Install a addon.""" if self.config.arch not in self.supported_arch: diff --git a/hassio/addons/validate.py b/hassio/addons/validate.py index d54713ce3..320b8a8b3 100644 --- a/hassio/addons/validate.py +++ b/hassio/addons/validate.py @@ -98,7 +98,7 @@ SCHEMA_REPOSITORY_CONFIG = vol.Schema({ # pylint: disable=no-value-for-parameter SCHEMA_ADDON_USER = vol.Schema({ vol.Required(ATTR_VERSION): vol.Coerce(str), - vol.Required(ATTR_OPTIONS): dict, + vol.Optional(ATTR_OPTIONS, default={}): dict, vol.Optional(ATTR_AUTO_UPDATE, default=False): vol.Boolean(), vol.Optional(ATTR_BOOT): vol.In([BOOT_AUTO, BOOT_MANUAL]), diff --git a/hassio/tasks.py b/hassio/tasks.py index 3bf328e9c..7fd888869 100644 --- a/hassio/tasks.py +++ b/hassio/tasks.py @@ -27,8 +27,14 @@ def addons_update(loop, addons): if not addon.is_installed or not addon.auto_update: continue - if addon.version_installed != addon.last_version: + if addon.version_installed == addon.last_version: + continue + + if addon.test_udpate_schema(): tasks.append(addon.update()) + else: + _LOGGER.warning( + "Addon %s will be ignore, schema tests fails", addon.slug) if tasks: _LOGGER.info("Addon auto update process %d tasks", len(tasks))