1
0
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:
Erik Montnemery
2025-01-28 14:44:09 +01:00
committed by GitHub
parent 9a4b73a834
commit abb58ec785
7 changed files with 219 additions and 36 deletions

View File

@@ -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,
}