mirror of
https://github.com/home-assistant/supervisor.git
synced 2026-05-08 17:08:36 +01:00
a2dffe595e
* Bump pyupgrade from 3.1.0 to 3.2.0 Bumps [pyupgrade](https://github.com/asottile/pyupgrade) from 3.1.0 to 3.2.0. - [Release notes](https://github.com/asottile/pyupgrade/releases) - [Commits](https://github.com/asottile/pyupgrade/compare/v3.1.0...v3.2.0) --- updated-dependencies: - dependency-name: pyupgrade dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * Update .pre-commit-config.yaml * Fixing pyupgrade Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Pascal Vizeli <pvizeli@syshack.ch>
112 lines
3.7 KiB
Python
112 lines
3.7 KiB
Python
"""Init file for Supervisor Docker object."""
|
|
from collections.abc import Awaitable
|
|
from ipaddress import IPv4Address
|
|
import logging
|
|
import os
|
|
|
|
from awesomeversion.awesomeversion import AwesomeVersion
|
|
import docker
|
|
import requests
|
|
|
|
from ..coresys import CoreSysAttributes
|
|
from ..exceptions import DockerError
|
|
from .interface import DockerInterface
|
|
|
|
_LOGGER: logging.Logger = logging.getLogger(__name__)
|
|
|
|
|
|
class DockerSupervisor(DockerInterface, CoreSysAttributes):
|
|
"""Docker Supervisor wrapper for Supervisor."""
|
|
|
|
@property
|
|
def name(self) -> str:
|
|
"""Return name of Docker container."""
|
|
return os.environ["SUPERVISOR_NAME"]
|
|
|
|
@property
|
|
def ip_address(self) -> IPv4Address:
|
|
"""Return IP address of this container."""
|
|
return self.sys_docker.network.supervisor
|
|
|
|
@property
|
|
def privileged(self) -> bool:
|
|
"""Return True if the container run with Privileged."""
|
|
return self.meta_host.get("Privileged", False)
|
|
|
|
def _attach(
|
|
self, version: AwesomeVersion, skip_state_event_if_down: bool = False
|
|
) -> None:
|
|
"""Attach to running docker container.
|
|
|
|
Need run inside executor.
|
|
"""
|
|
try:
|
|
docker_container = self.sys_docker.containers.get(self.name)
|
|
except (docker.errors.DockerException, requests.RequestException) as err:
|
|
raise DockerError() from err
|
|
|
|
self._meta = docker_container.attrs
|
|
_LOGGER.info(
|
|
"Attaching to Supervisor %s with version %s",
|
|
self.image,
|
|
self.sys_supervisor.version,
|
|
)
|
|
|
|
# If already attach
|
|
if docker_container in self.sys_docker.network.containers:
|
|
return
|
|
|
|
# Attach to network
|
|
_LOGGER.info("Connecting Supervisor to hassio-network")
|
|
self.sys_docker.network.attach_container(
|
|
docker_container,
|
|
alias=["supervisor"],
|
|
ipv4=self.sys_docker.network.supervisor,
|
|
)
|
|
|
|
def retag(self) -> Awaitable[None]:
|
|
"""Retag latest image to version."""
|
|
return self.sys_run_in_executor(self._retag)
|
|
|
|
def _retag(self) -> None:
|
|
"""Retag latest image to version.
|
|
|
|
Need run inside executor.
|
|
"""
|
|
try:
|
|
docker_container = self.sys_docker.containers.get(self.name)
|
|
|
|
docker_container.image.tag(self.image, tag=str(self.version))
|
|
docker_container.image.tag(self.image, tag="latest")
|
|
except (docker.errors.DockerException, requests.RequestException) as err:
|
|
raise DockerError(
|
|
f"Can't retag Supervisor version: {err}", _LOGGER.error
|
|
) from err
|
|
|
|
def update_start_tag(self, image: str, version: AwesomeVersion) -> Awaitable[None]:
|
|
"""Update start tag to new version."""
|
|
return self.sys_run_in_executor(self._update_start_tag, image, version)
|
|
|
|
def _update_start_tag(self, image: str, version: AwesomeVersion) -> None:
|
|
"""Update start tag to new version.
|
|
|
|
Need run inside executor.
|
|
"""
|
|
try:
|
|
docker_container = self.sys_docker.containers.get(self.name)
|
|
docker_image = self.sys_docker.images.get(f"{image}:{version!s}")
|
|
|
|
# Find start tag
|
|
for tag in docker_container.image.tags:
|
|
start_image = tag.partition(":")[0]
|
|
start_tag = tag.partition(":")[2] or "latest"
|
|
|
|
# If version tag
|
|
if start_tag != "latest":
|
|
continue
|
|
docker_image.tag(start_image, start_tag)
|
|
docker_image.tag(start_image, version.string)
|
|
|
|
except (docker.errors.DockerException, requests.RequestException) as err:
|
|
raise DockerError(f"Can't fix start tag: {err}", _LOGGER.error) from err
|