From 6ef99974cffad91650c5fc05117f30fac32f42dd Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 4 Feb 2020 17:40:46 +0100 Subject: [PATCH] Cleanup service (#1471) * Cleanup services on uninstall * Fix active list --- hassio/addons/__init__.py | 13 +++++++++++-- hassio/addons/addon.py | 7 ------- hassio/services/interface.py | 18 ++++++++++++------ hassio/services/modules/mqtt.py | 9 ++++++++- hassio/services/modules/mysql.py | 9 ++++++++- 5 files changed, 39 insertions(+), 17 deletions(-) diff --git a/hassio/addons/__init__.py b/hassio/addons/__init__.py index 47f85a4eb..ce75fc408 100644 --- a/hassio/addons/__init__.py +++ b/hassio/addons/__init__.py @@ -166,8 +166,17 @@ class AddonManager(CoreSysAttributes): with suppress(HomeAssistantAPIError): await self.sys_ingress.update_hass_panel(addon) - # Cleanup internal data - addon.remove_discovery() + # Cleanup discovery data + for message in self.sys_discovery.list_messages: + if message.addon != addon.slug: + continue + self.sys_discovery.remove(message) + + # Cleanup services data + for service in self.sys_services.list_services: + if addon.slug not in service.active: + continue + service.del_service_data(addon) self.data.uninstall(addon) self.local.pop(slug) diff --git a/hassio/addons/addon.py b/hassio/addons/addon.py index 50e6f9eac..429a2e12f 100644 --- a/hassio/addons/addon.py +++ b/hassio/addons/addon.py @@ -371,13 +371,6 @@ class Addon(AddonModel): raise AddonsError() - def remove_discovery(self): - """Remove all discovery message from add-on.""" - for message in self.sys_discovery.list_messages: - if message.addon != self.slug: - continue - self.sys_discovery.remove(message) - async def remove_data(self): """Remove add-on data.""" if not self.path_data.is_dir(): diff --git a/hassio/services/interface.py b/hassio/services/interface.py index c138ceaa6..768078a72 100644 --- a/hassio/services/interface.py +++ b/hassio/services/interface.py @@ -1,4 +1,5 @@ """Interface for single service.""" +from abc import ABC, abstractmethod from typing import Any, Dict, List, Optional import voluptuous as vol @@ -8,7 +9,7 @@ from ..const import PROVIDE_SERVICE from ..coresys import CoreSys, CoreSysAttributes -class ServiceInterface(CoreSysAttributes): +class ServiceInterface(CoreSysAttributes, ABC): """Interface class for service integration.""" def __init__(self, coresys: CoreSys): @@ -16,19 +17,19 @@ class ServiceInterface(CoreSysAttributes): self.coresys: CoreSys = coresys @property + @abstractmethod def slug(self) -> str: """Return slug of this service.""" - raise NotImplementedError() @property + @abstractmethod def _data(self) -> Dict[str, Any]: """Return data of this service.""" - raise NotImplementedError() @property + @abstractmethod def schema(self) -> vol.Schema: """Return data schema of this service.""" - raise NotImplementedError() @property def providers(self) -> List[str]: @@ -39,6 +40,11 @@ class ServiceInterface(CoreSysAttributes): addons.append(addon.slug) return addons + @property + @abstractmethod + def active(self) -> List[str]: + """Return list of addon slug they have enable that.""" + @property def enabled(self) -> bool: """Return True if the service is in use.""" @@ -54,10 +60,10 @@ class ServiceInterface(CoreSysAttributes): return self._data return None + @abstractmethod def set_service_data(self, addon: Addon, data: Dict[str, Any]) -> None: """Write the data into service object.""" - raise NotImplementedError() + @abstractmethod def del_service_data(self, addon: Addon) -> None: """Remove the data from service object.""" - raise NotImplementedError() diff --git a/hassio/services/modules/mqtt.py b/hassio/services/modules/mqtt.py index 5520d57e4..eec10603f 100644 --- a/hassio/services/modules/mqtt.py +++ b/hassio/services/modules/mqtt.py @@ -1,6 +1,6 @@ """Provide the MQTT Service.""" import logging -from typing import Any, Dict +from typing import Any, Dict, List from hassio.addons.addon import Addon from hassio.exceptions import ServicesError @@ -59,6 +59,13 @@ class MQTTService(ServiceInterface): """Return data schema of this service.""" return SCHEMA_SERVICE_MQTT + @property + def active(self) -> List[str]: + """Return list of addon slug they have enable that.""" + if not self.enabled: + return [] + return [self._data[ATTR_ADDON]] + def set_service_data(self, addon: Addon, data: Dict[str, Any]) -> None: """Write the data into service object.""" if self.enabled: diff --git a/hassio/services/modules/mysql.py b/hassio/services/modules/mysql.py index 066eaa45a..368646416 100644 --- a/hassio/services/modules/mysql.py +++ b/hassio/services/modules/mysql.py @@ -1,6 +1,6 @@ """Provide the MySQL Service.""" import logging -from typing import Any, Dict +from typing import Any, Dict, List from hassio.addons.addon import Addon from hassio.exceptions import ServicesError @@ -53,6 +53,13 @@ class MySQLService(ServiceInterface): """Return data schema of this service.""" return SCHEMA_SERVICE_MYSQL + @property + def active(self) -> List[str]: + """Return list of addon slug they have enable that.""" + if not self.enabled: + return [] + return [self._data[ATTR_ADDON]] + def set_service_data(self, addon: Addon, data: Dict[str, Any]) -> None: """Write the data into service object.""" if self.enabled: