mirror of
https://github.com/home-assistant/core.git
synced 2025-08-13 17:45:19 +02:00
Don't allow creating backups if hass is not running
This commit is contained in:
@@ -27,7 +27,7 @@ from homeassistant.backup_restore import (
|
|||||||
password_to_key,
|
password_to_key,
|
||||||
)
|
)
|
||||||
from homeassistant.const import __version__ as HAVERSION
|
from homeassistant.const import __version__ as HAVERSION
|
||||||
from homeassistant.core import HomeAssistant, callback
|
from homeassistant.core import CoreState, HomeAssistant, callback
|
||||||
from homeassistant.helpers import (
|
from homeassistant.helpers import (
|
||||||
instance_id,
|
instance_id,
|
||||||
integration_platform,
|
integration_platform,
|
||||||
@@ -976,6 +976,8 @@ class BackupManager:
|
|||||||
with_automatic_settings: bool = False,
|
with_automatic_settings: bool = False,
|
||||||
) -> NewBackup:
|
) -> NewBackup:
|
||||||
"""Initiate generating a backup."""
|
"""Initiate generating a backup."""
|
||||||
|
if self.hass.state is not CoreState.running:
|
||||||
|
raise BackupManagerError("Home Assistant is not running")
|
||||||
if self.state is not BackupManagerState.IDLE:
|
if self.state is not BackupManagerState.IDLE:
|
||||||
raise BackupManagerError(f"Backup manager busy: {self.state}")
|
raise BackupManagerError(f"Backup manager busy: {self.state}")
|
||||||
|
|
||||||
@@ -991,7 +993,7 @@ class BackupManager:
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
return await self._async_create_backup(
|
return await self._async_initiate_backup(
|
||||||
agent_ids=agent_ids,
|
agent_ids=agent_ids,
|
||||||
extra_metadata=extra_metadata,
|
extra_metadata=extra_metadata,
|
||||||
include_addons=include_addons,
|
include_addons=include_addons,
|
||||||
@@ -1018,7 +1020,7 @@ class BackupManager:
|
|||||||
self._update_issue_backup_failed()
|
self._update_issue_backup_failed()
|
||||||
raise
|
raise
|
||||||
|
|
||||||
async def _async_create_backup(
|
async def _async_initiate_backup(
|
||||||
self,
|
self,
|
||||||
*,
|
*,
|
||||||
agent_ids: list[str],
|
agent_ids: list[str],
|
||||||
|
@@ -4,6 +4,7 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
from collections.abc import Callable, Generator
|
from collections.abc import Callable, Generator
|
||||||
|
from contextlib import AbstractContextManager, nullcontext as does_not_raise
|
||||||
from dataclasses import replace
|
from dataclasses import replace
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
import json
|
import json
|
||||||
@@ -34,6 +35,7 @@ from homeassistant.components.backup import (
|
|||||||
from homeassistant.components.backup.agent import BackupAgentError
|
from homeassistant.components.backup.agent import BackupAgentError
|
||||||
from homeassistant.components.backup.const import DATA_MANAGER
|
from homeassistant.components.backup.const import DATA_MANAGER
|
||||||
from homeassistant.components.backup.manager import (
|
from homeassistant.components.backup.manager import (
|
||||||
|
BackupManager,
|
||||||
BackupManagerError,
|
BackupManagerError,
|
||||||
BackupManagerState,
|
BackupManagerState,
|
||||||
CreateBackupStage,
|
CreateBackupStage,
|
||||||
@@ -45,7 +47,7 @@ from homeassistant.components.backup.manager import (
|
|||||||
WrittenBackup,
|
WrittenBackup,
|
||||||
)
|
)
|
||||||
from homeassistant.components.backup.util import password_to_key
|
from homeassistant.components.backup.util import password_to_key
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import CoreState, HomeAssistant
|
||||||
from homeassistant.exceptions import HomeAssistantError
|
from homeassistant.exceptions import HomeAssistantError
|
||||||
from homeassistant.helpers import issue_registry as ir
|
from homeassistant.helpers import issue_registry as ir
|
||||||
|
|
||||||
@@ -659,6 +661,49 @@ async def test_initiate_backup(
|
|||||||
assert tar_file_path == f"{backup_directory}/{expected_filename}"
|
assert tar_file_path == f"{backup_directory}/{expected_filename}"
|
||||||
|
|
||||||
|
|
||||||
|
RAISES_HASS_NOT_RUNNING = pytest.raises(
|
||||||
|
HomeAssistantError, match="Home Assistant is not running"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("core_state", "expected_result", "initiate_backup_calls"),
|
||||||
|
[
|
||||||
|
(CoreState.final_write, RAISES_HASS_NOT_RUNNING, 0),
|
||||||
|
(CoreState.not_running, RAISES_HASS_NOT_RUNNING, 0),
|
||||||
|
(CoreState.running, does_not_raise(), 1),
|
||||||
|
(CoreState.starting, RAISES_HASS_NOT_RUNNING, 0),
|
||||||
|
(CoreState.stopped, RAISES_HASS_NOT_RUNNING, 0),
|
||||||
|
(CoreState.stopping, RAISES_HASS_NOT_RUNNING, 0),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
async def test_async_pre_backup_core_state(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
core_state: CoreState,
|
||||||
|
expected_result: AbstractContextManager,
|
||||||
|
initiate_backup_calls: int,
|
||||||
|
) -> None:
|
||||||
|
"""Test pre backup in different core states."""
|
||||||
|
await setup_backup_integration(hass)
|
||||||
|
manager = hass.data[DATA_MANAGER]
|
||||||
|
hass.set_state(core_state)
|
||||||
|
with ( # pylint: disable=confusing-with-statement
|
||||||
|
patch.object(BackupManager, "_async_initiate_backup") as initiate_backup_mock,
|
||||||
|
expected_result,
|
||||||
|
):
|
||||||
|
await manager.async_initiate_backup(
|
||||||
|
agent_ids=["backup.local"],
|
||||||
|
include_addons=[],
|
||||||
|
include_all_addons=False,
|
||||||
|
include_database=False,
|
||||||
|
include_folders=[],
|
||||||
|
include_homeassistant=True,
|
||||||
|
name=None,
|
||||||
|
password=None,
|
||||||
|
)
|
||||||
|
assert len(initiate_backup_mock.mock_calls) == initiate_backup_calls
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("mock_backup_generation")
|
@pytest.mark.usefixtures("mock_backup_generation")
|
||||||
@pytest.mark.parametrize("exception", [BackupAgentError("Boom!"), Exception("Boom!")])
|
@pytest.mark.parametrize("exception", [BackupAgentError("Boom!"), Exception("Boom!")])
|
||||||
async def test_initiate_backup_with_agent_error(
|
async def test_initiate_backup_with_agent_error(
|
||||||
|
Reference in New Issue
Block a user