Add policy for mappings (#55)

* Add policy for mappings

* fix travis
This commit is contained in:
Pascal Vizeli 2017-05-16 17:15:35 +02:00 committed by GitHub
parent 34c4acf199
commit ebcc21370e
3 changed files with 32 additions and 32 deletions

View File

@ -3,18 +3,20 @@ import copy
import logging import logging
import json import json
from pathlib import Path, PurePath from pathlib import Path, PurePath
import re
import voluptuous as vol import voluptuous as vol
from voluptuous.humanize import humanize_error from voluptuous.humanize import humanize_error
from .util import extract_hash_from_path from .util import extract_hash_from_path
from .validate import ( from .validate import (
validate_options, SCHEMA_ADDON_CONFIG, SCHEMA_REPOSITORY_CONFIG) validate_options, SCHEMA_ADDON_CONFIG, SCHEMA_REPOSITORY_CONFIG,
MAP_VOLUME)
from ..const import ( from ..const import (
FILE_HASSIO_ADDONS, ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON, FILE_HASSIO_ADDONS, ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON,
ATTR_STARTUP, ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, BOOT_AUTO, 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_SCHEMA, ATTR_IMAGE, ATTR_REPOSITORY, ATTR_URL, ATTR_ARCH,
ATTR_REPOSITORY, ATTR_URL, ATTR_ARCH, ATTR_LOCATON, ATTR_DEVICES) ATTR_LOCATON, ATTR_DEVICES)
from ..config import Config from ..config import Config
from ..tools import read_json_file, write_json_file from ..tools import read_json_file, write_json_file
@ -26,6 +28,8 @@ USER = 'user'
REPOSITORY_CORE = 'core' REPOSITORY_CORE = 'core'
REPOSITORY_LOCAL = 'local' REPOSITORY_LOCAL = 'local'
RE_VOLUME = re.compile(MAP_VOLUME)
class AddonsData(Config): class AddonsData(Config):
"""Hold data for addons inside HassIO.""" """Hold data for addons inside HassIO."""
@ -327,21 +331,14 @@ class AddonsData(Config):
) )
return ATTR_IMAGE not in addon_data return ATTR_IMAGE not in addon_data
def map_config(self, addon): def map_volumes(self, addon):
"""Return True if config map is needed.""" """Return a dict of {volume: policy} from addon."""
return MAP_CONFIG in self._system_data[addon][ATTR_MAP] 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 volumes
"""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]
def path_data(self, addon): def path_data(self, addon):
"""Return addon data path inside supervisor.""" """Return addon data path inside supervisor."""

View File

@ -4,9 +4,12 @@ import voluptuous as vol
from ..const import ( from ..const import (
ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON, ATTR_STARTUP, ATTR_NAME, ATTR_VERSION, ATTR_SLUG, ATTR_DESCRIPTON, ATTR_STARTUP,
ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, STARTUP_ONCE, STARTUP_AFTER, ATTR_BOOT, ATTR_MAP, ATTR_OPTIONS, ATTR_PORTS, STARTUP_ONCE, STARTUP_AFTER,
STARTUP_BEFORE, BOOT_AUTO, BOOT_MANUAL, ATTR_SCHEMA, ATTR_IMAGE, MAP_SSL, STARTUP_BEFORE, BOOT_AUTO, BOOT_MANUAL, ATTR_SCHEMA, ATTR_IMAGE,
MAP_CONFIG, MAP_ADDONS, MAP_BACKUP, ATTR_URL, ATTR_MAINTAINER, ATTR_ARCH, ATTR_URL, ATTR_MAINTAINER, ATTR_ARCH, ATTR_DEVICES, ARCH_ARMHF,
ARCH_ARMHF, ARCH_AARCH64, ARCH_AMD64, ARCH_I386, ATTR_DEVICES) ARCH_AARCH64, ARCH_AMD64, ARCH_I386)
MAP_VOLUME = r"^(config|ssl|addons|backup)(:rw|:ro)?$"
V_STR = 'str' V_STR = 'str'
V_INT = 'int' V_INT = 'int'
@ -35,9 +38,7 @@ SCHEMA_ADDON_CONFIG = vol.Schema({
vol.In([BOOT_AUTO, BOOT_MANUAL]), vol.In([BOOT_AUTO, BOOT_MANUAL]),
vol.Optional(ATTR_PORTS): dict, vol.Optional(ATTR_PORTS): dict,
vol.Optional(ATTR_DEVICES): [vol.Match(r"(.*):(.*):(rwm|rw|rm)")], vol.Optional(ATTR_DEVICES): [vol.Match(r"(.*):(.*):(rwm|rw|rm)")],
vol.Optional(ATTR_MAP, default=[]): [ vol.Optional(ATTR_MAP, default=[]): [vol.Match(MAP_VOLUME)],
vol.In([MAP_CONFIG, MAP_SSL, MAP_ADDONS, MAP_BACKUP])
],
vol.Required(ATTR_OPTIONS): dict, vol.Required(ATTR_OPTIONS): dict,
vol.Required(ATTR_SCHEMA): { vol.Required(ATTR_SCHEMA): {
vol.Coerce(str): vol.Any(ADDON_ELEMENT, [ vol.Coerce(str): vol.Any(ADDON_ELEMENT, [

View File

@ -7,7 +7,7 @@ import docker
from . import DockerBase from . import DockerBase
from .util import dockerfile_template 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__) _LOGGER = logging.getLogger(__name__)
@ -35,28 +35,30 @@ class DockerAddon(DockerBase):
'bind': '/data', 'mode': 'rw' '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({ volumes.update({
str(self.config.path_extern_config): { 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({ volumes.update({
str(self.config.path_extern_ssl): { 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({ volumes.update({
str(self.config.path_extern_addons_local): { 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({ volumes.update({
str(self.config.path_extern_backup): { str(self.config.path_extern_backup): {
'bind': '/backup', 'mode': 'rw' 'bind': '/backup', 'mode': addon_mapping[MAP_BACKUP]
}}) }})
return volumes return volumes