mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-19 15:16:33 +00:00
Store image on local config (#1627)
* Store image on local config * Fix api validate * Fix install handling
This commit is contained in:
parent
387e0ad03e
commit
9350e4f961
1
API.md
1
API.md
@ -368,7 +368,6 @@ Trigger an udev reload
|
||||
"machine": "Image machine type",
|
||||
"ip_address": "ip address",
|
||||
"image": "str",
|
||||
"custom": "bool -> if custom image",
|
||||
"boot": "bool",
|
||||
"port": 8123,
|
||||
"ssl": "bool",
|
||||
|
@ -14,10 +14,8 @@ from ..const import (
|
||||
ATTR_BLK_WRITE,
|
||||
ATTR_BOOT,
|
||||
ATTR_CPU_PERCENT,
|
||||
ATTR_CUSTOM,
|
||||
ATTR_IMAGE,
|
||||
ATTR_IP_ADDRESS,
|
||||
ATTR_VERSION_LATEST,
|
||||
ATTR_MACHINE,
|
||||
ATTR_MEMORY_LIMIT,
|
||||
ATTR_MEMORY_PERCENT,
|
||||
@ -28,6 +26,7 @@ from ..const import (
|
||||
ATTR_REFRESH_TOKEN,
|
||||
ATTR_SSL,
|
||||
ATTR_VERSION,
|
||||
ATTR_VERSION_LATEST,
|
||||
ATTR_WAIT_BOOT,
|
||||
ATTR_WATCHDOG,
|
||||
CONTENT_TYPE_BINARY,
|
||||
@ -43,8 +42,7 @@ _LOGGER: logging.Logger = logging.getLogger(__name__)
|
||||
SCHEMA_OPTIONS = vol.Schema(
|
||||
{
|
||||
vol.Optional(ATTR_BOOT): vol.Boolean(),
|
||||
vol.Inclusive(ATTR_IMAGE, "custom_hass"): vol.Maybe(docker_image),
|
||||
vol.Inclusive(ATTR_VERSION_LATEST, "custom_hass"): vol.Maybe(vol.Coerce(str)),
|
||||
vol.Optional(ATTR_IMAGE): docker_image,
|
||||
vol.Optional(ATTR_PORT): network_port,
|
||||
vol.Optional(ATTR_SSL): vol.Boolean(),
|
||||
vol.Optional(ATTR_WATCHDOG): vol.Boolean(),
|
||||
@ -71,7 +69,6 @@ class APIHomeAssistant(CoreSysAttributes):
|
||||
ATTR_IP_ADDRESS: str(self.sys_homeassistant.ip_address),
|
||||
ATTR_ARCH: self.sys_homeassistant.arch,
|
||||
ATTR_IMAGE: self.sys_homeassistant.image,
|
||||
ATTR_CUSTOM: self.sys_homeassistant.is_custom_image,
|
||||
ATTR_BOOT: self.sys_homeassistant.boot,
|
||||
ATTR_PORT: self.sys_homeassistant.api_port,
|
||||
ATTR_SSL: self.sys_homeassistant.api_ssl,
|
||||
@ -88,9 +85,8 @@ class APIHomeAssistant(CoreSysAttributes):
|
||||
"""Set Home Assistant options."""
|
||||
body = await api_validate(SCHEMA_OPTIONS, request)
|
||||
|
||||
if ATTR_IMAGE in body and ATTR_VERSION_LATEST in body:
|
||||
if ATTR_IMAGE in body:
|
||||
self.sys_homeassistant.image = body[ATTR_IMAGE]
|
||||
self.sys_homeassistant.latest_version = body[ATTR_VERSION_LATEST]
|
||||
|
||||
if ATTR_BOOT in body:
|
||||
self.sys_homeassistant.boot = body[ATTR_BOOT]
|
||||
|
@ -8,7 +8,7 @@ from typing import Awaitable, Optional
|
||||
|
||||
import jinja2
|
||||
|
||||
from .const import ATTR_VERSION, FILE_HASSIO_AUDIO
|
||||
from .const import ATTR_IMAGE, ATTR_VERSION, FILE_HASSIO_AUDIO
|
||||
from .coresys import CoreSys, CoreSysAttributes
|
||||
from .docker.audio import DockerAudio
|
||||
from .docker.stats import DockerStats
|
||||
@ -52,6 +52,18 @@ class Audio(JsonConfig, CoreSysAttributes):
|
||||
"""Set current version of Audio."""
|
||||
self._data[ATTR_VERSION] = value
|
||||
|
||||
@property
|
||||
def image(self) -> str:
|
||||
"""Return current image of Audio."""
|
||||
if self._data.get(ATTR_IMAGE):
|
||||
return self._data[ATTR_IMAGE]
|
||||
return f"homeassistant/{self.sys_arch.supervisor}-hassio-audio"
|
||||
|
||||
@image.setter
|
||||
def image(self, value: str) -> None:
|
||||
"""Return current image of Audio."""
|
||||
self._data[ATTR_IMAGE] = value
|
||||
|
||||
@property
|
||||
def latest_version(self) -> Optional[str]:
|
||||
"""Return latest version of Audio."""
|
||||
@ -84,6 +96,7 @@ class Audio(JsonConfig, CoreSysAttributes):
|
||||
await self.install()
|
||||
else:
|
||||
self.version = self.instance.version
|
||||
self.image = self.instance.image
|
||||
self.save_data()
|
||||
|
||||
# Run PulseAudio
|
||||
@ -122,6 +135,7 @@ class Audio(JsonConfig, CoreSysAttributes):
|
||||
|
||||
_LOGGER.info("Audio plugin now installed")
|
||||
self.version = self.instance.version
|
||||
self.image = self.instance.image
|
||||
self.save_data()
|
||||
|
||||
async def update(self, version: Optional[str] = None) -> None:
|
||||
|
@ -5,7 +5,7 @@ import logging
|
||||
import secrets
|
||||
from typing import Awaitable, Optional
|
||||
|
||||
from .const import ATTR_ACCESS_TOKEN, ATTR_VERSION, FILE_HASSIO_CLI
|
||||
from .const import ATTR_ACCESS_TOKEN, ATTR_IMAGE, ATTR_VERSION, FILE_HASSIO_CLI
|
||||
from .coresys import CoreSys, CoreSysAttributes
|
||||
from .docker.cli import DockerCli
|
||||
from .docker.stats import DockerStats
|
||||
@ -35,6 +35,18 @@ class HaCli(CoreSysAttributes, JsonConfig):
|
||||
"""Set current version of cli."""
|
||||
self._data[ATTR_VERSION] = value
|
||||
|
||||
@property
|
||||
def image(self) -> str:
|
||||
"""Return current image of cli."""
|
||||
if self._data.get(ATTR_IMAGE):
|
||||
return self._data[ATTR_IMAGE]
|
||||
return f"homeassistant/{self.sys_arch.supervisor}-hassio-cli"
|
||||
|
||||
@image.setter
|
||||
def image(self, value: str) -> None:
|
||||
"""Return current image of cli."""
|
||||
self._data[ATTR_IMAGE] = value
|
||||
|
||||
@property
|
||||
def latest_version(self) -> str:
|
||||
"""Return version of latest cli."""
|
||||
@ -72,6 +84,7 @@ class HaCli(CoreSysAttributes, JsonConfig):
|
||||
await self.install()
|
||||
else:
|
||||
self.version = self.instance.version
|
||||
self.image = self.instance.image
|
||||
self.save_data()
|
||||
|
||||
# Run PulseAudio
|
||||
@ -96,6 +109,7 @@ class HaCli(CoreSysAttributes, JsonConfig):
|
||||
|
||||
_LOGGER.info("cli plugin now installed")
|
||||
self.version = self.instance.version
|
||||
self.image = self.instance.image
|
||||
self.save_data()
|
||||
|
||||
async def update(self, version: Optional[str] = None) -> None:
|
||||
|
@ -17,7 +17,7 @@ from .const import (
|
||||
)
|
||||
from .utils.dt import parse_datetime
|
||||
from .utils.json import JsonConfig
|
||||
from .validate import SCHEMA_HASSIO_CONFIG
|
||||
from .validate import SCHEMA_SUPERVISOR_CONFIG
|
||||
|
||||
_LOGGER: logging.Logger = logging.getLogger(__name__)
|
||||
|
||||
@ -45,7 +45,7 @@ class CoreConfig(JsonConfig):
|
||||
|
||||
def __init__(self):
|
||||
"""Initialize config object."""
|
||||
super().__init__(FILE_HASSIO_CONFIG, SCHEMA_HASSIO_CONFIG)
|
||||
super().__init__(FILE_HASSIO_CONFIG, SCHEMA_SUPERVISOR_CONFIG)
|
||||
|
||||
@property
|
||||
def timezone(self):
|
||||
|
@ -147,7 +147,6 @@ ATTR_SIZE = "size"
|
||||
ATTR_TYPE = "type"
|
||||
ATTR_TIMEOUT = "timeout"
|
||||
ATTR_AUTO_UPDATE = "auto_update"
|
||||
ATTR_CUSTOM = "custom"
|
||||
ATTR_VIDEO = "video"
|
||||
ATTR_AUDIO = "audio"
|
||||
ATTR_AUDIO_INPUT = "audio_input"
|
||||
|
@ -10,14 +10,14 @@ import attr
|
||||
import jinja2
|
||||
import voluptuous as vol
|
||||
|
||||
from .const import ATTR_SERVERS, ATTR_VERSION, DNS_SUFFIX, FILE_HASSIO_DNS
|
||||
from .const import ATTR_IMAGE, ATTR_SERVERS, ATTR_VERSION, DNS_SUFFIX, FILE_HASSIO_DNS
|
||||
from .coresys import CoreSys, CoreSysAttributes
|
||||
from .docker.dns import DockerDNS
|
||||
from .docker.stats import DockerStats
|
||||
from .exceptions import CoreDNSError, CoreDNSUpdateError, DockerAPIError
|
||||
from .misc.forwarder import DNSForward
|
||||
from .utils.json import JsonConfig
|
||||
from .validate import dns_url, SCHEMA_DNS_CONFIG
|
||||
from .validate import SCHEMA_DNS_CONFIG, dns_url
|
||||
|
||||
_LOGGER: logging.Logger = logging.getLogger(__name__)
|
||||
|
||||
@ -79,6 +79,18 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
|
||||
"""Return current version of DNS."""
|
||||
self._data[ATTR_VERSION] = value
|
||||
|
||||
@property
|
||||
def image(self) -> str:
|
||||
"""Return current image of DNS."""
|
||||
if self._data.get(ATTR_IMAGE):
|
||||
return self._data[ATTR_IMAGE]
|
||||
return f"homeassistant/{self.sys_arch.supervisor}-hassio-dns"
|
||||
|
||||
@image.setter
|
||||
def image(self, value: str) -> None:
|
||||
"""Return current image of DNS."""
|
||||
self._data[ATTR_IMAGE] = value
|
||||
|
||||
@property
|
||||
def latest_version(self) -> Optional[str]:
|
||||
"""Return latest version of CoreDNS."""
|
||||
@ -115,6 +127,7 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
|
||||
await self.install()
|
||||
else:
|
||||
self.version = self.instance.version
|
||||
self.image = self.instance.image
|
||||
self.save_data()
|
||||
|
||||
# Start DNS forwarder
|
||||
@ -161,6 +174,7 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
|
||||
|
||||
_LOGGER.info("CoreDNS plugin now installed")
|
||||
self.version = self.instance.version
|
||||
self.image = self.instance.image
|
||||
self.save_data()
|
||||
|
||||
# Init Hosts
|
||||
|
@ -20,7 +20,7 @@ class DockerAudio(DockerInterface, CoreSysAttributes):
|
||||
@property
|
||||
def image(self) -> str:
|
||||
"""Return name of Supervisor Audio image."""
|
||||
return f"homeassistant/{self.sys_arch.supervisor}-hassio-audio"
|
||||
return self.sys_audio.image
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
|
@ -18,7 +18,7 @@ class DockerCli(DockerInterface, CoreSysAttributes):
|
||||
@property
|
||||
def image(self):
|
||||
"""Return name of HA cli image."""
|
||||
return f"homeassistant/{self.sys_arch.supervisor}-hassio-cli"
|
||||
return self.sys_cli.image
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
|
@ -18,7 +18,7 @@ class DockerDNS(DockerInterface, CoreSysAttributes):
|
||||
@property
|
||||
def image(self) -> str:
|
||||
"""Return name of Supervisor DNS image."""
|
||||
return f"homeassistant/{self.sys_arch.supervisor}-hassio-dns"
|
||||
return self.sys_dns.image
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
|
@ -91,6 +91,7 @@ class HomeAssistant(JsonConfig, CoreSysAttributes):
|
||||
await self.install_landingpage()
|
||||
else:
|
||||
self.version = self.instance.version
|
||||
self.image = self.instance.image
|
||||
self.save_data()
|
||||
|
||||
@property
|
||||
@ -163,8 +164,6 @@ class HomeAssistant(JsonConfig, CoreSysAttributes):
|
||||
@property
|
||||
def latest_version(self) -> str:
|
||||
"""Return last available version of Home Assistant."""
|
||||
if self.is_custom_image:
|
||||
return self._data.get(ATTR_VERSION_LATEST)
|
||||
return self.sys_updater.version_homeassistant
|
||||
|
||||
@latest_version.setter
|
||||
@ -183,17 +182,9 @@ class HomeAssistant(JsonConfig, CoreSysAttributes):
|
||||
return os.environ["HOMEASSISTANT_REPOSITORY"]
|
||||
|
||||
@image.setter
|
||||
def image(self, value: str):
|
||||
def image(self, value: str) -> None:
|
||||
"""Set image name of Home Assistant container."""
|
||||
if value:
|
||||
self._data[ATTR_IMAGE] = value
|
||||
else:
|
||||
self._data.pop(ATTR_IMAGE, None)
|
||||
|
||||
@property
|
||||
def is_custom_image(self) -> bool:
|
||||
"""Return True if a custom image is used."""
|
||||
return all(attr in self._data for attr in (ATTR_IMAGE, ATTR_VERSION_LATEST))
|
||||
self._data[ATTR_IMAGE] = value
|
||||
|
||||
@property
|
||||
def version(self) -> Optional[str]:
|
||||
@ -304,6 +295,7 @@ class HomeAssistant(JsonConfig, CoreSysAttributes):
|
||||
|
||||
_LOGGER.info("Home Assistant docker now installed")
|
||||
self.version = self.instance.version
|
||||
self.image = self.instance.image
|
||||
self.save_data()
|
||||
|
||||
# finishing
|
||||
|
@ -24,7 +24,6 @@ from ..const import (
|
||||
ATTR_FOLDERS,
|
||||
ATTR_HOMEASSISTANT,
|
||||
ATTR_IMAGE,
|
||||
ATTR_VERSION_LATEST,
|
||||
ATTR_NAME,
|
||||
ATTR_PORT,
|
||||
ATTR_PROTECTED,
|
||||
@ -430,13 +429,7 @@ class Snapshot(CoreSysAttributes):
|
||||
self.homeassistant[ATTR_WATCHDOG] = self.sys_homeassistant.watchdog
|
||||
self.homeassistant[ATTR_BOOT] = self.sys_homeassistant.boot
|
||||
self.homeassistant[ATTR_WAIT_BOOT] = self.sys_homeassistant.wait_boot
|
||||
|
||||
# Custom image
|
||||
if self.sys_homeassistant.is_custom_image:
|
||||
self.homeassistant[ATTR_IMAGE] = self.sys_homeassistant.image
|
||||
self.homeassistant[
|
||||
ATTR_VERSION_LATEST
|
||||
] = self.sys_homeassistant.latest_version
|
||||
self.homeassistant[ATTR_IMAGE] = self.sys_homeassistant.image
|
||||
|
||||
# API/Proxy
|
||||
self.homeassistant[ATTR_PORT] = self.sys_homeassistant.api_port
|
||||
@ -455,12 +448,9 @@ class Snapshot(CoreSysAttributes):
|
||||
self.sys_homeassistant.boot = self.homeassistant[ATTR_BOOT]
|
||||
self.sys_homeassistant.wait_boot = self.homeassistant[ATTR_WAIT_BOOT]
|
||||
|
||||
# Custom image
|
||||
if self.homeassistant.get(ATTR_IMAGE):
|
||||
# Was not needed before
|
||||
if self.homeassistant[ATTR_IMAGE]:
|
||||
self.sys_homeassistant.image = self.homeassistant[ATTR_IMAGE]
|
||||
self.sys_homeassistant.latest_version = self.homeassistant[
|
||||
ATTR_VERSION_LATEST
|
||||
]
|
||||
|
||||
# API/Proxy
|
||||
self.sys_homeassistant.api_port = self.homeassistant[ATTR_PORT]
|
||||
|
@ -11,7 +11,6 @@ from ..const import (
|
||||
ATTR_FOLDERS,
|
||||
ATTR_HOMEASSISTANT,
|
||||
ATTR_IMAGE,
|
||||
ATTR_VERSION_LATEST,
|
||||
ATTR_NAME,
|
||||
ATTR_PORT,
|
||||
ATTR_PROTECTED,
|
||||
@ -60,8 +59,7 @@ SCHEMA_SNAPSHOT = vol.Schema(
|
||||
vol.Optional(ATTR_HOMEASSISTANT, default=dict): vol.Schema(
|
||||
{
|
||||
vol.Optional(ATTR_VERSION): vol.Coerce(str),
|
||||
vol.Inclusive(ATTR_IMAGE, "custom_hass"): docker_image,
|
||||
vol.Inclusive(ATTR_VERSION_LATEST, "custom_hass"): vol.Coerce(str),
|
||||
vol.Optional(ATTR_IMAGE): docker_image,
|
||||
vol.Optional(ATTR_BOOT, default=True): vol.Boolean(),
|
||||
vol.Optional(ATTR_SSL, default=False): vol.Boolean(),
|
||||
vol.Optional(ATTR_PORT, default=8123): network_port,
|
||||
|
@ -22,7 +22,6 @@ from .const import (
|
||||
ATTR_HOMEASSISTANT,
|
||||
ATTR_IMAGE,
|
||||
ATTR_LAST_BOOT,
|
||||
ATTR_VERSION_LATEST,
|
||||
ATTR_LOGGING,
|
||||
ATTR_PORT,
|
||||
ATTR_PORTS,
|
||||
@ -102,10 +101,9 @@ SCHEMA_HASS_CONFIG = vol.Schema(
|
||||
{
|
||||
vol.Optional(ATTR_UUID, default=lambda: uuid.uuid4().hex): uuid_match,
|
||||
vol.Optional(ATTR_VERSION): vol.Maybe(vol.Coerce(str)),
|
||||
vol.Optional(ATTR_IMAGE): docker_image,
|
||||
vol.Optional(ATTR_ACCESS_TOKEN): token,
|
||||
vol.Optional(ATTR_BOOT, default=True): vol.Boolean(),
|
||||
vol.Inclusive(ATTR_IMAGE, "custom_hass"): docker_image,
|
||||
vol.Inclusive(ATTR_VERSION_LATEST, "custom_hass"): vol.Coerce(str),
|
||||
vol.Optional(ATTR_PORT, default=8123): network_port,
|
||||
vol.Optional(ATTR_REFRESH_TOKEN): vol.Maybe(vol.Coerce(str)),
|
||||
vol.Optional(ATTR_SSL, default=False): vol.Boolean(),
|
||||
@ -137,7 +135,7 @@ SCHEMA_UPDATER_CONFIG = vol.Schema(
|
||||
|
||||
|
||||
# pylint: disable=no-value-for-parameter
|
||||
SCHEMA_HASSIO_CONFIG = vol.Schema(
|
||||
SCHEMA_SUPERVISOR_CONFIG = vol.Schema(
|
||||
{
|
||||
vol.Optional(ATTR_TIMEZONE, default="UTC"): validate_timezone,
|
||||
vol.Optional(ATTR_LAST_BOOT): vol.Coerce(str),
|
||||
@ -173,6 +171,7 @@ SCHEMA_INGRESS_CONFIG = vol.Schema(
|
||||
SCHEMA_DNS_CONFIG = vol.Schema(
|
||||
{
|
||||
vol.Optional(ATTR_VERSION): vol.Maybe(vol.Coerce(str)),
|
||||
vol.Optional(ATTR_IMAGE): docker_image,
|
||||
vol.Optional(ATTR_SERVERS, default=list): dns_server_list,
|
||||
},
|
||||
extra=vol.REMOVE_EXTRA,
|
||||
@ -180,13 +179,18 @@ SCHEMA_DNS_CONFIG = vol.Schema(
|
||||
|
||||
|
||||
SCHEMA_AUDIO_CONFIG = vol.Schema(
|
||||
{vol.Optional(ATTR_VERSION): vol.Maybe(vol.Coerce(str))}, extra=vol.REMOVE_EXTRA,
|
||||
{
|
||||
vol.Optional(ATTR_VERSION): vol.Maybe(vol.Coerce(str)),
|
||||
vol.Optional(ATTR_IMAGE): docker_image,
|
||||
},
|
||||
extra=vol.REMOVE_EXTRA,
|
||||
)
|
||||
|
||||
|
||||
SCHEMA_CLI_CONFIG = vol.Schema(
|
||||
{
|
||||
vol.Optional(ATTR_VERSION): vol.Maybe(vol.Coerce(str)),
|
||||
vol.Optional(ATTR_IMAGE): docker_image,
|
||||
vol.Optional(ATTR_ACCESS_TOKEN): token,
|
||||
},
|
||||
extra=vol.REMOVE_EXTRA,
|
||||
|
Loading…
x
Reference in New Issue
Block a user