New error handling (#2680)

* New error handling

* Extend it
This commit is contained in:
Pascal Vizeli 2021-03-16 12:17:05 +01:00 committed by GitHub
parent d423252bc7
commit 390676dbc4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 55 additions and 31 deletions

View File

@ -154,17 +154,16 @@ class AddonManager(CoreSysAttributes):
async def install(self, slug: str) -> None: async def install(self, slug: str) -> None:
"""Install an add-on.""" """Install an add-on."""
if slug in self.local: if slug in self.local:
_LOGGER.warning("Add-on %s is already installed", slug) raise AddonsError(f"Add-on {slug} is already installed", _LOGGER.warning)
return
store = self.store.get(slug) store = self.store.get(slug)
if not store: if not store:
_LOGGER.error("Add-on %s not exists", slug) raise AddonsError(f"Add-on {slug} not exists", _LOGGER.error)
raise AddonsError()
if not store.available: if not store.available:
_LOGGER.error("Add-on %s not supported on that platform", slug) raise AddonsNotSupportedError(
raise AddonsNotSupportedError() f"Add-on {slug} not supported on that platform", _LOGGER.error
)
self.data.install(store) self.data.install(store)
addon = Addon(self.coresys, slug) addon = Addon(self.coresys, slug)
@ -256,23 +255,23 @@ class AddonManager(CoreSysAttributes):
async def update(self, slug: str) -> None: async def update(self, slug: str) -> None:
"""Update add-on.""" """Update add-on."""
if slug not in self.local: if slug not in self.local:
_LOGGER.error("Add-on %s is not installed", slug) raise AddonsError(f"Add-on {slug} is not installed", _LOGGER.error)
raise AddonsError()
addon = self.local[slug] addon = self.local[slug]
if addon.is_detached: if addon.is_detached:
_LOGGER.error("Add-on %s is not available inside store", slug) raise AddonsError(
raise AddonsError() f"Add-on {slug} is not available inside store", _LOGGER.error
)
store = self.store[slug] store = self.store[slug]
if addon.version == store.version: if addon.version == store.version:
_LOGGER.warning("No update available for add-on %s", slug) raise AddonsError(f"No update available for add-on {slug}", _LOGGER.warning)
return
# Check if available, Maybe something have changed # Check if available, Maybe something have changed
if not store.available: if not store.available:
_LOGGER.error("Add-on %s not supported on that platform", slug) raise AddonsNotSupportedError(
raise AddonsNotSupportedError() f"Add-on {slug} not supported on that platform", _LOGGER.error
)
# Update instance # Update instance
last_state: AddonState = addon.state last_state: AddonState = addon.state

View File

@ -1,9 +1,22 @@
"""Core Exceptions.""" """Core Exceptions."""
from typing import Callable, Optional
class HassioError(Exception): class HassioError(Exception):
"""Root exception.""" """Root exception."""
def __init__(
self,
message: Optional[str] = None,
logger: Optional[Callable[..., None]] = None,
) -> None:
"""Raise & log."""
if logger:
logger(message)
super().__init__(message)
class HassioNotSupportedError(HassioError): class HassioNotSupportedError(HassioError):
"""Function is not supported.""" """Function is not supported."""

View File

@ -143,8 +143,9 @@ class HassOS(CoreSysAttributes):
# Check installed version # Check installed version
self._check_host() self._check_host()
if version == self.version: if version == self.version:
_LOGGER.warning("Version %s is already installed", version) raise HassOSUpdateError(
raise HassOSUpdateError() f"Version {version!s} is already installed", _LOGGER.warning
)
# Fetch files from internet # Fetch files from internet
int_ota = await self._download_raucb(version) int_ota = await self._download_raucb(version)

View File

@ -182,8 +182,9 @@ class HomeAssistantCore(CoreSysAttributes):
exists = await self.instance.exists() exists = await self.instance.exists()
if exists and version == self.instance.version: if exists and version == self.instance.version:
_LOGGER.warning("Version %s is already installed", version) raise HomeAssistantUpdateError(
return f"Version {version!s} is already installed", _LOGGER.warning
)
# process an update # process an update
async def _update(to_version: AwesomeVersion) -> None: async def _update(to_version: AwesomeVersion) -> None:
@ -194,8 +195,9 @@ class HomeAssistantCore(CoreSysAttributes):
to_version, image=self.sys_updater.image_homeassistant to_version, image=self.sys_updater.image_homeassistant
) )
except DockerError as err: except DockerError as err:
_LOGGER.warning("Updating Home Assistant image failed") raise HomeAssistantUpdateError(
raise HomeAssistantUpdateError() from err "Updating Home Assistant image failed", _LOGGER.warning
) from err
else: else:
self.sys_homeassistant.version = self.instance.version self.sys_homeassistant.version = self.instance.version
self.sys_homeassistant.image = self.sys_updater.image_homeassistant self.sys_homeassistant.image = self.sys_updater.image_homeassistant
@ -344,8 +346,7 @@ class HomeAssistantCore(CoreSysAttributes):
# If not valid # If not valid
if result.exit_code is None: if result.exit_code is None:
_LOGGER.error("Fatal error on config check!") raise HomeAssistantError("Fatal error on config check!", _LOGGER.error)
raise HomeAssistantError()
# Convert output # Convert output
log = convert_to_ascii(result.output) log = convert_to_ascii(result.output)

