The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/8157
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === - Tested patch on running VMs with the `volatile.vm.uuid` key with and without snapshots to check they all get renamed.
From cfa1d01ef9de7c93b034103905a92f45d55a0f73 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 13 Nov 2020 15:37:43 +0000 Subject: [PATCH 1/8] lxd/patches: Adds patchVMRenameUUIDKey patch to renane config key from volatile.vm.uuid to volatile.uuid Brings into line with container's `volatile.uuid` key. Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/patches.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/lxd/patches.go b/lxd/patches.go index d3ca662f9b..e0569dafee 100644 --- a/lxd/patches.go +++ b/lxd/patches.go @@ -116,6 +116,7 @@ var patches = []patch{ {name: "network_ovn_remove_routes", stage: patchPostDaemonStorage, run: patchNetworkOVNRemoveRoutes}, {name: "network_fan_enable_nat", stage: patchPostDaemonStorage, run: patchNetworkFANEnableNAT}, {name: "thinpool_typo_fix", stage: patchPostDaemonStorage, run: patchThinpoolTypoFix}, + {name: "vm_rename_uuid_key", stage: patchPostDaemonStorage, run: patchVMRenameUUIDKey}, } type patch struct { @@ -180,6 +181,57 @@ func patchesApply(d *Daemon, stage patchStage) error { // Patches begin here +// patchVMRenameUUIDKey renames the volatile.vm.uuid key to volatile.uuid. +func patchVMRenameUUIDKey(name string, d *Daemon) error { + oldUUIDKey := "volatile.vm.uuid" + newUUIDKey := "volatile.uuid" + + return d.State().Cluster.InstanceList(func(inst db.Instance, p api.Project, profiles []api.Profile) error { + if inst.Type != instancetype.VM { + return nil + } + + return d.State().Cluster.Transaction(func(tx *db.ClusterTx) error { + uuid := inst.Config[oldUUIDKey] + if uuid != "" { + changes := map[string]string{ + oldUUIDKey: "", + newUUIDKey: uuid, + } + + logger.Debugf("Renaming config key %q to %q for VM %q (Project %q)", oldUUIDKey, newUUIDKey, inst.Name, inst.Project) + err := tx.UpdateInstanceConfig(inst.ID, changes) + if err != nil { + return errors.Wrapf(err, "Failed renaming config key %q to %q for VM %q (Project %q)", oldUUIDKey, newUUIDKey, inst.Name, inst.Project) + } + } + + snaps, err := tx.GetInstanceSnapshotsWithName(inst.Project, inst.Name) + if err != nil { + return err + } + + for _, snap := range snaps { + uuid := snap.Config[oldUUIDKey] + if uuid != "" { + changes := map[string]string{ + oldUUIDKey: "", + newUUIDKey: uuid, + } + + logger.Debugf("Renaming config key %q to %q for VM %q (Project %q)", oldUUIDKey, newUUIDKey, inst.Name, inst.Project) + err = tx.UpdateInstanceSnapshotConfig(snap.ID, changes) + if err != nil { + return errors.Wrapf(err, "Failed renaming config key %q to %q for VM %q (Project %q)", oldUUIDKey, newUUIDKey, inst.Name, inst.Project) + } + } + } + + return nil + }) + }) +} + // patchThinpoolTypoFix renames any config incorrectly set config file entries due to the lvm.thinpool_name typo. func patchThinpoolTypoFix(name string, d *Daemon) error { revert := revert.New() From 79a0fecff37d6e0a42ef9d84293439defcdabdcf Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 13 Nov 2020 14:48:19 +0000 Subject: [PATCH 2/8] shared/validate: Adds IsUUID function Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- shared/validate/validate.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/shared/validate/validate.go b/shared/validate/validate.go index 2a84a2bf3e..70ac4ef807 100644 --- a/shared/validate/validate.go +++ b/shared/validate/validate.go @@ -7,6 +7,8 @@ import ( "strconv" "strings" + "github.com/pborman/uuid" + "github.com/lxc/lxd/shared/units" ) @@ -451,3 +453,12 @@ func IsURLSegmentSafe(value string) error { return nil } + +// IsUUID validates whether a value is a UUID. +func IsUUID(value string) error { + if uuid.Parse(value) == nil { + return fmt.Errorf("Invalid UUID") + } + + return nil +} From 4173e42f63e374b6096bab99c7a7ed3ade8362ca Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 13 Nov 2020 14:48:40 +0000 Subject: [PATCH 3/8] shared/instance: Adds volatile.uuid key to instance validation Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- shared/instance.go | 1 + 1 file changed, 1 insertion(+) diff --git a/shared/instance.go b/shared/instance.go index 06541b4539..75bf75161a 100644 --- a/shared/instance.go +++ b/shared/instance.go @@ -255,6 +255,7 @@ var KnownInstanceConfigKeys = map[string]func(value string) error{ "volatile.idmap.current": validate.IsAny, "volatile.idmap.next": validate.IsAny, "volatile.apply_quota": validate.IsAny, + "volatile.uuid": validate.Optional(validate.IsUUID), } // ConfigKeyChecker returns a function that will check whether or not From 20bbd6e21b081f15e853399d52ac9a3164facdb5 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 13 Nov 2020 14:49:01 +0000 Subject: [PATCH 4/8] shared/instance: Removes vm.uuid from instance validation in ConfigKeyChecker Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- shared/instance.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/shared/instance.go b/shared/instance.go index 75bf75161a..023573a0cf 100644 --- a/shared/instance.go +++ b/shared/instance.go @@ -306,10 +306,6 @@ func ConfigKeyChecker(key string) (func(value string) error, error) { return validate.IsAny, nil } - if strings.HasSuffix(key, "vm.uuid") { - return validate.IsAny, nil - } - if strings.HasSuffix(key, ".ceph_rbd") { return validate.IsAny, nil } From fe619580b047fbc5127a9469be260b8f123ac451 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 13 Nov 2020 14:49:29 +0000 Subject: [PATCH 5/8] doc/instances: Replaces volatile.vm.uuid with volatile.uuid So can be used for containers too. Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- doc/instances.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/instances.md b/doc/instances.md index d6809ff115..171d4a1979 100644 --- a/doc/instances.md +++ b/doc/instances.md @@ -110,7 +110,7 @@ volatile.idmap.current | string | - | The id volatile.idmap.next | string | - | The idmap to use next time the instance starts volatile.last\_state.idmap | string | - | Serialized instance uid/gid map volatile.last\_state.power | string | - | Instance state as of last host shutdown -volatile.vm.uuid | string | - | Virtual machine UUID +volatile.uuid | string | - | Instance UUID volatile.\<name\>.apply\_quota | string | - | Disk quota to be applied on next instance start volatile.\<name\>.ceph\_rbd | string | - | RBD device path for Ceph disk devices volatile.\<name\>.host\_name | string | - | Network device name on the host From 04028a667a328abd4b0806c3b03b34364cfe92ca Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 13 Nov 2020 14:50:06 +0000 Subject: [PATCH 6/8] lxd/instance/drivers/driver/qemu: Updates Start to use and populate volatile.uuid instead of volatile.vm.uuid Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/instance/drivers/driver_qemu.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lxd/instance/drivers/driver_qemu.go b/lxd/instance/drivers/driver_qemu.go index bda16f90ae..d58cf874b5 100644 --- a/lxd/instance/drivers/driver_qemu.go +++ b/lxd/instance/drivers/driver_qemu.go @@ -779,10 +779,10 @@ func (vm *qemu) Start(stateful bool) error { } // Get a UUID for Qemu. - vmUUID := vm.localConfig["volatile.vm.uuid"] + vmUUID := vm.localConfig["volatile.uuid"] if vmUUID == "" { vmUUID = uuid.New() - vm.VolatileSet(map[string]string{"volatile.vm.uuid": vmUUID}) + vm.VolatileSet(map[string]string{"volatile.uuid": vmUUID}) } // Copy OVMF settings firmware to nvram file. From 647102c5a3cfdfaf4d6aaf4defeebf9bde0fcd41 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 13 Nov 2020 15:44:46 +0000 Subject: [PATCH 7/8] lxd/instance/drivers/driver/lxc: Generate instance UUID if not set in startCommon Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/instance/drivers/driver_lxc.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lxd/instance/drivers/driver_lxc.go b/lxd/instance/drivers/driver_lxc.go index 4705a36d90..ae53526fb2 100644 --- a/lxd/instance/drivers/driver_lxc.go +++ b/lxd/instance/drivers/driver_lxc.go @@ -19,6 +19,7 @@ import ( "time" "github.com/flosch/pongo2" + "github.com/pborman/uuid" "github.com/pkg/errors" "golang.org/x/sys/unix" liblxc "gopkg.in/lxc/go-lxc.v2" @@ -2129,6 +2130,13 @@ func (c *lxc) startCommon() (string, []func() error, error) { } ourStart = mountInfo.OurMount + // Generate UUID if not present. + instUUID := c.localConfig["volatile.uuid"] + if instUUID == "" { + instUUID = uuid.New() + c.VolatileSet(map[string]string{"volatile.uuid": instUUID}) + } + // Create the devices postStartHooks := []func() error{} nicID := -1 From 2b4dadffa029f4b2d6945ed1deb0f34ea166d0ee Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Fri, 13 Nov 2020 15:45:18 +0000 Subject: [PATCH 8/8] lxd/instance/drivers/driver/qemu: Makes UUID generation terminology consistent with container Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/instance/drivers/driver_qemu.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lxd/instance/drivers/driver_qemu.go b/lxd/instance/drivers/driver_qemu.go index d58cf874b5..65197efeaf 100644 --- a/lxd/instance/drivers/driver_qemu.go +++ b/lxd/instance/drivers/driver_qemu.go @@ -778,11 +778,11 @@ func (vm *qemu) Start(stateful bool) error { logger.Warn("Unable to use virtio-fs for config drive, using 9p as a fallback: virtiofsd missing") } - // Get a UUID for Qemu. - vmUUID := vm.localConfig["volatile.uuid"] - if vmUUID == "" { - vmUUID = uuid.New() - vm.VolatileSet(map[string]string{"volatile.uuid": vmUUID}) + // Generate UUID if not present. + instUUID := vm.localConfig["volatile.uuid"] + if instUUID == "" { + instUUID = uuid.New() + vm.VolatileSet(map[string]string{"volatile.uuid": instUUID}) } // Copy OVMF settings firmware to nvram file. @@ -850,7 +850,7 @@ func (vm *qemu) Start(stateful bool) error { qemuPath, "-S", "-name", vm.Name(), - "-uuid", vmUUID, + "-uuid", instUUID, "-daemonize", "-cpu", "host", "-nographic",
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel