mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-13 12:16:29 +00:00
Change Upstream handling
This commit is contained in:
parent
f34a175e4f
commit
45288a2491
4
API.md
4
API.md
@ -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": [
|
||||||
|
@ -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]
|
||||||
|
@ -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'
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
@ -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."""
|
||||||
|
@ -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")
|
||||||
|
@ -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):
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user