b66c137aa7
PVE refuses a restore carrying mountpoint params unless rootfs is also set ("mount
points configured, but 'rootfs' not set"). Size the rootfs override from the source
rootfs (rootfsSizeGB/sizeToGB, round up). Validated manually on the host: restore of
bind-mounted 9201 with --rootfs + --mp0/--mp9 overrides boots + tears down cleanly.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
65 lines
2.3 KiB
Go
65 lines
2.3 KiB
Go
package reconcile
|
|
|
|
import "testing"
|
|
|
|
func TestArchiveVMID(t *testing.T) {
|
|
cases := map[string]struct {
|
|
volid string
|
|
want int
|
|
ok bool
|
|
}{
|
|
"pbs ct": {"felhom-pbs:backup/ct/9201/2026-06-12T18:29:58Z", 9201, true},
|
|
"pbs vm": {"felhom-pbs:backup/vm/142/2026-06-12T18:29:58Z", 142, true},
|
|
"vzdump lxc": {"local:backup/vzdump-lxc-9201-2026_06_12-18_29_58.tar.zst", 9201, true},
|
|
"vzdump qemu": {"local:backup/vzdump-qemu-100-2026_06_12.vma.zst", 100, true},
|
|
"none": {"local:iso/whatever.iso", 0, false},
|
|
}
|
|
for name, c := range cases {
|
|
t.Run(name, func(t *testing.T) {
|
|
got, ok := archiveVMID(c.volid)
|
|
if ok != c.ok || got != c.want {
|
|
t.Errorf("archiveVMID(%q) = (%d,%v), want (%d,%v)", c.volid, got, ok, c.want, c.ok)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBindMountOverrides(t *testing.T) {
|
|
mps := map[string]string{
|
|
"mp0": "/mnt/felhom-usb/felhom-data,mp=/mnt/felhom-usb", // bind mount → override
|
|
"mp1": "local-lvm:8,mp=/data,backup=0", // real volume → left alone
|
|
"mp2": "/srv/extra", // bind mount, no explicit mp= → use host path
|
|
}
|
|
out := bindMountOverrides(mps, "local-lvm")
|
|
if _, ok := out["mp1"]; ok {
|
|
t.Error("mp1 is a storage volume and must NOT be overridden")
|
|
}
|
|
if got, want := out["mp0"], "local-lvm:1,mp=/mnt/felhom-usb,backup=0"; got != want {
|
|
t.Errorf("mp0 override = %q, want %q", got, want)
|
|
}
|
|
if got, want := out["mp2"], "local-lvm:1,mp=/srv/extra,backup=0"; got != want {
|
|
t.Errorf("mp2 override = %q, want %q", got, want)
|
|
}
|
|
|
|
// No bind mounts → nil (restore proceeds unchanged).
|
|
if bindMountOverrides(map[string]string{"mp0": "local-lvm:8,mp=/data"}, "local-lvm") != nil {
|
|
t.Error("expected nil when there are no bind mounts")
|
|
}
|
|
}
|
|
|
|
func TestRootfsSizeGB(t *testing.T) {
|
|
cases := map[string]int{
|
|
"local-lvm:vm-9201-disk-0,size=8G": 8,
|
|
"local-lvm:base,size=512M": 1, // rounds up
|
|
"local-lvm:base,size=1T": 1024,
|
|
"local-lvm:base,size=0": 0,
|
|
"local-lvm:base": 0, // no size field
|
|
"local-lvm:base,size=8": 8, // unit-less → GB
|
|
}
|
|
for spec, want := range cases {
|
|
if got := rootfsSizeGB(spec); got != want {
|
|
t.Errorf("rootfsSizeGB(%q) = %d, want %d", spec, got, want)
|
|
}
|
|
}
|
|
}
|