Add stage flag (#1460)

* Add stage flag

* Add filter

* Remove filter

* Fix lint
This commit is contained in:
Pascal Vizeli 2020-01-28 17:58:29 +01:00 committed by GitHub
parent 0a8b1c2797
commit f253c797af
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 49 additions and 19 deletions

2
API.md
View File

@ -457,6 +457,7 @@ Get all available addons.
"slug": "xy", "slug": "xy",
"description": "description", "description": "description",
"advanced": "bool", "advanced": "bool",
"stage": "stable|experimental|deprecated",
"repository": "core|local|REP_ID", "repository": "core|local|REP_ID",
"version": "LAST_VERSION", "version": "LAST_VERSION",
"installed": "none|INSTALL_VERSION", "installed": "none|INSTALL_VERSION",
@ -496,6 +497,7 @@ Get all available addons.
"detached": "bool", "detached": "bool",
"available": "bool", "available": "bool",
"advanced": "bool", "advanced": "bool",
"stage": "stable|experimental|deprecated",
"arch": ["armhf", "aarch64", "i386", "amd64"], "arch": ["armhf", "aarch64", "i386", "amd64"],
"machine": "[raspberrypi2, tinker]", "machine": "[raspberrypi2, tinker]",
"homeassistant": "null|min Home Assistant version", "homeassistant": "null|min Home Assistant version",

View File

@ -49,6 +49,7 @@ from ..const import (
ATTR_SERVICES, ATTR_SERVICES,
ATTR_SLUG, ATTR_SLUG,
ATTR_SNAPSHOT_EXCLUDE, ATTR_SNAPSHOT_EXCLUDE,
ATTR_STAGE,
ATTR_STARTUP, ATTR_STARTUP,
ATTR_STDIN, ATTR_STDIN,
ATTR_TIMEOUT, ATTR_TIMEOUT,
@ -60,9 +61,10 @@ from ..const import (
SECURITY_DEFAULT, SECURITY_DEFAULT,
SECURITY_DISABLE, SECURITY_DISABLE,
SECURITY_PROFILE, SECURITY_PROFILE,
AddonStages,
) )
from ..coresys import CoreSysAttributes 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] Data = Dict[str, Any]
@ -195,6 +197,11 @@ class AddonModel(CoreSysAttributes):
"""Return advanced mode of add-on.""" """Return advanced mode of add-on."""
return self.data[ATTR_ADVANCED] return self.data[ATTR_ADVANCED]
@property
def stage(self) -> AddonStages:
"""Return stage mode of add-on."""
return self.data[ATTR_STAGE]
@property @property
def services_role(self) -> Dict[str, str]: def services_role(self) -> Dict[str, str]:
"""Return dict of services with rights.""" """Return dict of services with rights."""

View File

