diff --git a/API.md b/API.md index b1eb768b5..305417f35 100644 --- a/API.md +++ b/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", diff --git a/supervisor/api/homeassistant.py b/supervisor/api/homeassistant.py index ecf323a31..373c3886b 100644 --- a/supervisor/api/homeassistant.py +++ b/supervisor/api/homeassistant.py @@ -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] diff --git a/supervisor/audio.py b/supervisor/audio.py index 3a4adfe61..14374857b 100644 --- a/supervisor/audio.py +++ b/supervisor/audio.py @@ -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: diff --git a/supervisor/cli.py b/supervisor/cli.py index 4872d183a..80cf955c1 100644 --- a/supervisor/cli.py +++ b/supervisor/cli.py @@ -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: diff --git a/supervisor/config.py b/supervisor/config.py index 754e029ba..d13222848 100644 --- a/supervisor/config.py +++ b/supervisor/config.py @@ -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): diff --git a/supervisor/const.py b/supervisor/const.py index 7a0c33732..c4067278f 100644 --- a/supervisor/const.py +++ b/supervisor/const.py @@ -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" diff --git a/supervisor/dns.py b/supervisor/dns.py index f81ee3ceb..516fe2ed3 100644 --- a/supervisor/dns.py +++ b/supervisor/dns.py @@ -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 diff --git a/supervisor/docker/audio.py b/supervisor/docker/audio.py index ccc71e079..efa93099f 100644 --- a/supervisor/docker/audio.py +++ b/supervisor/docker/audio.py @@ -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: diff --git a/supervisor/docker/cli.py b/supervisor/docker/cli.py index 08ebca7d3..08866b46e 100644 --- a/supervisor/docker/cli.py +++ b/supervisor/docker/cli.py @@ -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: diff --git a/supervisor/docker/dns.py b/supervisor/docker/dns.py index 9d02a76bb..a20068035 100644 --- a/supervisor/docker/dns.py +++ b/supervisor/docker/dns.py @@ -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: diff --git a/supervisor/homeassistant.py b/supervisor/homeassistant.py index 11474c8cc..62bf9581e 100644 --- a/supervisor/homeassistant.py +++ b/supervisor/homeassistant.py @@ -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 diff --git a/supervisor/snapshots/snapshot.py b/supervisor/snapshots/snapshot.py index cb0c25127..bb74af991 100644 --- a/supervisor/snapshots/snapshot.py +++ b/supervisor/snapshots/snapshot.py @@ -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] diff --git a/supervisor/snapshots/validate.py b/supervisor/snapshots/validate.py index 54f32665d..b3807ecaf 100644 --- a/supervisor/snapshots/validate.py +++ b/supervisor/snapshots/validate.py @@ -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, diff --git a/supervisor/validate.py b/supervisor/validate.py index 12474f0a5..e7a28c199 100644 --- a/supervisor/validate.py +++ b/supervisor/validate.py @@ -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,