Add explicit Django model fields for global and host backup settings, including SSH, rsync, source, excludes, and retention configuration. Populate them from legacy JSON during migration, make the config repository prefer structured fields, and update import/admin/tests around the SQL-first configuration model.
61 lines
2.3 KiB
Python
61 lines
2.3 KiB
Python
from __future__ import annotations
|
|
|
|
from django.test import TestCase
|
|
|
|
from pobsync_backend.config_source import DjangoConfigSource
|
|
from pobsync_backend.models import GlobalConfig, HostConfig
|
|
|
|
|
|
class DjangoConfigSourceTests(TestCase):
|
|
def test_returns_effective_config_from_database(self) -> None:
|
|
GlobalConfig.objects.create(
|
|
name="default",
|
|
backup_root="/backups",
|
|
pobsync_home="/opt/pobsync",
|
|
rsync_args=["--archive"],
|
|
rsync_extra_args=["--numeric-ids"],
|
|
excludes_default=["/proc/***"],
|
|
retention_daily=7,
|
|
retention_weekly=4,
|
|
retention_monthly=3,
|
|
retention_yearly=1,
|
|
data={
|
|
"backup_root": "/ignored",
|
|
"pobsync_home": "/ignored",
|
|
"ssh": {"user": "root", "port": 22, "options": []},
|
|
"rsync": {
|
|
"binary": "rsync",
|
|
"args": ["--archive"],
|
|
"timeout_seconds": 0,
|
|
"bwlimit_kbps": 0,
|
|
"extra_args": ["--numeric-ids"],
|
|
},
|
|
"defaults": {"source_root": "/", "destination_subdir": ""},
|
|
"excludes_default": ["/proc/***"],
|
|
"retention_defaults": {"daily": 7, "weekly": 4, "monthly": 3, "yearly": 1},
|
|
},
|
|
)
|
|
HostConfig.objects.create(
|
|
host="web-01",
|
|
address="web-01.example.test",
|
|
excludes_add=["/tmp/***"],
|
|
rsync_extra_args=["--delete"],
|
|
retention_daily=7,
|
|
retention_weekly=4,
|
|
retention_monthly=3,
|
|
retention_yearly=1,
|
|
config={
|
|
"retention": {"daily": 99, "weekly": 99, "monthly": 99, "yearly": 99},
|
|
"excludes_add": ["/ignored/***"],
|
|
"rsync": {"extra_args": ["--ignored"]},
|
|
},
|
|
)
|
|
|
|
cfg = DjangoConfigSource().effective_config_for_host("web-01")
|
|
|
|
self.assertEqual(cfg["backup_root"], "/backups")
|
|
self.assertEqual(cfg["host"], "web-01")
|
|
self.assertEqual(cfg["address"], "web-01.example.test")
|
|
self.assertEqual(cfg["excludes_effective"], ["/proc/***", "/tmp/***"])
|
|
self.assertEqual(cfg["rsync"]["args_effective"], ["--archive", "--numeric-ids", "--delete"])
|