@ -65,6 +65,7 @@ from ..const import (
ATTR_SLUG, ATTR_SLUG,
ATTR_SNAPSHOT_EXCLUDE, ATTR_SNAPSHOT_EXCLUDE,
ATTR_SQUASH, ATTR_SQUASH,
ATTR_STAGE,
ATTR_STARTUP, ATTR_STARTUP,
ATTR_STATE, ATTR_STATE,
ATTR_STDIN, ATTR_STDIN,
@ -87,6 +88,7 @@ from ..const import (
STARTUP_SERVICES, STARTUP_SERVICES,
STATE_STARTED, STATE_STARTED,
STATE_STOPPED, STATE_STOPPED,
AddonStages,
) )
from ..coresys import CoreSys from ..coresys import CoreSys
from ..discovery.validate import valid_discovery_service 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_STARTUP): vol.All(_simple_startup, vol.In(STARTUP_ALL)),
vol.Required(ATTR_BOOT): vol.In([BOOT_AUTO, BOOT_MANUAL]), vol.Required(ATTR_BOOT): vol.In([BOOT_AUTO, BOOT_MANUAL]),
vol.Optional(ATTR_ADVANCED, default=False): vol.Boolean(), 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): DOCKER_PORTS,
vol.Optional(ATTR_PORTS_DESCRIPTION): DOCKER_PORTS_DESCRIPTION, vol.Optional(ATTR_PORTS_DESCRIPTION): DOCKER_PORTS_DESCRIPTION,
vol.Optional(ATTR_WEBUI): vol.Match( vol.Optional(ATTR_WEBUI): vol.Match(

View File

@ -76,6 +76,7 @@ from ..const import (
ATTR_SERVICES, ATTR_SERVICES,
ATTR_SLUG, ATTR_SLUG,
ATTR_SOURCE, ATTR_SOURCE,
ATTR_STAGE,
ATTR_STATE, ATTR_STATE,
ATTR_STDIN, ATTR_STDIN,
ATTR_UDEV, ATTR_UDEV,
@ -149,6 +150,7 @@ class APIAddons(CoreSysAttributes):
ATTR_SLUG: addon.slug, ATTR_SLUG: addon.slug,
ATTR_DESCRIPTON: addon.description, ATTR_DESCRIPTON: addon.description,
ATTR_ADVANCED: addon.advanced, ATTR_ADVANCED: addon.advanced,
ATTR_STAGE: addon.stage,
ATTR_VERSION: addon.latest_version, ATTR_VERSION: addon.latest_version,
ATTR_INSTALLED: addon.version if addon.is_installed else None, ATTR_INSTALLED: addon.version if addon.is_installed else None,
ATTR_AVAILABLE: addon.available, ATTR_AVAILABLE: addon.available,
@ -193,6 +195,7 @@ class APIAddons(CoreSysAttributes):
ATTR_DESCRIPTON: addon.description, ATTR_DESCRIPTON: addon.description,
ATTR_LONG_DESCRIPTION: addon.long_description, ATTR_LONG_DESCRIPTION: addon.long_description,
ATTR_ADVANCED: addon.advanced, ATTR_ADVANCED: addon.advanced,
ATTR_STAGE: addon.stage,
ATTR_AUTO_UPDATE: None, ATTR_AUTO_UPDATE: None,
ATTR_REPOSITORY: addon.repository, ATTR_REPOSITORY: addon.repository,
ATTR_VERSION: None, ATTR_VERSION: None,

View File

@ -37,11 +37,12 @@ from ..const import (
ATTR_WAIT_BOOT, ATTR_WAIT_BOOT,
CONTENT_TYPE_BINARY, CONTENT_TYPE_BINARY,
HASSIO_VERSION, HASSIO_VERSION,
UpdateChannels,
) )
from ..coresys import CoreSysAttributes from ..coresys import CoreSysAttributes
from ..exceptions import APIError from ..exceptions import APIError
from ..utils.validate import validate_timezone 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 from .utils import api_process, api_process_raw, api_validate
_LOGGER: logging.Logger = logging.getLogger(__name__) _LOGGER: logging.Logger = logging.getLogger(__name__)
@ -49,7 +50,7 @@ _LOGGER: logging.Logger = logging.getLogger(__name__)
# pylint: disable=no-value-for-parameter # pylint: disable=no-value-for-parameter
SCHEMA_OPTIONS = vol.Schema( 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_ADDONS_REPOSITORIES): repositories,
vol.Optional(ATTR_TIMEZONE): validate_timezone, vol.Optional(ATTR_TIMEZONE): validate_timezone,
vol.Optional(ATTR_WAIT_BOOT): wait_boot, vol.Optional(ATTR_WAIT_BOOT): wait_boot,

View File

@ -11,7 +11,7 @@ from .addons import AddonManager
from .api import RestAPI from .api import RestAPI
from .arch import CpuArch from .arch import CpuArch
from .auth import Auth from .auth import Auth
from .const import CHANNEL_DEV, SOCKET_DOCKER from .const import SOCKET_DOCKER, UpdateChannels
from .core import HassIO from .core import HassIO
from .coresys import CoreSys from .coresys import CoreSys
from .dbus import DBusManager from .dbus import DBusManager
@ -142,7 +142,7 @@ def initialize_system_data(coresys: CoreSys):
# Check if ENV is in development mode # Check if ENV is in development mode
if bool(os.environ.get("SUPERVISOR_DEV", 0)): if bool(os.environ.get("SUPERVISOR_DEV", 0)):
_LOGGER.warning("SUPERVISOR_DEV is set") _LOGGER.warning("SUPERVISOR_DEV is set")
coresys.updater.channel = CHANNEL_DEV coresys.updater.channel = UpdateChannels.DEV
coresys.config.logging = "debug" coresys.config.logging = "debug"
coresys.config.debug = True coresys.config.debug = True

View File

@ -1,6 +1,7 @@
"""Constants file for Hass.io.""" """Constants file for Hass.io."""
from pathlib import Path from enum import Enum
from ipaddress import ip_network from ipaddress import ip_network
from pathlib import Path
HASSIO_VERSION = "197" HASSIO_VERSION = "197"
@ -224,6 +225,7 @@ ATTR_VALUE = "value"
ATTR_SNAPSHOT_EXCLUDE = "snapshot_exclude" ATTR_SNAPSHOT_EXCLUDE = "snapshot_exclude"
ATTR_DOCUMENTATION = "documentation" ATTR_DOCUMENTATION = "documentation"
ATTR_ADVANCED = "advanced" ATTR_ADVANCED = "advanced"
ATTR_STAGE = "stage"
PROVIDE_SERVICE = "provide" PROVIDE_SERVICE = "provide"
NEED_SERVICE = "need" NEED_SERVICE = "need"
@ -264,10 +266,6 @@ ARCH_I386 = "i386"
ARCH_ALL = [ARCH_ARMHF, ARCH_ARMV7, ARCH_AARCH64, ARCH_AMD64, ARCH_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_CORE = "core"
REPOSITORY_LOCAL = "local" REPOSITORY_LOCAL = "local"
@ -325,3 +323,19 @@ ROLE_ALL = [ROLE_DEFAULT, ROLE_HOMEASSISTANT, ROLE_BACKUP, ROLE_MANAGER, ROLE_AD
CHAN_ID = "chan_id" CHAN_ID = "chan_id"
CHAN_TYPE = "chan_type" 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"

View File

@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, Optional
import aiohttp import aiohttp
from .config import CoreConfig from .config import CoreConfig
from .const import CHANNEL_DEV from .const import UpdateChannels
from .docker import DockerAPI from .docker import DockerAPI
from .misc.hardware import Hardware from .misc.hardware import Hardware
from .misc.scheduler import Scheduler from .misc.scheduler import Scheduler
@ -85,7 +85,7 @@ class CoreSys:
@property @property
def dev(self) -> bool: def dev(self) -> bool:
"""Return True if we run dev mode.""" """Return True if we run dev mode."""
return self._updater.channel == CHANNEL_DEV return self._updater.channel == UpdateChannels.DEV
@property @property
def timezone(self) -> str: def timezone(self) -> str:

View File

@ -17,6 +17,7 @@ from .const import (
ATTR_HOMEASSISTANT, ATTR_HOMEASSISTANT,
FILE_HASSIO_UPDATER, FILE_HASSIO_UPDATER,
URL_HASSIO_VERSION, URL_HASSIO_VERSION,
UpdateChannels,
) )
from .coresys import CoreSysAttributes from .coresys import CoreSysAttributes
from .exceptions import HassioUpdaterError from .exceptions import HassioUpdaterError
@ -71,12 +72,12 @@ class Updater(JsonConfig, CoreSysAttributes):
return self._data.get(ATTR_DNS) return self._data.get(ATTR_DNS)
@property @property
def channel(self) -> str: def channel(self) -> UpdateChannels:
"""Return upstream channel of Hass.io instance.""" """Return upstream channel of Hass.io instance."""
return self._data[ATTR_CHANNEL] return self._data[ATTR_CHANNEL]
@channel.setter @channel.setter
def channel(self, value: str): def channel(self, value: UpdateChannels):
"""Set upstream mode.""" """Set upstream mode."""
self._data[ATTR_CHANNEL] = value self._data[ATTR_CHANNEL] = value

View File

@ -32,9 +32,7 @@ from .const import (
ATTR_VERSION, ATTR_VERSION,
ATTR_WAIT_BOOT, ATTR_WAIT_BOOT,
ATTR_WATCHDOG, ATTR_WATCHDOG,
CHANNEL_BETA, UpdateChannels,
CHANNEL_DEV,
CHANNEL_STABLE,
) )
from .utils.validate import validate_timezone 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)) wait_boot = vol.All(vol.Coerce(int), vol.Range(min=1, max=60))
docker_image = vol.Match(r"^[\w{}]+/[\-\w{}]+$") docker_image = vol.Match(r"^[\w{}]+/[\-\w{}]+$")
alsa_device = vol.Maybe(vol.Match(r"\d+,\d+")) 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}$") uuid_match = vol.Match(r"^[0-9a-f]{32}$")
sha256 = vol.Match(r"^[0-9a-f]{64}$") sha256 = vol.Match(r"^[0-9a-f]{64}$")
token = vol.Match(r"^[0-9a-f]{32,256}$") token = vol.Match(r"^[0-9a-f]{32,256}$")
@ -122,7 +119,9 @@ SCHEMA_HASS_CONFIG = vol.Schema(
SCHEMA_UPDATER_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_HOMEASSISTANT): vol.Coerce(str),
vol.Optional(ATTR_HASSIO): vol.Coerce(str), vol.Optional(ATTR_HASSIO): vol.Coerce(str),
vol.Optional(ATTR_HASSOS): vol.Coerce(str), vol.Optional(ATTR_HASSOS): vol.Coerce(str),