From f253c797afd143128c91b212172b7150be95c6b7 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 28 Jan 2020 17:58:29 +0100 Subject: [PATCH] Add stage flag (#1460) * Add stage flag * Add filter * Remove filter * Fix lint --- API.md | 2 ++ hassio/addons/model.py | 9 ++++++++- hassio/addons/validate.py | 3 +++ hassio/api/addons.py | 3 +++ hassio/api/supervisor.py | 5 +++-- hassio/bootstrap.py | 4 ++-- hassio/const.py | 24 +++++++++++++++++++----- hassio/coresys.py | 4 ++-- hassio/updater.py | 5 +++-- hassio/validate.py | 9 ++++----- 10 files changed, 49 insertions(+), 19 deletions(-) diff --git a/API.md b/API.md index 37a006cbe..5e24bb36c 100644 --- a/API.md +++ b/API.md @@ -457,6 +457,7 @@ Get all available addons. "slug": "xy", "description": "description", "advanced": "bool", + "stage": "stable|experimental|deprecated", "repository": "core|local|REP_ID", "version": "LAST_VERSION", "installed": "none|INSTALL_VERSION", @@ -496,6 +497,7 @@ Get all available addons. "detached": "bool", "available": "bool", "advanced": "bool", + "stage": "stable|experimental|deprecated", "arch": ["armhf", "aarch64", "i386", "amd64"], "machine": "[raspberrypi2, tinker]", "homeassistant": "null|min Home Assistant version", diff --git a/hassio/addons/model.py b/hassio/addons/model.py index c3d8ef135..1d933936c 100644 --- a/hassio/addons/model.py +++ b/hassio/addons/model.py @@ -49,6 +49,7 @@ from ..const import ( ATTR_SERVICES, ATTR_SLUG, ATTR_SNAPSHOT_EXCLUDE, + ATTR_STAGE, ATTR_STARTUP, ATTR_STDIN, ATTR_TIMEOUT, @@ -60,9 +61,10 @@ from ..const import ( SECURITY_DEFAULT, SECURITY_DISABLE, SECURITY_PROFILE, + AddonStages, ) from ..coresys import CoreSysAttributes -from .validate import RE_SERVICE, RE_VOLUME, validate_options, schema_ui_options +from .validate import RE_SERVICE, RE_VOLUME, schema_ui_options, validate_options Data = Dict[str, Any] @@ -195,6 +197,11 @@ class AddonModel(CoreSysAttributes): """Return advanced mode of add-on.""" return self.data[ATTR_ADVANCED] + @property + def stage(self) -> AddonStages: + """Return stage mode of add-on.""" + return self.data[ATTR_STAGE] + @property def services_role(self) -> Dict[str, str]: """Return dict of services with rights.""" diff --git a/hassio/addons/validate.py b/hassio/addons/validate.py index 77b7880ba..dd2f524db 100644 --- a/hassio/addons/validate.py +++ b/hassio/addons/validate.py @@ -65,6 +65,7 @@ from ..const import ( ATTR_SLUG, ATTR_SNAPSHOT_EXCLUDE, ATTR_SQUASH, + ATTR_STAGE, ATTR_STARTUP, ATTR_STATE, ATTR_STDIN, @@ -87,6 +88,7 @@ from ..const import ( STARTUP_SERVICES, STATE_STARTED, STATE_STOPPED, + AddonStages, ) from ..coresys import CoreSys from ..discovery.validate import valid_discovery_service @@ -188,6 +190,7 @@ SCHEMA_ADDON_CONFIG = vol.Schema( vol.Required(ATTR_STARTUP): vol.All(_simple_startup, vol.In(STARTUP_ALL)), vol.Required(ATTR_BOOT): vol.In([BOOT_AUTO, BOOT_MANUAL]), vol.Optional(ATTR_ADVANCED, default=False): vol.Boolean(), + vol.Optional(ATTR_STAGE, default=AddonStages.STABLE): vol.Coerce(AddonStages), vol.Optional(ATTR_PORTS): DOCKER_PORTS, vol.Optional(ATTR_PORTS_DESCRIPTION): DOCKER_PORTS_DESCRIPTION, vol.Optional(ATTR_WEBUI): vol.Match( diff --git a/hassio/api/addons.py b/hassio/api/addons.py index a65bda6ad..63eb4226e 100644 --- a/hassio/api/addons.py +++ b/hassio/api/addons.py @@ -76,6 +76,7 @@ from ..const import ( ATTR_SERVICES, ATTR_SLUG, ATTR_SOURCE, + ATTR_STAGE, ATTR_STATE, ATTR_STDIN, ATTR_UDEV, @@ -149,6 +150,7 @@ class APIAddons(CoreSysAttributes): ATTR_SLUG: addon.slug, ATTR_DESCRIPTON: addon.description, ATTR_ADVANCED: addon.advanced, + ATTR_STAGE: addon.stage, ATTR_VERSION: addon.latest_version, ATTR_INSTALLED: addon.version if addon.is_installed else None, ATTR_AVAILABLE: addon.available, @@ -193,6 +195,7 @@ class APIAddons(CoreSysAttributes): ATTR_DESCRIPTON: addon.description, ATTR_LONG_DESCRIPTION: addon.long_description, ATTR_ADVANCED: addon.advanced, + ATTR_STAGE: addon.stage, ATTR_AUTO_UPDATE: None, ATTR_REPOSITORY: addon.repository, ATTR_VERSION: None, diff --git a/hassio/api/supervisor.py b/hassio/api/supervisor.py index b30bf0af8..b77aebc24 100644 --- a/hassio/api/supervisor.py +++ b/hassio/api/supervisor.py @@ -37,11 +37,12 @@ from ..const import ( ATTR_WAIT_BOOT, CONTENT_TYPE_BINARY, HASSIO_VERSION, + UpdateChannels, ) from ..coresys import CoreSysAttributes from ..exceptions import APIError from ..utils.validate import validate_timezone -from ..validate import channels, log_level, repositories, wait_boot +from ..validate import log_level, repositories, wait_boot from .utils import api_process, api_process_raw, api_validate _LOGGER: logging.Logger = logging.getLogger(__name__) @@ -49,7 +50,7 @@ _LOGGER: logging.Logger = logging.getLogger(__name__) # pylint: disable=no-value-for-parameter SCHEMA_OPTIONS = vol.Schema( { - vol.Optional(ATTR_CHANNEL): channels, + vol.Optional(ATTR_CHANNEL): vol.Coerce(UpdateChannels), vol.Optional(ATTR_ADDONS_REPOSITORIES): repositories, vol.Optional(ATTR_TIMEZONE): validate_timezone, vol.Optional(ATTR_WAIT_BOOT): wait_boot, diff --git a/hassio/bootstrap.py b/hassio/bootstrap.py index 35b35eee4..ca9e930ca 100644 --- a/hassio/bootstrap.py +++ b/hassio/bootstrap.py @@ -11,7 +11,7 @@ from .addons import AddonManager from .api import RestAPI from .arch import CpuArch from .auth import Auth -from .const import CHANNEL_DEV, SOCKET_DOCKER +from .const import SOCKET_DOCKER, UpdateChannels from .core import HassIO from .coresys import CoreSys from .dbus import DBusManager @@ -142,7 +142,7 @@ def initialize_system_data(coresys: CoreSys): # Check if ENV is in development mode if bool(os.environ.get("SUPERVISOR_DEV", 0)): _LOGGER.warning("SUPERVISOR_DEV is set") - coresys.updater.channel = CHANNEL_DEV + coresys.updater.channel = UpdateChannels.DEV coresys.config.logging = "debug" coresys.config.debug = True diff --git a/hassio/const.py b/hassio/const.py index 61c119624..4cb406065 100644 --- a/hassio/const.py +++ b/hassio/const.py @@ -1,6 +1,7 @@ """Constants file for Hass.io.""" -from pathlib import Path +from enum import Enum from ipaddress import ip_network +from pathlib import Path HASSIO_VERSION = "197" @@ -224,6 +225,7 @@ ATTR_VALUE = "value" ATTR_SNAPSHOT_EXCLUDE = "snapshot_exclude" ATTR_DOCUMENTATION = "documentation" ATTR_ADVANCED = "advanced" +ATTR_STAGE = "stage" PROVIDE_SERVICE = "provide" NEED_SERVICE = "need" @@ -264,10 +266,6 @@ ARCH_I386 = "i386" ARCH_ALL = [ARCH_ARMHF, ARCH_ARMV7, ARCH_AARCH64, ARCH_AMD64, ARCH_I386] -CHANNEL_STABLE = "stable" -CHANNEL_BETA = "beta" -CHANNEL_DEV = "dev" - REPOSITORY_CORE = "core" REPOSITORY_LOCAL = "local" @@ -325,3 +323,19 @@ ROLE_ALL = [ROLE_DEFAULT, ROLE_HOMEASSISTANT, ROLE_BACKUP, ROLE_MANAGER, ROLE_AD CHAN_ID = "chan_id" CHAN_TYPE = "chan_type" + + +class AddonStages(str, Enum): + """Stage types of add-on.""" + + STABLE = "stable" + EXPERIMENTAL = "experimental" + DEPRECATED = "deprecated" + + +class UpdateChannels(str, Enum): + """Core supported update channels.""" + + STABLE = "stable" + BETA = "beta" + DEV = "dev" diff --git a/hassio/coresys.py b/hassio/coresys.py index 70d47f707..0e63d44b7 100644 --- a/hassio/coresys.py +++ b/hassio/coresys.py @@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, Optional import aiohttp from .config import CoreConfig -from .const import CHANNEL_DEV +from .const import UpdateChannels from .docker import DockerAPI from .misc.hardware import Hardware from .misc.scheduler import Scheduler @@ -85,7 +85,7 @@ class CoreSys: @property def dev(self) -> bool: """Return True if we run dev mode.""" - return self._updater.channel == CHANNEL_DEV + return self._updater.channel == UpdateChannels.DEV @property def timezone(self) -> str: diff --git a/hassio/updater.py b/hassio/updater.py index 7e9fedd19..354d1c8c7 100644 --- a/hassio/updater.py +++ b/hassio/updater.py @@ -17,6 +17,7 @@ from .const import ( ATTR_HOMEASSISTANT, FILE_HASSIO_UPDATER, URL_HASSIO_VERSION, + UpdateChannels, ) from .coresys import CoreSysAttributes from .exceptions import HassioUpdaterError @@ -71,12 +72,12 @@ class Updater(JsonConfig, CoreSysAttributes): return self._data.get(ATTR_DNS) @property - def channel(self) -> str: + def channel(self) -> UpdateChannels: """Return upstream channel of Hass.io instance.""" return self._data[ATTR_CHANNEL] @channel.setter - def channel(self, value: str): + def channel(self, value: UpdateChannels): """Set upstream mode.""" self._data[ATTR_CHANNEL] = value diff --git a/hassio/validate.py b/hassio/validate.py index a3bbd3e31..785b6fff9 100644 --- a/hassio/validate.py +++ b/hassio/validate.py @@ -32,9 +32,7 @@ from .const import ( ATTR_VERSION, ATTR_WAIT_BOOT, ATTR_WATCHDOG, - CHANNEL_BETA, - CHANNEL_DEV, - CHANNEL_STABLE, + UpdateChannels, ) from .utils.validate import validate_timezone @@ -47,7 +45,6 @@ network_port = vol.All(vol.Coerce(int), vol.Range(min=1, max=65535)) wait_boot = vol.All(vol.Coerce(int), vol.Range(min=1, max=60)) docker_image = vol.Match(r"^[\w{}]+/[\-\w{}]+$") alsa_device = vol.Maybe(vol.Match(r"\d+,\d+")) -channels = vol.In([CHANNEL_STABLE, CHANNEL_BETA, CHANNEL_DEV]) uuid_match = vol.Match(r"^[0-9a-f]{32}$") sha256 = vol.Match(r"^[0-9a-f]{64}$") token = vol.Match(r"^[0-9a-f]{32,256}$") @@ -122,7 +119,9 @@ SCHEMA_HASS_CONFIG = vol.Schema( SCHEMA_UPDATER_CONFIG = vol.Schema( { - vol.Optional(ATTR_CHANNEL, default=CHANNEL_STABLE): channels, + vol.Optional(ATTR_CHANNEL, default=UpdateChannels.STABLE): vol.Coerce( + UpdateChannels + ), vol.Optional(ATTR_HOMEASSISTANT): vol.Coerce(str), vol.Optional(ATTR_HASSIO): vol.Coerce(str), vol.Optional(ATTR_HASSOS): vol.Coerce(str),