Indicate in WS API when scheduling additional automatic backup (#136155)

This commit is contained in:
Erik Montnemery 2025-01-22 19:01:46 +01:00 committed by GitHub
parent 4e494aa393
commit ea9be01c7c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 116 additions and 1 deletions

View File

@ -320,6 +320,7 @@ class BackupSchedule:
time: dt.time | None = None time: dt.time | None = None
cron_event: CronSim | None = field(init=False, default=None) cron_event: CronSim | None = field(init=False, default=None)
next_automatic_backup: datetime | None = field(init=False, default=None) next_automatic_backup: datetime | None = field(init=False, default=None)
next_automatic_backup_additional = False
@callback @callback
def apply( def apply(
@ -378,6 +379,14 @@ class BackupSchedule:
# add a day to the next time to avoid scheduling at the same time again # add a day to the next time to avoid scheduling at the same time again
self.cron_event = CronSim(cron_pattern, now + timedelta(days=1)) self.cron_event = CronSim(cron_pattern, now + timedelta(days=1))
# Compare the computed next time with the next time from the cron pattern
# to determine if an additional backup has been scheduled
cron_event_configured = CronSim(cron_pattern, now)
next_configured_time = next(cron_event_configured)
self.next_automatic_backup_additional = next_time < next_configured_time
else:
self.next_automatic_backup_additional = False
async def _create_backup(now: datetime) -> None: async def _create_backup(now: datetime) -> None:
"""Create backup.""" """Create backup."""
manager.remove_next_backup_event = None manager.remove_next_backup_event = None

View File

@ -61,6 +61,7 @@ async def handle_info(
"last_attempted_automatic_backup": manager.config.data.last_attempted_automatic_backup, "last_attempted_automatic_backup": manager.config.data.last_attempted_automatic_backup,
"last_completed_automatic_backup": manager.config.data.last_completed_automatic_backup, "last_completed_automatic_backup": manager.config.data.last_completed_automatic_backup,
"next_automatic_backup": manager.config.data.schedule.next_automatic_backup, "next_automatic_backup": manager.config.data.schedule.next_automatic_backup,
"next_automatic_backup_additional": manager.config.data.schedule.next_automatic_backup_additional,
}, },
) )
@ -329,7 +330,8 @@ async def handle_config_info(
{ {
"config": config "config": config
| { | {
"next_automatic_backup": manager.config.data.schedule.next_automatic_backup "next_automatic_backup": manager.config.data.schedule.next_automatic_backup,
"next_automatic_backup_additional": manager.config.data.schedule.next_automatic_backup_additional,
} }
}, },
) )

View File

@ -84,6 +84,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -114,6 +115,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -144,6 +146,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -174,6 +177,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -204,6 +208,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',

View File

