diff --git a/homeassistant/components/azure_storage/__init__.py b/homeassistant/components/azure_storage/__init__.py index 00e419fd3c9..78d85dd6a59 100644 --- a/homeassistant/components/azure_storage/__init__.py +++ b/homeassistant/components/azure_storage/__init__.py @@ -2,8 +2,8 @@ from aiohttp import ClientTimeout from azure.core.exceptions import ( + AzureError, ClientAuthenticationError, - HttpResponseError, ResourceNotFoundError, ) from azure.core.pipeline.transport._aiohttp import ( @@ -70,7 +70,7 @@ async def async_setup_entry( translation_key="invalid_auth", translation_placeholders={CONF_ACCOUNT_NAME: entry.data[CONF_ACCOUNT_NAME]}, ) from err - except HttpResponseError as err: + except AzureError as err: raise ConfigEntryNotReady( translation_domain=DOMAIN, translation_key="cannot_connect", diff --git a/homeassistant/components/azure_storage/backup.py b/homeassistant/components/azure_storage/backup.py index 4a9254213dc..54fd069a11f 100644 --- a/homeassistant/components/azure_storage/backup.py +++ b/homeassistant/components/azure_storage/backup.py @@ -8,7 +8,7 @@ import json import logging from typing import Any, Concatenate -from azure.core.exceptions import HttpResponseError +from azure.core.exceptions import AzureError, HttpResponseError, ServiceRequestError from azure.storage.blob import BlobProperties from homeassistant.components.backup import ( @@ -80,6 +80,20 @@ def handle_backup_errors[_R, **P]( f"Error during backup operation in {func.__name__}:" f" Status {err.status_code}, message: {err.message}" ) from err + except ServiceRequestError as err: + raise BackupAgentError( + f"Timeout during backup operation in {func.__name__}" + ) from err + except AzureError as err: + _LOGGER.debug( + "Error during backup in %s: %s", + func.__name__, + err, + exc_info=True, + ) + raise BackupAgentError( + f"Error during backup operation in {func.__name__}: {err}" + ) from err return wrapper diff --git a/tests/components/azure_storage/test_backup.py b/tests/components/azure_storage/test_backup.py index 7c5912a4981..ebb491c2b7c 100644 --- a/tests/components/azure_storage/test_backup.py +++ b/tests/components/azure_storage/test_backup.py @@ -6,7 +6,7 @@ from collections.abc import AsyncGenerator from io import StringIO from unittest.mock import ANY, Mock, patch -from azure.core.exceptions import HttpResponseError +from azure.core.exceptions import AzureError, HttpResponseError, ServiceRequestError from azure.storage.blob import BlobProperties import pytest @@ -276,14 +276,33 @@ async def test_agents_error_on_download_not_found( assert mock_client.download_blob.call_count == 0 +@pytest.mark.parametrize( + ("error", "message"), + [ + ( + HttpResponseError("http error"), + "Error during backup operation in async_delete_backup: Status None, message: http error", + ), + ( + ServiceRequestError("timeout"), + "Timeout during backup operation in async_delete_backup", + ), + ( + AzureError("generic error"), + "Error during backup operation in async_delete_backup: generic error", + ), + ], +) async def test_error_during_delete( hass: HomeAssistant, hass_ws_client: WebSocketGenerator, mock_client: MagicMock, mock_config_entry: MockConfigEntry, + error: Exception, + message: str, ) -> None: """Test the error wrapper.""" - mock_client.delete_blob.side_effect = HttpResponseError("Failed to delete backup") + mock_client.delete_blob.side_effect = error client = await hass_ws_client(hass) @@ -297,12 +316,7 @@ async def test_error_during_delete( assert response["success"] assert response["result"] == { - "agent_errors": { - f"{DOMAIN}.{mock_config_entry.entry_id}": ( - "Error during backup operation in async_delete_backup: " - "Status None, message: Failed to delete backup" - ) - } + "agent_errors": {f"{DOMAIN}.{mock_config_entry.entry_id}": message} }