Don't allow setting backup retention to 0 days or copies

This commit is contained in:
Erik 2025-02-18 10:33:37 +01:00
parent 4cdc3de94a
commit 96507a0722
5 changed files with 34 additions and 25 deletions

View File

@ -16,7 +16,7 @@ if TYPE_CHECKING:
STORE_DELAY_SAVE = 30
STORAGE_KEY = DOMAIN
STORAGE_VERSION = 1
STORAGE_VERSION_MINOR = 3
STORAGE_VERSION_MINOR = 4
class StoredBackupData(TypedDict):
@ -60,6 +60,13 @@ class _BackupStore(Store[StoredBackupData]):
else:
data["config"]["schedule"]["days"] = [state]
data["config"]["schedule"]["recurrence"] = "custom_days"
if old_minor_version < 4:
# Workaround for a bug in frontend which incorrectly set days to 0
# instead of to None for unlimited retention.
if data["config"]["retention"]["copies"] == 0:
data["config"]["retention"]["copies"] = None
if data["config"]["retention"]["days"] == 0:
data["config"]["retention"]["days"] = None
# Note: We allow reading data with major version 2.
# Reject if major version is higher than 2.

View File

@ -368,8 +368,10 @@ async def handle_config_info(
),
vol.Optional("retention"): vol.Schema(
{
vol.Optional("copies"): vol.Any(int, None),
vol.Optional("days"): vol.Any(int, None),
# Note: We can't use cv.positive_int because it allows 0 even
# though 0 is not positive.
vol.Optional("copies"): vol.Any(vol.All(int, vol.Range(min=1)), None),
vol.Optional("days"): vol.Any(vol.All(int, vol.Range(min=1)), None),
},
),
vol.Optional("schedule"): vol.Schema(

View File

@ -39,7 +39,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -84,7 +84,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -131,7 +131,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -179,7 +179,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---

View File

@ -686,7 +686,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -800,7 +800,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -914,7 +914,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -1038,7 +1038,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -1205,7 +1205,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -1319,7 +1319,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -1435,7 +1435,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -1549,7 +1549,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -1667,7 +1667,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -1789,7 +1789,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -1903,7 +1903,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -2017,7 +2017,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -2131,7 +2131,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---
@ -2245,7 +2245,7 @@
}),
}),
'key': 'backup',
'minor_version': 3,
'minor_version': 4,
'version': 1,
})
# ---

View File

@ -2158,7 +2158,7 @@ async def test_config_schedule_logic(
{
"type": "backup/config/update",
"create_backup": {"agent_ids": ["test.test-agent"]},
"retention": {"copies": 0, "days": None},
"retention": {"copies": 1, "days": None},
"schedule": {"recurrence": "daily"},
},
{
@ -2232,7 +2232,7 @@ async def test_config_schedule_logic(
{
"type": "backup/config/update",
"create_backup": {"agent_ids": ["test.test-agent"]},
"retention": {"copies": 0, "days": None},
"retention": {"copies": 1, "days": None},
"schedule": {"recurrence": "daily"},
},
{
@ -2301,7 +2301,7 @@ async def test_config_schedule_logic(
{
"type": "backup/config/update",
"create_backup": {"agent_ids": ["test.test-agent"]},
"retention": {"copies": 0, "days": None},
"retention": {"copies": 1, "days": None},
"schedule": {"recurrence": "daily"},
},
{
@ -3019,7 +3019,7 @@ async def test_config_retention_copies_logic_manual_backup(
{
"type": "backup/config/update",
"create_backup": {"agent_ids": ["test-agent"]},
"retention": {"copies": None, "days": 0},
"retention": {"copies": None, "days": 1},
"schedule": {"recurrence": "never"},
}
],