From c85aa664e1ef09f67f506f56294cf2181dc7e9f6 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Fri, 4 Sep 2020 16:20:07 +0200 Subject: [PATCH] Use packages version (#2013) * Use package version * more readable * Fix --- supervisor/docker/interface.py | 17 +++++++++-------- supervisor/homeassistant/core.py | 4 ++-- supervisor/plugins/__init__.py | 28 +++++++++++++++------------- supervisor/plugins/audio.py | 2 +- supervisor/plugins/cli.py | 2 +- supervisor/plugins/dns.py | 2 +- supervisor/plugins/multicast.py | 2 +- 7 files changed, 30 insertions(+), 27 deletions(-) diff --git a/supervisor/docker/interface.py b/supervisor/docker/interface.py index 5758dba17..f387b84bc 100644 --- a/supervisor/docker/interface.py +++ b/supervisor/docker/interface.py @@ -5,6 +5,7 @@ import logging from typing import Any, Awaitable, Dict, List, Optional import docker +from packaging import version as pkg_version import requests from . import CommandReturn @@ -431,12 +432,12 @@ class DockerInterface(CoreSysAttributes): # Check return value return int(docker_container.attrs["State"]["ExitCode"]) != 0 - def get_latest_version(self, key: Any = int) -> Awaitable[str]: - """Return latest version of local Home Asssistant image.""" - return self.sys_run_in_executor(self._get_latest_version, key) + def get_latest_version(self) -> Awaitable[str]: + """Return latest version of local image.""" + return self.sys_run_in_executor(self._get_latest_version) - def _get_latest_version(self, key: Any = int) -> str: - """Return latest version of local Home Asssistant image. + def _get_latest_version(self) -> str: + """Return latest version of local image. Need run inside executor. """ @@ -446,8 +447,8 @@ class DockerInterface(CoreSysAttributes): for tag in image.tags: version = tag.partition(":")[2] try: - key(version) - except (AttributeError, ValueError): + pkg_version.parse(version) + except (TypeError, pkg_version.InvalidVersion): continue available_version.append(version) @@ -461,5 +462,5 @@ class DockerInterface(CoreSysAttributes): _LOGGER.debug("Found %s versions: %s", self.image, available_version) # Sort version and return latest version - available_version.sort(key=key, reverse=True) + available_version.sort(key=pkg_version.parse, reverse=True) return available_version[0] diff --git a/supervisor/homeassistant/core.py b/supervisor/homeassistant/core.py index a8e3cc0b2..e6810f3e9 100644 --- a/supervisor/homeassistant/core.py +++ b/supervisor/homeassistant/core.py @@ -53,8 +53,8 @@ class HomeAssistantCore(CoreSysAttributes): try: # Evaluate Version if we lost this information if not self.sys_homeassistant.version: - self.sys_homeassistant.version = await self.instance.get_latest_version( - key=pkg_version.parse + self.sys_homeassistant.version = ( + await self.instance.get_latest_version() ) await self.instance.attach(tag=self.sys_homeassistant.version) diff --git a/supervisor/plugins/__init__.py b/supervisor/plugins/__init__.py index ac70b1a6a..1bb2cb713 100644 --- a/supervisor/plugins/__init__.py +++ b/supervisor/plugins/__init__.py @@ -2,6 +2,8 @@ import asyncio import logging +from packaging.version import LegacyVersion, parse as pkg_parse + from ..coresys import CoreSys, CoreSysAttributes from ..exceptions import HassioError from .audio import Audio @@ -15,10 +17,10 @@ _LOGGER: logging.Logger = logging.getLogger(__name__) class PluginManager(CoreSysAttributes): """Manage supported function for plugins.""" - required_cli: int = 26 - required_dns: int = 9 - required_audio: int = 17 - required_multicast: int = 3 + required_cli: LegacyVersion = pkg_parse("26") + required_dns: LegacyVersion = pkg_parse("9") + required_audio: LegacyVersion = pkg_parse("17") + required_multicast: LegacyVersion = pkg_parse("3") def __init__(self, coresys: CoreSys): """Initialize plugin manager.""" @@ -61,7 +63,7 @@ class PluginManager(CoreSysAttributes): try: await plugin.load() except Exception as err: # pylint: disable=broad-except - _LOGGER.warning("Can't load plugin %s", type(plugin).__name__) + _LOGGER.warning("Can't load plugin %s: %s", type(plugin).__name__, err) self.sys_capture_exception(err) # Check requirements @@ -73,18 +75,16 @@ class PluginManager(CoreSysAttributes): ): # Check if need an update try: - if int(plugin.version) >= required_version: - continue - except (TypeError, ValueError): - if plugin.version == "dev": + if pkg_parse(plugin.version) >= required_version: continue + except TypeError: _LOGGER.warning( "Somethings going wrong with requirements on %s", type(plugin).__name__, ) _LOGGER.info( - "Requirement need update for %s - %i", + "Requirement need update for %s - %s", type(plugin).__name__, required_version, ) @@ -92,12 +92,14 @@ class PluginManager(CoreSysAttributes): await plugin.update(version=str(required_version)) except HassioError: _LOGGER.error( - "Can't update %s to %i but it's a reuirement, the Supervisor is not health now!", + "Can't update %s to %s but it's a reuirement, the Supervisor is not health now!", type(plugin).__name__, required_version, ) except Exception as err: # pylint: disable=broad-except - _LOGGER.warning("Can't update plugin %s", type(plugin).__name__) + _LOGGER.warning( + "Can't update plugin %s: %s", type(plugin).__name__, err + ) self.sys_capture_exception(err) async def repair(self) -> None: @@ -123,5 +125,5 @@ class PluginManager(CoreSysAttributes): try: await plugin.stop() except Exception as err: # pylint: disable=broad-except - _LOGGER.warning("Can't stop plugin %s", type(plugin).__name__) + _LOGGER.warning("Can't stop plugin %s: %s", type(plugin).__name__, err) self.sys_capture_exception(err) diff --git a/supervisor/plugins/audio.py b/supervisor/plugins/audio.py index 4d5e81416..e41e1f30b 100644 --- a/supervisor/plugins/audio.py +++ b/supervisor/plugins/audio.py @@ -88,7 +88,7 @@ class Audio(JsonConfig, CoreSysAttributes): try: # Evaluate Version if we lost this information if not self.version: - self.version = await self.instance.get_latest_version(key=int) + self.version = await self.instance.get_latest_version() await self.instance.attach(tag=self.version) except DockerAPIError: diff --git a/supervisor/plugins/cli.py b/supervisor/plugins/cli.py index d37dd71d8..b8d4e8209 100644 --- a/supervisor/plugins/cli.py +++ b/supervisor/plugins/cli.py @@ -76,7 +76,7 @@ class HaCli(CoreSysAttributes, JsonConfig): try: # Evaluate Version if we lost this information if not self.version: - self.version = await self.instance.get_latest_version(key=int) + self.version = await self.instance.get_latest_version() await self.instance.attach(tag=self.version) except DockerAPIError: diff --git a/supervisor/plugins/dns.py b/supervisor/plugins/dns.py index bfa293b2c..0845cf12d 100644 --- a/supervisor/plugins/dns.py +++ b/supervisor/plugins/dns.py @@ -123,7 +123,7 @@ class CoreDNS(JsonConfig, CoreSysAttributes): try: # Evaluate Version if we lost this information if not self.version: - self.version = await self.instance.get_latest_version(key=int) + self.version = await self.instance.get_latest_version() await self.instance.attach(tag=self.version) except DockerAPIError: diff --git a/supervisor/plugins/multicast.py b/supervisor/plugins/multicast.py index 8ca671111..bfd863297 100644 --- a/supervisor/plugins/multicast.py +++ b/supervisor/plugins/multicast.py @@ -70,7 +70,7 @@ class Multicast(JsonConfig, CoreSysAttributes): try: # Evaluate Version if we lost this information if not self.version: - self.version = await self.instance.get_latest_version(key=int) + self.version = await self.instance.get_latest_version() await self.instance.attach(tag=self.version) except DockerAPIError: