Make exeption more useful (#1922)

This commit is contained in:
Pascal Vizeli 2020-08-14 23:12:54 +02:00 committed by GitHub
parent 835509901f
commit bbef706a33
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
27 changed files with 102 additions and 102 deletions

View File

@ -155,7 +155,7 @@ class AddonManager(CoreSysAttributes):
await addon.instance.install(store.version, store.image) await addon.instance.install(store.version, store.image)
except DockerAPIError: except DockerAPIError:
self.data.uninstall(addon) self.data.uninstall(addon)
raise AddonsError() from None raise AddonsError()
else: else:
self.local[slug] = addon self.local[slug] = addon
@ -175,7 +175,7 @@ class AddonManager(CoreSysAttributes):
try: try:
await addon.instance.remove() await addon.instance.remove()
except DockerAPIError: except DockerAPIError:
raise AddonsError() from None raise AddonsError()
await addon.remove_data() await addon.remove_data()
@ -246,7 +246,7 @@ class AddonManager(CoreSysAttributes):
with suppress(DockerAPIError): with suppress(DockerAPIError):
await addon.instance.cleanup() await addon.instance.cleanup()
except DockerAPIError: except DockerAPIError:
raise AddonsError() from None raise AddonsError()
else: else:
self.data.update(store) self.data.update(store)
_LOGGER.info("Add-on '%s' successfully updated", slug) _LOGGER.info("Add-on '%s' successfully updated", slug)
@ -284,7 +284,7 @@ class AddonManager(CoreSysAttributes):
await addon.instance.remove() await addon.instance.remove()
await addon.instance.install(addon.version) await addon.instance.install(addon.version)
except DockerAPIError: except DockerAPIError:
raise AddonsError() from None raise AddonsError()
else: else:
self.data.update(store) self.data.update(store)
_LOGGER.info("Add-on '%s' successfully rebuilt", slug) _LOGGER.info("Add-on '%s' successfully rebuilt", slug)

View File

@ -489,14 +489,14 @@ class Addon(AddonModel):
try: try:
await self.instance.run() await self.instance.run()
except DockerAPIError: except DockerAPIError:
raise AddonsError() from None raise AddonsError()
async def stop(self) -> None: async def stop(self) -> None:
"""Stop add-on.""" """Stop add-on."""
try: try:
return await self.instance.stop() return await self.instance.stop()
except DockerAPIError: except DockerAPIError:
raise AddonsError() from None raise AddonsError()
async def restart(self) -> None: async def restart(self) -> None:
"""Restart add-on.""" """Restart add-on."""
@ -516,7 +516,7 @@ class Addon(AddonModel):
try: try:
return await self.instance.stats() return await self.instance.stats()
except DockerAPIError: except DockerAPIError:
raise AddonsError() from None raise AddonsError()
async def write_stdin(self, data) -> None: async def write_stdin(self, data) -> None:
"""Write data to add-on stdin. """Write data to add-on stdin.
@ -530,7 +530,7 @@ class Addon(AddonModel):
try: try:
return await self.instance.write_stdin(data) return await self.instance.write_stdin(data)
except DockerAPIError: except DockerAPIError:
raise AddonsError() from None raise AddonsError()
async def snapshot(self, tar_file: tarfile.TarFile) -> None: async def snapshot(self, tar_file: tarfile.TarFile) -> None:
"""Snapshot state of an add-on.""" """Snapshot state of an add-on."""
@ -542,7 +542,7 @@ class Addon(AddonModel):
try: try:
await self.instance.export_image(temp_path.joinpath("image.tar")) await self.instance.export_image(temp_path.joinpath("image.tar"))
except DockerAPIError: except DockerAPIError:
raise AddonsError() from None raise AddonsError()
data = { data = {
ATTR_USER: self.persist, ATTR_USER: self.persist,
@ -556,7 +556,7 @@ class Addon(AddonModel):
write_json_file(temp_path.joinpath("addon.json"), data) write_json_file(temp_path.joinpath("addon.json"), data)
except JsonFileError: except JsonFileError:
_LOGGER.error("Can't save meta for %s", self.slug) _LOGGER.error("Can't save meta for %s", self.slug)
raise AddonsError() from None raise AddonsError()
# Store AppArmor Profile # Store AppArmor Profile
if self.sys_host.apparmor.exists(self.slug): if self.sys_host.apparmor.exists(self.slug):
@ -565,7 +565,7 @@ class Addon(AddonModel):
self.sys_host.apparmor.backup_profile(self.slug, profile) self.sys_host.apparmor.backup_profile(self.slug, profile)
except HostAppArmorError: except HostAppArmorError:
_LOGGER.error("Can't backup AppArmor profile") _LOGGER.error("Can't backup AppArmor profile")
raise AddonsError() from None raise AddonsError()
# write into tarfile # write into tarfile
def _write_tarfile(): def _write_tarfile():
@ -588,7 +588,7 @@ class Addon(AddonModel):
await self.sys_run_in_executor(_write_tarfile) await self.sys_run_in_executor(_write_tarfile)
except (tarfile.TarError, OSError) as err: except (tarfile.TarError, OSError) as err:
_LOGGER.error("Can't write tarfile %s: %s", tar_file, err) _LOGGER.error("Can't write tarfile %s: %s", tar_file, err)
raise AddonsError() from None raise AddonsError()
_LOGGER.info("Finish snapshot for addon %s", self.slug) _LOGGER.info("Finish snapshot for addon %s", self.slug)
@ -605,13 +605,13 @@ class Addon(AddonModel):
await self.sys_run_in_executor(_extract_tarfile) await self.sys_run_in_executor(_extract_tarfile)
except tarfile.TarError as err: except tarfile.TarError as err:
_LOGGER.error("Can't read tarfile %s: %s", tar_file, err) _LOGGER.error("Can't read tarfile %s: %s", tar_file, err)
raise AddonsError() from None raise AddonsError()
# Read snapshot data # Read snapshot data
try: try:
data = read_json_file(Path(temp, "addon.json")) data = read_json_file(Path(temp, "addon.json"))
except JsonFileError: except JsonFileError:
raise AddonsError() from None raise AddonsError()
# Validate # Validate
try: try:
@ -622,7 +622,7 @@ class Addon(AddonModel):
self.slug, self.slug,
humanize_error(data, err), humanize_error(data, err),
) )
raise AddonsError() from None raise AddonsError()
# If available # If available
if not self._available(data[ATTR_SYSTEM]): if not self._available(data[ATTR_SYSTEM]):
@ -669,7 +669,7 @@ class Addon(AddonModel):
await self.sys_run_in_executor(_restore_data) await self.sys_run_in_executor(_restore_data)
except shutil.Error as err: except shutil.Error as err:
_LOGGER.error("Can't restore origin data: %s", err) _LOGGER.error("Can't restore origin data: %s", err)
raise AddonsError() from None raise AddonsError()
# Restore AppArmor # Restore AppArmor
profile_file = Path(temp, "apparmor.txt") profile_file = Path(temp, "apparmor.txt")
@ -680,7 +680,7 @@ class Addon(AddonModel):
_LOGGER.error( _LOGGER.error(
"Can't restore AppArmor profile for add-on %s", self.slug "Can't restore AppArmor profile for add-on %s", self.slug
) )
raise AddonsError() from None raise AddonsError()
# Run add-on # Run add-on
if data[ATTR_STATE] == STATE_STARTED: if data[ATTR_STATE] == STATE_STARTED:

View File

@ -362,7 +362,7 @@ def validate_options(coresys: CoreSys, raw_schema: Dict[str, Any]):
# normal value # normal value
options[key] = _single_validate(coresys, typ, value, key) options[key] = _single_validate(coresys, typ, value, key)
except (IndexError, KeyError): except (IndexError, KeyError):
raise vol.Invalid(f"Type error for {key}") from None raise vol.Invalid(f"Type error for {key}")
_check_missing_options(raw_schema, options, "root") _check_missing_options(raw_schema, options, "root")
return options return options

View File

@ -104,7 +104,7 @@ class APIIngress(CoreSysAttributes):
except aiohttp.ClientError as err: except aiohttp.ClientError as err:
_LOGGER.error("Ingress error: %s", err) _LOGGER.error("Ingress error: %s", err)
raise HTTPBadGateway() from None raise HTTPBadGateway()
async def _handle_websocket( async def _handle_websocket(
self, request: web.Request, addon: Addon, path: str self, request: web.Request, addon: Addon, path: str

View File

@ -120,7 +120,7 @@ async def api_validate(
try: try:
data_validated = schema(data) data_validated = schema(data)
except vol.Invalid as ex: except vol.Invalid as ex:
raise APIError(humanize_error(data, ex)) from None raise APIError(humanize_error(data, ex))
if not origin: if not origin:
return data_validated return data_validated

View File

@ -79,7 +79,7 @@ class Discovery(CoreSysAttributes, JsonConfig):
config = valid_discovery_config(service, config) config = valid_discovery_config(service, config)
except vol.Invalid as err: except vol.Invalid as err:
_LOGGER.error("Invalid discovery %s config", humanize_error(config, err)) _LOGGER.error("Invalid discovery %s config", humanize_error(config, err))
raise DiscoveryError() from None raise DiscoveryError()
# Create message # Create message
message = Message(addon.slug, service, config) message = Message(addon.slug, service, config)

View File

@ -130,7 +130,7 @@ class DockerAPI:
) )
except docker.errors.DockerException as err: except docker.errors.DockerException as err:
_LOGGER.error("Can't create container from %s: %s", name, err) _LOGGER.error("Can't create container from %s: %s", name, err)
raise DockerAPIError() from None raise DockerAPIError()
# Attach network # Attach network
if not network_mode: if not network_mode:
@ -148,7 +148,7 @@ class DockerAPI:
container.start() container.start()
except docker.errors.DockerException as err: except docker.errors.DockerException as err:
_LOGGER.error("Can't start %s: %s", name, err) _LOGGER.error("Can't start %s: %s", name, err)
raise DockerAPIError() from None raise DockerAPIError()
# Update metadata # Update metadata
with suppress(docker.errors.DockerException): with suppress(docker.errors.DockerException):
@ -186,7 +186,7 @@ class DockerAPI:
except docker.errors.DockerException as err: except docker.errors.DockerException as err:
_LOGGER.error("Can't execute command: %s", err) _LOGGER.error("Can't execute command: %s", err)
raise DockerAPIError() from None raise DockerAPIError()
finally: finally:
# cleanup container # cleanup container

View File

@ -398,7 +398,7 @@ class DockerAddon(DockerInterface):
except docker.errors.DockerException as err: except docker.errors.DockerException as err:
_LOGGER.error("Can't build %s:%s: %s", self.image, tag, err) _LOGGER.error("Can't build %s:%s: %s", self.image, tag, err)
raise DockerAPIError() from None raise DockerAPIError()
_LOGGER.info("Build %s:%s done", self.image, tag) _LOGGER.info("Build %s:%s done", self.image, tag)
@ -416,7 +416,7 @@ class DockerAddon(DockerInterface):
image = self.sys_docker.api.get_image(f"{self.image}:{self.version}") image = self.sys_docker.api.get_image(f"{self.image}:{self.version}")
except docker.errors.DockerException as err: except docker.errors.DockerException as err:
_LOGGER.error("Can't fetch image %s: %s", self.image, err) _LOGGER.error("Can't fetch image %s: %s", self.image, err)
raise DockerAPIError() from None raise DockerAPIError()
_LOGGER.info("Export image %s to %s", self.image, tar_file) _LOGGER.info("Export image %s to %s", self.image, tar_file)
try: try:
@ -425,7 +425,7 @@ class DockerAddon(DockerInterface):
write_tar.write(chunk) write_tar.write(chunk)
except (OSError, requests.exceptions.ReadTimeout) as err: except (OSError, requests.exceptions.ReadTimeout) as err:
_LOGGER.error("Can't write tar file %s: %s", tar_file, err) _LOGGER.error("Can't write tar file %s: %s", tar_file, err)
raise DockerAPIError() from None raise DockerAPIError()
_LOGGER.info("Export image %s done", self.image) _LOGGER.info("Export image %s done", self.image)
@ -446,7 +446,7 @@ class DockerAddon(DockerInterface):
docker_image = self.sys_docker.images.get(f"{self.image}:{self.version}") docker_image = self.sys_docker.images.get(f"{self.image}:{self.version}")
except (docker.errors.DockerException, OSError) as err: except (docker.errors.DockerException, OSError) as err:
_LOGGER.error("Can't import image %s: %s", self.image, err) _LOGGER.error("Can't import image %s: %s", self.image, err)
raise DockerAPIError() from None raise DockerAPIError()
self._meta = docker_image.attrs self._meta = docker_image.attrs
_LOGGER.info("Import image %s and version %s", tar_file, self.version) _LOGGER.info("Import image %s and version %s", tar_file, self.version)
@ -465,7 +465,7 @@ class DockerAddon(DockerInterface):
Need run inside executor. Need run inside executor.
""" """
if not self._is_running(): if not self._is_running():
raise DockerAPIError() from None raise DockerAPIError()
try: try:
# Load needed docker objects # Load needed docker objects
@ -473,7 +473,7 @@ class DockerAddon(DockerInterface):
socket = container.attach_socket(params={"stdin": 1, "stream": 1}) socket = container.attach_socket(params={"stdin": 1, "stream": 1})
except docker.errors.DockerException as err: except docker.errors.DockerException as err:
_LOGGER.error("Can't attach to %s stdin: %s", self.name, err) _LOGGER.error("Can't attach to %s stdin: %s", self.name, err)
raise DockerAPIError() from None raise DockerAPIError()
try: try:
# Write to stdin # Write to stdin
@ -482,7 +482,7 @@ class DockerAddon(DockerInterface):
socket.close() socket.close()
except OSError as err: except OSError as err:
_LOGGER.error("Can't write to %s stdin: %s", self.name, err) _LOGGER.error("Can't write to %s stdin: %s", self.name, err)
raise DockerAPIError() from None raise DockerAPIError()
def _stop(self, remove_container=True) -> None: def _stop(self, remove_container=True) -> None:
"""Stop/remove Docker container. """Stop/remove Docker container.

View File

@ -106,7 +106,7 @@ class DockerInterface(CoreSysAttributes):
"Available space in /data is: %s GiB", "Available space in /data is: %s GiB",
free_space, free_space,
) )
raise DockerAPIError() from None raise DockerAPIError()
else: else:
self._meta = docker_image.attrs self._meta = docker_image.attrs
@ -162,7 +162,7 @@ class DockerInterface(CoreSysAttributes):
# Successfull? # Successfull?
if not self._meta: if not self._meta:
raise DockerAPIError() from None raise DockerAPIError()
_LOGGER.info("Attach to %s with version %s", self.image, self.version) _LOGGER.info("Attach to %s with version %s", self.image, self.version)
@process_lock @process_lock
@ -190,7 +190,7 @@ class DockerInterface(CoreSysAttributes):
try: try:
docker_container = self.sys_docker.containers.get(self.name) docker_container = self.sys_docker.containers.get(self.name)
except docker.errors.DockerException: except docker.errors.DockerException:
raise DockerAPIError() from None raise DockerAPIError()
if docker_container.status == "running": if docker_container.status == "running":
_LOGGER.info("Stop %s application", self.name) _LOGGER.info("Stop %s application", self.name)
@ -215,14 +215,14 @@ class DockerInterface(CoreSysAttributes):
try: try:
docker_container = self.sys_docker.containers.get(self.name) docker_container = self.sys_docker.containers.get(self.name)
except docker.errors.DockerException: except docker.errors.DockerException:
raise DockerAPIError() from None raise DockerAPIError()
_LOGGER.info("Start %s", self.name) _LOGGER.info("Start %s", self.name)
try: try:
docker_container.start() docker_container.start()
except docker.errors.DockerException as err: except docker.errors.DockerException as err:
_LOGGER.error("Can't start %s: %s", self.name, err) _LOGGER.error("Can't start %s: %s", self.name, err)
raise DockerAPIError() from None raise DockerAPIError()
@process_lock @process_lock
def remove(self) -> Awaitable[None]: def remove(self) -> Awaitable[None]:
@ -251,7 +251,7 @@ class DockerInterface(CoreSysAttributes):
except docker.errors.DockerException as err: except docker.errors.DockerException as err:
_LOGGER.warning("Can't remove image %s: %s", self.image, err) _LOGGER.warning("Can't remove image %s: %s", self.image, err)
raise DockerAPIError() from None raise DockerAPIError()
self._meta = None self._meta = None
@ -320,7 +320,7 @@ class DockerInterface(CoreSysAttributes):
origin = self.sys_docker.images.get(f"{self.image}:{self.version}") origin = self.sys_docker.images.get(f"{self.image}:{self.version}")
except docker.errors.DockerException: except docker.errors.DockerException:
_LOGGER.warning("Can't find %s for cleanup", self.image) _LOGGER.warning("Can't find %s for cleanup", self.image)
raise DockerAPIError() from None raise DockerAPIError()
# Cleanup Current # Cleanup Current
for image in self.sys_docker.images.list(name=self.image): for image in self.sys_docker.images.list(name=self.image):
@ -353,14 +353,14 @@ class DockerInterface(CoreSysAttributes):
try: try:
container = self.sys_docker.containers.get(self.name) container = self.sys_docker.containers.get(self.name)
except docker.errors.DockerException: except docker.errors.DockerException:
raise DockerAPIError() from None raise DockerAPIError()
_LOGGER.info("Restart %s", self.image) _LOGGER.info("Restart %s", self.image)
try: try:
container.restart(timeout=self.timeout) container.restart(timeout=self.timeout)
except docker.errors.DockerException as err: except docker.errors.DockerException as err:
_LOGGER.warning("Can't restart %s: %s", self.image, err) _LOGGER.warning("Can't restart %s: %s", self.image, err)
raise DockerAPIError() from None raise DockerAPIError()
@process_lock @process_lock
def execute_command(self, command: str) -> Awaitable[CommandReturn]: def execute_command(self, command: str) -> Awaitable[CommandReturn]:
@ -386,14 +386,14 @@ class DockerInterface(CoreSysAttributes):
try: try:
docker_container = self.sys_docker.containers.get(self.name) docker_container = self.sys_docker.containers.get(self.name)
except docker.errors.DockerException: except docker.errors.DockerException:
raise DockerAPIError() from None raise DockerAPIError()
try: try:
stats = docker_container.stats(stream=False) stats = docker_container.stats(stream=False)
return DockerStats(stats) return DockerStats(stats)
except docker.errors.DockerException as err: except docker.errors.DockerException as err:
_LOGGER.error("Can't read stats from %s: %s", self.name, err) _LOGGER.error("Can't read stats from %s: %s", self.name, err)
raise DockerAPIError() from None raise DockerAPIError()
def is_fails(self) -> Awaitable[bool]: def is_fails(self) -> Awaitable[bool]:
"""Return True if Docker is failing state. """Return True if Docker is failing state.

View File

@ -105,7 +105,7 @@ class DockerNetwork:
self.network.connect(container, aliases=alias, ipv4_address=ipv4_address) self.network.connect(container, aliases=alias, ipv4_address=ipv4_address)
except docker.errors.APIError as err: except docker.errors.APIError as err:
_LOGGER.error("Can't link container to hassio-net: %s", err) _LOGGER.error("Can't link container to hassio-net: %s", err)
raise DockerAPIError() from None raise DockerAPIError()
self.network.reload() self.network.reload()
@ -125,7 +125,7 @@ class DockerNetwork:
except docker.errors.APIError as err: except docker.errors.APIError as err:
_LOGGER.warning("Can't disconnect container from default: %s", err) _LOGGER.warning("Can't disconnect container from default: %s", err)
raise DockerAPIError() from None raise DockerAPIError()
def stale_cleanup(self, container_name: str): def stale_cleanup(self, container_name: str):
"""Remove force a container from Network. """Remove force a container from Network.

View File

@ -39,7 +39,7 @@ class DockerSupervisor(DockerInterface, CoreSysAttributes):
try: try:
docker_container = self.sys_docker.containers.get(self.name) docker_container = self.sys_docker.containers.get(self.name)
except docker.errors.DockerException: except docker.errors.DockerException:
raise DockerAPIError() from None raise DockerAPIError()
self._meta = docker_container.attrs self._meta = docker_container.attrs
_LOGGER.info( _LOGGER.info(
@ -76,7 +76,7 @@ class DockerSupervisor(DockerInterface, CoreSysAttributes):
docker_container.image.tag(self.image, tag="latest") docker_container.image.tag(self.image, tag="latest")
except docker.errors.DockerException as err: except docker.errors.DockerException as err:
_LOGGER.error("Can't retag supervisor version: %s", err) _LOGGER.error("Can't retag supervisor version: %s", err)
raise DockerAPIError() from None raise DockerAPIError()
def update_start_tag(self, image: str, version: str) -> Awaitable[None]: def update_start_tag(self, image: str, version: str) -> Awaitable[None]:
"""Update start tag to new version.""" """Update start tag to new version."""
@ -103,4 +103,4 @@ class DockerSupervisor(DockerInterface, CoreSysAttributes):
except docker.errors.DockerException as err: except docker.errors.DockerException as err:
_LOGGER.error("Can't fix start tag: %s", err) _LOGGER.error("Can't fix start tag: %s", err)
raise DockerAPIError() from None raise DockerAPIError()

View File

@ -142,7 +142,7 @@ class HassOS(CoreSysAttributes):
except DBusError: except DBusError:
_LOGGER.error("Rauc communication error") _LOGGER.error("Rauc communication error")
raise HassOSUpdateError() from None raise HassOSUpdateError()
finally: finally:
int_ota.unlink() int_ota.unlink()

View File

@ -344,7 +344,7 @@ class HomeAssistant(JsonConfig, CoreSysAttributes):
) )
except DockerAPIError: except DockerAPIError:
_LOGGER.warning("Update Home Assistant image fails") _LOGGER.warning("Update Home Assistant image fails")
raise HomeAssistantUpdateError() from None raise HomeAssistantUpdateError()
else: else:
self.version = self.instance.version self.version = self.instance.version
self.image = self.sys_updater.image_homeassistant self.image = self.sys_updater.image_homeassistant
@ -393,7 +393,7 @@ class HomeAssistant(JsonConfig, CoreSysAttributes):
try: try:
await self.instance.run() await self.instance.run()
except DockerAPIError: except DockerAPIError:
raise HomeAssistantError() from None raise HomeAssistantError()
await self._block_till_run(self.version) await self._block_till_run(self.version)
@ -409,7 +409,7 @@ class HomeAssistant(JsonConfig, CoreSysAttributes):
try: try:
await self.instance.start() await self.instance.start()
except DockerAPIError: except DockerAPIError:
raise HomeAssistantError() from None raise HomeAssistantError()
await self._block_till_run(self.version) await self._block_till_run(self.version)
# No Instance/Container found, extended start # No Instance/Container found, extended start
@ -425,7 +425,7 @@ class HomeAssistant(JsonConfig, CoreSysAttributes):
try: try:
return await self.instance.stop(remove_container=False) return await self.instance.stop(remove_container=False)
except DockerAPIError: except DockerAPIError:
raise HomeAssistantError() from None raise HomeAssistantError()
@process_lock @process_lock
async def restart(self) -> None: async def restart(self) -> None:
@ -433,7 +433,7 @@ class HomeAssistant(JsonConfig, CoreSysAttributes):
try: try:
await self.instance.restart() await self.instance.restart()
except DockerAPIError: except DockerAPIError:
raise HomeAssistantError() from None raise HomeAssistantError()
await self._block_till_run(self.version) await self._block_till_run(self.version)
@ -459,7 +459,7 @@ class HomeAssistant(JsonConfig, CoreSysAttributes):
try: try:
return await self.instance.stats() return await self.instance.stats()
except DockerAPIError: except DockerAPIError:
raise HomeAssistantError() from None raise HomeAssistantError()
def is_running(self) -> Awaitable[bool]: def is_running(self) -> Awaitable[bool]:
"""Return True if Docker container is running. """Return True if Docker container is running.

View File

@ -76,7 +76,7 @@ class AppArmorControl(CoreSysAttributes):
shutil.copyfile(profile_file, dest_profile) shutil.copyfile(profile_file, dest_profile)
except OSError as err: except OSError as err:
_LOGGER.error("Can't copy %s: %s", profile_file, err) _LOGGER.error("Can't copy %s: %s", profile_file, err)
raise HostAppArmorError() from None raise HostAppArmorError()
# Load profiles # Load profiles
_LOGGER.info("Add or Update AppArmor profile: %s", profile_name) _LOGGER.info("Add or Update AppArmor profile: %s", profile_name)

View File

@ -96,4 +96,4 @@ class InfoCenter(CoreSysAttributes):
_LOGGER.warning("Can't update host system information!") _LOGGER.warning("Can't update host system information!")
except DBusNotConnectedError: except DBusNotConnectedError:
_LOGGER.error("No hostname D-Bus connection available") _LOGGER.error("No hostname D-Bus connection available")
raise HostNotSupportedError() from None raise HostNotSupportedError()

View File

@ -36,4 +36,4 @@ class NetworkManager(CoreSysAttributes):
_LOGGER.warning("Can't update host DNS system information!") _LOGGER.warning("Can't update host DNS system information!")
except DBusNotConnectedError: except DBusNotConnectedError:
_LOGGER.error("No hostname D-Bus connection available") _LOGGER.error("No hostname D-Bus connection available")
raise HostNotSupportedError() from None raise HostNotSupportedError()

