Skip to content

Commit f9cc336

Browse files
authoredFeb 3, 2025
Don't blow up when a backup doesn't exist on Synology DSM (home-assistant#136913)
* don't raise while delte not existing backup * only raise when error ne 408
1 parent 42cab20 commit f9cc336

File tree

2 files changed

+43
-19
lines changed

2 files changed

+43
-19
lines changed
 

‎homeassistant/components/synology_dsm/backup.py

+14-9
Original file line numberDiff line numberDiff line change
@@ -161,15 +161,20 @@ async def async_delete_backup(
161161
162162
:param backup_id: The ID of the backup that was returned in async_list_backups.
163163
"""
164-
try:
165-
await self._file_station.delete_file(
166-
path=self.path, filename=f"{backup_id}.tar"
167-
)
168-
await self._file_station.delete_file(
169-
path=self.path, filename=f"{backup_id}_meta.json"
170-
)
171-
except SynologyDSMAPIErrorException as err:
172-
raise BackupAgentError("Failed to delete the backup") from err
164+
for filename in (f"{backup_id}.tar", f"{backup_id}_meta.json"):
165+
try:
166+
await self._file_station.delete_file(path=self.path, filename=filename)
167+
except SynologyDSMAPIErrorException as err:
168+
err_args: dict = err.args[0]
169+
if int(err_args.get("code", 0)) != 900 or (
170+
(err_details := err_args.get("details")) is not None
171+
and isinstance(err_details, list)
172+
and isinstance(err_details[0], dict)
173+
and int(err_details[0].get("code", 0))
174+
!= 408 # No such file or directory
175+
):
176+
LOGGER.error("Failed to delete backup: %s", err)
177+
raise BackupAgentError("Failed to delete backup") from err
173178

174179
async def async_list_backups(self, **kwargs: Any) -> list[AgentBackup]:
175180
"""List backups."""

‎tests/components/synology_dsm/test_backup.py

+29-10
Original file line numberDiff line numberDiff line change
@@ -673,7 +673,11 @@ async def test_agents_delete_not_existing(
673673
backup_id = "ef34ab12"
674674

675675
setup_dsm_with_filestation.file.delete_file = AsyncMock(
676-
side_effect=SynologyDSMAPIErrorException("api", "404", "not found")
676+
side_effect=SynologyDSMAPIErrorException(
677+
"api",
678+
"900",
679+
[{"code": 408, "path": f"/ha_backup/my_backup_path/{backup_id}.tar"}],
680+
)
677681
)
678682

679683
await client.send_json_auto_id(
@@ -685,26 +689,40 @@ async def test_agents_delete_not_existing(
685689
response = await client.receive_json()
686690

687691
assert response["success"]
688-
assert response["result"] == {
689-
"agent_errors": {
690-
"synology_dsm.mocked_syno_dsm_entry": "Failed to delete the backup"
691-
}
692-
}
692+
assert response["result"] == {"agent_errors": {}}
693693

694694

695+
@pytest.mark.parametrize(
696+
("error", "expected_log"),
697+
[
698+
(
699+
SynologyDSMAPIErrorException("api", "100", "Unknown error"),
700+
"{'api': 'api', 'code': '100', 'reason': 'Unknown', 'details': 'Unknown error'}",
701+
),
702+
(
703+
SynologyDSMAPIErrorException("api", "900", [{"code": 407}]),
704+
"{'api': 'api', 'code': '900', 'reason': 'Unknown', 'details': [{'code': 407}]",
705+
),
706+
(
707+
SynologyDSMAPIErrorException("api", "900", [{"code": 417}]),
708+
"{'api': 'api', 'code': '900', 'reason': 'Unknown', 'details': [{'code': 417}]",
709+
),
710+
],
711+
)
695712
async def test_agents_delete_error(
696713
hass: HomeAssistant,
697714
hass_ws_client: WebSocketGenerator,
715+
caplog: pytest.LogCaptureFixture,
698716
setup_dsm_with_filestation: MagicMock,
717+
error: SynologyDSMAPIErrorException,
718+
expected_log: str,
699719
) -> None:
700720
"""Test error while delete backup."""
701721
client = await hass_ws_client(hass)
702722

703723
# error while delete
704724
backup_id = "abcd12ef"
705-
setup_dsm_with_filestation.file.delete_file.side_effect = (
706-
SynologyDSMAPIErrorException("api", "404", "not found")
707-
)
725+
setup_dsm_with_filestation.file.delete_file.side_effect = error
708726
await client.send_json_auto_id(
709727
{
710728
"type": "backup/delete",
@@ -716,9 +734,10 @@ async def test_agents_delete_error(
716734
assert response["success"]
717735
assert response["result"] == {
718736
"agent_errors": {
719-
"synology_dsm.mocked_syno_dsm_entry": "Failed to delete the backup"
737+
"synology_dsm.mocked_syno_dsm_entry": "Failed to delete backup"
720738
}
721739
}
740+
assert f"Failed to delete backup: {expected_log}" in caplog.text
722741
mock: AsyncMock = setup_dsm_with_filestation.file.delete_file
723742
assert len(mock.mock_calls) == 1
724743
assert mock.call_args_list[0].kwargs["filename"] == "abcd12ef.tar"

0 commit comments

Comments
 (0)
Please sign in to comment.