@ -245,6 +245,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -284,6 +285,7 @@
'last_attempted_automatic_backup': '2024-10-26T04:45:00+01:00', 'last_attempted_automatic_backup': '2024-10-26T04:45:00+01:00',
'last_completed_automatic_backup': '2024-10-26T04:45:00+01:00', 'last_completed_automatic_backup': '2024-10-26T04:45:00+01:00',
'next_automatic_backup': '2024-11-14T04:55:00+01:00', 'next_automatic_backup': '2024-11-14T04:55:00+01:00',
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': 3, 'copies': 3,
'days': 7, 'days': 7,
@ -326,6 +328,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': 3, 'copies': 3,
'days': None, 'days': None,
@ -361,6 +364,7 @@
'last_attempted_automatic_backup': '2024-10-27T04:45:00+01:00', 'last_attempted_automatic_backup': '2024-10-27T04:45:00+01:00',
'last_completed_automatic_backup': '2024-10-26T04:45:00+01:00', 'last_completed_automatic_backup': '2024-10-26T04:45:00+01:00',
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': 7, 'days': 7,
@ -396,6 +400,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': '2024-11-18T04:55:00+01:00', 'next_automatic_backup': '2024-11-18T04:55:00+01:00',
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -432,6 +437,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -467,6 +473,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': '2024-11-17T04:55:00+01:00', 'next_automatic_backup': '2024-11-17T04:55:00+01:00',
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -503,6 +510,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -538,6 +546,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': 7, 'days': 7,
@ -609,6 +618,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -644,6 +654,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': '2024-11-14T04:55:00+01:00', 'next_automatic_backup': '2024-11-14T04:55:00+01:00',
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': 3, 'copies': 3,
'days': None, 'days': None,
@ -715,6 +726,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -750,6 +762,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': '2024-11-14T04:55:00+01:00', 'next_automatic_backup': '2024-11-14T04:55:00+01:00',
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': 7, 'days': 7,
@ -821,6 +834,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -856,6 +870,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': '2024-11-14T06:00:00+01:00', 'next_automatic_backup': '2024-11-14T06:00:00+01:00',
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -927,6 +942,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -962,6 +978,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': '2024-11-18T04:55:00+01:00', 'next_automatic_backup': '2024-11-18T04:55:00+01:00',
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1035,6 +1052,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1070,6 +1088,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1141,6 +1160,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1176,6 +1196,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': '2024-11-17T04:55:00+01:00', 'next_automatic_backup': '2024-11-17T04:55:00+01:00',
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1251,6 +1272,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1290,6 +1312,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': '2024-11-14T04:55:00+01:00', 'next_automatic_backup': '2024-11-14T04:55:00+01:00',
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1365,6 +1388,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1400,6 +1424,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': '2024-11-14T04:55:00+01:00', 'next_automatic_backup': '2024-11-14T04:55:00+01:00',
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': 3, 'copies': 3,
'days': 7, 'days': 7,
@ -1471,6 +1496,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1506,6 +1532,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': '2024-11-14T04:55:00+01:00', 'next_automatic_backup': '2024-11-14T04:55:00+01:00',
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1577,6 +1604,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1612,6 +1640,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': '2024-11-14T04:55:00+01:00', 'next_automatic_backup': '2024-11-14T04:55:00+01:00',
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': 3, 'copies': 3,
'days': None, 'days': None,
@ -1683,6 +1712,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1718,6 +1748,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': '2024-11-14T04:55:00+01:00', 'next_automatic_backup': '2024-11-14T04:55:00+01:00',
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': 7, 'days': 7,
@ -1789,6 +1820,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1823,6 +1855,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1857,6 +1890,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1891,6 +1925,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1925,6 +1960,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1959,6 +1995,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -1993,6 +2030,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -2027,6 +2065,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -2061,6 +2100,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -2095,6 +2135,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -2129,6 +2170,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -2163,6 +2205,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -2197,6 +2240,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -2231,6 +2275,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -2265,6 +2310,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -2299,6 +2345,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -2333,6 +2380,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -2367,6 +2415,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
'retention': dict({ 'retention': dict({
'copies': None, 'copies': None,
'days': None, 'days': None,
@ -2394,6 +2443,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -2421,6 +2471,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -2464,6 +2515,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -2491,6 +2543,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -2534,6 +2587,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -2588,6 +2642,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -2626,6 +2681,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -2675,6 +2731,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -2719,6 +2776,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -2773,6 +2831,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -2828,6 +2887,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -2884,6 +2944,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -2938,6 +2999,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -2992,6 +3054,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -3046,6 +3109,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -3101,6 +3165,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -3546,6 +3611,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -3589,6 +3655,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -3633,6 +3700,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -3698,6 +3766,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',
@ -3742,6 +3811,7 @@
'last_attempted_automatic_backup': None, 'last_attempted_automatic_backup': None,
'last_completed_automatic_backup': None, 'last_completed_automatic_backup': None,
'next_automatic_backup': None, 'next_automatic_backup': None,
'next_automatic_backup_additional': False,
}), }),
'success': True, 'success': True,
'type': 'result', 'type': 'result',

View File

@ -275,6 +275,7 @@ async def test_async_initiate_backup(
"last_attempted_automatic_backup": None, "last_attempted_automatic_backup": None,
"last_completed_automatic_backup": None, "last_completed_automatic_backup": None,
"next_automatic_backup": None, "next_automatic_backup": None,
"next_automatic_backup_additional": False,
} }
await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) await ws_client.send_json_auto_id({"type": "backup/subscribe_events"})
@ -521,6 +522,7 @@ async def test_async_initiate_backup_with_agent_error(
"last_attempted_automatic_backup": None, "last_attempted_automatic_backup": None,
"last_completed_automatic_backup": None, "last_completed_automatic_backup": None,
"next_automatic_backup": None, "next_automatic_backup": None,
"next_automatic_backup_additional": False,
} }
await ws_client.send_json_auto_id( await ws_client.send_json_auto_id(
@ -616,6 +618,7 @@ async def test_async_initiate_backup_with_agent_error(
"last_attempted_automatic_backup": None, "last_attempted_automatic_backup": None,
"last_completed_automatic_backup": None, "last_completed_automatic_backup": None,
"next_automatic_backup": None, "next_automatic_backup": None,
"next_automatic_backup_additional": False,
} }
await hass.async_block_till_done() await hass.async_block_till_done()
@ -884,6 +887,7 @@ async def test_async_initiate_backup_non_agent_upload_error(
"last_attempted_automatic_backup": None, "last_attempted_automatic_backup": None,
"last_completed_automatic_backup": None, "last_completed_automatic_backup": None,
"next_automatic_backup": None, "next_automatic_backup": None,
"next_automatic_backup_additional": False,
} }
await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) await ws_client.send_json_auto_id({"type": "backup/subscribe_events"})
@ -995,6 +999,7 @@ async def test_async_initiate_backup_with_task_error(
"last_attempted_automatic_backup": None, "last_attempted_automatic_backup": None,
"last_completed_automatic_backup": None, "last_completed_automatic_backup": None,
"next_automatic_backup": None, "next_automatic_backup": None,
"next_automatic_backup_additional": False,
} }
await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) await ws_client.send_json_auto_id({"type": "backup/subscribe_events"})
@ -1100,6 +1105,7 @@ async def test_initiate_backup_file_error(
"last_attempted_automatic_backup": None, "last_attempted_automatic_backup": None,
"last_completed_automatic_backup": None, "last_completed_automatic_backup": None,
"next_automatic_backup": None, "next_automatic_backup": None,
"next_automatic_backup_additional": False,
} }
await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) await ws_client.send_json_auto_id({"type": "backup/subscribe_events"})
@ -1621,6 +1627,7 @@ async def test_receive_backup_agent_error(
"last_attempted_automatic_backup": None, "last_attempted_automatic_backup": None,
"last_completed_automatic_backup": None, "last_completed_automatic_backup": None,
"next_automatic_backup": None, "next_automatic_backup": None,
"next_automatic_backup_additional": False,
} }
await ws_client.send_json_auto_id( await ws_client.send_json_auto_id(
@ -1699,6 +1706,7 @@ async def test_receive_backup_agent_error(
"last_attempted_automatic_backup": None, "last_attempted_automatic_backup": None,
"last_completed_automatic_backup": None, "last_completed_automatic_backup": None,
"next_automatic_backup": None, "next_automatic_backup": None,
"next_automatic_backup_additional": False,
} }
await hass.async_block_till_done() await hass.async_block_till_done()
@ -1760,6 +1768,7 @@ async def test_receive_backup_non_agent_upload_error(
"last_attempted_automatic_backup": None, "last_attempted_automatic_backup": None,
"last_completed_automatic_backup": None, "last_completed_automatic_backup": None,
"next_automatic_backup": None, "next_automatic_backup": None,
"next_automatic_backup_additional": False,
} }
await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) await ws_client.send_json_auto_id({"type": "backup/subscribe_events"})
@ -1881,6 +1890,7 @@ async def test_receive_backup_file_write_error(
"last_attempted_automatic_backup": None, "last_attempted_automatic_backup": None,
"last_completed_automatic_backup": None, "last_completed_automatic_backup": None,
"next_automatic_backup": None, "next_automatic_backup": None,
"next_automatic_backup_additional": False,
} }
await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) await ws_client.send_json_auto_id({"type": "backup/subscribe_events"})
@ -1990,6 +2000,7 @@ async def test_receive_backup_read_tar_error(
"last_attempted_automatic_backup": None, "last_attempted_automatic_backup": None,
"last_completed_automatic_backup": None, "last_completed_automatic_backup": None,
"next_automatic_backup": None, "next_automatic_backup": None,
"next_automatic_backup_additional": False,
} }
await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) await ws_client.send_json_auto_id({"type": "backup/subscribe_events"})
@ -2158,6 +2169,7 @@ async def test_receive_backup_file_read_error(
"last_attempted_automatic_backup": None, "last_attempted_automatic_backup": None,
"last_completed_automatic_backup": None, "last_completed_automatic_backup": None,
"next_automatic_backup": None, "next_automatic_backup": None,
"next_automatic_backup_additional": False,
} }
await ws_client.send_json_auto_id({"type": "backup/subscribe_events"}) await ws_client.send_json_auto_id({"type": "backup/subscribe_events"})

View File

@ -1310,6 +1310,7 @@ async def test_config_update_errors(
"attempted_backup_time", "attempted_backup_time",
"completed_backup_time", "completed_backup_time",
"scheduled_backup_time", "scheduled_backup_time",
"additional_backup",
"backup_calls_1", "backup_calls_1",
"backup_calls_2", "backup_calls_2",
"call_args", "call_args",
@ -1325,6 +1326,7 @@ async def test_config_update_errors(
"2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00",
"2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00",
"2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00",
False,
1, 1,
2, 2,
BACKUP_CALL, BACKUP_CALL,
@ -1345,6 +1347,7 @@ async def test_config_update_errors(
"2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00",
"2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00",
"2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00",
False,
1, 1,
2, 2,
BACKUP_CALL, BACKUP_CALL,
@ -1364,6 +1367,7 @@ async def test_config_update_errors(
"2024-11-18T04:55:00+01:00", "2024-11-18T04:55:00+01:00",
"2024-11-18T04:55:00+01:00", "2024-11-18T04:55:00+01:00",
"2024-11-18T04:55:00+01:00", "2024-11-18T04:55:00+01:00",
False,
1, 1,
2, 2,
BACKUP_CALL, BACKUP_CALL,
@ -1387,6 +1391,7 @@ async def test_config_update_errors(
"2024-11-18T03:45:00+01:00", "2024-11-18T03:45:00+01:00",
"2024-11-18T03:45:00+01:00", "2024-11-18T03:45:00+01:00",
"2024-11-18T03:45:00+01:00", "2024-11-18T03:45:00+01:00",
False,
1, 1,
2, 2,
BACKUP_CALL, BACKUP_CALL,
@ -1406,6 +1411,7 @@ async def test_config_update_errors(
"2024-11-12T03:45:00+01:00", "2024-11-12T03:45:00+01:00",
"2024-11-12T03:45:00+01:00", "2024-11-12T03:45:00+01:00",
"2024-11-12T03:45:00+01:00", "2024-11-12T03:45:00+01:00",
False,
1, 1,
2, 2,
BACKUP_CALL, BACKUP_CALL,
@ -1425,6 +1431,7 @@ async def test_config_update_errors(
"2024-11-13T04:55:00+01:00", "2024-11-13T04:55:00+01:00",
"2024-11-13T04:55:00+01:00", "2024-11-13T04:55:00+01:00",
"2024-11-13T04:55:00+01:00", "2024-11-13T04:55:00+01:00",
False,
1, 1,
2, 2,
BACKUP_CALL, BACKUP_CALL,
@ -1444,6 +1451,7 @@ async def test_config_update_errors(
"2024-11-11T04:45:00+01:00", "2024-11-11T04:45:00+01:00",
"2024-11-11T04:45:00+01:00", "2024-11-11T04:45:00+01:00",
None, None,
False,
0, 0,
0, 0,
None, None,
@ -1463,6 +1471,7 @@ async def test_config_update_errors(
"2024-11-11T04:45:00+01:00", "2024-11-11T04:45:00+01:00",
"2024-11-11T04:45:00+01:00", "2024-11-11T04:45:00+01:00",
None, None,
False,
0, 0,
0, 0,
None, None,
@ -1482,6 +1491,7 @@ async def test_config_update_errors(
"2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00",
"2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00",
"2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00",
False,
1, 1,
2, 2,
BACKUP_CALL, BACKUP_CALL,
@ -1501,6 +1511,7 @@ async def test_config_update_errors(
"2024-11-12T04:55:00+01:00", # missed event uses daily schedule once "2024-11-12T04:55:00+01:00", # missed event uses daily schedule once
"2024-11-12T04:55:00+01:00", # missed event uses daily schedule once "2024-11-12T04:55:00+01:00", # missed event uses daily schedule once
"2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00",
True,
1, 1,
1, 1,
BACKUP_CALL, BACKUP_CALL,
@ -1520,6 +1531,7 @@ async def test_config_update_errors(
"2024-10-26T04:45:00+01:00", "2024-10-26T04:45:00+01:00",
"2024-10-26T04:45:00+01:00", "2024-10-26T04:45:00+01:00",
None, None,
False,
0, 0,
0, 0,
None, None,
@ -1539,6 +1551,7 @@ async def test_config_update_errors(
"2024-11-12T04:55:00+01:00", # attempted to create backup but failed "2024-11-12T04:55:00+01:00", # attempted to create backup but failed
"2024-11-11T04:45:00+01:00", "2024-11-11T04:45:00+01:00",
"2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00",
False,
1, 1,
2, 2,
BACKUP_CALL, BACKUP_CALL,
@ -1558,6 +1571,7 @@ async def test_config_update_errors(
"2024-11-12T04:55:00+01:00", # attempted to create backup but failed "2024-11-12T04:55:00+01:00", # attempted to create backup but failed
"2024-11-11T04:45:00+01:00", "2024-11-11T04:45:00+01:00",
"2024-11-12T04:55:00+01:00", "2024-11-12T04:55:00+01:00",
False,
1, 1,
2, 2,
BACKUP_CALL, BACKUP_CALL,
@ -1579,6 +1593,7 @@ async def test_config_schedule_logic(
attempted_backup_time: str, attempted_backup_time: str,
completed_backup_time: str, completed_backup_time: str,
scheduled_backup_time: str, scheduled_backup_time: str,
additional_backup: bool,
backup_calls_1: int, backup_calls_1: int,
backup_calls_2: int, backup_calls_2: int,
call_args: Any, call_args: Any,
@ -1630,6 +1645,7 @@ async def test_config_schedule_logic(
await client.send_json_auto_id({"type": "backup/info"}) await client.send_json_auto_id({"type": "backup/info"})
result = await client.receive_json() result = await client.receive_json()
assert result["result"]["next_automatic_backup"] == scheduled_backup_time assert result["result"]["next_automatic_backup"] == scheduled_backup_time
assert result["result"]["next_automatic_backup_additional"] == additional_backup
freezer.move_to(time_1) freezer.move_to(time_1)
async_fire_time_changed(hass) async_fire_time_changed(hass)

View File

@ -205,6 +205,7 @@ async def test_agents_list_backups_fail_cloud(
"last_attempted_automatic_backup": None, "last_attempted_automatic_backup": None,
"last_completed_automatic_backup": None, "last_completed_automatic_backup": None,
"next_automatic_backup": None, "next_automatic_backup": None,
"next_automatic_backup_additional": False,
} }