The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6605
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) ===
From 84db47f63dea75c9b180fb5a35b8d7096aa08738 Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Thu, 12 Dec 2019 11:12:07 +0100 Subject: [PATCH 1/3] lxd/storage/drivers: Always pass Volume argument This changes the drivers interface to always take a Volume argument instead of separate volType and volName. Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- lxd/storage/drivers/interface.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lxd/storage/drivers/interface.go b/lxd/storage/drivers/interface.go index 0732ebeb69..c250ff864b 100644 --- a/lxd/storage/drivers/interface.go +++ b/lxd/storage/drivers/interface.go @@ -23,7 +23,7 @@ type Driver interface { // Internal. Config() map[string]string Info() Info - HasVolume(volType VolumeType, volName string) bool + HasVolume(vol Volume) bool // Pool. Create() error @@ -39,33 +39,33 @@ type Driver interface { CreateVolume(vol Volume, filler *VolumeFiller, op *operations.Operation) error CreateVolumeFromCopy(vol Volume, srcVol Volume, copySnapshots bool, op *operations.Operation) error RefreshVolume(vol Volume, srcVol Volume, srcSnapshots []Volume, op *operations.Operation) error - DeleteVolume(volType VolumeType, volName string, op *operations.Operation) error - RenameVolume(volType VolumeType, volName string, newName string, op *operations.Operation) error + DeleteVolume(vol Volume, op *operations.Operation) error + RenameVolume(vol Volume, newName string, op *operations.Operation) error UpdateVolume(vol Volume, changedConfig map[string]string) error - GetVolumeUsage(volType VolumeType, volName string) (int64, error) - SetVolumeQuota(volType VolumeType, volName, size string, op *operations.Operation) error - GetVolumeDiskPath(volType VolumeType, volName string) (string, error) + GetVolumeUsage(vol Volume) (int64, error) + SetVolumeQuota(vol Volume, size string, op *operations.Operation) error + GetVolumeDiskPath(vol Volume) (string, error) // MountVolume mounts a storage volume, returns true if we caused a new mount, false if // already mounted. - MountVolume(volType VolumeType, volName string, op *operations.Operation) (bool, error) + MountVolume(vol Volume, op *operations.Operation) (bool, error) // MountVolumeSnapshot mounts a storage volume snapshot as readonly, returns true if we // caused a new mount, false if already mounted. - MountVolumeSnapshot(volType VolumeType, volName, snapshotName string, op *operations.Operation) (bool, error) + MountVolumeSnapshot(vol Volume, snapshotName string, op *operations.Operation) (bool, error) // UnmountVolume unmounts a storage volume, returns true if unmounted, false if was not // mounted. - UnmountVolume(volType VolumeType, volName string, op *operations.Operation) (bool, error) + UnmountVolume(vol Volume, op *operations.Operation) (bool, error) // UnmountVolume unmounts a storage volume snapshot, returns true if unmounted, false if was // not mounted. - UnmountVolumeSnapshot(VolumeType VolumeType, volName, snapshotName string, op *operations.Operation) (bool, error) + UnmountVolumeSnapshot(vol Volume, snapshotName string, op *operations.Operation) (bool, error) - CreateVolumeSnapshot(volType VolumeType, volName string, newSnapshotName string, op *operations.Operation) error - DeleteVolumeSnapshot(volType VolumeType, volName string, snapshotName string, op *operations.Operation) error - RenameVolumeSnapshot(volType VolumeType, volName string, snapshotName string, newSnapshotName string, op *operations.Operation) error - VolumeSnapshots(volType VolumeType, volName string, op *operations.Operation) ([]string, error) + CreateVolumeSnapshot(vol Volume, newSnapshotName string, op *operations.Operation) error + DeleteVolumeSnapshot(vol Volume, snapshotName string, op *operations.Operation) error + RenameVolumeSnapshot(vol Volume, snapshotName string, newSnapshotName string, op *operations.Operation) error + VolumeSnapshots(vol Volume, op *operations.Operation) ([]string, error) RestoreVolume(vol Volume, snapshotName string, op *operations.Operation) error // Migration. From ea66c9b4039a148d43745e2d8bdeb8f4519eb1e9 Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Thu, 12 Dec 2019 11:12:55 +0100 Subject: [PATCH 2/3] lxd/storage/drivers: Use new driver interface Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- lxd/storage/drivers/driver_cephfs.go | 110 +++++++++++++-------------- lxd/storage/drivers/driver_dir.go | 88 +++++++++++---------- lxd/storage/drivers/volume.go | 13 ++-- 3 files changed, 105 insertions(+), 106 deletions(-) diff --git a/lxd/storage/drivers/driver_cephfs.go b/lxd/storage/drivers/driver_cephfs.go index fa1c759458..dcb5f2ff93 100644 --- a/lxd/storage/drivers/driver_cephfs.go +++ b/lxd/storage/drivers/driver_cephfs.go @@ -67,8 +67,8 @@ func (d *cephfs) Info() Info { } } -func (d *cephfs) HasVolume(volType VolumeType, volName string) bool { - if shared.PathExists(GetVolumeMountPath(d.name, volType, volName)) { +func (d *cephfs) HasVolume(vol Volume) bool { + if shared.PathExists(GetVolumeMountPath(d.name, vol.volType, vol.name)) { return true } @@ -289,7 +289,7 @@ func (d *cephfs) ValidateVolume(vol Volume, removeUnknownKeys bool) error { } // GetVolumeDiskPath returns the location of a root disk block device. -func (d *cephfs) GetVolumeDiskPath(volType VolumeType, volName string) (string, error) { +func (d *cephfs) GetVolumeDiskPath(vol Volume) (string, error) { return "", ErrNotImplemented } @@ -355,7 +355,7 @@ func (d *cephfs) CreateVolumeFromCopy(vol Volume, srcVol Volume, copySnapshots b // Remove any paths created if we are reverting. for _, snapName := range revertSnaps { - d.DeleteVolumeSnapshot(vol.volType, vol.name, snapName, op) + d.DeleteVolumeSnapshot(vol, snapName, op) } os.RemoveAll(volPath) @@ -382,7 +382,7 @@ func (d *cephfs) CreateVolumeFromCopy(vol Volume, srcVol Volume, copySnapshots b }, op) // Create the snapshot itself. - err = d.CreateVolumeSnapshot(vol.volType, vol.name, snapName, op) + err = d.CreateVolumeSnapshot(vol, snapName, op) if err != nil { return err } @@ -393,7 +393,7 @@ func (d *cephfs) CreateVolumeFromCopy(vol Volume, srcVol Volume, copySnapshots b } // Apply the volume quota if specified. - err = d.SetVolumeQuota(vol.volType, vol.name, vol.config["size"], op) + err = d.SetVolumeQuota(vol, vol.config["size"], op) if err != nil { return err } @@ -416,12 +416,12 @@ func (d *cephfs) RefreshVolume(vol Volume, srcVol Volume, srcSnapshots []Volume, return ErrNotImplemented } -func (d *cephfs) DeleteVolume(volType VolumeType, volName string, op *operations.Operation) error { - if volType != VolumeTypeCustom { +func (d *cephfs) DeleteVolume(vol Volume, op *operations.Operation) error { + if vol.volType != VolumeTypeCustom { return fmt.Errorf("Volume type not supported") } - snapshots, err := d.VolumeSnapshots(volType, volName, op) + snapshots, err := d.VolumeSnapshots(vol, op) if err != nil { return err } @@ -430,7 +430,7 @@ func (d *cephfs) DeleteVolume(volType VolumeType, volName string, op *operations return fmt.Errorf("Cannot remove a volume that has snapshots") } - volPath := GetVolumeMountPath(d.name, volType, volName) + volPath := GetVolumeMountPath(d.name, vol.volType, vol.name) // If the volume doesn't exist, then nothing more to do. if !shared.PathExists(volPath) { @@ -445,7 +445,7 @@ func (d *cephfs) DeleteVolume(volType VolumeType, volName string, op *operations // Although the volume snapshot directory should already be removed, lets remove it here // to just in case the top-level directory is left. - snapshotDir := GetVolumeSnapshotDir(d.name, volType, volName) + snapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, vol.name) err = os.RemoveAll(snapshotDir) if err != nil { @@ -455,15 +455,13 @@ func (d *cephfs) DeleteVolume(volType VolumeType, volName string, op *operations return nil } -func (d *cephfs) RenameVolume(volType VolumeType, volName string, newName string, op *operations.Operation) error { - if volType != VolumeTypeCustom { +func (d *cephfs) RenameVolume(vol Volume, newName string, op *operations.Operation) error { + if vol.volType != VolumeTypeCustom { return fmt.Errorf("Volume type not supported") } - vol := NewVolume(d, d.name, volType, ContentTypeFS, volName, nil) - // Create new snapshots directory. - snapshotDir := GetVolumeSnapshotDir(d.name, volType, newName) + snapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, newName) err := os.MkdirAll(snapshotDir, 0711) if err != nil { @@ -495,10 +493,10 @@ func (d *cephfs) RenameVolume(volType VolumeType, volName string, newName string }() // Rename the snapshot directory first. - srcSnapshotDir := GetVolumeSnapshotDir(d.name, volType, volName) + srcSnapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, vol.name) if shared.PathExists(srcSnapshotDir) { - targetSnapshotDir := GetVolumeSnapshotDir(d.name, volType, newName) + targetSnapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, newName) err = os.Rename(srcSnapshotDir, targetSnapshotDir) if err != nil { @@ -517,16 +515,16 @@ func (d *cephfs) RenameVolume(volType VolumeType, volName string, newName string return err } - sourcePath := GetVolumeMountPath(d.name, volType, newName) - targetPath := GetVolumeMountPath(d.name, volType, newName) + sourcePath := GetVolumeMountPath(d.name, vol.volType, newName) + targetPath := GetVolumeMountPath(d.name, vol.volType, newName) for _, snapshot := range snapshots { // Figure out the snapshot paths. _, snapName, _ := shared.InstanceGetParentAndSnapshotName(snapshot.name) oldCephSnapPath := filepath.Join(sourcePath, ".snap", snapName) newCephSnapPath := filepath.Join(targetPath, ".snap", snapName) - oldPath := GetVolumeMountPath(d.name, volType, GetSnapshotVolumeName(volName, snapName)) - newPath := GetVolumeMountPath(d.name, volType, GetSnapshotVolumeName(newName, snapName)) + oldPath := GetVolumeMountPath(d.name, vol.volType, GetSnapshotVolumeName(vol.name, snapName)) + newPath := GetVolumeMountPath(d.name, vol.volType, GetSnapshotVolumeName(newName, snapName)) // Update the symlink. err = os.Symlink(newCephSnapPath, newPath) @@ -541,8 +539,8 @@ func (d *cephfs) RenameVolume(volType VolumeType, volName string, newName string }) } - oldPath := GetVolumeMountPath(d.name, volType, volName) - newPath := GetVolumeMountPath(d.name, volType, newName) + oldPath := GetVolumeMountPath(d.name, vol.volType, vol.name) + newPath := GetVolumeMountPath(d.name, vol.volType, newName) err = os.Rename(oldPath, newPath) if err != nil { return err @@ -563,11 +561,11 @@ func (d *cephfs) UpdateVolume(vol Volume, changedConfig map[string]string) error return nil } - return d.SetVolumeQuota(vol.volType, vol.name, value, nil) + return d.SetVolumeQuota(vol, value, nil) } -func (d *cephfs) GetVolumeUsage(volType VolumeType, volName string) (int64, error) { - out, err := shared.RunCommand("getfattr", "-n", "ceph.quota.max_bytes", "--only-values", GetVolumeMountPath(d.name, volType, volName)) +func (d *cephfs) GetVolumeUsage(vol Volume) (int64, error) { + out, err := shared.RunCommand("getfattr", "-n", "ceph.quota.max_bytes", "--only-values", GetVolumeMountPath(d.name, vol.volType, vol.name)) if err != nil { return -1, err } @@ -580,7 +578,7 @@ func (d *cephfs) GetVolumeUsage(volType VolumeType, volName string) (int64, erro return size, nil } -func (d *cephfs) SetVolumeQuota(volType VolumeType, volName, size string, op *operations.Operation) error { +func (d *cephfs) SetVolumeQuota(vol Volume, size string, op *operations.Operation) error { if size == "" || size == "0" { size = d.config["volume.size"] } @@ -590,49 +588,49 @@ func (d *cephfs) SetVolumeQuota(volType VolumeType, volName, size string, op *op return err } - _, err = shared.RunCommand("setfattr", "-n", "ceph.quota.max_bytes", "-v", fmt.Sprintf("%d", sizeBytes), GetVolumeMountPath(d.name, volType, volName)) + _, err = shared.RunCommand("setfattr", "-n", "ceph.quota.max_bytes", "-v", fmt.Sprintf("%d", sizeBytes), GetVolumeMountPath(d.name, vol.volType, vol.name)) return err } -func (d *cephfs) MountVolume(volType VolumeType, volName string, op *operations.Operation) (bool, error) { - if volType != VolumeTypeCustom { +func (d *cephfs) MountVolume(vol Volume, op *operations.Operation) (bool, error) { + if vol.volType != VolumeTypeCustom { return false, fmt.Errorf("Volume type not supported") } return false, nil } -func (d *cephfs) MountVolumeSnapshot(volType VolumeType, VolName, snapshotName string, op *operations.Operation) (bool, error) { - if volType != VolumeTypeCustom { +func (d *cephfs) MountVolumeSnapshot(vol Volume, snapshotName string, op *operations.Operation) (bool, error) { + if vol.volType != VolumeTypeCustom { return false, fmt.Errorf("Volume type not supported") } return false, nil } -func (d *cephfs) UnmountVolume(volType VolumeType, volName string, op *operations.Operation) (bool, error) { - if volType != VolumeTypeCustom { +func (d *cephfs) UnmountVolume(vol Volume, op *operations.Operation) (bool, error) { + if vol.volType != VolumeTypeCustom { return false, fmt.Errorf("Volume type not supported") } return false, nil } -func (d *cephfs) UnmountVolumeSnapshot(volType VolumeType, volName, snapshotName string, op *operations.Operation) (bool, error) { - if volType != VolumeTypeCustom { +func (d *cephfs) UnmountVolumeSnapshot(vol Volume, snapshotName string, op *operations.Operation) (bool, error) { + if vol.volType != VolumeTypeCustom { return false, fmt.Errorf("Volume type not supported") } return false, nil } -func (d *cephfs) CreateVolumeSnapshot(volType VolumeType, volName string, newSnapshotName string, op *operations.Operation) error { - if volType != VolumeTypeCustom { +func (d *cephfs) CreateVolumeSnapshot(vol Volume, newSnapshotName string, op *operations.Operation) error { + if vol.volType != VolumeTypeCustom { return fmt.Errorf("Volume type not supported") } // Create the snapshot. - sourcePath := GetVolumeMountPath(d.name, volType, volName) + sourcePath := GetVolumeMountPath(d.name, vol.volType, vol.name) cephSnapPath := filepath.Join(sourcePath, ".snap", newSnapshotName) err := os.Mkdir(cephSnapPath, 0711) @@ -640,7 +638,7 @@ func (d *cephfs) CreateVolumeSnapshot(volType VolumeType, volName string, newSna return err } - targetPath := GetVolumeMountPath(d.name, volType, GetSnapshotVolumeName(volName, newSnapshotName)) + targetPath := GetVolumeMountPath(d.name, vol.volType, GetSnapshotVolumeName(vol.name, newSnapshotName)) err = os.MkdirAll(filepath.Dir(targetPath), 0711) if err != nil { @@ -655,13 +653,13 @@ func (d *cephfs) CreateVolumeSnapshot(volType VolumeType, volName string, newSna return nil } -func (d *cephfs) DeleteVolumeSnapshot(volType VolumeType, volName string, snapshotName string, op *operations.Operation) error { - if volType != VolumeTypeCustom { +func (d *cephfs) DeleteVolumeSnapshot(vol Volume, snapshotName string, op *operations.Operation) error { + if vol.volType != VolumeTypeCustom { return fmt.Errorf("Volume type not supported") } // Delete the snapshot itself. - sourcePath := GetVolumeMountPath(d.name, volType, volName) + sourcePath := GetVolumeMountPath(d.name, vol.volType, vol.name) cephSnapPath := filepath.Join(sourcePath, ".snap", snapshotName) err := os.Remove(cephSnapPath) @@ -670,7 +668,7 @@ func (d *cephfs) DeleteVolumeSnapshot(volType VolumeType, volName string, snapsh } // Remove the symlink. - snapPath := GetVolumeMountPath(d.name, volType, GetSnapshotVolumeName(volName, snapshotName)) + snapPath := GetVolumeMountPath(d.name, vol.volType, GetSnapshotVolumeName(vol.name, snapshotName)) err = os.Remove(snapPath) if err != nil { return err @@ -679,12 +677,12 @@ func (d *cephfs) DeleteVolumeSnapshot(volType VolumeType, volName string, snapsh return nil } -func (d *cephfs) RenameVolumeSnapshot(volType VolumeType, volName string, snapshotName string, newSnapshotName string, op *operations.Operation) error { - if volType != VolumeTypeCustom { +func (d *cephfs) RenameVolumeSnapshot(vol Volume, snapshotName string, newSnapshotName string, op *operations.Operation) error { + if vol.volType != VolumeTypeCustom { return fmt.Errorf("Volume type not supported") } - sourcePath := GetVolumeMountPath(d.name, volType, volName) + sourcePath := GetVolumeMountPath(d.name, vol.volType, vol.name) oldCephSnapPath := filepath.Join(sourcePath, ".snap", snapshotName) newCephSnapPath := filepath.Join(sourcePath, ".snap", newSnapshotName) @@ -694,13 +692,13 @@ func (d *cephfs) RenameVolumeSnapshot(volType VolumeType, volName string, snapsh } // Re-generate the snapshot symlink. - oldPath := GetVolumeMountPath(d.name, volType, GetSnapshotVolumeName(volName, snapshotName)) + oldPath := GetVolumeMountPath(d.name, vol.volType, GetSnapshotVolumeName(vol.name, snapshotName)) err = os.Remove(oldPath) if err != nil { return err } - newPath := GetVolumeMountPath(d.name, volType, GetSnapshotVolumeName(volName, newSnapshotName)) + newPath := GetVolumeMountPath(d.name, vol.volType, GetSnapshotVolumeName(vol.name, newSnapshotName)) err = os.Symlink(newCephSnapPath, newPath) if err != nil { return err @@ -709,12 +707,12 @@ func (d *cephfs) RenameVolumeSnapshot(volType VolumeType, volName string, snapsh return nil } -func (d *cephfs) VolumeSnapshots(volType VolumeType, volName string, op *operations.Operation) ([]string, error) { - if volType != VolumeTypeCustom { +func (d *cephfs) VolumeSnapshots(vol Volume, op *operations.Operation) ([]string, error) { + if vol.volType != VolumeTypeCustom { return nil, fmt.Errorf("Volume type not supported") } - snapshotDir := GetVolumeSnapshotDir(d.name, volType, volName) + snapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, vol.name) snapshots := []string{} ents, err := ioutil.ReadDir(snapshotDir) @@ -834,7 +832,7 @@ func (d *cephfs) CreateVolumeFromMigration(vol Volume, conn io.ReadWriteCloser, // Remove any paths created if we are reverting. for _, snapName := range revertSnaps { - d.DeleteVolumeSnapshot(vol.volType, vol.name, snapName, op) + d.DeleteVolumeSnapshot(vol, snapName, op) } os.RemoveAll(volPath) @@ -858,7 +856,7 @@ func (d *cephfs) CreateVolumeFromMigration(vol Volume, conn io.ReadWriteCloser, } // Create the snapshot itself. - err = d.CreateVolumeSnapshot(vol.volType, vol.name, snapName, op) + err = d.CreateVolumeSnapshot(vol, snapName, op) if err != nil { return err } @@ -868,7 +866,7 @@ func (d *cephfs) CreateVolumeFromMigration(vol Volume, conn io.ReadWriteCloser, } // Apply the volume quota if specified. - err = d.SetVolumeQuota(vol.volType, vol.name, vol.config["size"], op) + err = d.SetVolumeQuota(vol, vol.config["size"], op) if err != nil { return err } diff --git a/lxd/storage/drivers/driver_dir.go b/lxd/storage/drivers/driver_dir.go index 88de930d29..ca792876ea 100644 --- a/lxd/storage/drivers/driver_dir.go +++ b/lxd/storage/drivers/driver_dir.go @@ -138,15 +138,15 @@ func (d *dir) GetResources() (*api.ResourcesStoragePool, error) { } // GetVolumeUsage returns the disk space used by the volume. -func (d *dir) GetVolumeUsage(volType VolumeType, volName string) (int64, error) { - volPath := GetVolumeMountPath(d.name, volType, volName) +func (d *dir) GetVolumeUsage(vol Volume) (int64, error) { + volPath := GetVolumeMountPath(d.name, vol.volType, vol.name) ok, err := quota.Supported(volPath) if err != nil || !ok { return 0, nil } // Get the volume ID for the volume to access quota. - volID, err := d.getVolID(volType, volName) + volID, err := d.getVolID(vol.volType, vol.name) if err != nil { return -1, err } @@ -168,8 +168,8 @@ func (d *dir) ValidateVolume(vol Volume, removeUnknownKeys bool) error { } // HasVolume indicates whether a specific volume exists on the storage pool. -func (d *dir) HasVolume(volType VolumeType, volName string) bool { - if shared.PathExists(GetVolumeMountPath(d.name, volType, volName)) { +func (d *dir) HasVolume(vol Volume) bool { + if shared.PathExists(GetVolumeMountPath(d.name, vol.volType, vol.name)) { return true } @@ -177,8 +177,8 @@ func (d *dir) HasVolume(volType VolumeType, volName string) bool { } // GetVolumeDiskPath returns the location of a disk volume. -func (d *dir) GetVolumeDiskPath(volType VolumeType, volName string) (string, error) { - return filepath.Join(GetVolumeMountPath(d.name, volType, volName), "root.img"), nil +func (d *dir) GetVolumeDiskPath(vol Volume) (string, error) { + return filepath.Join(GetVolumeMountPath(d.name, vol.volType, vol.name), "root.img"), nil } // setupInitialQuota enables quota on a new volume and sets with an initial quota from config. @@ -246,7 +246,7 @@ func (d *dir) CreateVolume(vol Volume, filler *VolumeFiller, op *operations.Oper rootBlockPath := "" if vol.contentType == ContentTypeBlock { // We expect the filler to copy the VM image into this path. - rootBlockPath, err = d.GetVolumeDiskPath(vol.volType, vol.name) + rootBlockPath, err = d.GetVolumeDiskPath(vol) if err != nil { return err } @@ -389,7 +389,7 @@ func (d *dir) CreateVolumeFromMigration(vol Volume, conn io.ReadWriteCloser, vol // Remove any paths created if we are reverting. for _, snapName := range revertSnaps { - d.DeleteVolumeSnapshot(vol.volType, vol.name, snapName, op) + d.DeleteVolumeSnapshot(vol, snapName, op) } os.RemoveAll(volPath) @@ -424,7 +424,7 @@ func (d *dir) CreateVolumeFromMigration(vol Volume, conn io.ReadWriteCloser, vol } // Create the snapshot itself. - err = d.CreateVolumeSnapshot(vol.volType, vol.name, snapName, op) + err = d.CreateVolumeSnapshot(vol, snapName, op) if err != nil { return err } @@ -531,7 +531,7 @@ func (d *dir) copyVolume(vol Volume, srcVol Volume, srcSnapshots []Volume, op *o // Remove any paths created if we are reverting. for _, snapName := range revertSnaps { - d.DeleteVolumeSnapshot(vol.volType, vol.name, snapName, op) + d.DeleteVolumeSnapshot(vol, snapName, op) } os.RemoveAll(volPath) @@ -552,7 +552,7 @@ func (d *dir) copyVolume(vol Volume, srcVol Volume, srcSnapshots []Volume, op *o }, op) // Create the snapshot itself. - err = d.CreateVolumeSnapshot(vol.volType, vol.name, snapName, op) + err = d.CreateVolumeSnapshot(vol, snapName, op) if err != nil { return err } @@ -589,8 +589,8 @@ func (d *dir) copyVolume(vol Volume, srcVol Volume, srcSnapshots []Volume, op *o } // VolumeSnapshots returns a list of snapshots for the volume. -func (d *dir) VolumeSnapshots(volType VolumeType, volName string, op *operations.Operation) ([]string, error) { - snapshotDir := GetVolumeSnapshotDir(d.name, volType, volName) +func (d *dir) VolumeSnapshots(vol Volume, op *operations.Operation) ([]string, error) { + snapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, vol.name) snapshots := []string{} ents, err := ioutil.ReadDir(snapshotDir) @@ -642,11 +642,9 @@ func (d *dir) UpdateVolume(vol Volume, changedConfig map[string]string) error { } // RenameVolume renames a volume and its snapshots. -func (d *dir) RenameVolume(volType VolumeType, volName string, newVolName string, op *operations.Operation) error { - vol := NewVolume(d, d.name, volType, ContentTypeFS, volName, nil) - +func (d *dir) RenameVolume(vol Volume, newVolName string, op *operations.Operation) error { // Create new snapshots directory. - snapshotDir := GetVolumeSnapshotDir(d.name, volType, newVolName) + snapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, newVolName) err := os.MkdirAll(snapshotDir, 0711) if err != nil { @@ -694,8 +692,8 @@ func (d *dir) RenameVolume(volType VolumeType, volName string, newVolName string }) } - oldPath := GetVolumeMountPath(d.name, volType, volName) - newPath := GetVolumeMountPath(d.name, volType, newVolName) + oldPath := GetVolumeMountPath(d.name, vol.volType, vol.name) + newPath := GetVolumeMountPath(d.name, vol.volType, newVolName) err = os.Rename(oldPath, newPath) if err != nil { return err @@ -707,7 +705,7 @@ func (d *dir) RenameVolume(volType VolumeType, volName string, newVolName string }) // Remove old snapshots directory. - oldSnapshotDir := GetVolumeSnapshotDir(d.name, volType, volName) + oldSnapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, vol.name) err = os.RemoveAll(oldSnapshotDir) if err != nil { @@ -739,8 +737,8 @@ func (d *dir) RestoreVolume(vol Volume, snapshotName string, op *operations.Oper // DeleteVolume deletes a volume of the storage device. If any snapshots of the volume remain then // this function will return an error. -func (d *dir) DeleteVolume(volType VolumeType, volName string, op *operations.Operation) error { - snapshots, err := d.VolumeSnapshots(volType, volName, op) +func (d *dir) DeleteVolume(vol Volume, op *operations.Operation) error { + snapshots, err := d.VolumeSnapshots(vol, op) if err != nil { return err } @@ -749,7 +747,7 @@ func (d *dir) DeleteVolume(volType VolumeType, volName string, op *operations.Op return fmt.Errorf("Cannot remove a volume that has snapshots") } - volPath := GetVolumeMountPath(d.name, volType, volName) + volPath := GetVolumeMountPath(d.name, vol.volType, vol.name) // If the volume doesn't exist, then nothing more to do. if !shared.PathExists(volPath) { @@ -757,7 +755,7 @@ func (d *dir) DeleteVolume(volType VolumeType, volName string, op *operations.Op } // Get the volume ID for the volume, which is used to remove project quota. - volID, err := d.getVolID(volType, volName) + volID, err := d.getVolID(vol.volType, vol.name) if err != nil { return err } @@ -776,7 +774,7 @@ func (d *dir) DeleteVolume(volType VolumeType, volName string, op *operations.Op // Although the volume snapshot directory should already be removed, lets remove it here // to just in case the top-level directory is left. - err = deleteParentSnapshotDirIfEmpty(d.name, volType, volName) + err = deleteParentSnapshotDirIfEmpty(d.name, vol.volType, vol.name) if err != nil { return err } @@ -786,32 +784,32 @@ func (d *dir) DeleteVolume(volType VolumeType, volName string, op *operations.Op // MountVolume simulates mounting a volume. As dir driver doesn't have volumes to mount it returns // false indicating that there is no need to issue an unmount. -func (d *dir) MountVolume(volType VolumeType, volName string, op *operations.Operation) (bool, error) { +func (d *dir) MountVolume(vol Volume, op *operations.Operation) (bool, error) { return false, nil } // MountVolumeSnapshot sets up a read-only mount on top of the snapshot to avoid accidental modifications. -func (d *dir) MountVolumeSnapshot(volType VolumeType, volName, snapshotName string, op *operations.Operation) (bool, error) { - snapPath := GetVolumeMountPath(d.name, volType, GetSnapshotVolumeName(volName, snapshotName)) +func (d *dir) MountVolumeSnapshot(vol Volume, snapshotName string, op *operations.Operation) (bool, error) { + snapPath := GetVolumeMountPath(d.name, vol.volType, GetSnapshotVolumeName(vol.name, snapshotName)) return mountReadOnly(snapPath, snapPath) } // UnmountVolume simulates unmounting a volume. As dir driver doesn't have volumes to unmount it // returns false indicating the volume was already unmounted. -func (d *dir) UnmountVolume(volType VolumeType, volName string, op *operations.Operation) (bool, error) { +func (d *dir) UnmountVolume(vol Volume, op *operations.Operation) (bool, error) { return false, nil } // UnmountVolumeSnapshot removes the read-only mount placed on top of a snapshot. -func (d *dir) UnmountVolumeSnapshot(volType VolumeType, volName, snapshotName string, op *operations.Operation) (bool, error) { - snapPath := GetVolumeMountPath(d.name, volType, GetSnapshotVolumeName(volName, snapshotName)) +func (d *dir) UnmountVolumeSnapshot(vol Volume, snapshotName string, op *operations.Operation) (bool, error) { + snapPath := GetVolumeMountPath(d.name, vol.volType, GetSnapshotVolumeName(vol.name, snapshotName)) return forceUnmount(snapPath) } // SetVolumeQuota sets the quota on the volume. -func (d *dir) SetVolumeQuota(volType VolumeType, volName, size string, op *operations.Operation) error { - volPath := GetVolumeMountPath(d.name, volType, volName) - volID, err := d.getVolID(volType, volName) +func (d *dir) SetVolumeQuota(vol Volume, size string, op *operations.Operation) error { + volPath := GetVolumeMountPath(d.name, vol.volType, vol.name) + volID, err := d.getVolID(vol.volType, vol.name) if err != nil { return err } @@ -903,10 +901,10 @@ func (d *dir) deleteQuota(path string, volID int64) error { } // CreateVolumeSnapshot creates a snapshot of a volume. -func (d *dir) CreateVolumeSnapshot(volType VolumeType, volName string, newSnapshotName string, op *operations.Operation) error { - srcPath := GetVolumeMountPath(d.name, volType, volName) - fullSnapName := GetSnapshotVolumeName(volName, newSnapshotName) - snapVol := NewVolume(d, d.name, volType, ContentTypeFS, fullSnapName, nil) +func (d *dir) CreateVolumeSnapshot(vol Volume, newSnapshotName string, op *operations.Operation) error { + srcPath := GetVolumeMountPath(d.name, vol.volType, vol.name) + fullSnapName := GetSnapshotVolumeName(vol.name, newSnapshotName) + snapVol := NewVolume(d, d.name, vol.volType, ContentTypeFS, fullSnapName, nil) snapPath := snapVol.MountPath() // Create snapshot directory. @@ -936,8 +934,8 @@ func (d *dir) CreateVolumeSnapshot(volType VolumeType, volName string, newSnapsh // DeleteVolumeSnapshot removes a snapshot from the storage device. The volName and snapshotName // must be bare names and should not be in the format "volume/snapshot". -func (d *dir) DeleteVolumeSnapshot(volType VolumeType, volName string, snapshotName string, op *operations.Operation) error { - snapPath := GetVolumeMountPath(d.name, volType, GetSnapshotVolumeName(volName, snapshotName)) +func (d *dir) DeleteVolumeSnapshot(vol Volume, snapshotName string, op *operations.Operation) error { + snapPath := GetVolumeMountPath(d.name, vol.volType, GetSnapshotVolumeName(vol.name, snapshotName)) // Remove the snapshot from the storage device. err := os.RemoveAll(snapPath) @@ -946,7 +944,7 @@ func (d *dir) DeleteVolumeSnapshot(volType VolumeType, volName string, snapshotN } // Remove the parent snapshot directory if this is the last snapshot being removed. - err = deleteParentSnapshotDirIfEmpty(d.name, volType, volName) + err = deleteParentSnapshotDirIfEmpty(d.name, vol.volType, vol.name) if err != nil { return err } @@ -955,9 +953,9 @@ func (d *dir) DeleteVolumeSnapshot(volType VolumeType, volName string, snapshotN } // RenameVolumeSnapshot renames a volume snapshot. -func (d *dir) RenameVolumeSnapshot(volType VolumeType, volName string, snapshotName string, newSnapshotName string, op *operations.Operation) error { - oldPath := GetVolumeMountPath(d.name, volType, GetSnapshotVolumeName(volName, snapshotName)) - newPath := GetVolumeMountPath(d.name, volType, GetSnapshotVolumeName(volName, newSnapshotName)) +func (d *dir) RenameVolumeSnapshot(vol Volume, snapshotName string, newSnapshotName string, op *operations.Operation) error { + oldPath := GetVolumeMountPath(d.name, vol.volType, GetSnapshotVolumeName(vol.name, snapshotName)) + newPath := GetVolumeMountPath(d.name, vol.volType, GetSnapshotVolumeName(vol.name, newSnapshotName)) err := os.Rename(oldPath, newPath) if err != nil { return err diff --git a/lxd/storage/drivers/volume.go b/lxd/storage/drivers/volume.go index 9bfb687a44..195d4bd695 100644 --- a/lxd/storage/drivers/volume.go +++ b/lxd/storage/drivers/volume.go @@ -115,7 +115,10 @@ func (v Volume) MountTask(task func(mountPath string, op *operations.Operation) if isSnap { unlock := lock(mountLockID) - ourMount, err := v.driver.MountVolumeSnapshot(v.volType, parentName, snapName, op) + // Override volume name + v.name = parentName + + ourMount, err := v.driver.MountVolumeSnapshot(v, snapName, op) if err != nil { unlock() return err @@ -126,14 +129,14 @@ func (v Volume) MountTask(task func(mountPath string, op *operations.Operation) if ourMount { defer func() { unlock := lock(umountLockID) - v.driver.UnmountVolumeSnapshot(v.volType, parentName, snapName, op) + v.driver.UnmountVolumeSnapshot(v, snapName, op) unlock() }() } } else { unlock := lock(mountLockID) - ourMount, err := v.driver.MountVolume(v.volType, v.name, op) + ourMount, err := v.driver.MountVolume(v, op) if err != nil { unlock() return err @@ -144,7 +147,7 @@ func (v Volume) MountTask(task func(mountPath string, op *operations.Operation) if ourMount { defer func() { unlock := lock(umountLockID) - v.driver.UnmountVolume(v.volType, v.name, op) + v.driver.UnmountVolume(v, op) unlock() }() } @@ -159,7 +162,7 @@ func (v Volume) Snapshots(op *operations.Operation) ([]Volume, error) { return nil, fmt.Errorf("Volume is a snapshot") } - snapshots, err := v.driver.VolumeSnapshots(v.volType, v.name, op) + snapshots, err := v.driver.VolumeSnapshots(v, op) if err != nil { return nil, err } From 3c43e0e739a175e7575df8c3a9cb67bc708e2aa8 Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Thu, 12 Dec 2019 12:09:21 +0100 Subject: [PATCH 3/3] lxd/storage: Always pass Volume to drivers This updates the calls to the driver functions in that it now always passes a Volume. Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- lxd/storage/backend_lxd.go | 201 ++++++++++++++++++++++++++++--------- 1 file changed, 152 insertions(+), 49 deletions(-) diff --git a/lxd/storage/backend_lxd.go b/lxd/storage/backend_lxd.go index 151434ab6c..30c1184ad0 100644 --- a/lxd/storage/backend_lxd.go +++ b/lxd/storage/backend_lxd.go @@ -502,21 +502,18 @@ func (b *lxdBackend) CreateInstanceFromCopy(inst instance.Instance, src instance contentType := InstanceContentType(inst) - if b.driver.HasVolume(volType, project.Prefix(inst.Project(), inst.Name())) { - return fmt.Errorf("Cannot create volume, already exists on target") - } - // Get the root disk device config. _, rootDiskConf, err := shared.GetRootDiskDevice(inst.ExpandedDevices().CloneNative()) if err != nil { return err } - // Get the volume name on storage. - volStorageName := project.Prefix(inst.Project(), inst.Name()) + vol := b.newVolume(volType, contentType, project.Prefix(inst.Project(), inst.Name()), + rootDiskConf) - // Initialise a new volume containing the root disk config supplied in the new instance. - vol := b.newVolume(volType, contentType, volStorageName, rootDiskConf) + if b.driver.HasVolume(vol) { + return fmt.Errorf("Cannot create volume, already exists on target") + } // Get the src volume name on storage. srcVolStorageName := project.Prefix(src.Project(), src.Name()) @@ -878,7 +875,10 @@ func (b *lxdBackend) CreateInstanceFromMigration(inst instance.Instance, conn io contentType := InstanceContentType(inst) - volExists := b.driver.HasVolume(volType, project.Prefix(inst.Project(), inst.Name())) + // There's no need to pass config as it's not needed in HasVolume(). + vol := b.newVolume(volType, contentType, project.Prefix(inst.Project(), inst.Name()), nil) + + volExists := b.driver.HasVolume(vol) if args.Refresh && !volExists { return fmt.Errorf("Cannot refresh volume, doesn't exist on target") } else if !args.Refresh && volExists { @@ -898,7 +898,7 @@ func (b *lxdBackend) CreateInstanceFromMigration(inst instance.Instance, conn io // Get the volume name on storage. volStorageName := project.Prefix(inst.Project(), args.Name) - vol := b.newVolume(volType, contentType, volStorageName, args.Config) + vol = b.newVolume(volType, contentType, volStorageName, args.Config) var preFiller drivers.VolumeFiller @@ -1040,7 +1040,11 @@ func (b *lxdBackend) RenameInstance(inst instance.Instance, newName string, op * // Rename the volume and its snapshots on the storage device. volStorageName := project.Prefix(inst.Project(), inst.Name()) newVolStorageName := project.Prefix(inst.Project(), newName) - err = b.driver.RenameVolume(volType, volStorageName, newVolStorageName, op) + + // There's no need to pass config as it's not needed when renaming a volume. + vol := b.newVolume(volType, InstanceContentType(inst), volStorageName, nil) + + err = b.driver.RenameVolume(vol, newVolStorageName, op) if err != nil { return err } @@ -1108,10 +1112,13 @@ func (b *lxdBackend) DeleteInstance(inst instance.Instance, op *operations.Opera // Get the volume name on storage. volStorageName := project.Prefix(inst.Project(), inst.Name()) + // There's no need to pass config as it's not needed when deleting a volume. + vol := b.newVolume(volType, InstanceContentType(inst), volStorageName, nil) + // Delete the volume from the storage device. Must come after snapshots are removed. // Must come before DB StoragePoolVolumeDelete so that the volume ID is still available. logger.Debug("Deleting instance volume", log.Ctx{"volName": volStorageName}) - err = b.driver.DeleteVolume(volType, volStorageName, op) + err = b.driver.DeleteVolume(vol, op) if err != nil { return err } @@ -1212,7 +1219,12 @@ func (b *lxdBackend) GetInstanceUsage(inst instance.Instance) (int64, error) { defer logger.Debug("GetInstanceUsage finished") if inst.Type() == instancetype.Container { - return b.driver.GetVolumeUsage(drivers.VolumeTypeContainer, inst.Name()) + // There's no need to pass config as it's not needed when retrieving + // the volume usage. + vol := b.newVolume(drivers.VolumeTypeContainer, InstanceContentType(inst), + inst.Name(), nil) + + return b.driver.GetVolumeUsage(vol) } return -1, ErrNotImplemented @@ -1236,10 +1248,12 @@ func (b *lxdBackend) SetInstanceQuota(inst instance.Instance, size string, op *o return err } - // Get the volume name on storage. - volStorageName := project.Prefix(inst.Project(), inst.Name()) + // Get the volume. + // There's no need to pass config as it's not needed when setting quotas. + vol := b.newVolume(volType, InstanceContentType(inst), + project.Prefix(inst.Project(), inst.Name()), nil) - return b.driver.SetVolumeQuota(volType, volStorageName, size, op) + return b.driver.SetVolumeQuota(vol, size, op) } // MountInstance mounts the instance's root volume. @@ -1254,10 +1268,17 @@ func (b *lxdBackend) MountInstance(inst instance.Instance, op *operations.Operat return false, err } - // Get the volume name on storage. - volStorageName := project.Prefix(inst.Project(), inst.Name()) + // Get the root disk device config. + _, rootDiskConf, err := shared.GetRootDiskDevice(inst.ExpandedDevices().CloneNative()) + if err != nil { + return false, err + } - return b.driver.MountVolume(volType, volStorageName, op) + // Get the volume. + vol := b.newVolume(volType, InstanceContentType(inst), + project.Prefix(inst.Project(), inst.Name()), rootDiskConf) + + return b.driver.MountVolume(vol, op) } // UnmountInstance unmounts the instance's root volume. @@ -1272,10 +1293,17 @@ func (b *lxdBackend) UnmountInstance(inst instance.Instance, op *operations.Oper return false, err } - // Get the volume name on storage. - volStorageName := project.Prefix(inst.Project(), inst.Name()) + // Get the root disk device config. + _, rootDiskConf, err := shared.GetRootDiskDevice(inst.ExpandedDevices().CloneNative()) + if err != nil { + return false, err + } + + // Get the volume. + vol := b.newVolume(volType, InstanceContentType(inst), + project.Prefix(inst.Project(), inst.Name()), rootDiskConf) - return b.driver.UnmountVolume(volType, volStorageName, op) + return b.driver.UnmountVolume(vol, op) } // GetInstanceDisk returns the location of the disk. @@ -1290,11 +1318,14 @@ func (b *lxdBackend) GetInstanceDisk(inst instance.Instance) (string, error) { return "", err } - // Get the volume name on storage. - volStorageName := project.Prefix(inst.Project(), inst.Name()) + // Get the volume. + // There's no need to pass config as it's not needed when getting the + // location of the disk block device. + vol := b.newVolume(volType, InstanceContentType(inst), + project.Prefix(inst.Project(), inst.Name()), nil) // Get the location of the disk block device. - diskPath, err := b.driver.GetVolumeDiskPath(volType, volStorageName) + diskPath, err := b.driver.GetVolumeDiskPath(vol) if err != nil { return "", err } @@ -1340,10 +1371,13 @@ func (b *lxdBackend) CreateInstanceSnapshot(inst instance.Instance, src instance return fmt.Errorf("Volume name must be a snapshot") } - // Get the volume name on storage. - volStorageName := project.Prefix(inst.Project(), parentName) + // Get the volume. + // There's no need to pass config as it's not needed when creating volume + // snapshots. + vol := b.newVolume(volType, InstanceContentType(inst), + project.Prefix(inst.Project(), parentName), nil) - err = b.driver.CreateVolumeSnapshot(volType, volStorageName, snapName, op) + err = b.driver.CreateVolumeSnapshot(vol, snapName, op) if err != nil { return err } @@ -1387,8 +1421,12 @@ func (b *lxdBackend) RenameInstanceSnapshot(inst instance.Instance, newName stri } // Rename storage volume snapshot. - volStorageName := project.Prefix(inst.Project(), parentName) - err = b.driver.RenameVolumeSnapshot(volType, volStorageName, oldSnapshotName, newName, op) + // There's no need to pass config as it's not needed when renaming a volume + // snapshot. + vol := b.newVolume(volType, InstanceContentType(inst), + project.Prefix(inst.Project(), parentName), nil) + + err = b.driver.RenameVolumeSnapshot(vol, oldSnapshotName, newName, op) if err != nil { return err } @@ -1397,7 +1435,12 @@ func (b *lxdBackend) RenameInstanceSnapshot(inst instance.Instance, newName stri err = b.state.Cluster.StoragePoolVolumeRename(inst.Project(), inst.Name(), newVolName, volDBType, b.ID()) if err != nil { // Revert rename. - b.driver.RenameVolumeSnapshot(drivers.VolumeTypeCustom, parentName, newName, oldSnapshotName, op) + // There's no need to pass config as it's not needed when renaming a + // volume snapshot. + vol := b.newVolume(drivers.VolumeTypeCustom, InstanceContentType(inst), + parentName, nil) + + b.driver.RenameVolumeSnapshot(vol, newName, oldSnapshotName, op) return err } @@ -1432,7 +1475,12 @@ func (b *lxdBackend) DeleteInstanceSnapshot(inst instance.Instance, op *operatio // Delete the snapshot from the storage device. // Must come before DB StoragePoolVolumeDelete so that the volume ID is still available. logger.Debug("Deleting instance snapshot volume", log.Ctx{"volName": parentStorageName, "snapshotName": snapName}) - err = b.driver.DeleteVolumeSnapshot(volType, parentStorageName, snapName, op) + + // There's no need to pass config as it's not needed when deleting a volume + // snapshot. + vol := b.newVolume(volType, InstanceContentType(inst), parentStorageName, nil) + + err = b.driver.DeleteVolumeSnapshot(vol, snapName, op) if err != nil { return err } @@ -1524,13 +1572,20 @@ func (b *lxdBackend) MountInstanceSnapshot(inst instance.Instance, op *operation return false, err } + // Get the root disk device config. + _, rootDiskConf, err := shared.GetRootDiskDevice(inst.ExpandedDevices().CloneNative()) + if err != nil { + return false, err + } + // Get the parent and snapshot name. parentName, snapName, _ := shared.InstanceGetParentAndSnapshotName(inst.Name()) - // Get the volume name on storage. - volStorageName := project.Prefix(inst.Project(), parentName) + // Get the volume. + vol := b.newVolume(volType, InstanceContentType(inst), + project.Prefix(inst.Project(), parentName), rootDiskConf) - return b.driver.MountVolumeSnapshot(volType, volStorageName, snapName, op) + return b.driver.MountVolumeSnapshot(vol, snapName, op) } // UnmountInstanceSnapshot unmounts an instance snapshot. @@ -1549,13 +1604,20 @@ func (b *lxdBackend) UnmountInstanceSnapshot(inst instance.Instance, op *operati return false, err } + // Get the root disk device config. + _, rootDiskConf, err := shared.GetRootDiskDevice(inst.ExpandedDevices().CloneNative()) + if err != nil { + return false, err + } + // Get the parent and snapshot name. parentName, snapName, _ := shared.InstanceGetParentAndSnapshotName(inst.Name()) - // Get the volume name on storage. - volStorageName := project.Prefix(inst.Project(), parentName) + // Get the volume. + vol := b.newVolume(volType, InstanceContentType(inst), + project.Prefix(inst.Project(), parentName), rootDiskConf) - return b.driver.UnmountVolumeSnapshot(volType, volStorageName, snapName, op) + return b.driver.UnmountVolumeSnapshot(vol, snapName, op) } // EnsureImage creates an optimized volume of the image if supported by the storage pool driver and @@ -1569,8 +1631,12 @@ func (b *lxdBackend) EnsureImage(fingerprint string, op *operations.Operation) e return nil // Nothing to do for drivers that don't support optimized images volumes. } + // There's no need to pass the content type or config. Both are not needed + // when checking the existence of volumes. + vol := b.newVolume(drivers.VolumeTypeImage, "", fingerprint, nil) + // Check if we already have a suitable volume. - if b.driver.HasVolume(drivers.VolumeTypeImage, fingerprint) { + if b.driver.HasVolume(vol) { return nil } @@ -1618,7 +1684,11 @@ func (b *lxdBackend) DeleteImage(fingerprint string, op *operations.Operation) e return fmt.Errorf("Invalid fingerprint") } - err = b.driver.DeleteVolume(drivers.VolumeTypeImage, fingerprint, op) + // There's no need to pass the content type or config. Both are not needed + // when removing an image. + vol := b.newVolume(drivers.VolumeTypeImage, "", fingerprint, nil) + + err = b.driver.DeleteVolume(vol, op) if err != nil { return err } @@ -1972,7 +2042,9 @@ func (b *lxdBackend) RenameCustomVolume(volName string, newVolName string, op *o oldName: volName, }) - err = b.driver.RenameVolume(drivers.VolumeTypeCustom, volName, newVolName, op) + vol := b.newVolume(drivers.VolumeTypeCustom, "", volName, nil) + + err = b.driver.RenameVolume(vol, newVolName, op) if err != nil { return err } @@ -2101,8 +2173,11 @@ func (b *lxdBackend) DeleteCustomVolume(volName string, op *operations.Operation } } + // There's no need to pass config as it's not needed when deleting a volume. + vol := b.newVolume(drivers.VolumeTypeCustom, drivers.ContentTypeFS, volName, nil) + // Delete the volume from the storage device. Must come after snapshots are removed. - err = b.driver.DeleteVolume(drivers.VolumeTypeCustom, volName, op) + err = b.driver.DeleteVolume(vol, op) if err != nil { return err } @@ -2118,7 +2193,11 @@ func (b *lxdBackend) DeleteCustomVolume(volName string, op *operations.Operation // GetCustomVolumeUsage returns the disk space used by the custom volume. func (b *lxdBackend) GetCustomVolumeUsage(volName string) (int64, error) { - return b.driver.GetVolumeUsage(drivers.VolumeTypeCustom, volName) + // There's no need to pass config as it's not needed when getting the volume + // usage. + vol := b.newVolume(drivers.VolumeTypeCustom, drivers.ContentTypeFS, volName, nil) + + return b.driver.GetVolumeUsage(vol) } // MountCustomVolume mounts a custom volume. @@ -2127,7 +2206,14 @@ func (b *lxdBackend) MountCustomVolume(volName string, op *operations.Operation) logger.Debug("MountCustomVolume started") defer logger.Debug("MountCustomVolume finished") - return b.driver.MountVolume(drivers.VolumeTypeCustom, volName, op) + _, volume, err := b.state.Cluster.StoragePoolNodeVolumeGetType(volName, db.StoragePoolVolumeTypeCustom, b.id) + if err != nil { + return false, err + } + + vol := b.newVolume(drivers.VolumeTypeCustom, drivers.ContentTypeFS, volName, volume.Config) + + return b.driver.MountVolume(vol, op) } // UnmountCustomVolume unmounts a custom volume. @@ -2136,7 +2222,14 @@ func (b *lxdBackend) UnmountCustomVolume(volName string, op *operations.Operatio logger.Debug("UnmountCustomVolume started") defer logger.Debug("UnmountCustomVolume finished") - return b.driver.UnmountVolume(drivers.VolumeTypeCustom, volName, op) + _, volume, err := b.state.Cluster.StoragePoolNodeVolumeGetType(volName, db.StoragePoolVolumeTypeCustom, b.id) + if err != nil { + return false, err + } + + vol := b.newVolume(drivers.VolumeTypeCustom, drivers.ContentTypeFS, volName, volume.Config) + + return b.driver.UnmountVolume(vol, op) } // CreateCustomVolumeSnapshot creates a snapshot of a custom volume. @@ -2188,8 +2281,11 @@ func (b *lxdBackend) CreateCustomVolumeSnapshot(volName string, newSnapshotName } }() + vol := b.newVolume(drivers.VolumeTypeCustom, drivers.ContentTypeFS, volName, + parentVol.Config) + // Create the snapshot on the storage device. - err = b.driver.CreateVolumeSnapshot(drivers.VolumeTypeCustom, volName, newSnapshotName, op) + err = b.driver.CreateVolumeSnapshot(vol, newSnapshotName, op) if err != nil { return err } @@ -2213,7 +2309,10 @@ func (b *lxdBackend) RenameCustomVolumeSnapshot(volName string, newSnapshotName return fmt.Errorf("Invalid new snapshot name") } - err := b.driver.RenameVolumeSnapshot(drivers.VolumeTypeCustom, parentName, oldSnapshotName, newSnapshotName, op) + // There's no need to pass config as it's not needed when renaming a volume. + vol := b.newVolume(drivers.VolumeTypeCustom, drivers.ContentTypeFS, parentName, nil) + + err := b.driver.RenameVolumeSnapshot(vol, oldSnapshotName, newSnapshotName, op) if err != nil { return err } @@ -2222,7 +2321,7 @@ func (b *lxdBackend) RenameCustomVolumeSnapshot(volName string, newSnapshotName err = b.state.Cluster.StoragePoolVolumeRename("default", volName, newVolName, db.StoragePoolVolumeTypeCustom, b.ID()) if err != nil { // Revert rename. - b.driver.RenameVolumeSnapshot(drivers.VolumeTypeCustom, parentName, newSnapshotName, oldSnapshotName, op) + b.driver.RenameVolumeSnapshot(vol, newSnapshotName, oldSnapshotName, op) return err } @@ -2240,9 +2339,13 @@ func (b *lxdBackend) DeleteCustomVolumeSnapshot(volName string, op *operations.O return fmt.Errorf("Volume name must be a snapshot") } + // There's no need to pass config as it's not needed when deleting a volume + // snapshot. + vol := b.newVolume(drivers.VolumeTypeCustom, drivers.ContentTypeFS, parentName, nil) + // Delete the snapshot from the storage device. // Must come before DB StoragePoolVolumeDelete so that the volume ID is still available. - err := b.driver.DeleteVolumeSnapshot(drivers.VolumeTypeCustom, parentName, snapName, op) + err := b.driver.DeleteVolumeSnapshot(vol, snapName, op) if err != nil { return err }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel