From ebcc21370e2ab3686ec4b298c2c5952b19f2257e Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 16 May 2017 17:15:35 +0200 Subject: [PATCH] Add policy for mappings (#55) * Add policy for mappings * fix travis --- hassio/addons/data.py | 31 ++++++++++++++----------------- hassio/addons/validate.py | 13 +++++++------ hassio/dock/addon.py | 20 +++++++++++--------- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/hassio/addons/data.py b/hassio/addons/data.py index b423dbd35..4228c053a 100644 --- a/hassio/addons/data.py +++ b/hassio/addons/data.py @@ -3,18 +3,20 @@ import copy import logging import json from pathlib import Path, PurePath +import re import voluptuous as vol from voluptuous.humanize import humanize_error from .util import extract_hash_from_path from .validate import ( - validate_options, SCHEMA_ADDON_CONFIG, SCHEMA_REPOSITORY_CONFIG) + validate_options, SCHEMA_ADDON_CONFIG, SCHEMA_REPOSITORY_CONFIG, + MAP_VOLUME) 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, - ATTR_SCHEMA, ATTR_IMAGE, MAP_CONFIG, MAP_SSL, MAP_ADDONS, MAP_BACKUP, - ATTR_REPOSITORY, ATTR_URL, ATTR_ARCH, ATTR_LOCATON, ATTR_DEVICES) + ATTR_SCHEMA, ATTR_IMAGE, ATTR_REPOSITORY, ATTR_URL, ATTR_ARCH, + ATTR_LOCATON, ATTR_DEVICES) from ..config import Config from ..tools import read_json_file, write_json_file @@ -26,6 +28,8 @@ USER = 'user' REPOSITORY_CORE = 'core' REPOSITORY_LOCAL = 'local' +RE_VOLUME = re.compile(MAP_VOLUME) + class AddonsData(Config): """Hold data for addons inside HassIO.""" @@ -327,21 +331,14 @@ class AddonsData(Config): ) return ATTR_IMAGE not in addon_data - def map_config(self, addon): - """Return True if config map is needed.""" - return MAP_CONFIG in self._system_data[addon][ATTR_MAP] + def map_volumes(self, addon): + """Return a dict of {volume: policy} from addon.""" + volumes = {} + for volume in self._system_data[addon][ATTR_MAP]: + result = RE_VOLUME.match(volume) + volumes[result.group(1)] = result.group(2) or 'ro' - def map_ssl(self, addon): - """Return True if ssl map is needed.""" - return MAP_SSL in self._system_data[addon][ATTR_MAP] - - def map_addons(self, addon): - """Return True if addons map is needed.""" - return MAP_ADDONS in self._system_data[addon][ATTR_MAP] - - def map_backup(self, addon): - """Return True if backup map is needed.""" - return MAP_BACKUP in self._system_data[addon][ATTR_MAP] + return volumes def path_data(self, addon): """Return addon data path inside supervisor.""" diff --git a/hassio/addons/validate.py b/hassio/addons/validate.py index e26527411..6bdfafc63 100644 --- a/hassio/addons/validate.py +++ b/hassio/addons/validate.py @@ -4,9 +4,12 @@ import voluptuous as vol 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, ATTR_ARCH, - ARCH_ARMHF, ARCH_AARCH64, ARCH_AMD64, ARCH_I386, ATTR_DEVICES) + STARTUP_BEFORE, BOOT_AUTO, BOOT_MANUAL, ATTR_SCHEMA, ATTR_IMAGE, + ATTR_URL, ATTR_MAINTAINER, ATTR_ARCH, ATTR_DEVICES, ARCH_ARMHF, + ARCH_AARCH64, ARCH_AMD64, ARCH_I386) + + +MAP_VOLUME = r"^(config|ssl|addons|backup)(:rw|:ro)?$" V_STR = 'str' V_INT = 'int' @@ -35,9 +38,7 @@ SCHEMA_ADDON_CONFIG = vol.Schema({ vol.In([BOOT_AUTO, BOOT_MANUAL]), vol.Optional(ATTR_PORTS): dict, vol.Optional(ATTR_DEVICES): [vol.Match(r"(.*):(.*):(rwm|rw|rm)")], - vol.Optional(ATTR_MAP, default=[]): [ - vol.In([MAP_CONFIG, MAP_SSL, MAP_ADDONS, MAP_BACKUP]) - ], + vol.Optional(ATTR_MAP, default=[]): [vol.Match(MAP_VOLUME)], vol.Required(ATTR_OPTIONS): dict, vol.Required(ATTR_SCHEMA): { vol.Coerce(str): vol.Any(ADDON_ELEMENT, [ diff --git a/hassio/dock/addon.py b/hassio/dock/addon.py index e07cd140a..813890119 100644 --- a/hassio/dock/addon.py +++ b/hassio/dock/addon.py @@ -7,7 +7,7 @@ import docker from . import DockerBase from .util import dockerfile_template -from ..const import META_ADDON +from ..const import META_ADDON, MAP_CONFIG, MAP_SSL, MAP_ADDONS, MAP_BACKUP _LOGGER = logging.getLogger(__name__) @@ -35,28 +35,30 @@ class DockerAddon(DockerBase): 'bind': '/data', 'mode': 'rw' }} - if self.addons_data.map_config(self.addon): + addon_mapping = self.addons_data.map_volumes(self.addon) + + if MAP_CONFIG in addon_mapping: volumes.update({ str(self.config.path_extern_config): { - 'bind': '/config', 'mode': 'rw' + 'bind': '/config', 'mode': addon_mapping[MAP_CONFIG] }}) - if self.addons_data.map_ssl(self.addon): + if MAP_SSL in addon_mapping: volumes.update({ str(self.config.path_extern_ssl): { - 'bind': '/ssl', 'mode': 'rw' + 'bind': '/ssl', 'mode': addon_mapping[MAP_SSL] }}) - if self.addons_data.map_addons(self.addon): + if MAP_ADDONS in addon_mapping: volumes.update({ str(self.config.path_extern_addons_local): { - 'bind': '/addons', 'mode': 'rw' + 'bind': '/addons', 'mode': addon_mapping[MAP_ADDONS] }}) - if self.addons_data.map_backup(self.addon): + if MAP_BACKUP in addon_mapping: volumes.update({ str(self.config.path_extern_backup): { - 'bind': '/backup', 'mode': 'rw' + 'bind': '/backup', 'mode': addon_mapping[MAP_BACKUP] }}) return volumes