feat: discover snapshots into Django records
Add a Django-native snapshot discovery service and management command that scans backup directories, reads snapshot metadata, and idempotently upserts SnapshotRecord rows. Expose it through the pobsync command wrapper, update admin/docs, and cover discovery behavior with tests.
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any
|
||||
|
||||
from django.core.management.base import BaseCommand, CommandError
|
||||
|
||||
from pobsync.snapshot_meta import normalize_kind
|
||||
from pobsync_backend.models import GlobalConfig, HostConfig
|
||||
from pobsync_backend.snapshot_discovery import discover_snapshots
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = "Discover snapshot metadata on disk and upsert SnapshotRecord rows."
|
||||
|
||||
def add_arguments(self, parser) -> None:
|
||||
parser.add_argument("--host", default=None)
|
||||
parser.add_argument("--kind", default="all", help="scheduled|manual|incomplete|all")
|
||||
|
||||
def handle(self, *args: Any, **options: Any) -> None:
|
||||
try:
|
||||
global_config = GlobalConfig.objects.get(name="default")
|
||||
except GlobalConfig.DoesNotExist as exc:
|
||||
raise CommandError("Missing GlobalConfig 'default'") from exc
|
||||
|
||||
host = None
|
||||
if options["host"]:
|
||||
try:
|
||||
host = HostConfig.objects.get(host=options["host"], enabled=True)
|
||||
except HostConfig.DoesNotExist as exc:
|
||||
raise CommandError(f"Missing enabled HostConfig {options['host']!r}") from exc
|
||||
|
||||
kind = normalize_kind(options["kind"])
|
||||
kinds = ["scheduled", "manual", "incomplete"] if kind == "all" else [kind]
|
||||
result = discover_snapshots(host=host, global_config=global_config, kinds=kinds)
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS(
|
||||
f"Scanned {result['scanned']} snapshot(s), created {result['created']}, updated {result['updated']}."
|
||||
)
|
||||
)
|
||||
Reference in New Issue
Block a user