View File

@ -2,7 +2,10 @@
import asyncio import asyncio
import logging import logging
from pathlib import Path from pathlib import Path
from typing import Set from typing import Awaitable, Set
from awesomeversion.awesomeversion import AwesomeVersion
from awesomeversion.exceptions import AwesomeVersionCompare
from ..const import FOLDER_HOMEASSISTANT, SNAPSHOT_FULL, SNAPSHOT_PARTIAL, CoreState from ..const import FOLDER_HOMEASSISTANT, SNAPSHOT_FULL, SNAPSHOT_PARTIAL, CoreState
from ..coresys import CoreSysAttributes from ..coresys import CoreSysAttributes
@ -263,9 +266,7 @@ class SnapshotManager(CoreSysAttributes):
# Start homeassistant restore # Start homeassistant restore
_LOGGER.info("Restoring %s Home-Assistant", snapshot.slug) _LOGGER.info("Restoring %s Home-Assistant", snapshot.slug)
snapshot.restore_homeassistant() snapshot.restore_homeassistant()
task_hass = self.sys_create_task( task_hass = self._update_core_task(snapshot.homeassistant_version)
self.sys_homeassistant.core.update(snapshot.homeassistant_version)
)
# Restore repositories # Restore repositories
_LOGGER.info("Restoring %s Repositories", snapshot.slug) _LOGGER.info("Restoring %s Repositories", snapshot.slug)
@ -354,11 +355,7 @@ class SnapshotManager(CoreSysAttributes):
task_hass = None task_hass = None
if homeassistant: if homeassistant:
_LOGGER.info("Restoring %s Home-Assistant", snapshot.slug) _LOGGER.info("Restoring %s Home-Assistant", snapshot.slug)
task_hass = self.sys_create_task( task_hass = self._update_core_task(snapshot.homeassistant_version)
self.sys_homeassistant.core.update(
snapshot.homeassistant_version
)
)
if addons: if addons:
_LOGGER.info("Restoring %s Repositories", snapshot.slug) _LOGGER.info("Restoring %s Repositories", snapshot.slug)
@ -393,3 +390,16 @@ class SnapshotManager(CoreSysAttributes):
finally: finally:
self.sys_core.state = CoreState.RUNNING self.sys_core.state = CoreState.RUNNING
self.lock.release() self.lock.release()
def _update_core_task(self, version: AwesomeVersion) -> Awaitable[None]:
"""Process core update if needed and make awaitable object."""
async def _core_update():
try:
if version == self.sys_homeassistant.version:
return
except (AwesomeVersionCompare, TypeError):
pass
await self.sys_homeassistant.core.update(version)
return self.sys_create_task(_core_update())