From 745af3c039021e1065d547685ff2e544e6f47295 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Thu, 23 Jan 2020 19:05:13 +0100 Subject: [PATCH] Add MySQL service support (#1448) --- hassio/addons/validate.py | 2 +- hassio/services/__init__.py | 5 ++- hassio/services/const.py | 1 + hassio/services/data.py | 7 ++- hassio/services/modules/mysql.py | 77 ++++++++++++++++++++++++++++++++ hassio/services/validate.py | 4 +- 6 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 hassio/services/modules/mysql.py diff --git a/hassio/addons/validate.py b/hassio/addons/validate.py index 61b17779c..77b7880ba 100644 --- a/hassio/addons/validate.py +++ b/hassio/addons/validate.py @@ -103,7 +103,7 @@ _LOGGER: logging.Logger = logging.getLogger(__name__) RE_VOLUME = re.compile(r"^(config|ssl|addons|backup|share)(?::(rw|ro))?$") -RE_SERVICE = re.compile(r"^(?Pmqtt):(?Pprovide|want|need)$") +RE_SERVICE = re.compile(r"^(?Pmqtt|mysql):(?Pprovide|want|need)$") V_STR = "str" V_INT = "int" diff --git a/hassio/services/__init__.py b/hassio/services/__init__.py index bfe235cee..4d774f749 100644 --- a/hassio/services/__init__.py +++ b/hassio/services/__init__.py @@ -2,12 +2,13 @@ from typing import Dict, List from ..coresys import CoreSys, CoreSysAttributes -from .const import SERVICE_MQTT +from .const import SERVICE_MQTT, SERVICE_MYSQL from .data import ServicesData from .interface import ServiceInterface from .modules.mqtt import MQTTService +from .modules.mysql import MySQLService -AVAILABLE_SERVICES = {SERVICE_MQTT: MQTTService} +AVAILABLE_SERVICES = {SERVICE_MQTT: MQTTService, SERVICE_MYSQL: MySQLService} class ServiceManager(CoreSysAttributes): diff --git a/hassio/services/const.py b/hassio/services/const.py index f4a42e14c..f5e2fceba 100644 --- a/hassio/services/const.py +++ b/hassio/services/const.py @@ -9,3 +9,4 @@ ATTR_SSL = "ssl" ATTR_USERNAME = "username" SERVICE_MQTT = "mqtt" +SERVICE_MYSQL = "mysql" diff --git a/hassio/services/data.py b/hassio/services/data.py index a77c81dcb..0974970e3 100644 --- a/hassio/services/data.py +++ b/hassio/services/data.py @@ -3,7 +3,7 @@ from typing import Any, Dict from ..const import FILE_HASSIO_SERVICES from ..utils.json import JsonConfig -from .const import SERVICE_MQTT +from .const import SERVICE_MQTT, SERVICE_MYSQL from .validate import SCHEMA_SERVICES_CONFIG @@ -18,3 +18,8 @@ class ServicesData(JsonConfig): def mqtt(self) -> Dict[str, Any]: """Return settings for MQTT service.""" return self._data[SERVICE_MQTT] + + @property + def mysql(self) -> Dict[str, Any]: + """Return settings for MySQL service.""" + return self._data[SERVICE_MYSQL] diff --git a/hassio/services/modules/mysql.py b/hassio/services/modules/mysql.py new file mode 100644 index 000000000..066eaa45a --- /dev/null +++ b/hassio/services/modules/mysql.py @@ -0,0 +1,77 @@ +"""Provide the MySQL Service.""" +import logging +from typing import Any, Dict + +from hassio.addons.addon import Addon +from hassio.exceptions import ServicesError +from hassio.validate import network_port +import voluptuous as vol + +from ..const import ( + ATTR_ADDON, + ATTR_HOST, + ATTR_PASSWORD, + ATTR_PORT, + ATTR_USERNAME, + SERVICE_MYSQL, +) +from ..interface import ServiceInterface + +_LOGGER: logging.Logger = logging.getLogger(__name__) + + +# pylint: disable=no-value-for-parameter +SCHEMA_SERVICE_MYSQL = vol.Schema( + { + vol.Required(ATTR_HOST): vol.Coerce(str), + vol.Required(ATTR_PORT): network_port, + vol.Optional(ATTR_USERNAME): vol.Coerce(str), + vol.Optional(ATTR_PASSWORD): vol.Coerce(str), + } +) + +SCHEMA_CONFIG_MYSQL = SCHEMA_SERVICE_MYSQL.extend( + {vol.Required(ATTR_ADDON): vol.Coerce(str)} +) + + +class MySQLService(ServiceInterface): + """Provide MySQL services.""" + + @property + def slug(self) -> str: + """Return slug of this service.""" + return SERVICE_MYSQL + + @property + def _data(self) -> Dict[str, Any]: + """Return data of this service.""" + return self.sys_services.data.mysql + + @property + def schema(self) -> vol.Schema: + """Return data schema of this service.""" + return SCHEMA_SERVICE_MYSQL + + def set_service_data(self, addon: Addon, data: Dict[str, Any]) -> None: + """Write the data into service object.""" + if self.enabled: + _LOGGER.error( + "There is already a MySQL in use from %s", self._data[ATTR_ADDON] + ) + raise ServicesError() + + self._data.update(data) + self._data[ATTR_ADDON] = addon.slug + + _LOGGER.info("Set %s as service provider for MySQL", addon.slug) + self.save() + + def del_service_data(self, addon: Addon) -> None: + """Remove the data from service object.""" + if not self.enabled: + _LOGGER.warning("Can't remove not exists services") + raise ServicesError() + + self._data.clear() + self.save() diff --git a/hassio/services/validate.py b/hassio/services/validate.py index ff30217f1..f14fcc3e0 100644 --- a/hassio/services/validate.py +++ b/hassio/services/validate.py @@ -2,11 +2,13 @@ import voluptuous as vol from ..utils.validate import schema_or -from .const import SERVICE_MQTT +from .const import SERVICE_MQTT, SERVICE_MYSQL from .modules.mqtt import SCHEMA_CONFIG_MQTT +from .modules.mysql import SCHEMA_CONFIG_MYSQL SCHEMA_SERVICES_CONFIG = vol.Schema( {vol.Optional(SERVICE_MQTT, default=dict): schema_or(SCHEMA_CONFIG_MQTT)}, + {vol.Optional(SERVICE_MYSQL, default=dict): schema_or(SCHEMA_CONFIG_MYSQL)}, extra=vol.REMOVE_EXTRA, )