Include extra metadata in backup WS API (#137296)

* Include extra metadata in backup WS API

* Update onboarding backup view

* Update google_drive tests
This commit is contained in:
Erik Montnemery 2025-02-04 15:57:30 +01:00 committed by Bram Kragten
parent 09e02493b7
commit d478f906df
15 changed files with 154 additions and 15 deletions

View File

@ -41,12 +41,6 @@ class BaseBackup:
homeassistant_version: str | None # None if homeassistant_included is False
name: str
def as_frontend_json(self) -> dict:
"""Return a dict representation of this backup for sending to frontend."""
return {
key: val for key, val in asdict(self).items() if key != "extra_metadata"
}
@dataclass(frozen=True, kw_only=True)
class AgentBackup(BaseBackup):

View File

@ -57,7 +57,7 @@ async def handle_info(
"agent_errors": {
agent_id: str(err) for agent_id, err in agent_errors.items()
},
"backups": [backup.as_frontend_json() for backup in backups.values()],
"backups": list(backups.values()),
"last_attempted_automatic_backup": manager.config.data.last_attempted_automatic_backup,
"last_completed_automatic_backup": manager.config.data.last_completed_automatic_backup,
"last_non_idle_event": manager.last_non_idle_event,
@ -91,7 +91,7 @@ async def handle_details(
"agent_errors": {
agent_id: str(err) for agent_id, err in agent_errors.items()
},
"backup": backup.as_frontend_json() if backup else None,
"backup": backup,
},
)

View File

@ -378,7 +378,7 @@ class BackupInfoView(BackupOnboardingView):
backups, _ = await manager.async_get_backups()
return self.json(
{
"backups": [backup.as_frontend_json() for backup in backups.values()],
"backups": list(backups.values()),
"state": manager.state,
"last_non_idle_event": manager.last_non_idle_event,
}

View File

@ -5,7 +5,7 @@ from __future__ import annotations
from collections.abc import AsyncIterator, Callable, Coroutine, Iterable
from pathlib import Path
from typing import Any
from unittest.mock import ANY, AsyncMock, Mock, patch
from unittest.mock import AsyncMock, Mock, patch
from homeassistant.components.backup import (
DOMAIN,
@ -29,7 +29,7 @@ TEST_BACKUP_ABC123 = AgentBackup(
backup_id="abc123",
database_included=True,
date="1970-01-01T00:00:00.000Z",
extra_metadata={"instance_id": ANY, "with_automatic_settings": True},
extra_metadata={"instance_id": "our_uuid", "with_automatic_settings": True},
folders=[Folder.MEDIA, Folder.SHARE],
homeassistant_included=True,
homeassistant_version="2024.12.0",

View File

@ -18,6 +18,16 @@ from .common import TEST_BACKUP_PATH_ABC123, TEST_BACKUP_PATH_DEF456
from tests.common import get_fixture_path
@pytest.fixture(name="instance_id", autouse=True)
def instance_id_fixture(hass: HomeAssistant) -> Generator[None]:
"""Mock instance ID."""
with patch(
"homeassistant.components.backup.manager.instance_id.async_get",
return_value="our_uuid",
):
yield
@pytest.fixture(name="mocked_json_bytes")
def mocked_json_bytes_fixture() -> Generator[Mock]:
"""Mock json_bytes."""

View File

@ -71,6 +71,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'our_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -94,6 +98,10 @@
'backup_id': 'def456',
'database_included': False,
'date': '1980-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'unknown_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([

View File

@ -3040,6 +3040,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'our_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -3117,6 +3121,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'our_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -3175,6 +3183,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'our_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -3217,6 +3229,10 @@
'backup_id': 'def456',
'database_included': False,
'date': '1980-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'unknown_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -3270,6 +3286,10 @@
'backup_id': 'def456',
'database_included': False,
'date': '1980-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'unknown_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -3321,6 +3341,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'our_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -3379,6 +3403,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'our_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -3438,6 +3466,8 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00Z',
'extra_metadata': dict({
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -3497,6 +3527,8 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00Z',
'extra_metadata': dict({
}),
'failed_agent_ids': list([
'test.remote',
]),
@ -3556,6 +3588,8 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00Z',
'extra_metadata': dict({
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -3614,6 +3648,8 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00Z',
'extra_metadata': dict({
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -3672,6 +3708,8 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00Z',
'extra_metadata': dict({
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -3730,6 +3768,8 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00Z',
'extra_metadata': dict({
}),
'failed_agent_ids': list([
'test.remote',
]),
@ -3789,6 +3829,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'our_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -3828,6 +3872,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'our_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -3883,6 +3931,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'our_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -3923,6 +3975,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'our_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -4199,6 +4255,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'our_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -4246,6 +4306,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'our_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -4297,6 +4361,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'our_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -4339,6 +4407,10 @@
'backup_id': 'def456',
'database_included': False,
'date': '1980-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'unknown_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -4367,6 +4439,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'our_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -4415,6 +4491,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'our_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([

View File

@ -136,7 +136,7 @@ async def test_create_backup_service(
agent_ids=["backup.local"],
backup_name="Custom backup 2025.1.0",
extra_metadata={
"instance_id": hass.data["core.uuid"],
"instance_id": "our_uuid",
"with_automatic_settings": False,
},
include_addons=None,
@ -595,7 +595,7 @@ async def test_initiate_backup(
"compressed": True,
"date": ANY,
"extra": {
"instance_id": hass.data["core.uuid"],
"instance_id": "our_uuid",
"with_automatic_settings": False,
},
"homeassistant": {
@ -625,6 +625,7 @@ async def test_initiate_backup(
"backup_id": backup_id,
"database_included": include_database,
"date": ANY,
"extra_metadata": {"instance_id": "our_uuid", "with_automatic_settings": False},
"failed_agent_ids": [],
"folders": [],
"homeassistant_included": True,
@ -675,6 +676,10 @@ async def test_initiate_backup_with_agent_error(
"backup_id": "backup1",
"database_included": True,
"date": "1970-01-01T00:00:00.000Z",
"extra_metadata": {
"instance_id": "our_uuid",
"with_automatic_settings": True,
},
"failed_agent_ids": [],
"folders": [
"media",
@ -691,6 +696,10 @@ async def test_initiate_backup_with_agent_error(
"backup_id": "backup2",
"database_included": False,
"date": "1980-01-01T00:00:00.000Z",
"extra_metadata": {
"instance_id": "unknown_uuid",
"with_automatic_settings": True,
},
"failed_agent_ids": [],
"folders": [
"media",
@ -713,6 +722,10 @@ async def test_initiate_backup_with_agent_error(
"backup_id": "backup3",
"database_included": True,
"date": "1970-01-01T00:00:00.000Z",
"extra_metadata": {
"instance_id": "our_uuid",
"with_automatic_settings": True,
},
"failed_agent_ids": [],
"folders": [
"media",
@ -836,6 +849,7 @@ async def test_initiate_backup_with_agent_error(
"backup_id": "abc123",
"database_included": True,
"date": ANY,
"extra_metadata": {"instance_id": "our_uuid", "with_automatic_settings": False},
"failed_agent_ids": ["test.remote"],
"folders": [],
"homeassistant_included": True,
@ -1770,6 +1784,10 @@ async def test_receive_backup_agent_error(
"backup_id": "backup1",
"database_included": True,
"date": "1970-01-01T00:00:00.000Z",
"extra_metadata": {
"instance_id": "our_uuid",
"with_automatic_settings": True,
},
"failed_agent_ids": [],
"folders": [
"media",
@ -1786,6 +1804,10 @@ async def test_receive_backup_agent_error(
"backup_id": "backup2",
"database_included": False,
"date": "1980-01-01T00:00:00.000Z",
"extra_metadata": {
"instance_id": "unknown_uuid",
"with_automatic_settings": True,
},
"failed_agent_ids": [],
"folders": [
"media",
@ -1808,6 +1830,10 @@ async def test_receive_backup_agent_error(
"backup_id": "backup3",
"database_included": True,
"date": "1970-01-01T00:00:00.000Z",
"extra_metadata": {
"instance_id": "our_uuid",
"with_automatic_settings": True,
},
"failed_agent_ids": [],
"folders": [
"media",
@ -3325,6 +3351,7 @@ async def test_initiate_backup_per_agent_encryption(
"backup_id": backup_id,
"database_included": True,
"date": ANY,
"extra_metadata": {"instance_id": "our_uuid", "with_automatic_settings": False},
"failed_agent_ids": [],
"folders": [],
"homeassistant_included": True,

View File

@ -174,6 +174,7 @@ async def test_agents_list_backups(
"backup_id": "23e64aec",
"date": "2024-11-22T11:48:48.727189+01:00",
"database_included": True,
"extra_metadata": {},
"folders": [],
"homeassistant_included": True,
"homeassistant_version": "2024.12.0.dev0",
@ -223,6 +224,7 @@ async def test_agents_list_backups_fail_cloud(
"backup_id": "23e64aec",
"date": "2024-11-22T11:48:48.727189+01:00",
"database_included": True,
"extra_metadata": {},
"folders": [],
"homeassistant_included": True,
"homeassistant_version": "2024.12.0.dev0",

View File

@ -47,6 +47,7 @@ TEST_AGENT_BACKUP_RESULT = {
"backup_id": "test-backup",
"database_included": True,
"date": "2025-01-01T01:23:45.678Z",
"extra_metadata": {"with_automatic_settings": False},
"folders": [],
"homeassistant_included": True,
"homeassistant_version": "2024.12.0",

View File

@ -509,6 +509,7 @@ async def test_agent_info(
"backup_id": "abc123",
"database_included": True,
"date": "1970-01-01T00:00:00+00:00",
"extra_metadata": {},
"failed_agent_ids": [],
"folders": ["share"],
"homeassistant_included": True,
@ -528,6 +529,7 @@ async def test_agent_info(
"backup_id": "abc123",
"database_included": False,
"date": "1970-01-01T00:00:00+00:00",
"extra_metadata": {},
"failed_agent_ids": [],
"folders": ["share"],
"homeassistant_included": False,
@ -680,6 +682,7 @@ async def test_agent_get_backup(
"backup_id": "abc123",
"database_included": True,
"date": "1970-01-01T00:00:00+00:00",
"extra_metadata": {},
"failed_agent_ids": [],
"folders": ["share"],
"homeassistant_included": True,

View File

@ -2,7 +2,7 @@
from collections.abc import AsyncGenerator
from io import StringIO
from unittest.mock import patch
from unittest.mock import ANY, patch
import pytest
@ -106,6 +106,7 @@ async def test_agents_list_backups(
"backup_id": "abc123",
"database_included": False,
"date": "1970-01-01T00:00:00Z",
"extra_metadata": {},
"failed_agent_ids": [],
"folders": ["media", "share"],
"homeassistant_included": True,
@ -187,6 +188,7 @@ async def test_agents_upload(
"backup_id": "test-backup",
"database_included": True,
"date": "1970-01-01T00:00:00.000Z",
"extra_metadata": {"instance_id": ANY, "with_automatic_settings": False},
"failed_agent_ids": [],
"folders": ["media", "share"],
"homeassistant_included": True,

View File

@ -19,6 +19,10 @@
'backup_id': 'abc123',
'database_included': True,
'date': '1970-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'abc123',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([
@ -42,6 +46,10 @@
'backup_id': 'def456',
'database_included': False,
'date': '1980-01-01T00:00:00.000Z',
'extra_metadata': dict({
'instance_id': 'unknown_uuid',
'with_automatic_settings': True,
}),
'failed_agent_ids': list([
]),
'folders': list([

View File

@ -88,6 +88,7 @@ async def test_agents_list_backups(
"backup_id": "23e64aec",
"date": "2024-11-22T11:48:48.727189+01:00",
"database_included": True,
"extra_metadata": {},
"folders": [],
"homeassistant_included": True,
"homeassistant_version": "2024.12.0.dev0",
@ -123,6 +124,7 @@ async def test_agents_get_backup(
"backup_id": "23e64aec",
"date": "2024-11-22T11:48:48.727189+01:00",
"database_included": True,
"extra_metadata": {},
"folders": [],
"homeassistant_included": True,
"homeassistant_version": "2024.12.0.dev0",

View File

@ -2,7 +2,7 @@
from io import StringIO
from typing import Any
from unittest.mock import AsyncMock, MagicMock, Mock, patch
from unittest.mock import ANY, AsyncMock, MagicMock, Mock, patch
import pytest
from synology_dsm.api.file_station.models import SynoFileFile, SynoFileSharedFolder
@ -300,6 +300,7 @@ async def test_agents_list_backups(
"backup_id": "abcd12ef",
"date": "2025-01-09T20:14:35.457323+01:00",
"database_included": True,
"extra_metadata": {"instance_id": ANY, "with_automatic_settings": True},
"folders": [],
"homeassistant_included": True,
"homeassistant_version": "2025.2.0.dev0",
@ -370,6 +371,7 @@ async def test_agents_list_backups_disabled_filestation(
"backup_id": "abcd12ef",
"date": "2025-01-09T20:14:35.457323+01:00",
"database_included": True,
"extra_metadata": {"instance_id": ANY, "with_automatic_settings": True},
"folders": [],
"homeassistant_included": True,
"homeassistant_version": "2025.2.0.dev0",