mirror of
https://github.com/home-assistant/core.git
synced 2025-12-24 12:59:34 +00:00
Include error reason in backup events (#136697)
* Include error reason in backup events * Update hassio backup tests * Sort code * Remove catching BackupError in async_receive_backup
This commit is contained in:
@@ -419,6 +419,7 @@ async def test_initiate_backup(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": CreateBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -433,6 +434,7 @@ async def test_initiate_backup(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": CreateBackupStage.HOME_ASSISTANT,
|
||||
"state": CreateBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -440,6 +442,7 @@ async def test_initiate_backup(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": CreateBackupStage.UPLOAD_TO_AGENTS,
|
||||
"state": CreateBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -447,6 +450,7 @@ async def test_initiate_backup(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": CreateBackupState.COMPLETED,
|
||||
}
|
||||
@@ -670,6 +674,7 @@ async def test_initiate_backup_with_agent_error(
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"stage": None,
|
||||
"reason": None,
|
||||
"state": CreateBackupState.IN_PROGRESS,
|
||||
}
|
||||
result = await ws_client.receive_json()
|
||||
@@ -683,6 +688,7 @@ async def test_initiate_backup_with_agent_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": CreateBackupStage.HOME_ASSISTANT,
|
||||
"state": CreateBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -690,6 +696,7 @@ async def test_initiate_backup_with_agent_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": CreateBackupStage.UPLOAD_TO_AGENTS,
|
||||
"state": CreateBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -697,6 +704,7 @@ async def test_initiate_backup_with_agent_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": "upload_failed",
|
||||
"stage": None,
|
||||
"state": CreateBackupState.FAILED,
|
||||
}
|
||||
@@ -1025,6 +1033,7 @@ async def test_initiate_backup_non_agent_upload_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": CreateBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -1039,6 +1048,7 @@ async def test_initiate_backup_non_agent_upload_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": CreateBackupStage.HOME_ASSISTANT,
|
||||
"state": CreateBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -1046,6 +1056,7 @@ async def test_initiate_backup_non_agent_upload_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": CreateBackupStage.UPLOAD_TO_AGENTS,
|
||||
"state": CreateBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -1053,6 +1064,7 @@ async def test_initiate_backup_non_agent_upload_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": "upload_failed",
|
||||
"stage": None,
|
||||
"state": CreateBackupState.FAILED,
|
||||
}
|
||||
@@ -1131,6 +1143,7 @@ async def test_initiate_backup_with_task_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": CreateBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -1138,6 +1151,7 @@ async def test_initiate_backup_with_task_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": "upload_failed",
|
||||
"stage": None,
|
||||
"state": CreateBackupState.FAILED,
|
||||
}
|
||||
@@ -1245,6 +1259,7 @@ async def test_initiate_backup_file_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": CreateBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -1259,6 +1274,7 @@ async def test_initiate_backup_file_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": CreateBackupStage.HOME_ASSISTANT,
|
||||
"state": CreateBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -1266,6 +1282,7 @@ async def test_initiate_backup_file_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": CreateBackupStage.UPLOAD_TO_AGENTS,
|
||||
"state": CreateBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -1273,6 +1290,7 @@ async def test_initiate_backup_file_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.CREATE_BACKUP,
|
||||
"reason": "upload_failed",
|
||||
"stage": None,
|
||||
"state": CreateBackupState.FAILED,
|
||||
}
|
||||
@@ -1559,6 +1577,7 @@ async def test_receive_backup_busy_manager(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": "create_backup",
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": "in_progress",
|
||||
}
|
||||
@@ -1752,6 +1771,7 @@ async def test_receive_backup_agent_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": ReceiveBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -1759,6 +1779,7 @@ async def test_receive_backup_agent_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": ReceiveBackupStage.RECEIVE_FILE,
|
||||
"state": ReceiveBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -1766,6 +1787,7 @@ async def test_receive_backup_agent_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": ReceiveBackupStage.UPLOAD_TO_AGENTS,
|
||||
"state": ReceiveBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -1773,6 +1795,7 @@ async def test_receive_backup_agent_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": ReceiveBackupState.COMPLETED,
|
||||
}
|
||||
@@ -1885,6 +1908,7 @@ async def test_receive_backup_non_agent_upload_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": ReceiveBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -1892,6 +1916,7 @@ async def test_receive_backup_non_agent_upload_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": ReceiveBackupStage.RECEIVE_FILE,
|
||||
"state": ReceiveBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -1899,6 +1924,7 @@ async def test_receive_backup_non_agent_upload_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": ReceiveBackupStage.UPLOAD_TO_AGENTS,
|
||||
"state": ReceiveBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -2007,6 +2033,7 @@ async def test_receive_backup_file_write_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": ReceiveBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -2014,6 +2041,7 @@ async def test_receive_backup_file_write_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": ReceiveBackupStage.RECEIVE_FILE,
|
||||
"state": ReceiveBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -2021,6 +2049,7 @@ async def test_receive_backup_file_write_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": "unknown_error",
|
||||
"stage": None,
|
||||
"state": ReceiveBackupState.FAILED,
|
||||
}
|
||||
@@ -2114,6 +2143,7 @@ async def test_receive_backup_read_tar_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": ReceiveBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -2121,6 +2151,7 @@ async def test_receive_backup_read_tar_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": ReceiveBackupStage.RECEIVE_FILE,
|
||||
"state": ReceiveBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -2128,6 +2159,7 @@ async def test_receive_backup_read_tar_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": "unknown_error",
|
||||
"stage": None,
|
||||
"state": ReceiveBackupState.FAILED,
|
||||
}
|
||||
@@ -2151,6 +2183,7 @@ async def test_receive_backup_read_tar_error(
|
||||
"unlink_call_count",
|
||||
"unlink_exception",
|
||||
"final_state",
|
||||
"final_state_reason",
|
||||
"response_status",
|
||||
),
|
||||
[
|
||||
@@ -2164,6 +2197,7 @@ async def test_receive_backup_read_tar_error(
|
||||
1,
|
||||
None,
|
||||
ReceiveBackupState.COMPLETED,
|
||||
None,
|
||||
201,
|
||||
),
|
||||
(
|
||||
@@ -2176,6 +2210,7 @@ async def test_receive_backup_read_tar_error(
|
||||
1,
|
||||
None,
|
||||
ReceiveBackupState.COMPLETED,
|
||||
None,
|
||||
201,
|
||||
),
|
||||
(
|
||||
@@ -2188,6 +2223,7 @@ async def test_receive_backup_read_tar_error(
|
||||
1,
|
||||
None,
|
||||
ReceiveBackupState.COMPLETED,
|
||||
None,
|
||||
201,
|
||||
),
|
||||
(
|
||||
@@ -2200,6 +2236,7 @@ async def test_receive_backup_read_tar_error(
|
||||
1,
|
||||
OSError("Boom!"),
|
||||
ReceiveBackupState.FAILED,
|
||||
"unknown_error",
|
||||
500,
|
||||
),
|
||||
],
|
||||
@@ -2218,6 +2255,7 @@ async def test_receive_backup_file_read_error(
|
||||
unlink_call_count: int,
|
||||
unlink_exception: Exception | None,
|
||||
final_state: ReceiveBackupState,
|
||||
final_state_reason: str | None,
|
||||
response_status: int,
|
||||
) -> None:
|
||||
"""Test file read error during backup receive."""
|
||||
@@ -2288,6 +2326,7 @@ async def test_receive_backup_file_read_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": ReceiveBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -2295,6 +2334,7 @@ async def test_receive_backup_file_read_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": ReceiveBackupStage.RECEIVE_FILE,
|
||||
"state": ReceiveBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -2302,6 +2342,7 @@ async def test_receive_backup_file_read_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": ReceiveBackupStage.UPLOAD_TO_AGENTS,
|
||||
"state": ReceiveBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -2309,6 +2350,7 @@ async def test_receive_backup_file_read_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RECEIVE_BACKUP,
|
||||
"reason": final_state_reason,
|
||||
"stage": None,
|
||||
"state": final_state,
|
||||
}
|
||||
@@ -2394,6 +2436,7 @@ async def test_restore_backup(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RESTORE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": RestoreBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -2401,6 +2444,7 @@ async def test_restore_backup(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RESTORE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": RestoreBackupState.CORE_RESTART,
|
||||
}
|
||||
@@ -2410,6 +2454,7 @@ async def test_restore_backup(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RESTORE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": RestoreBackupState.COMPLETED,
|
||||
}
|
||||
@@ -2497,6 +2542,7 @@ async def test_restore_backup_wrong_password(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RESTORE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": RestoreBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -2504,6 +2550,7 @@ async def test_restore_backup_wrong_password(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RESTORE_BACKUP,
|
||||
"reason": "password_incorrect",
|
||||
"stage": None,
|
||||
"state": RestoreBackupState.FAILED,
|
||||
}
|
||||
@@ -2523,23 +2570,27 @@ async def test_restore_backup_wrong_password(
|
||||
|
||||
@pytest.mark.usefixtures("path_glob")
|
||||
@pytest.mark.parametrize(
|
||||
("parameters", "expected_error"),
|
||||
("parameters", "expected_error", "expected_reason"),
|
||||
[
|
||||
(
|
||||
{"backup_id": TEST_BACKUP_DEF456.backup_id},
|
||||
f"Backup def456 not found in agent {LOCAL_AGENT_ID}",
|
||||
"backup_manager_error",
|
||||
),
|
||||
(
|
||||
{"restore_addons": ["blah"]},
|
||||
"Addons and folders are not supported in core restore",
|
||||
"backup_reader_writer_error",
|
||||
),
|
||||
(
|
||||
{"restore_folders": [Folder.ADDONS]},
|
||||
"Addons and folders are not supported in core restore",
|
||||
"backup_reader_writer_error",
|
||||
),
|
||||
(
|
||||
{"restore_database": False, "restore_homeassistant": False},
|
||||
"Home Assistant or database must be included in restore",
|
||||
"backup_reader_writer_error",
|
||||
),
|
||||
],
|
||||
)
|
||||
@@ -2548,6 +2599,7 @@ async def test_restore_backup_wrong_parameters(
|
||||
hass_ws_client: WebSocketGenerator,
|
||||
parameters: dict[str, Any],
|
||||
expected_error: str,
|
||||
expected_reason: str,
|
||||
) -> None:
|
||||
"""Test restore backup wrong parameters."""
|
||||
await async_setup_component(hass, DOMAIN, {})
|
||||
@@ -2584,6 +2636,7 @@ async def test_restore_backup_wrong_parameters(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RESTORE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": RestoreBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -2591,6 +2644,7 @@ async def test_restore_backup_wrong_parameters(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RESTORE_BACKUP,
|
||||
"reason": expected_reason,
|
||||
"stage": None,
|
||||
"state": RestoreBackupState.FAILED,
|
||||
}
|
||||
@@ -2640,10 +2694,20 @@ async def test_restore_backup_when_busy(
|
||||
|
||||
@pytest.mark.usefixtures("mock_backup_generation")
|
||||
@pytest.mark.parametrize(
|
||||
("exception", "error_code", "error_message"),
|
||||
("exception", "error_code", "error_message", "expected_reason"),
|
||||
[
|
||||
(BackupAgentError("Boom!"), "home_assistant_error", "Boom!"),
|
||||
(Exception("Boom!"), "unknown_error", "Unknown error"),
|
||||
(
|
||||
BackupAgentError("Boom!"),
|
||||
"home_assistant_error",
|
||||
"Boom!",
|
||||
"backup_agent_error",
|
||||
),
|
||||
(
|
||||
Exception("Boom!"),
|
||||
"unknown_error",
|
||||
"Unknown error",
|
||||
"unknown_error",
|
||||
),
|
||||
],
|
||||
)
|
||||
async def test_restore_backup_agent_error(
|
||||
@@ -2652,6 +2716,7 @@ async def test_restore_backup_agent_error(
|
||||
exception: Exception,
|
||||
error_code: str,
|
||||
error_message: str,
|
||||
expected_reason: str,
|
||||
) -> None:
|
||||
"""Test restore backup with agent error."""
|
||||
remote_agent = BackupAgentTest("remote", backups=[TEST_BACKUP_ABC123])
|
||||
@@ -2694,6 +2759,7 @@ async def test_restore_backup_agent_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RESTORE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": RestoreBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -2701,6 +2767,7 @@ async def test_restore_backup_agent_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RESTORE_BACKUP,
|
||||
"reason": expected_reason,
|
||||
"stage": None,
|
||||
"state": RestoreBackupState.FAILED,
|
||||
}
|
||||
@@ -2841,6 +2908,7 @@ async def test_restore_backup_file_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RESTORE_BACKUP,
|
||||
"reason": None,
|
||||
"stage": None,
|
||||
"state": RestoreBackupState.IN_PROGRESS,
|
||||
}
|
||||
@@ -2848,6 +2916,7 @@ async def test_restore_backup_file_error(
|
||||
result = await ws_client.receive_json()
|
||||
assert result["event"] == {
|
||||
"manager_state": BackupManagerState.RESTORE_BACKUP,
|
||||
"reason": "unknown_error",
|
||||
"stage": None,
|
||||
"state": RestoreBackupState.FAILED,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user