Change Upstream handling

This commit is contained in:
Pascal Vizeli 2018-03-24 21:44:44 +01:00
parent f34a175e4f
commit 45288a2491
8 changed files with 44 additions and 35 deletions

4
API.md
View File

@ -36,7 +36,7 @@ The addons from `addons` are only installed one.
"version": "INSTALL_VERSION", "version": "INSTALL_VERSION",
"last_version": "LAST_VERSION", "last_version": "LAST_VERSION",
"arch": "armhf|aarch64|i386|amd64", "arch": "armhf|aarch64|i386|amd64",
"beta_channel": "true|false", "mode": "stable|beta|dev",
"timezone": "TIMEZONE", "timezone": "TIMEZONE",
"wait_boot": "int", "wait_boot": "int",
"addons": [ "addons": [
@ -72,7 +72,7 @@ Optional:
```json ```json
{ {
"beta_channel": "true|false", "mode": "stable|beta|dev",
"timezone": "TIMEZONE", "timezone": "TIMEZONE",
"wait_boot": "int", "wait_boot": "int",
"addons_repositories": [ "addons_repositories": [

View File

@ -6,20 +6,19 @@ import voluptuous as vol
from .utils import api_process, api_process_raw, api_validate from .utils import api_process, api_process_raw, api_validate
from ..const import ( 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, HASSIO_VERSION, ATTR_ADDONS_REPOSITORIES, ATTR_LOGO, ATTR_REPOSITORY,
ATTR_DESCRIPTON, ATTR_NAME, ATTR_SLUG, ATTR_INSTALLED, ATTR_TIMEZONE, ATTR_DESCRIPTON, ATTR_NAME, ATTR_SLUG, ATTR_INSTALLED, ATTR_TIMEZONE,
ATTR_STATE, ATTR_WAIT_BOOT, ATTR_CPU_PERCENT, ATTR_MEMORY_USAGE, ATTR_STATE, ATTR_WAIT_BOOT, ATTR_CPU_PERCENT, ATTR_MEMORY_USAGE,
ATTR_MEMORY_LIMIT, ATTR_NETWORK_RX, ATTR_NETWORK_TX, ATTR_BLK_READ, ATTR_MEMORY_LIMIT, ATTR_NETWORK_RX, ATTR_NETWORK_TX, ATTR_BLK_READ,
ATTR_BLK_WRITE, CONTENT_TYPE_BINARY, ATTR_ICON) ATTR_BLK_WRITE, CONTENT_TYPE_BINARY, ATTR_ICON)
from ..coresys import CoreSysAttributes 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__) _LOGGER = logging.getLogger(__name__)
SCHEMA_OPTIONS = vol.Schema({ SCHEMA_OPTIONS = vol.Schema({
# pylint: disable=no-value-for-parameter vol.Optional(ATTR_MODE): MODES,
vol.Optional(ATTR_BETA_CHANNEL): vol.Boolean(),
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,
@ -59,7 +58,7 @@ class APISupervisor(CoreSysAttributes):
return { return {
ATTR_VERSION: HASSIO_VERSION, ATTR_VERSION: HASSIO_VERSION,
ATTR_LAST_VERSION: self._updater.version_hassio, ATTR_LAST_VERSION: self._updater.version_hassio,
ATTR_BETA_CHANNEL: self._updater.beta_channel, ATTR_MODE: self._updater.mode,
ATTR_ARCH: self._arch, ATTR_ARCH: self._arch,
ATTR_WAIT_BOOT: self._config.wait_boot, ATTR_WAIT_BOOT: self._config.wait_boot,
ATTR_TIMEZONE: self._config.timezone, ATTR_TIMEZONE: self._config.timezone,
@ -72,8 +71,8 @@ class APISupervisor(CoreSysAttributes):
"""Set supervisor options.""" """Set supervisor options."""
body = await api_validate(SCHEMA_OPTIONS, request) body = await api_validate(SCHEMA_OPTIONS, request)
if ATTR_BETA_CHANNEL in body: if ATTR_MODE in body:
self._updater.beta_channel = body[ATTR_BETA_CHANNEL] self._updater.mode = body[ATTR_MODE]
if ATTR_TIMEZONE in body: if ATTR_TIMEZONE in body:
self._config.timezone = body[ATTR_TIMEZONE] self._config.timezone = body[ATTR_TIMEZONE]

View File

@ -70,7 +70,7 @@ ATTR_VERSION = 'version'
ATTR_AUTO_UART = 'auto_uart' ATTR_AUTO_UART = 'auto_uart'
ATTR_LAST_BOOT = 'last_boot' ATTR_LAST_BOOT = 'last_boot'
ATTR_LAST_VERSION = 'last_version' ATTR_LAST_VERSION = 'last_version'
ATTR_BETA_CHANNEL = 'beta_channel' ATTR_MODE = 'mode'
ATTR_NAME = 'name' ATTR_NAME = 'name'
ATTR_SLUG = 'slug' ATTR_SLUG = 'slug'
ATTR_DESCRIPTON = 'description' ATTR_DESCRIPTON = 'description'
@ -186,6 +186,10 @@ ARCH_AARCH64 = 'aarch64'
ARCH_AMD64 = 'amd64' ARCH_AMD64 = 'amd64'
ARCH_I386 = 'i386' ARCH_I386 = 'i386'
MODE_STABLE = 'stable'
MODE_BETA = 'beta'
MODE_DEV = 'dev'
REPOSITORY_CORE = 'core' REPOSITORY_CORE = 'core'
REPOSITORY_LOCAL = 'local' REPOSITORY_LOCAL = 'local'

View File

@ -56,12 +56,12 @@ class HassIO(CoreSysAttributes):
async def start(self): async def start(self):
"""Start HassIO orchestration.""" """Start HassIO orchestration."""
# on release channel, try update itself # on release channel, try update itself
# on beta channel, only read new versions # on dev mode, only read new versions
if not self._updater.beta_channel and self._supervisor.need_update: if not self._dev and self._supervisor.need_update:
if await self._supervisor.update(): if await self._supervisor.update():
return return
else: else:
_LOGGER.info("Ignore Hass.io auto updates on beta mode") _LOGGER.info("Ignore Hass.io auto updates on dev mode")
# start api # start api
await self._api.start() await self._api.start()

View File

@ -2,6 +2,7 @@
import aiohttp import aiohttp
from .const import MODE_DEV
from .config import CoreConfig from .config import CoreConfig
from .docker import DockerAPI from .docker import DockerAPI
from .misc.dns import DNSForward from .misc.dns import DNSForward
@ -49,6 +50,11 @@ class CoreSys(object):
return self._supervisor.arch return self._supervisor.arch
return None return None
@property
def dev(self):
"""Return True if we run dev modus."""
return self._updater.mode == MODE_DEV
@property @property
def loop(self): def loop(self):
"""Return loop object.""" """Return loop object."""

View File

@ -78,8 +78,8 @@ class Tasks(CoreSysAttributes):
return return
# don't perform a update on beta/dev channel # don't perform a update on beta/dev channel
if self._updater.beta_channel: if self._dev:
_LOGGER.warning("Ignore Hass.io update on beta upstream!") _LOGGER.warning("Ignore Hass.io update on dev mode!")
return return
_LOGGER.info("Found new Hass.io version") _LOGGER.info("Found new Hass.io version")

View File

@ -9,7 +9,7 @@ import async_timeout
from .const import ( from .const import (
URL_HASSIO_VERSION, FILE_HASSIO_UPDATER, ATTR_HOMEASSISTANT, ATTR_HASSIO, 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 .coresys import CoreSysAttributes
from .utils import AsyncThrottle from .utils import AsyncThrottle
from .utils.json import JsonConfig from .utils.json import JsonConfig
@ -17,6 +17,12 @@ from .validate import SCHEMA_UPDATER_CONFIG
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
MODE_TO_BRANCH = {
MODE_STABLE: 'master',
MODE_BETA: 'rc',
MODE_DEV: 'dev',
}
class Updater(JsonConfig, CoreSysAttributes): class Updater(JsonConfig, CoreSysAttributes):
"""Fetch last versions from version.json.""" """Fetch last versions from version.json."""
@ -44,21 +50,14 @@ class Updater(JsonConfig, CoreSysAttributes):
return self._data.get(ATTR_HASSIO) return self._data.get(ATTR_HASSIO)
@property @property
def upstream(self): def mode(self):
"""Return Upstream branch for version.""" """Return upstream mode of hassio instance."""
if self.beta_channel: return self._data[ATTR_MODE]
return 'dev'
return 'master'
@property @mode.setter
def beta_channel(self): def mode(self, value):
"""Return True if we run in beta upstream.""" """Set upstream mode."""
return self._data[ATTR_BETA_CHANNEL] self._data[ATTR_MODE] = value
@beta_channel.setter
def beta_channel(self, value):
"""Set beta upstream mode."""
self._data[ATTR_BETA_CHANNEL] = bool(value)
@AsyncThrottle(timedelta(seconds=60)) @AsyncThrottle(timedelta(seconds=60))
async def reload(self): async def reload(self):
@ -66,7 +65,7 @@ class Updater(JsonConfig, CoreSysAttributes):
Is a coroutine. Is a coroutine.
""" """
url = URL_HASSIO_VERSION.format(self.upstream) url = URL_HASSIO_VERSION.format(MODE_TO_BRANCH[self.mode])
try: try:
_LOGGER.info("Fetch update data from %s", url) _LOGGER.info("Fetch update data from %s", url)
with async_timeout.timeout(10, loop=self._loop): with async_timeout.timeout(10, loop=self._loop):

View File

@ -6,10 +6,11 @@ import voluptuous as vol
import pytz import pytz
from .const import ( 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_ADDONS_CUSTOM_LIST, ATTR_AUDIO_OUTPUT, ATTR_AUDIO_INPUT,
ATTR_PASSWORD, ATTR_HOMEASSISTANT, ATTR_HASSIO, ATTR_BOOT, ATTR_LAST_BOOT, 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<url>[^#]+)(?:#(?P<branch>[\w\-]+))?$") RE_REPOSITORY = re.compile(r"^(?P<url>[^#]+)(?:#(?P<branch>[\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+") ALSA_CHANNEL = vol.Match(r"\d+,\d+")
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{}]+$")
MODES = vol.In([MODE_STABLE, MODE_BETA, MODE_DEV])
def validate_repository(repository): def validate_repository(repository):
@ -94,9 +96,8 @@ SCHEMA_HASS_CONFIG = vol.Schema({
}, extra=vol.REMOVE_EXTRA) }, extra=vol.REMOVE_EXTRA)
# pylint: disable=no-value-for-parameter
SCHEMA_UPDATER_CONFIG = vol.Schema({ 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_HOMEASSISTANT): vol.Coerce(str),
vol.Optional(ATTR_HASSIO): vol.Coerce(str), vol.Optional(ATTR_HASSIO): vol.Coerce(str),
}, extra=vol.REMOVE_EXTRA) }, extra=vol.REMOVE_EXTRA)