View File

@ -117,10 +117,10 @@ class SoundControl(CoreSysAttributes):
except PulseIndexError: except PulseIndexError:
_LOGGER.error("Can't find %s stream %s", source, name) _LOGGER.error("Can't find %s stream %s", source, name)
raise PulseAudioError() from None raise PulseAudioError()
except PulseError as err: except PulseError as err:
_LOGGER.error("Can't set %s as stream: %s", name, err) _LOGGER.error("Can't set %s as stream: %s", name, err)
raise PulseAudioError() from None raise PulseAudioError()
# Run and Reload data # Run and Reload data
await self.sys_run_in_executor(_set_default) await self.sys_run_in_executor(_set_default)
@ -151,10 +151,10 @@ class SoundControl(CoreSysAttributes):
_LOGGER.error( _LOGGER.error(
"Can't find %s stream %d (App: %s)", stream_type, index, application "Can't find %s stream %d (App: %s)", stream_type, index, application
) )
raise PulseAudioError() from None raise PulseAudioError()
except PulseError as err: except PulseError as err:
_LOGGER.error("Can't set %d volume: %s", index, err) _LOGGER.error("Can't set %d volume: %s", index, err)
raise PulseAudioError() from None raise PulseAudioError()
# Run and Reload data # Run and Reload data
await self.sys_run_in_executor(_set_volume) await self.sys_run_in_executor(_set_volume)
@ -185,10 +185,10 @@ class SoundControl(CoreSysAttributes):
_LOGGER.error( _LOGGER.error(
"Can't find %s stream %d (App: %s)", stream_type, index, application "Can't find %s stream %d (App: %s)", stream_type, index, application
) )
raise PulseAudioError() from None raise PulseAudioError()
except PulseError as err: except PulseError as err:
_LOGGER.error("Can't set %d volume: %s", index, err) _LOGGER.error("Can't set %d volume: %s", index, err)
raise PulseAudioError() from None raise PulseAudioError()
# Run and Reload data # Run and Reload data
await self.sys_run_in_executor(_set_mute) await self.sys_run_in_executor(_set_mute)
@ -205,12 +205,12 @@ class SoundControl(CoreSysAttributes):
except PulseIndexError: except PulseIndexError:
_LOGGER.error("Can't find %s profile %s", card_name, profile_name) _LOGGER.error("Can't find %s profile %s", card_name, profile_name)
raise PulseAudioError() from None raise PulseAudioError()
except PulseError as err: except PulseError as err:
_LOGGER.error( _LOGGER.error(
"Can't activate %s profile %s: %s", card_name, profile_name, err "Can't activate %s profile %s: %s", card_name, profile_name, err
) )
raise PulseAudioError() from None raise PulseAudioError()
# Run and Reload data # Run and Reload data
await self.sys_run_in_executor(_activate_profile) await self.sys_run_in_executor(_activate_profile)
@ -331,7 +331,7 @@ class SoundControl(CoreSysAttributes):
except PulseOperationFailed as err: except PulseOperationFailed as err:
_LOGGER.error("Error while processing pulse update: %s", err) _LOGGER.error("Error while processing pulse update: %s", err)
raise PulseAudioError() from None raise PulseAudioError()
except PulseError as err: except PulseError as err:
_LOGGER.debug("Can't update PulseAudio data: %s", err) _LOGGER.debug("Can't update PulseAudio data: %s", err)

View File

@ -156,7 +156,7 @@ class Audio(JsonConfig, CoreSysAttributes):
await self.instance.update(version, image=self.sys_updater.image_audio) await self.instance.update(version, image=self.sys_updater.image_audio)
except DockerAPIError: except DockerAPIError:
_LOGGER.error("Audio update fails") _LOGGER.error("Audio update fails")
raise AudioUpdateError() from None raise AudioUpdateError()
else: else:
self.version = version self.version = version
self.image = self.sys_updater.image_audio self.image = self.sys_updater.image_audio
@ -176,7 +176,7 @@ class Audio(JsonConfig, CoreSysAttributes):
await self.instance.restart() await self.instance.restart()
except DockerAPIError: except DockerAPIError:
_LOGGER.error("Can't start Audio plugin") _LOGGER.error("Can't start Audio plugin")
raise AudioError() from None raise AudioError()
async def start(self) -> None: async def start(self) -> None:
"""Run CoreDNS.""" """Run CoreDNS."""
@ -185,7 +185,7 @@ class Audio(JsonConfig, CoreSysAttributes):
await self.instance.run() await self.instance.run()
except DockerAPIError: except DockerAPIError:
_LOGGER.error("Can't start Audio plugin") _LOGGER.error("Can't start Audio plugin")
raise AudioError() from None raise AudioError()
async def stop(self) -> None: async def stop(self) -> None:
"""Stop CoreDNS.""" """Stop CoreDNS."""
@ -194,7 +194,7 @@ class Audio(JsonConfig, CoreSysAttributes):
await self.instance.stop() await self.instance.stop()
except DockerAPIError: except DockerAPIError:
_LOGGER.error("Can't stop Audio plugin") _LOGGER.error("Can't stop Audio plugin")
raise AudioError() from None raise AudioError()
def logs(self) -> Awaitable[bytes]: def logs(self) -> Awaitable[bytes]:
"""Get CoreDNS docker logs. """Get CoreDNS docker logs.
@ -208,7 +208,7 @@ class Audio(JsonConfig, CoreSysAttributes):
try: try:
return await self.instance.stats() return await self.instance.stats()
except DockerAPIError: except DockerAPIError:
raise AudioError() from None raise AudioError()
def is_running(self) -> Awaitable[bool]: def is_running(self) -> Awaitable[bool]:
"""Return True if Docker container is running. """Return True if Docker container is running.

View File

@ -134,7 +134,7 @@ class HaCli(CoreSysAttributes, JsonConfig):
) )
except DockerAPIError: except DockerAPIError:
_LOGGER.error("HA cli update fails") _LOGGER.error("HA cli update fails")
raise CliUpdateError() from None raise CliUpdateError()
else: else:
self.version = version self.version = version
self.image = self.sys_updater.image_cli self.image = self.sys_updater.image_cli
@ -159,7 +159,7 @@ class HaCli(CoreSysAttributes, JsonConfig):
await self.instance.run() await self.instance.run()
except DockerAPIError: except DockerAPIError:
_LOGGER.error("Can't start cli plugin") _LOGGER.error("Can't start cli plugin")
raise CliError() from None raise CliError()
async def stop(self) -> None: async def stop(self) -> None:
"""Stop cli.""" """Stop cli."""
@ -168,14 +168,14 @@ class HaCli(CoreSysAttributes, JsonConfig):
await self.instance.stop() await self.instance.stop()
except DockerAPIError: except DockerAPIError:
_LOGGER.error("Can't stop cli plugin") _LOGGER.error("Can't stop cli plugin")
raise CliError() from None raise CliError()
async def stats(self) -> DockerStats: async def stats(self) -> DockerStats:
"""Return stats of cli.""" """Return stats of cli."""
try: try:
return await self.instance.stats() return await self.instance.stats()
except DockerAPIError: except DockerAPIError:
raise CliError() from None raise CliError()
def is_running(self) -> Awaitable[bool]: def is_running(self) -> Awaitable[bool]:
"""Return True if Docker container is running. """Return True if Docker container is running.

View File

@ -207,7 +207,7 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
await self.instance.update(version, image=self.sys_updater.image_dns) await self.instance.update(version, image=self.sys_updater.image_dns)
except DockerAPIError: except DockerAPIError:
_LOGGER.error("CoreDNS update fails") _LOGGER.error("CoreDNS update fails")
raise CoreDNSUpdateError() from None raise CoreDNSUpdateError()
else: else:
self.version = version self.version = version
self.image = self.sys_updater.image_dns self.image = self.sys_updater.image_dns
@ -240,7 +240,7 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
await self.instance.run() await self.instance.run()
except DockerAPIError: except DockerAPIError:
_LOGGER.error("Can't start CoreDNS plugin") _LOGGER.error("Can't start CoreDNS plugin")
raise CoreDNSError() from None raise CoreDNSError()
async def stop(self) -> None: async def stop(self) -> None:
"""Stop CoreDNS.""" """Stop CoreDNS."""
@ -249,7 +249,7 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
await self.instance.stop() await self.instance.stop()
except DockerAPIError: except DockerAPIError:
_LOGGER.error("Can't stop CoreDNS plugin") _LOGGER.error("Can't stop CoreDNS plugin")
raise CoreDNSError() from None raise CoreDNSError()
async def reset(self) -> None: async def reset(self) -> None:
"""Reset DNS and hosts.""" """Reset DNS and hosts."""
@ -316,7 +316,7 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
self.corefile.write_text(data) self.corefile.write_text(data)
except OSError as err: except OSError as err:
_LOGGER.error("Can't update corefile: %s", err) _LOGGER.error("Can't update corefile: %s", err)
raise CoreDNSError() from None raise CoreDNSError()
def _init_hosts(self) -> None: def _init_hosts(self) -> None:
"""Import hosts entry.""" """Import hosts entry."""
@ -340,7 +340,7 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
hosts.write(f"{entry.ip_address!s} {' '.join(entry.names)}\n") hosts.write(f"{entry.ip_address!s} {' '.join(entry.names)}\n")
except OSError as err: except OSError as err:
_LOGGER.error("Can't write hosts file: %s", err) _LOGGER.error("Can't write hosts file: %s", err)
raise CoreDNSError() from None raise CoreDNSError()
def add_host(self, ipv4: IPv4Address, names: List[str], write: bool = True) -> None: def add_host(self, ipv4: IPv4Address, names: List[str], write: bool = True) -> None:
"""Add a new host entry.""" """Add a new host entry."""
@ -404,7 +404,7 @@ class CoreDNS(JsonConfig, CoreSysAttributes):
try: try:
return await self.instance.stats() return await self.instance.stats()
except DockerAPIError: except DockerAPIError:
raise CoreDNSError() from None raise CoreDNSError()
def is_running(self) -> Awaitable[bool]: def is_running(self) -> Awaitable[bool]:
"""Return True if Docker container is running. """Return True if Docker container is running.

View File

@ -129,7 +129,7 @@ class Multicast(JsonConfig, CoreSysAttributes):
await self.instance.update(version, image=self.sys_updater.image_multicast) await self.instance.update(version, image=self.sys_updater.image_multicast)
except DockerAPIError: except DockerAPIError:
_LOGGER.error("Multicast update fails") _LOGGER.error("Multicast update fails")
raise MulticastUpdateError() from None raise MulticastUpdateError()
else: else:
self.version = version self.version = version
self.image = self.sys_updater.image_multicast self.image = self.sys_updater.image_multicast
@ -181,7 +181,7 @@ class Multicast(JsonConfig, CoreSysAttributes):
try: try:
return await self.instance.stats() return await self.instance.stats()
except DockerAPIError: except DockerAPIError:
raise MulticastError() from None raise MulticastError()
def is_running(self) -> Awaitable[bool]: def is_running(self) -> Awaitable[bool]:
"""Return True if Docker container is running. """Return True if Docker container is running.

View File

@ -277,7 +277,7 @@ class Snapshot(CoreSysAttributes):
_LOGGER.error( _LOGGER.error(
"Invalid data for %s: %s", self.tarfile, humanize_error(self._data, err) "Invalid data for %s: %s", self.tarfile, humanize_error(self._data, err)
) )
raise ValueError("Invalid config") from None raise ValueError("Invalid config")
# new snapshot, build it # new snapshot, build it
def _create_snapshot(): def _create_snapshot():

View File

@ -87,7 +87,7 @@ class Supervisor(CoreSysAttributes):
except (aiohttp.ClientError, asyncio.TimeoutError) as err: except (aiohttp.ClientError, asyncio.TimeoutError) as err:
_LOGGER.warning("Can't fetch AppArmor profile: %s", err) _LOGGER.warning("Can't fetch AppArmor profile: %s", err)
raise SupervisorError() from None raise SupervisorError()
with TemporaryDirectory(dir=self.sys_config.path_tmp) as tmp_dir: with TemporaryDirectory(dir=self.sys_config.path_tmp) as tmp_dir:
profile_file = Path(tmp_dir, "apparmor.txt") profile_file = Path(tmp_dir, "apparmor.txt")
@ -95,7 +95,7 @@ class Supervisor(CoreSysAttributes):
profile_file.write_text(data) profile_file.write_text(data)
except OSError as err: except OSError as err:
_LOGGER.error("Can't write temporary profile: %s", err) _LOGGER.error("Can't write temporary profile: %s", err)
raise SupervisorError() from None raise SupervisorError()
try: try:
await self.sys_host.apparmor.load_profile( await self.sys_host.apparmor.load_profile(
@ -103,7 +103,7 @@ class Supervisor(CoreSysAttributes):
) )
except HostAppArmorError: except HostAppArmorError:
_LOGGER.error("Can't update AppArmor profile!") _LOGGER.error("Can't update AppArmor profile!")
raise SupervisorError() from None raise SupervisorError()
async def update(self, version: Optional[str] = None) -> None: async def update(self, version: Optional[str] = None) -> None:
"""Update Home Assistant version.""" """Update Home Assistant version."""
@ -123,7 +123,7 @@ class Supervisor(CoreSysAttributes):
) )
except DockerAPIError: except DockerAPIError:
_LOGGER.error("Update of Supervisor fails!") _LOGGER.error("Update of Supervisor fails!")
raise SupervisorUpdateError() from None raise SupervisorUpdateError()
else: else:
self.sys_config.version = version self.sys_config.version = version
self.sys_config.save_data() self.sys_config.save_data()
@ -149,7 +149,7 @@ class Supervisor(CoreSysAttributes):
try: try:
return await self.instance.stats() return await self.instance.stats()
except DockerAPIError: except DockerAPIError:
raise SupervisorError() from None raise SupervisorError()
async def repair(self): async def repair(self):
"""Repair local Supervisor data.""" """Repair local Supervisor data."""

View File

