diff --git a/API.md b/API.md index 3c31bffa7..d06c13f59 100644 --- a/API.md +++ b/API.md @@ -36,7 +36,7 @@ The addons from `addons` are only installed one. "version": "INSTALL_VERSION", "last_version": "LAST_VERSION", "arch": "armhf|aarch64|i386|amd64", - "beta_channel": "true|false", + "mode": "stable|beta|dev", "timezone": "TIMEZONE", "wait_boot": "int", "addons": [ @@ -72,7 +72,7 @@ Optional: ```json { - "beta_channel": "true|false", + "mode": "stable|beta|dev", "timezone": "TIMEZONE", "wait_boot": "int", "addons_repositories": [ diff --git a/hassio/api/supervisor.py b/hassio/api/supervisor.py index ad8c70cff..d61d56b00 100644 --- a/hassio/api/supervisor.py +++ b/hassio/api/supervisor.py @@ -6,20 +6,19 @@ import voluptuous as vol from .utils import api_process, api_process_raw, api_validate from ..const import ( - ATTR_ADDONS, ATTR_VERSION, ATTR_LAST_VERSION, ATTR_BETA_CHANNEL, ATTR_ARCH, + ATTR_ADDONS, ATTR_VERSION, ATTR_LAST_VERSION, ATTR_MODE, ATTR_ARCH, HASSIO_VERSION, ATTR_ADDONS_REPOSITORIES, ATTR_LOGO, ATTR_REPOSITORY, ATTR_DESCRIPTON, ATTR_NAME, ATTR_SLUG, ATTR_INSTALLED, ATTR_TIMEZONE, ATTR_STATE, ATTR_WAIT_BOOT, ATTR_CPU_PERCENT, ATTR_MEMORY_USAGE, ATTR_MEMORY_LIMIT, ATTR_NETWORK_RX, ATTR_NETWORK_TX, ATTR_BLK_READ, ATTR_BLK_WRITE, CONTENT_TYPE_BINARY, ATTR_ICON) from ..coresys import CoreSysAttributes -from ..validate import validate_timezone, WAIT_BOOT, REPOSITORIES +from ..validate import validate_timezone, WAIT_BOOT, REPOSITORIES, MODES _LOGGER = logging.getLogger(__name__) SCHEMA_OPTIONS = vol.Schema({ - # pylint: disable=no-value-for-parameter - vol.Optional(ATTR_BETA_CHANNEL): vol.Boolean(), + vol.Optional(ATTR_MODE): MODES, vol.Optional(ATTR_ADDONS_REPOSITORIES): REPOSITORIES, vol.Optional(ATTR_TIMEZONE): validate_timezone, vol.Optional(ATTR_WAIT_BOOT): WAIT_BOOT, @@ -59,7 +58,7 @@ class APISupervisor(CoreSysAttributes): return { ATTR_VERSION: HASSIO_VERSION, ATTR_LAST_VERSION: self._updater.version_hassio, - ATTR_BETA_CHANNEL: self._updater.beta_channel, + ATTR_MODE: self._updater.mode, ATTR_ARCH: self._arch, ATTR_WAIT_BOOT: self._config.wait_boot, ATTR_TIMEZONE: self._config.timezone, @@ -72,8 +71,8 @@ class APISupervisor(CoreSysAttributes): """Set supervisor options.""" body = await api_validate(SCHEMA_OPTIONS, request) - if ATTR_BETA_CHANNEL in body: - self._updater.beta_channel = body[ATTR_BETA_CHANNEL] + if ATTR_MODE in body: + self._updater.mode = body[ATTR_MODE] if ATTR_TIMEZONE in body: self._config.timezone = body[ATTR_TIMEZONE] diff --git a/hassio/const.py b/hassio/const.py index 61d91927b..11f8db5ce 100644 --- a/hassio/const.py +++ b/hassio/const.py @@ -70,7 +70,7 @@ ATTR_VERSION = 'version' ATTR_AUTO_UART = 'auto_uart' ATTR_LAST_BOOT = 'last_boot' ATTR_LAST_VERSION = 'last_version' -ATTR_BETA_CHANNEL = 'beta_channel' +ATTR_MODE = 'mode' ATTR_NAME = 'name' ATTR_SLUG = 'slug' ATTR_DESCRIPTON = 'description' @@ -186,6 +186,10 @@ ARCH_AARCH64 = 'aarch64' ARCH_AMD64 = 'amd64' ARCH_I386 = 'i386' +MODE_STABLE = 'stable' +MODE_BETA = 'beta' +MODE_DEV = 'dev' + REPOSITORY_CORE = 'core' REPOSITORY_LOCAL = 'local' diff --git a/hassio/core.py b/hassio/core.py index c90a74019..0054a6990 100644 --- a/hassio/core.py +++ b/hassio/core.py @@ -56,12 +56,12 @@ class HassIO(CoreSysAttributes): async def start(self): """Start HassIO orchestration.""" # on release channel, try update itself - # on beta channel, only read new versions - if not self._updater.beta_channel and self._supervisor.need_update: + # on dev mode, only read new versions + if not self._dev and self._supervisor.need_update: if await self._supervisor.update(): return else: - _LOGGER.info("Ignore Hass.io auto updates on beta mode") + _LOGGER.info("Ignore Hass.io auto updates on dev mode") # start api await self._api.start() diff --git a/hassio/coresys.py b/hassio/coresys.py index 8fda0bf0e..c099044ad 100644 --- a/hassio/coresys.py +++ b/hassio/coresys.py @@ -2,6 +2,7 @@ import aiohttp +from .const import MODE_DEV from .config import CoreConfig from .docker import DockerAPI from .misc.dns import DNSForward @@ -49,6 +50,11 @@ class CoreSys(object): return self._supervisor.arch return None + @property + def dev(self): + """Return True if we run dev modus.""" + return self._updater.mode == MODE_DEV + @property def loop(self): """Return loop object.""" diff --git a/hassio/tasks.py b/hassio/tasks.py index ab95b0365..ff8e1d661 100644 --- a/hassio/tasks.py +++ b/hassio/tasks.py @@ -78,8 +78,8 @@ class Tasks(CoreSysAttributes): return # don't perform a update on beta/dev channel - if self._updater.beta_channel: - _LOGGER.warning("Ignore Hass.io update on beta upstream!") + if self._dev: + _LOGGER.warning("Ignore Hass.io update on dev mode!") return _LOGGER.info("Found new Hass.io version") diff --git a/hassio/updater.py b/hassio/updater.py index 168e2585e..a3fdc57a5 100644 --- a/hassio/updater.py +++ b/hassio/updater.py @@ -9,7 +9,7 @@ import async_timeout from .const import ( URL_HASSIO_VERSION, FILE_HASSIO_UPDATER, ATTR_HOMEASSISTANT, ATTR_HASSIO, - ATTR_BETA_CHANNEL) + ATTR_MODE, MODE_STABLE, MODE_BETA, MODE_DEV) from .coresys import CoreSysAttributes from .utils import AsyncThrottle from .utils.json import JsonConfig @@ -17,6 +17,12 @@ from .validate import SCHEMA_UPDATER_CONFIG _LOGGER = logging.getLogger(__name__) +MODE_TO_BRANCH = { + MODE_STABLE: 'master', + MODE_BETA: 'rc', + MODE_DEV: 'dev', +} + class Updater(JsonConfig, CoreSysAttributes): """Fetch last versions from version.json.""" @@ -44,21 +50,14 @@ class Updater(JsonConfig, CoreSysAttributes): return self._data.get(ATTR_HASSIO) @property - def upstream(self): - """Return Upstream branch for version.""" - if self.beta_channel: - return 'dev' - return 'master' + def mode(self): + """Return upstream mode of hassio instance.""" + return self._data[ATTR_MODE] - @property - def beta_channel(self): - """Return True if we run in beta upstream.""" - return self._data[ATTR_BETA_CHANNEL] - - @beta_channel.setter - def beta_channel(self, value): - """Set beta upstream mode.""" - self._data[ATTR_BETA_CHANNEL] = bool(value) + @mode.setter + def mode(self, value): + """Set upstream mode.""" + self._data[ATTR_MODE] = value @AsyncThrottle(timedelta(seconds=60)) async def reload(self): @@ -66,7 +65,7 @@ class Updater(JsonConfig, CoreSysAttributes): Is a coroutine. """ - url = URL_HASSIO_VERSION.format(self.upstream) + url = URL_HASSIO_VERSION.format(MODE_TO_BRANCH[self.mode]) try: _LOGGER.info("Fetch update data from %s", url) with async_timeout.timeout(10, loop=self._loop): diff --git a/hassio/validate.py b/hassio/validate.py index fd4a909be..a10242bbe 100644 --- a/hassio/validate.py +++ b/hassio/validate.py @@ -6,10 +6,11 @@ import voluptuous as vol import pytz from .const import ( - ATTR_IMAGE, ATTR_LAST_VERSION, ATTR_BETA_CHANNEL, ATTR_TIMEZONE, + ATTR_IMAGE, ATTR_LAST_VERSION, ATTR_MODE, ATTR_TIMEZONE, ATTR_ADDONS_CUSTOM_LIST, ATTR_AUDIO_OUTPUT, ATTR_AUDIO_INPUT, ATTR_PASSWORD, ATTR_HOMEASSISTANT, ATTR_HASSIO, ATTR_BOOT, ATTR_LAST_BOOT, - ATTR_SSL, ATTR_PORT, ATTR_WATCHDOG, ATTR_WAIT_BOOT, ATTR_UUID) + ATTR_SSL, ATTR_PORT, ATTR_WATCHDOG, ATTR_WAIT_BOOT, ATTR_UUID, + MODE_STABLE, MODE_BETA, MODE_DEV) RE_REPOSITORY = re.compile(r"^(?P[^#]+)(?:#(?P[\w\-]+))?$") @@ -18,6 +19,7 @@ NETWORK_PORT = vol.All(vol.Coerce(int), vol.Range(min=1, max=65535)) ALSA_CHANNEL = vol.Match(r"\d+,\d+") WAIT_BOOT = vol.All(vol.Coerce(int), vol.Range(min=1, max=60)) DOCKER_IMAGE = vol.Match(r"^[\w{}]+/[\-\w{}]+$") +MODES = vol.In([MODE_STABLE, MODE_BETA, MODE_DEV]) def validate_repository(repository): @@ -94,9 +96,8 @@ SCHEMA_HASS_CONFIG = vol.Schema({ }, extra=vol.REMOVE_EXTRA) -# pylint: disable=no-value-for-parameter SCHEMA_UPDATER_CONFIG = vol.Schema({ - vol.Optional(ATTR_BETA_CHANNEL, default=False): vol.Boolean(), + vol.Optional(ATTR_MODE, default=MODE_STABLE): MODES, vol.Optional(ATTR_HOMEASSISTANT): vol.Coerce(str), vol.Optional(ATTR_HASSIO): vol.Coerce(str), }, extra=vol.REMOVE_EXTRA)