mirror of
https://github.com/home-assistant/core.git
synced 2025-07-25 14:17:45 +00:00
Split pre/post backup actions into dedicated methods (#110632)
* Split pre/post backup actions into dedicated methods * Update homeassistant/components/backup/manager.py Co-authored-by: Martin Hjelmare <marhje52@gmail.com> --------- Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
This commit is contained in:
parent
b9a8b992d7
commit
57d3f3f9f7
@ -82,6 +82,38 @@ class BackupManager:
|
|||||||
return
|
return
|
||||||
self.platforms[integration_domain] = platform
|
self.platforms[integration_domain] = platform
|
||||||
|
|
||||||
|
async def pre_backup_actions(self) -> None:
|
||||||
|
"""Perform pre backup actions."""
|
||||||
|
if not self.loaded_platforms:
|
||||||
|
await self.load_platforms()
|
||||||
|
|
||||||
|
pre_backup_results = await asyncio.gather(
|
||||||
|
*(
|
||||||
|
platform.async_pre_backup(self.hass)
|
||||||
|
for platform in self.platforms.values()
|
||||||
|
),
|
||||||
|
return_exceptions=True,
|
||||||
|
)
|
||||||
|
for result in pre_backup_results:
|
||||||
|
if isinstance(result, Exception):
|
||||||
|
raise result
|
||||||
|
|
||||||
|
async def post_backup_actions(self) -> None:
|
||||||
|
"""Perform post backup actions."""
|
||||||
|
if not self.loaded_platforms:
|
||||||
|
await self.load_platforms()
|
||||||
|
|
||||||
|
post_backup_results = await asyncio.gather(
|
||||||
|
*(
|
||||||
|
platform.async_post_backup(self.hass)
|
||||||
|
for platform in self.platforms.values()
|
||||||
|
),
|
||||||
|
return_exceptions=True,
|
||||||
|
)
|
||||||
|
for result in post_backup_results:
|
||||||
|
if isinstance(result, Exception):
|
||||||
|
raise result
|
||||||
|
|
||||||
async def load_backups(self) -> None:
|
async def load_backups(self) -> None:
|
||||||
"""Load data of stored backup files."""
|
"""Load data of stored backup files."""
|
||||||
backups = await self.hass.async_add_executor_job(self._read_backups)
|
backups = await self.hass.async_add_executor_job(self._read_backups)
|
||||||
@ -160,22 +192,9 @@ class BackupManager:
|
|||||||
if self.backing_up:
|
if self.backing_up:
|
||||||
raise HomeAssistantError("Backup already in progress")
|
raise HomeAssistantError("Backup already in progress")
|
||||||
|
|
||||||
if not self.loaded_platforms:
|
|
||||||
await self.load_platforms()
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.backing_up = True
|
self.backing_up = True
|
||||||
pre_backup_results = await asyncio.gather(
|
await self.pre_backup_actions()
|
||||||
*(
|
|
||||||
platform.async_pre_backup(self.hass)
|
|
||||||
for platform in self.platforms.values()
|
|
||||||
),
|
|
||||||
return_exceptions=True,
|
|
||||||
)
|
|
||||||
for result in pre_backup_results:
|
|
||||||
if isinstance(result, Exception):
|
|
||||||
raise result
|
|
||||||
|
|
||||||
backup_name = f"Core {HAVERSION}"
|
backup_name = f"Core {HAVERSION}"
|
||||||
date_str = dt_util.now().isoformat()
|
date_str = dt_util.now().isoformat()
|
||||||
slug = _generate_slug(date_str, backup_name)
|
slug = _generate_slug(date_str, backup_name)
|
||||||
@ -208,16 +227,7 @@ class BackupManager:
|
|||||||
return backup
|
return backup
|
||||||
finally:
|
finally:
|
||||||
self.backing_up = False
|
self.backing_up = False
|
||||||
post_backup_results = await asyncio.gather(
|
await self.post_backup_actions()
|
||||||
*(
|
|
||||||
platform.async_post_backup(self.hass)
|
|
||||||
for platform in self.platforms.values()
|
|
||||||
),
|
|
||||||
return_exceptions=True,
|
|
||||||
)
|
|
||||||
for result in post_backup_results:
|
|
||||||
if isinstance(result, Exception):
|
|
||||||
raise result
|
|
||||||
|
|
||||||
def _mkdir_and_generate_backup_contents(
|
def _mkdir_and_generate_backup_contents(
|
||||||
self,
|
self,
|
||||||
|
@ -267,3 +267,53 @@ async def test_exception_plaform_post(hass: HomeAssistant) -> None:
|
|||||||
|
|
||||||
with pytest.raises(HomeAssistantError):
|
with pytest.raises(HomeAssistantError):
|
||||||
await _mock_backup_generation(manager)
|
await _mock_backup_generation(manager)
|
||||||
|
|
||||||
|
|
||||||
|
async def test_loading_platforms_when_running_pre_backup_actions(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
caplog: pytest.LogCaptureFixture,
|
||||||
|
) -> None:
|
||||||
|
"""Test loading backup platforms when running post backup actions."""
|
||||||
|
manager = BackupManager(hass)
|
||||||
|
|
||||||
|
assert not manager.loaded_platforms
|
||||||
|
assert not manager.platforms
|
||||||
|
|
||||||
|
await _setup_mock_domain(
|
||||||
|
hass,
|
||||||
|
Mock(
|
||||||
|
async_pre_backup=AsyncMock(),
|
||||||
|
async_post_backup=AsyncMock(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
await manager.pre_backup_actions()
|
||||||
|
|
||||||
|
assert manager.loaded_platforms
|
||||||
|
assert len(manager.platforms) == 1
|
||||||
|
|
||||||
|
assert "Loaded 1 platforms" in caplog.text
|
||||||
|
|
||||||
|
|
||||||
|
async def test_loading_platforms_when_running_post_backup_actions(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
caplog: pytest.LogCaptureFixture,
|
||||||
|
) -> None:
|
||||||
|
"""Test loading backup platforms when running post backup actions."""
|
||||||
|
manager = BackupManager(hass)
|
||||||
|
|
||||||
|
assert not manager.loaded_platforms
|
||||||
|
assert not manager.platforms
|
||||||
|
|
||||||
|
await _setup_mock_domain(
|
||||||
|
hass,
|
||||||
|
Mock(
|
||||||
|
async_pre_backup=AsyncMock(),
|
||||||
|
async_post_backup=AsyncMock(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
await manager.post_backup_actions()
|
||||||
|
|
||||||
|
assert manager.loaded_platforms
|
||||||
|
assert len(manager.platforms) == 1
|
||||||
|
|
||||||
|
assert "Loaded 1 platforms" in caplog.text
|
||||||
|
Loading…
x
Reference in New Issue
Block a user