@ -158,16 +158,16 @@ class Updater(JsonConfig, CoreSysAttributes):
except (aiohttp.ClientError, asyncio.TimeoutError) as err: except (aiohttp.ClientError, asyncio.TimeoutError) as err:
_LOGGER.warning("Can't fetch versions from %s: %s", url, err) _LOGGER.warning("Can't fetch versions from %s: %s", url, err)
raise HassioUpdaterError() from None raise HassioUpdaterError()
except json.JSONDecodeError as err: except json.JSONDecodeError as err:
_LOGGER.warning("Can't parse versions from %s: %s", url, err) _LOGGER.warning("Can't parse versions from %s: %s", url, err)
raise HassioUpdaterError() from None raise HassioUpdaterError()
# data valid? # data valid?
if not data or data.get(ATTR_CHANNEL) != self.channel: if not data or data.get(ATTR_CHANNEL) != self.channel:
_LOGGER.warning("Invalid data from %s", url) _LOGGER.warning("Invalid data from %s", url)
raise HassioUpdaterError() from None raise HassioUpdaterError()
try: try:
# Update supervisor version # Update supervisor version
@ -196,7 +196,7 @@ class Updater(JsonConfig, CoreSysAttributes):
except KeyError as err: except KeyError as err:
_LOGGER.warning("Can't process version data: %s", err) _LOGGER.warning("Can't process version data: %s", err)
raise HassioUpdaterError() from None raise HassioUpdaterError()
else: else:
self.save_data() self.save_data()

View File

@ -89,7 +89,7 @@ class DBus:
except ET.ParseError as err: except ET.ParseError as err:
_LOGGER.error("Can't parse introspect data: %s", err) _LOGGER.error("Can't parse introspect data: %s", err)
_LOGGER.debug("Introspect %s on %s", self.bus_name, self.object_path) _LOGGER.debug("Introspect %s on %s", self.bus_name, self.object_path)
raise DBusParseError() from None raise DBusParseError()
# Read available methods # Read available methods
for interface in xml.findall("./interface"): for interface in xml.findall("./interface"):
@ -137,7 +137,7 @@ class DBus:
except json.JSONDecodeError as err: except json.JSONDecodeError as err:
_LOGGER.error("Can't parse '%s': %s", json_raw, err) _LOGGER.error("Can't parse '%s': %s", json_raw, err)
_LOGGER.debug("GVariant data: '%s'", raw) _LOGGER.debug("GVariant data: '%s'", raw)
raise DBusParseError() from None raise DBusParseError()
@staticmethod @staticmethod
def gvariant_args(args: List[Any]) -> str: def gvariant_args(args: List[Any]) -> str:
@ -179,7 +179,7 @@ class DBus:
return (await self.call_dbus(DBUS_METHOD_GETALL, interface))[0] return (await self.call_dbus(DBUS_METHOD_GETALL, interface))[0]
except IndexError: except IndexError:
_LOGGER.error("No attributes returned for %s", interface) _LOGGER.error("No attributes returned for %s", interface)
raise DBusFatalError from None raise DBusFatalError
async def _send(self, command: List[str]) -> str: async def _send(self, command: List[str]) -> str:
"""Send command over dbus.""" """Send command over dbus."""
@ -196,7 +196,7 @@ class DBus:
data, error = await proc.communicate() data, error = await proc.communicate()
except OSError as err: except OSError as err:
_LOGGER.error("DBus fatal error: %s", err) _LOGGER.error("DBus fatal error: %s", err)
raise DBusFatalError() from None raise DBusFatalError()
# Success? # Success?
if proc.returncode == 0: if proc.returncode == 0:
@ -301,7 +301,7 @@ class DBusSignalWrapper:
try: try:
data = await self._proc.stdout.readline() data = await self._proc.stdout.readline()
except asyncio.TimeoutError: except asyncio.TimeoutError:
raise StopAsyncIteration() from None raise StopAsyncIteration()
# Program close # Program close
if not data: if not data:
@ -322,4 +322,4 @@ class DBusSignalWrapper:
try: try:
return self.dbus.parse_gvariant(data) return self.dbus.parse_gvariant(data)
except DBusParseError: except DBusParseError:
raise StopAsyncIteration() from None raise StopAsyncIteration()

View File

@ -20,7 +20,7 @@ def write_json_file(jsonfile: Path, data: Any) -> None:
jsonfile.write_text(json.dumps(data, indent=2)) jsonfile.write_text(json.dumps(data, indent=2))
except (OSError, ValueError, TypeError) as err: except (OSError, ValueError, TypeError) as err:
_LOGGER.error("Can't write %s: %s", jsonfile, err) _LOGGER.error("Can't write %s: %s", jsonfile, err)
raise JsonFileError() from None raise JsonFileError()
def read_json_file(jsonfile: Path) -> Any: def read_json_file(jsonfile: Path) -> Any:
@ -29,7 +29,7 @@ def read_json_file(jsonfile: Path) -> Any:
return json.loads(jsonfile.read_text()) return json.loads(jsonfile.read_text())
except (OSError, ValueError, TypeError, UnicodeDecodeError) as err: except (OSError, ValueError, TypeError, UnicodeDecodeError) as err:
_LOGGER.error("Can't read json from %s: %s", jsonfile, err) _LOGGER.error("Can't read json from %s: %s", jsonfile, err)
raise JsonFileError() from None raise JsonFileError()
class JsonConfig: class JsonConfig:

View File

@ -24,6 +24,6 @@ def validate_timezone(timezone):
raise vol.Invalid( raise vol.Invalid(
"Invalid time zone passed in. Valid options can be found here: " "Invalid time zone passed in. Valid options can be found here: "
"http://en.wikipedia.org/wiki/List_of_tz_database_time_zones" "http://en.wikipedia.org/wiki/List_of_tz_database_time_zones"
) from None )
return timezone return timezone