Use packages version (#2013)

* Use package version

* more readable

* Fix
This commit is contained in:
Pascal Vizeli 2020-09-04 16:20:07 +02:00 committed by GitHub
parent 51dcbf5db7
commit c85aa664e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 30 additions and 27 deletions

View File

@ -5,6 +5,7 @@ import logging
from typing import Any, Awaitable, Dict, List, Optional from typing import Any, Awaitable, Dict, List, Optional
import docker import docker
from packaging import version as pkg_version
import requests import requests
from . import CommandReturn from . import CommandReturn
@ -431,12 +432,12 @@ class DockerInterface(CoreSysAttributes):
# Check return value # Check return value
return int(docker_container.attrs["State"]["ExitCode"]) != 0 return int(docker_container.attrs["State"]["ExitCode"]) != 0
def get_latest_version(self, key: Any = int) -> Awaitable[str]: def get_latest_version(self) -> Awaitable[str]:
"""Return latest version of local Home Asssistant image.""" """Return latest version of local image."""
return self.sys_run_in_executor(self._get_latest_version, key) return self.sys_run_in_executor(self._get_latest_version)
def _get_latest_version(self, key: Any = int) -> str: def _get_latest_version(self) -> str:
"""Return latest version of local Home Asssistant image. """Return latest version of local image.
Need run inside executor. Need run inside executor.
""" """
@ -446,8 +447,8 @@ class DockerInterface(CoreSysAttributes):
for tag in image.tags: for tag in image.tags:
version = tag.partition(":")[2] version = tag.partition(":")[2]
try: try:
key(version) pkg_version.parse(version)
except (AttributeError, ValueError): except (TypeError, pkg_version.InvalidVersion):
continue continue
available_version.append(version) available_version.append(version)
@ -461,5 +462,5 @@ class DockerInterface(CoreSysAttributes):
_LOGGER.debug("Found %s versions: %s", self.image, available_version) _LOGGER.debug("Found %s versions: %s", self.image, available_version)
# Sort version and return latest 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] return available_version[0]

View File

@ -53,8 +53,8 @@ class HomeAssistantCore(CoreSysAttributes):
try: try:
# Evaluate Version if we lost this information # Evaluate Version if we lost this information
if not self.sys_homeassistant.version: if not self.sys_homeassistant.version:
self.sys_homeassistant.version = await self.instance.get_latest_version( self.sys_homeassistant.version = (
key=pkg_version.parse await self.instance.get_latest_version()
) )
await self.instance.attach(tag=self.sys_homeassistant.version) await self.instance.attach(tag=self.sys_homeassistant.version)

View File

@ -2,6 +2,8 @@
import asyncio import asyncio
import logging import logging
from packaging.version import LegacyVersion, parse as pkg_parse
from ..coresys import CoreSys, CoreSysAttributes from ..coresys import CoreSys, CoreSysAttributes
from ..exceptions import HassioError from ..exceptions import HassioError
from .audio import Audio from .audio import Audio
@ -15,10 +17,10 @@ _LOGGER: logging.Logger = logging.getLogger(__name__)
class PluginManager(CoreSysAttributes): class PluginManager(CoreSysAttributes):
"""Manage supported function for plugins.""" """Manage supported function for plugins."""
required_cli: int = 26 required_cli: LegacyVersion = pkg_parse("26")
required_dns: int = 9 required_dns: LegacyVersion = pkg_parse("9")
required_audio: int = 17 required_audio: LegacyVersion = pkg_parse("17")
required_multicast: int = 3 required_multicast: LegacyVersion = pkg_parse("3")
def __init__(self, coresys: CoreSys): def __init__(self, coresys: CoreSys):
"""Initialize plugin manager.""" """Initialize plugin manager."""
@ -61,7 +63,7 @@ class PluginManager(CoreSysAttributes):
try: try:
await plugin.load() await plugin.load()
except Exception as err: # pylint: disable=broad-except 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) self.sys_capture_exception(err)
# Check requirements # Check requirements
@ -73,18 +75,16 @@ class PluginManager(CoreSysAttributes):
): ):
# Check if need an update # Check if need an update
try: try:
if int(plugin.version) >= required_version: if pkg_parse(plugin.version) >= required_version:
continue
except (TypeError, ValueError):
if plugin.version == "dev":
continue continue
except TypeError:
_LOGGER.warning( _LOGGER.warning(
"Somethings going wrong with requirements on %s", "Somethings going wrong with requirements on %s",
type(plugin).__name__, type(plugin).__name__,
) )
_LOGGER.info( _LOGGER.info(
"Requirement need update for %s - %i", "Requirement need update for %s - %s",
type(plugin).__name__, type(plugin).__name__,
required_version, required_version,
) )
@ -92,12 +92,14 @@ class PluginManager(CoreSysAttributes):
await plugin.update(version=str(required_version)) await plugin.update(version=str(required_version))
except HassioError: except HassioError:
_LOGGER.error( _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__, type(plugin).__name__,
required_version, required_version,
) )
except Exception as err: # pylint: disable=broad-except 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) self.sys_capture_exception(err)
async def repair(self) -> None: async def repair(self) -> None:
@ -123,5 +125,5 @@ class PluginManager(CoreSysAttributes):
try: try:
await plugin.stop() await plugin.stop()
except Exception as err: # pylint: disable=broad-except 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) self.sys_capture_exception(err)

View File

@ -88,7 +88,7 @@ class Audio(JsonConfig, CoreSysAttributes):
try: try:
# Evaluate Version if we lost this information # Evaluate Version if we lost this information
if not self.version: 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) await self.instance.attach(tag=self.version)
except DockerAPIError: except DockerAPIError:

View File

@ -76,7 +76,7 @@ class HaCli(CoreSysAttributes, JsonConfig):
try: try:
# Evaluate Version if we lost this information # Evaluate Version if we lost this information
if not self.version: 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) await self.instance.attach(tag=self.version)
except DockerAPIError: except DockerAPIError:

View File

@ -123,7 +123,7 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
try: try:
# Evaluate Version if we lost this information # Evaluate Version if we lost this information
if not self.version: 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) await self.instance.attach(tag=self.version)
except DockerAPIError: except DockerAPIError:

View File

@ -70,7 +70,7 @@ class Multicast(JsonConfig, CoreSysAttributes):
try: try:
# Evaluate Version if we lost this information # Evaluate Version if we lost this information
if not self.version: 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) await self.instance.attach(tag=self.version)
except DockerAPIError: except DockerAPIError: