[lxc-devel] [lxd/master] Storage: Use storage pool name as LVM volume group name if lvm.vg_name not set

tomponline on Github lxc-bot at linuxcontainers.org
Tue Feb 4 09:49:11 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 487 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200204/3d22b41d/attachment-0001.bin>
-------------- next part --------------
From 80a8e44776c9ea2ed883cd41605b79e59a66b147 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Tue, 4 Feb 2020 09:46:10 +0000
Subject: [PATCH 1/2] lxd/storage/drivers/driver/lvm/utils: Adds
 volumeGroupName function

It appears that some older LVM storage pools do not have the lvm.vg_name property in their config, and instead rely on the old driver behavior of using the storage pool name if it is mising.

This adds back the old behavior.

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/storage/drivers/driver_lvm_utils.go | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/lxd/storage/drivers/driver_lvm_utils.go b/lxd/storage/drivers/driver_lvm_utils.go
index ea1999c18a..a19e136af3 100644
--- a/lxd/storage/drivers/driver_lvm_utils.go
+++ b/lxd/storage/drivers/driver_lvm_utils.go
@@ -24,6 +24,15 @@ const lvmBlockVolSuffix = ".block"
 
 var errLVMNotFound = fmt.Errorf("Not found")
 
+// volumeGroupName returns the volume group name the pool is hosted on.
+func (d *lvm) volumeGroupName() string {
+	if d.config["lvm.vg_name"] != "" {
+		return d.config["lvm.vg_name"]
+	}
+
+	return d.name
+}
+
 // usesThinpool indicates whether the config specifies to use a thin pool or not.
 func (d *lvm) usesThinpool() bool {
 	// Default is to use a thinpool.

From 9ffbdba9acc61f1440d468057c801947a7cb6aeb Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Tue, 4 Feb 2020 09:47:30 +0000
Subject: [PATCH 2/2] lxd/storage/drivers/driver/lvm: volumeGroupName usage in
 place of d.config["lvm.vg_name"]

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/storage/drivers/driver_lvm.go         | 80 +++++++++++------------
 lxd/storage/drivers/driver_lvm_utils.go   | 14 ++--
 lxd/storage/drivers/driver_lvm_volumes.go | 60 ++++++++---------
 3 files changed, 77 insertions(+), 77 deletions(-)

diff --git a/lxd/storage/drivers/driver_lvm.go b/lxd/storage/drivers/driver_lvm.go
index 8a614af018..f2ecdd262e 100644
--- a/lxd/storage/drivers/driver_lvm.go
+++ b/lxd/storage/drivers/driver_lvm.go
@@ -146,7 +146,7 @@ func (d *lvm) Create() error {
 		}
 
 		// Check if the volume group already exists.
-		vgExists, vgTags, err = d.volumeGroupExists(d.config["lvm.vg_name"])
+		vgExists, vgTags, err = d.volumeGroupExists(d.volumeGroupName())
 		if err != nil {
 			return err
 		}
@@ -160,14 +160,14 @@ func (d *lvm) Create() error {
 		if d.config["lvm.vg_name"] == "" {
 			d.config["lvm.vg_name"] = d.name
 		}
-		d.config["source"] = d.config["lvm.vg_name"]
+		d.config["source"] = d.volumeGroupName()
 
 		if !shared.IsBlockdevPath(srcPath) {
 			return fmt.Errorf("Custom loop file locations are not supported")
 		}
 
 		// Check if the volume group already exists.
-		vgExists, vgTags, err = d.volumeGroupExists(d.config["lvm.vg_name"])
+		vgExists, vgTags, err = d.volumeGroupExists(d.volumeGroupName())
 		if err != nil {
 			return err
 		}
@@ -196,13 +196,13 @@ func (d *lvm) Create() error {
 		d.config["lvm.vg_name"] = d.config["source"]
 
 		// Check the volume group already exists.
-		vgExists, vgTags, err = d.volumeGroupExists(d.config["lvm.vg_name"])
+		vgExists, vgTags, err = d.volumeGroupExists(d.volumeGroupName())
 		if err != nil {
 			return err
 		}
 
 		if !vgExists {
-			return fmt.Errorf("The requested volume group %q does not exist", d.config["lvm.vg_name"])
+			return fmt.Errorf("The requested volume group %q does not exist", d.volumeGroupName())
 		}
 	} else {
 		return fmt.Errorf("Invalid source property")
@@ -220,18 +220,18 @@ func (d *lvm) Create() error {
 	if vgExists {
 		// Check that the volume group is empty. Otherwise we will refuse to use it.
 		// The LV count returned includes both normal volumes and thin volumes.
-		lvCount, err := d.countLogicalVolumes(d.config["lvm.vg_name"])
+		lvCount, err := d.countLogicalVolumes(d.volumeGroupName())
 		if err != nil {
-			return errors.Wrapf(err, "Failed to determine whether the volume group %q is empty", d.config["lvm.vg_name"])
+			return errors.Wrapf(err, "Failed to determine whether the volume group %q is empty", d.volumeGroupName())
 		}
 
 		empty := false
 		if lvCount > 0 {
 			if d.usesThinpool() {
 				// Always check if the thin pool exists as we may need to create it later.
-				thinPoolExists, err = d.thinpoolExists(d.config["lvm.vg_name"], d.thinpoolName())
+				thinPoolExists, err = d.thinpoolExists(d.volumeGroupName(), d.thinpoolName())
 				if err != nil {
-					return errors.Wrapf(err, "Failed to determine whether thinpool %q exists in volume group %q", d.config["lvm.vg_name"], d.thinpoolName())
+					return errors.Wrapf(err, "Failed to determine whether thinpool %q exists in volume group %q", d.volumeGroupName(), d.thinpoolName())
 				}
 
 				// If the single volume is the storage pool's thin pool LV then we still consider
@@ -245,12 +245,12 @@ func (d *lvm) Create() error {
 		}
 
 		if !empty {
-			return fmt.Errorf("Volume group %q is not empty", d.config["lvm.vg_name"])
+			return fmt.Errorf("Volume group %q is not empty", d.volumeGroupName())
 		}
 
 		// Check the tags on the volume group to check it is not already being used by LXD.
 		if shared.StringInSlice(lvmVgPoolMarker, vgTags) {
-			return fmt.Errorf("Volume group %q is already used by LXD", d.config["lvm.vg_name"])
+			return fmt.Errorf("Volume group %q is already used by LXD", d.volumeGroupName())
 		}
 	} else {
 		// Create physical volume if doesn't exist.
@@ -268,33 +268,33 @@ func (d *lvm) Create() error {
 		}
 
 		// Create volume group.
-		_, err := shared.TryRunCommand("vgcreate", d.config["lvm.vg_name"], pvName)
+		_, err := shared.TryRunCommand("vgcreate", d.volumeGroupName(), pvName)
 		if err != nil {
 			return err
 		}
-		d.logger.Debug("Volume group created", log.Ctx{"pv_name": pvName, "vg_name": d.config["lvm.vg_name"]})
-		revert.Add(func() { shared.TryRunCommand("vgremove", d.config["lvm.vg_name"]) })
+		d.logger.Debug("Volume group created", log.Ctx{"pv_name": pvName, "vg_name": d.volumeGroupName()})
+		revert.Add(func() { shared.TryRunCommand("vgremove", d.volumeGroupName()) })
 	}
 
 	// Create thin pool if needed.
 	if d.usesThinpool() && !thinPoolExists {
-		err = d.createDefaultThinPool(d.Info().Version, d.config["lvm.vg_name"], d.thinpoolName())
+		err = d.createDefaultThinPool(d.Info().Version, d.volumeGroupName(), d.thinpoolName())
 		if err != nil {
 			return err
 		}
-		d.logger.Debug("Thin pool created", log.Ctx{"vg_name": d.config["lvm.vg_name"], "thinpool_name": d.thinpoolName()})
+		d.logger.Debug("Thin pool created", log.Ctx{"vg_name": d.volumeGroupName(), "thinpool_name": d.thinpoolName()})
 
 		revert.Add(func() {
-			d.removeLogicalVolume(d.lvmDevPath(d.config["lvm.vg_name"], "", "", d.thinpoolName()))
+			d.removeLogicalVolume(d.lvmDevPath(d.volumeGroupName(), "", "", d.thinpoolName()))
 		})
 	}
 
 	// Mark the volume group with the lvmVgPoolMarker tag to indicate it is now in use by LXD.
-	_, err = shared.TryRunCommand("vgchange", "--addtag", lvmVgPoolMarker, d.config["lvm.vg_name"])
+	_, err = shared.TryRunCommand("vgchange", "--addtag", lvmVgPoolMarker, d.volumeGroupName())
 	if err != nil {
 		return err
 	}
-	d.logger.Debug("LXD marker tag added to volume group", log.Ctx{"vg_name": d.config["lvm.vg_name"]})
+	d.logger.Debug("LXD marker tag added to volume group", log.Ctx{"vg_name": d.volumeGroupName()})
 
 	revert.Success()
 	return nil
@@ -314,7 +314,7 @@ func (d *lvm) Delete(op *operations.Operation) error {
 		defer loopFile.Close()
 	}
 
-	vgExists, vgTags, err := d.volumeGroupExists(d.config["lvm.vg_name"])
+	vgExists, vgTags, err := d.volumeGroupExists(d.volumeGroupName())
 	if err != nil {
 		return err
 	}
@@ -322,7 +322,7 @@ func (d *lvm) Delete(op *operations.Operation) error {
 	removeVg := false
 	if vgExists {
 		// Count normal and thin volumes.
-		lvCount, err := d.countLogicalVolumes(d.config["lvm.vg_name"])
+		lvCount, err := d.countLogicalVolumes(d.volumeGroupName())
 		if err != nil && err != errLVMNotFound {
 			return err
 		}
@@ -336,7 +336,7 @@ func (d *lvm) Delete(op *operations.Operation) error {
 			} else if d.usesThinpool() && lvCount > 0 {
 				// Lets see if the lv count is just our thin pool, or whether we can only remove
 				// the thin pool itself and not the volume group.
-				thinVolCount, err := d.countThinVolumes(d.config["lvm.vg_name"], d.thinpoolName())
+				thinVolCount, err := d.countThinVolumes(d.volumeGroupName(), d.thinpoolName())
 				if err != nil && err != errLVMNotFound {
 					return err
 				}
@@ -350,11 +350,11 @@ func (d *lvm) Delete(op *operations.Operation) error {
 					} else if thinVolCount == 0 && lvCount > 1 {
 						// Otherwise, if the thin pool is empty but the volume group has
 						// other volumes, then just remove the thin pool volume.
-						err = d.removeLogicalVolume(d.lvmDevPath(d.config["lvm.vg_name"], "", "", d.thinpoolName()))
+						err = d.removeLogicalVolume(d.lvmDevPath(d.volumeGroupName(), "", "", d.thinpoolName()))
 						if err != nil {
-							return errors.Wrapf(err, "Failed to delete thin pool %q from volume group %q", d.thinpoolName(), d.config["lvm.vg_name"])
+							return errors.Wrapf(err, "Failed to delete thin pool %q from volume group %q", d.thinpoolName(), d.volumeGroupName())
 						}
-						d.logger.Debug("Thin pool removed", log.Ctx{"vg_name": d.config["lvm.vg_name"], "thinpool_name": d.thinpoolName()})
+						d.logger.Debug("Thin pool removed", log.Ctx{"vg_name": d.volumeGroupName(), "thinpool_name": d.thinpoolName()})
 					}
 				}
 			}
@@ -362,19 +362,19 @@ func (d *lvm) Delete(op *operations.Operation) error {
 
 		// Remove volume group if needed.
 		if removeVg {
-			_, err := shared.TryRunCommand("vgremove", "-f", d.config["lvm.vg_name"])
+			_, err := shared.TryRunCommand("vgremove", "-f", d.volumeGroupName())
 			if err != nil {
 				return errors.Wrapf(err, "Failed to delete the volume group for the lvm storage pool")
 			}
-			d.logger.Debug("Volume group removed", log.Ctx{"vg_name": d.config["lvm.vg_name"]})
+			d.logger.Debug("Volume group removed", log.Ctx{"vg_name": d.volumeGroupName()})
 		} else {
 			// Otherwise just remove the lvmVgPoolMarker tag to indicate LXD no longer uses this VG.
 			if shared.StringInSlice(lvmVgPoolMarker, vgTags) {
-				_, err = shared.TryRunCommand("vgchange", "--deltag", lvmVgPoolMarker, d.config["lvm.vg_name"])
+				_, err = shared.TryRunCommand("vgchange", "--deltag", lvmVgPoolMarker, d.volumeGroupName())
 				if err != nil {
 					return errors.Wrapf(err, "Failed to remove marker tag on volume group for the lvm storage pool")
 				}
-				d.logger.Debug("LXD marker tag removed from volume group", log.Ctx{"vg_name": d.config["lvm.vg_name"]})
+				d.logger.Debug("LXD marker tag removed from volume group", log.Ctx{"vg_name": d.volumeGroupName()})
 			}
 		}
 	}
@@ -457,19 +457,19 @@ func (d *lvm) Update(changedConfig map[string]string) error {
 	}
 
 	if changedConfig["lvm.vg_name"] != "" {
-		_, err := shared.TryRunCommand("vgrename", d.config["lvm.vg_name"], changedConfig["lvm.vg_name"])
+		_, err := shared.TryRunCommand("vgrename", d.volumeGroupName(), changedConfig["lvm.vg_name"])
 		if err != nil {
-			return errors.Wrapf(err, "Error renaming LVM volume group from %q to %q", d.config["lvm.vg_name"], changedConfig["lvm.vg_name"])
+			return errors.Wrapf(err, "Error renaming LVM volume group from %q to %q", d.volumeGroupName(), changedConfig["lvm.vg_name"])
 		}
-		d.logger.Debug("Volume group renamed", log.Ctx{"vg_name": d.config["lvm.vg_name"], "new_vg_name": changedConfig["lvm.vg_name"]})
+		d.logger.Debug("Volume group renamed", log.Ctx{"vg_name": d.volumeGroupName(), "new_vg_name": changedConfig["lvm.vg_name"]})
 	}
 
 	if changedConfig["lvm.thinpool_name"] != "" {
-		_, err := shared.TryRunCommand("lvrename", d.config["lvm.vg_name"], d.config["lvm.thinpool_name"], changedConfig["lvm.thinpool_name"])
+		_, err := shared.TryRunCommand("lvrename", d.volumeGroupName(), d.config["lvm.thinpool_name"], changedConfig["lvm.thinpool_name"])
 		if err != nil {
 			return errors.Wrapf(err, "Error renaming LVM thin pool from %q to %q", d.config["lvm.thinpool_name"], changedConfig["lvm.thinpool_name"])
 		}
-		d.logger.Debug("Thin pool volume renamed", log.Ctx{"vg_name": d.config["lvm.vg_name"], "thinpool": d.config["lvm.thinpool_name"], "new_thinpool": changedConfig["lvm.thinpool_name"]})
+		d.logger.Debug("Thin pool volume renamed", log.Ctx{"vg_name": d.volumeGroupName(), "thinpool": d.config["lvm.thinpool_name"], "new_thinpool": changedConfig["lvm.thinpool_name"]})
 	}
 
 	return nil
@@ -479,7 +479,7 @@ func (d *lvm) Update(changedConfig map[string]string) error {
 // LVM pools this creates a loop device).
 func (d *lvm) Mount() (bool, error) {
 	// Open the loop file if the LVM device doesn't exist yet and the source points to a file.
-	if !shared.IsDir(fmt.Sprintf("/dev/%s", d.config["lvm.vg_name"])) && filepath.IsAbs(d.config["source"]) && !shared.IsBlockdevPath(d.config["source"]) {
+	if !shared.IsDir(fmt.Sprintf("/dev/%s", d.volumeGroupName())) && filepath.IsAbs(d.config["source"]) && !shared.IsBlockdevPath(d.config["source"]) {
 		loopFile, err := d.openLoopFile(d.config["source"])
 		if err != nil {
 			return false, err
@@ -490,7 +490,7 @@ func (d *lvm) Mount() (bool, error) {
 	}
 
 	// Activate volume group so that it's device is added to /dev.
-	_, err := shared.TryRunCommand("vgchange", "-ay", d.config["lvm.vg_name"])
+	_, err := shared.TryRunCommand("vgchange", "-ay", d.volumeGroupName())
 	if err != nil {
 		return false, err
 	}
@@ -503,10 +503,10 @@ func (d *lvm) Mount() (bool, error) {
 func (d *lvm) Unmount() (bool, error) {
 	// If loop backed, force release the loop device.
 	if filepath.IsAbs(d.config["source"]) && !shared.IsBlockdevPath(d.config["source"]) {
-		vgExists, _, _ := d.volumeGroupExists(d.config["lvm.vg_name"])
+		vgExists, _, _ := d.volumeGroupExists(d.volumeGroupName())
 		if vgExists {
 			// Deactivate volume group so that it's device is removed from /dev.
-			_, err := shared.TryRunCommand("vgchange", "-an", d.config["lvm.vg_name"])
+			_, err := shared.TryRunCommand("vgchange", "-an", d.volumeGroupName())
 			if err != nil {
 				return false, err
 			}
@@ -531,7 +531,7 @@ func (d *lvm) GetResources() (*api.ResourcesStoragePool, error) {
 	// Thinpools will always report zero free space on the volume group, so calculate approx
 	// used space using the thinpool logical volume allocated (data and meta) percentages.
 	if d.usesThinpool() {
-		volDevPath := d.lvmDevPath(d.config["lvm.vg_name"], "", "", d.thinpoolName())
+		volDevPath := d.lvmDevPath(d.volumeGroupName(), "", "", d.thinpoolName())
 		totalSize, usedSize, err := d.thinPoolVolumeUsage(volDevPath)
 		if err != nil {
 			return nil, err
@@ -542,7 +542,7 @@ func (d *lvm) GetResources() (*api.ResourcesStoragePool, error) {
 	} else {
 		// If thinpools are not in use, calculate used space in volume group.
 		args := []string{
-			d.config["lvm.vg_name"],
+			d.volumeGroupName(),
 			"--noheadings",
 			"--units", "b",
 			"--nosuffix",
diff --git a/lxd/storage/drivers/driver_lvm_utils.go b/lxd/storage/drivers/driver_lvm_utils.go
index a19e136af3..696399793e 100644
--- a/lxd/storage/drivers/driver_lvm_utils.go
+++ b/lxd/storage/drivers/driver_lvm_utils.go
@@ -578,13 +578,13 @@ func (d *lvm) copyThinpoolVolume(vol, srcVol Volume, srcSnapshots []Volume, refr
 			// We do not modify the original snapshot so as to avoid damaging if it is corrupted for
 			// some reason. If the filesystem needs to have a unique UUID generated in order to mount
 			// this will be done at restore time to be safe.
-			_, err = d.createLogicalVolumeSnapshot(d.config["lvm.vg_name"], srcSnapshot, newSnapVol, true, d.usesThinpool())
+			_, err = d.createLogicalVolumeSnapshot(d.volumeGroupName(), srcSnapshot, newSnapVol, true, d.usesThinpool())
 			if err != nil {
 				return errors.Wrapf(err, "Error creating LVM logical volume snapshot")
 			}
 
 			revert.Add(func() {
-				d.removeLogicalVolume(d.lvmDevPath(d.config["lvm.vg_name"], newSnapVol.volType, newSnapVol.contentType, newSnapVol.name))
+				d.removeLogicalVolume(d.lvmDevPath(d.volumeGroupName(), newSnapVol.volType, newSnapVol.contentType, newSnapVol.name))
 			})
 		}
 	}
@@ -592,9 +592,9 @@ func (d *lvm) copyThinpoolVolume(vol, srcVol Volume, srcSnapshots []Volume, refr
 	// Handle copying the main volume.
 	if d.HasVolume(vol) {
 		if refresh {
-			newVolDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, vol.name)
+			newVolDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, vol.name)
 			tmpVolName := fmt.Sprintf("%s%s", vol.name, tmpVolSuffix)
-			tmpVolDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, tmpVolName)
+			tmpVolDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, tmpVolName)
 
 			// Rename existing volume to temporary new name so we can revert if needed.
 			err := d.renameLogicalVolume(newVolDevPath, tmpVolDevPath)
@@ -623,12 +623,12 @@ func (d *lvm) copyThinpoolVolume(vol, srcVol Volume, srcSnapshots []Volume, refr
 	}
 
 	// Create snapshot of source volume as new volume.
-	_, err := d.createLogicalVolumeSnapshot(d.config["lvm.vg_name"], srcVol, vol, false, d.usesThinpool())
+	_, err := d.createLogicalVolumeSnapshot(d.volumeGroupName(), srcVol, vol, false, d.usesThinpool())
 	if err != nil {
 		return errors.Wrapf(err, "Error creating LVM logical volume snapshot")
 	}
 
-	volDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, vol.name)
+	volDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, vol.name)
 
 	revert.Add(func() {
 		d.removeLogicalVolume(volDevPath)
@@ -655,7 +655,7 @@ func (d *lvm) copyThinpoolVolume(vol, srcVol Volume, srcSnapshots []Volume, refr
 
 	// Finally clean up original volumes left that were renamed with a tmpVolSuffix suffix.
 	for _, removeVolName := range removeVols {
-		err := d.removeLogicalVolume(d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, removeVolName))
+		err := d.removeLogicalVolume(d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, removeVolName))
 		if err != nil {
 			return errors.Wrapf(err, "Error removing LVM volume %q", vol.name)
 		}
diff --git a/lxd/storage/drivers/driver_lvm_volumes.go b/lxd/storage/drivers/driver_lvm_volumes.go
index d55449964e..472fb5fa75 100644
--- a/lxd/storage/drivers/driver_lvm_volumes.go
+++ b/lxd/storage/drivers/driver_lvm_volumes.go
@@ -29,7 +29,7 @@ func (d *lvm) CreateVolume(vol Volume, filler *VolumeFiller, op *operations.Oper
 	}
 	revert.Add(func() { os.RemoveAll(volPath) })
 
-	err = d.createLogicalVolume(d.config["lvm.vg_name"], d.thinpoolName(), vol, d.usesThinpool())
+	err = d.createLogicalVolume(d.volumeGroupName(), d.thinpoolName(), vol, d.usesThinpool())
 	if err != nil {
 		return errors.Wrapf(err, "Error creating LVM logical volume")
 	}
@@ -162,7 +162,7 @@ func (d *lvm) DeleteVolume(vol Volume, op *operations.Operation) error {
 		return fmt.Errorf("Cannot remove a volume that has snapshots")
 	}
 
-	volDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, vol.name)
+	volDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, vol.name)
 	lvExists, err := d.logicalVolumeExists(volDevPath)
 	if err != nil {
 		return err
@@ -176,7 +176,7 @@ func (d *lvm) DeleteVolume(vol Volume, op *operations.Operation) error {
 			}
 		}
 
-		err = d.removeLogicalVolume(d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, vol.name))
+		err = d.removeLogicalVolume(d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, vol.name))
 		if err != nil {
 			return errors.Wrapf(err, "Error removing LVM logical volume")
 		}
@@ -212,7 +212,7 @@ func (d *lvm) DeleteVolume(vol Volume, op *operations.Operation) error {
 
 // HasVolume indicates whether a specific volume exists on the storage pool.
 func (d *lvm) HasVolume(vol Volume) bool {
-	volDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, vol.name)
+	volDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, vol.name)
 	volExists, err := d.logicalVolumeExists(volDevPath)
 	if err != nil {
 		return false
@@ -288,7 +288,7 @@ func (d *lvm) GetVolumeUsage(vol Volume) (int64, error) {
 	} else if vol.contentType == ContentTypeBlock && d.usesThinpool() {
 		// For thin pool block volumes we can calculate an approximate usage using the space allocated to
 		// the volume from the thin pool.
-		volDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, vol.name)
+		volDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, vol.name)
 		_, usedSize, err := d.thinPoolVolumeUsage(volDevPath)
 		if err != nil {
 			return -1, err
@@ -313,7 +313,7 @@ func (d *lvm) SetVolumeQuota(vol Volume, size string, op *operations.Operation)
 	}
 
 	// Read actual size of current volume.
-	volDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, vol.name)
+	volDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, vol.name)
 	oldSizeBytes, err := d.logicalVolumeSize(volDevPath)
 	if err != nil {
 		return err
@@ -321,7 +321,7 @@ func (d *lvm) SetVolumeQuota(vol Volume, size string, op *operations.Operation)
 
 	// Get the volume group's physical extent size, as we use this to figure out if the new and old sizes are
 	// going to change beyond 1 extent size, otherwise there is no point in trying to resize as LVM do it.
-	vgExtentSize, err := d.volumeGroupExtentSize(d.config["lvm.vg_name"])
+	vgExtentSize, err := d.volumeGroupExtentSize(d.volumeGroupName())
 	if err != nil {
 		return err
 	}
@@ -383,7 +383,7 @@ func (d *lvm) SetVolumeQuota(vol Volume, size string, op *operations.Operation)
 // GetVolumeDiskPath returns the location of a disk volume.
 func (d *lvm) GetVolumeDiskPath(vol Volume) (string, error) {
 	if vol.IsVMBlock() {
-		volDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, vol.name)
+		volDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, vol.name)
 		return volDevPath, nil
 	}
 
@@ -397,7 +397,7 @@ func (d *lvm) MountVolume(vol Volume, op *operations.Operation) (bool, error) {
 
 	// Check if already mounted.
 	if vol.contentType == ContentTypeFS && !shared.IsMountPoint(mountPath) {
-		volDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, vol.name)
+		volDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, vol.name)
 		mountFlags, mountOptions := resolveMountOptions(d.volumeMountOptions(vol))
 		err := TryMount(volDevPath, mountPath, d.volumeFilesystem(vol), mountFlags, mountOptions)
 		if err != nil {
@@ -438,7 +438,7 @@ func (d *lvm) UnmountVolume(vol Volume, op *operations.Operation) (bool, error)
 
 // RenameVolume renames a volume and its snapshots.
 func (d *lvm) RenameVolume(vol Volume, newVolName string, op *operations.Operation) error {
-	volDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, vol.name)
+	volDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, vol.name)
 
 	return vol.UnmountTask(func(op *operations.Operation) error {
 		snapNames, err := d.VolumeSnapshots(vol, op)
@@ -452,9 +452,9 @@ func (d *lvm) RenameVolume(vol Volume, newVolName string, op *operations.Operati
 		// Rename snapshots (change volume prefix to use new parent volume name).
 		for _, snapName := range snapNames {
 			snapVolName := GetSnapshotVolumeName(vol.name, snapName)
-			snapVolDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, snapVolName)
+			snapVolDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, snapVolName)
 			newSnapVolName := GetSnapshotVolumeName(newVolName, snapName)
-			newSnapVolDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, newSnapVolName)
+			newSnapVolDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, newSnapVolName)
 			err = d.renameLogicalVolume(snapVolDevPath, newSnapVolDevPath)
 			if err != nil {
 				return err
@@ -476,7 +476,7 @@ func (d *lvm) RenameVolume(vol Volume, newVolName string, op *operations.Operati
 		}
 
 		// Rename actual volume.
-		newVolDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, newVolName)
+		newVolDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, newVolName)
 		err = d.renameLogicalVolume(volDevPath, newVolDevPath)
 		if err != nil {
 			return err
@@ -549,12 +549,12 @@ func (d *lvm) CreateVolumeSnapshot(snapVol Volume, op *operations.Operation) err
 	}
 	revert.Add(func() { os.RemoveAll(snapPath) })
 
-	_, err = d.createLogicalVolumeSnapshot(d.config["lvm.vg_name"], parentVol, snapVol, true, d.usesThinpool())
+	_, err = d.createLogicalVolumeSnapshot(d.volumeGroupName(), parentVol, snapVol, true, d.usesThinpool())
 	if err != nil {
 		return errors.Wrapf(err, "Error creating LVM logical volume snapshot")
 	}
 
-	volDevPath := d.lvmDevPath(d.config["lvm.vg_name"], snapVol.volType, snapVol.contentType, snapVol.name)
+	volDevPath := d.lvmDevPath(d.volumeGroupName(), snapVol.volType, snapVol.contentType, snapVol.name)
 
 	revert.Add(func() {
 		d.removeLogicalVolume(volDevPath)
@@ -564,7 +564,7 @@ func (d *lvm) CreateVolumeSnapshot(snapVol Volume, op *operations.Operation) err
 	if snapVol.IsVMBlock() {
 		parentFSVol := parentVol.NewVMBlockFilesystemVolume()
 		fsVol := snapVol.NewVMBlockFilesystemVolume()
-		_, err = d.createLogicalVolumeSnapshot(d.config["lvm.vg_name"], parentFSVol, fsVol, true, d.usesThinpool())
+		_, err = d.createLogicalVolumeSnapshot(d.volumeGroupName(), parentFSVol, fsVol, true, d.usesThinpool())
 		if err != nil {
 			return errors.Wrapf(err, "Error creating LVM logical volume snapshot")
 		}
@@ -578,7 +578,7 @@ func (d *lvm) CreateVolumeSnapshot(snapVol Volume, op *operations.Operation) err
 // must be bare names and should not be in the format "volume/snapshot".
 func (d *lvm) DeleteVolumeSnapshot(snapVol Volume, op *operations.Operation) error {
 	// Remove the snapshot from the storage device.
-	volDevPath := d.lvmDevPath(d.config["lvm.vg_name"], snapVol.volType, snapVol.contentType, snapVol.name)
+	volDevPath := d.lvmDevPath(d.volumeGroupName(), snapVol.volType, snapVol.contentType, snapVol.name)
 	lvExists, err := d.logicalVolumeExists(volDevPath)
 	if err != nil {
 		return err
@@ -590,7 +590,7 @@ func (d *lvm) DeleteVolumeSnapshot(snapVol Volume, op *operations.Operation) err
 			return errors.Wrapf(err, "Error unmounting LVM logical volume")
 		}
 
-		err = d.removeLogicalVolume(d.lvmDevPath(d.config["lvm.vg_name"], snapVol.volType, snapVol.contentType, snapVol.name))
+		err = d.removeLogicalVolume(d.lvmDevPath(d.volumeGroupName(), snapVol.volType, snapVol.contentType, snapVol.name))
 		if err != nil {
 			return errors.Wrapf(err, "Error removing LVM logical volume")
 		}
@@ -649,16 +649,16 @@ func (d *lvm) MountVolumeSnapshot(snapVol Volume, op *operations.Operation) (boo
 			tmpVol := NewVolume(d, d.name, snapVol.volType, snapVol.contentType, tmpVolName, snapVol.config, snapVol.poolConfig)
 
 			// Create writable snapshot from source snapshot named with a tmpVolSuffix suffix.
-			_, err := d.createLogicalVolumeSnapshot(d.config["lvm.vg_name"], snapVol, tmpVol, false, d.usesThinpool())
+			_, err := d.createLogicalVolumeSnapshot(d.volumeGroupName(), snapVol, tmpVol, false, d.usesThinpool())
 			if err != nil {
 				return false, errors.Wrapf(err, "Error creating temporary LVM logical volume snapshot")
 			}
 
 			revert.Add(func() {
-				d.removeLogicalVolume(d.lvmDevPath(d.config["lvm.vg_name"], tmpVol.volType, tmpVol.contentType, tmpVol.name))
+				d.removeLogicalVolume(d.lvmDevPath(d.volumeGroupName(), tmpVol.volType, tmpVol.contentType, tmpVol.name))
 			})
 
-			tmpVolDevPath := d.lvmDevPath(d.config["lvm.vg_name"], tmpVol.volType, tmpVol.contentType, tmpVol.name)
+			tmpVolDevPath := d.lvmDevPath(d.volumeGroupName(), tmpVol.volType, tmpVol.contentType, tmpVol.name)
 
 			d.logger.Debug("Regenerating filesystem UUID", log.Ctx{"dev": tmpVolDevPath, "fs": d.volumeFilesystem(tmpVol)})
 			err = regenerateFilesystemUUID(d.volumeFilesystem(tmpVol), tmpVolDevPath)
@@ -671,7 +671,7 @@ func (d *lvm) MountVolumeSnapshot(snapVol Volume, op *operations.Operation) (boo
 		}
 
 		// Finally attempt to mount the volume that needs mounting.
-		volDevPath := d.lvmDevPath(d.config["lvm.vg_name"], mountVol.volType, mountVol.contentType, mountVol.name)
+		volDevPath := d.lvmDevPath(d.volumeGroupName(), mountVol.volType, mountVol.contentType, mountVol.name)
 		mountFlags, mountOptions := resolveMountOptions(d.volumeMountOptions(snapVol))
 		err := TryMount(volDevPath, mountPath, d.volumeFilesystem(mountVol), mountFlags|unix.MS_RDONLY, mountOptions)
 		if err != nil {
@@ -707,7 +707,7 @@ func (d *lvm) UnmountVolumeSnapshot(snapVol Volume, op *operations.Operation) (b
 
 		// Check if a temporary snapshot exists, and if so remove it.
 		tmpVolName := fmt.Sprintf("%s%s", snapVol.name, tmpVolSuffix)
-		tmpVolDevPath := d.lvmDevPath(d.config["lvm.vg_name"], snapVol.volType, snapVol.contentType, tmpVolName)
+		tmpVolDevPath := d.lvmDevPath(d.volumeGroupName(), snapVol.volType, snapVol.contentType, tmpVolName)
 		exists, err := d.logicalVolumeExists(tmpVolDevPath)
 		if err != nil {
 			return true, errors.Wrapf(err, "Failed to check existence of temporary LVM snapshot volume %q", tmpVolDevPath)
@@ -755,9 +755,9 @@ func (d *lvm) RestoreVolume(vol Volume, snapshotName string, op *operations.Oper
 			return errors.Wrapf(err, "Error unmounting LVM logical volume")
 		}
 
-		originalVolDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, vol.name)
+		originalVolDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, vol.name)
 		tmpVolName := fmt.Sprintf("%s%s", vol.name, tmpVolSuffix)
-		tmpVolDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, tmpVolName)
+		tmpVolDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, tmpVolName)
 
 		// Rename original logical volume to temporary new name so we can revert if needed.
 		err = d.renameLogicalVolume(originalVolDevPath, tmpVolDevPath)
@@ -771,12 +771,12 @@ func (d *lvm) RestoreVolume(vol Volume, snapshotName string, op *operations.Oper
 		})
 
 		// Create writable snapshot from source snapshot named as target volume.
-		_, err = d.createLogicalVolumeSnapshot(d.config["lvm.vg_name"], snapVol, vol, false, true)
+		_, err = d.createLogicalVolumeSnapshot(d.volumeGroupName(), snapVol, vol, false, true)
 		if err != nil {
 			return errors.Wrapf(err, "Error restoring LVM logical volume snapshot")
 		}
 
-		volDevPath := d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, vol.name)
+		volDevPath := d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, vol.name)
 
 		revert.Add(func() {
 			d.removeLogicalVolume(volDevPath)
@@ -792,7 +792,7 @@ func (d *lvm) RestoreVolume(vol Volume, snapshotName string, op *operations.Oper
 		}
 
 		// Finally remove the original logical volume. Should always be the last step to allow revert.
-		err = d.removeLogicalVolume(d.lvmDevPath(d.config["lvm.vg_name"], vol.volType, vol.contentType, tmpVolName))
+		err = d.removeLogicalVolume(d.lvmDevPath(d.volumeGroupName(), vol.volType, vol.contentType, tmpVolName))
 		if err != nil {
 			return errors.Wrapf(err, "Error removing original LVM logical volume")
 		}
@@ -835,11 +835,11 @@ func (d *lvm) RestoreVolume(vol Volume, snapshotName string, op *operations.Oper
 
 // RenameVolumeSnapshot renames a volume snapshot.
 func (d *lvm) RenameVolumeSnapshot(snapVol Volume, newSnapshotName string, op *operations.Operation) error {
-	volDevPath := d.lvmDevPath(d.config["lvm.vg_name"], snapVol.volType, snapVol.contentType, snapVol.name)
+	volDevPath := d.lvmDevPath(d.volumeGroupName(), snapVol.volType, snapVol.contentType, snapVol.name)
 
 	parentName, _, _ := shared.InstanceGetParentAndSnapshotName(snapVol.name)
 	newSnapVolName := GetSnapshotVolumeName(parentName, newSnapshotName)
-	newVolDevPath := d.lvmDevPath(d.config["lvm.vg_name"], snapVol.volType, snapVol.contentType, newSnapVolName)
+	newVolDevPath := d.lvmDevPath(d.volumeGroupName(), snapVol.volType, snapVol.contentType, newSnapVolName)
 	err := d.renameLogicalVolume(volDevPath, newVolDevPath)
 	if err != nil {
 		return errors.Wrapf(err, "Error renaming LVM logical volume")


More information about the lxc-devel mailing list