The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6696
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 5906d2801b0e39ba39d84457236b66d7d4daee85 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Mon, 13 Jan 2020 10:52:09 +0000 Subject: [PATCH 1/3] lxd/storage/drivers/volume: Adds NewVMBlockFilesystemVolume and IsVMBlock functions Used to manage virtual machine associated filesystem volumes and detect when a volume is for a VM or associated image. Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/storage/drivers/volume.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/lxd/storage/drivers/volume.go b/lxd/storage/drivers/volume.go index d7e8d6e648..d479c9d030 100644 --- a/lxd/storage/drivers/volume.go +++ b/lxd/storage/drivers/volume.go @@ -15,6 +15,9 @@ const tmpVolSuffix = ".lxdtmp" // defaultBlockSize Default size of block volumes. const defaultBlockSize = "10GB" +// vmBlockFilesystemSize is the size of a VM block volume's associated filesystem volume. +const vmBlockFilesystemSize = "50MB" + // DefaultFilesystem filesytem to use for block devices by default. const DefaultFilesystem = "ext4" @@ -276,3 +279,23 @@ func (v Volume) Type() VolumeType { func (v Volume) ContentType() ContentType { return v.contentType } + +// IsVMBlock returns true if volume is a block volume for virtual machines or associated images. +func (v Volume) IsVMBlock() bool { + return (v.volType == VolumeTypeVM || v.volType == VolumeTypeImage) && v.contentType == ContentTypeBlock +} + +// NewVMBlockFilesystemVolume returns a copy of the volume with the content type set to ContentTypeFS and the +// config "size" property set to vmBlockFilesystemSize. +func (v Volume) NewVMBlockFilesystemVolume() Volume { + // Copy volume config so modifications don't affect original volume. + newConf := make(map[string]string, len(v.config)) + for k, v := range v.config { + newConf[k] = v + } + + // VM Block filesystems are a fixed size. + newConf["size"] = vmBlockFilesystemSize + + return NewVolume(v.driver, v.pool, v.volType, ContentTypeFS, v.name, newConf, v.poolConfig) +} From 43ae14f236d5b6d736164b22c02fa8372e52f2a9 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Mon, 13 Jan 2020 10:53:13 +0000 Subject: [PATCH 2/3] lxd/storage/drivers/driver/zfs/volumes: VM block function usage Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/storage/drivers/driver_zfs_volumes.go | 36 +++++++++++------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/lxd/storage/drivers/driver_zfs_volumes.go b/lxd/storage/drivers/driver_zfs_volumes.go index 58fcd6e2b5..17a34a4c47 100644 --- a/lxd/storage/drivers/driver_zfs_volumes.go +++ b/lxd/storage/drivers/driver_zfs_volumes.go @@ -97,8 +97,8 @@ func (d *zfs) CreateVolume(vol Volume, filler *VolumeFiller, op *operations.Oper } // For VM images, create a filesystem volume too. - if d.checkVMBlock(vol) { - fsVol := NewVolume(d, d.name, vol.volType, ContentTypeFS, vol.name, vol.config, vol.poolConfig) + if vol.IsVMBlock() { + fsVol := vol.NewVMBlockFilesystemVolume() err := d.CreateVolume(fsVol, nil, op) if err != nil { return err @@ -635,8 +635,8 @@ func (d *zfs) DeleteVolume(vol Volume, op *operations.Operation) error { } // For VMs, also delete the filesystem dataset. - if d.checkVMBlock(vol) { - fsVol := NewVolume(d, d.name, vol.volType, ContentTypeFS, vol.name, vol.config, vol.poolConfig) + if vol.IsVMBlock() { + fsVol := vol.NewVMBlockFilesystemVolume() err := d.DeleteVolume(fsVol, op) if err != nil { return err @@ -838,8 +838,8 @@ func (d *zfs) GetVolumeDiskPath(vol Volume) (string, error) { // MountVolume simulates mounting a volume. func (d *zfs) MountVolume(vol Volume, op *operations.Operation) (bool, error) { // For VMs, also mount the filesystem dataset. - if d.checkVMBlock(vol) { - fsVol := NewVolume(d, d.name, vol.volType, ContentTypeFS, vol.name, vol.config, vol.poolConfig) + if vol.IsVMBlock() { + fsVol := vol.NewVMBlockFilesystemVolume() _, err := d.MountVolume(fsVol, op) if err != nil { return false, err @@ -876,8 +876,8 @@ func (d *zfs) MountVolume(vol Volume, op *operations.Operation) (bool, error) { // UnmountVolume simulates unmounting a volume. func (d *zfs) UnmountVolume(vol Volume, op *operations.Operation) (bool, error) { // For VMs, also mount the filesystem dataset. - if d.checkVMBlock(vol) { - fsVol := NewVolume(d, d.name, vol.volType, ContentTypeFS, vol.name, vol.config, vol.poolConfig) + if vol.IsVMBlock() { + fsVol := vol.NewVMBlockFilesystemVolume() _, err := d.UnmountVolume(fsVol, op) if err != nil { return false, err @@ -943,8 +943,8 @@ func (d *zfs) RenameVolume(vol Volume, newVolName string, op *operations.Operati } // For VM images, create a filesystem volume too. - if d.checkVMBlock(vol) { - fsVol := NewVolume(d, d.name, vol.volType, ContentTypeFS, vol.name, vol.config, vol.poolConfig) + if vol.IsVMBlock() { + fsVol := vol.NewVMBlockFilesystemVolume() err := d.RenameVolume(fsVol, newVolName, op) if err != nil { return err @@ -1162,8 +1162,8 @@ func (d *zfs) CreateVolumeSnapshot(vol Volume, op *operations.Operation) error { revert.Add(func() { d.DeleteVolumeSnapshot(vol, op) }) // For VM images, create a filesystem volume too. - if d.checkVMBlock(vol) { - fsVol := NewVolume(d, d.name, vol.volType, ContentTypeFS, vol.name, vol.config, vol.poolConfig) + if vol.IsVMBlock() { + fsVol := vol.NewVMBlockFilesystemVolume() err := d.CreateVolumeSnapshot(fsVol, op) if err != nil { return err @@ -1215,8 +1215,8 @@ func (d *zfs) DeleteVolumeSnapshot(vol Volume, op *operations.Operation) error { } // For VM images, create a filesystem volume too. - if d.checkVMBlock(vol) { - fsVol := NewVolume(d, d.name, vol.volType, ContentTypeFS, vol.name, vol.config, vol.poolConfig) + if vol.IsVMBlock() { + fsVol := vol.NewVMBlockFilesystemVolume() err := d.DeleteVolumeSnapshot(fsVol, op) if err != nil { return err @@ -1330,8 +1330,8 @@ func (d *zfs) RestoreVolume(vol Volume, snapshotName string, op *operations.Oper } // For VM images, restore the associated filesystem dataset too. - if d.checkVMBlock(vol) { - fsVol := NewVolume(d, d.name, vol.volType, ContentTypeFS, vol.name, vol.config, vol.poolConfig) + if vol.IsVMBlock() { + fsVol := vol.NewVMBlockFilesystemVolume() err := d.RestoreVolume(fsVol, snapshotName, op) if err != nil { return err @@ -1371,8 +1371,8 @@ func (d *zfs) RenameVolumeSnapshot(vol Volume, newSnapshotName string, op *opera }) // For VM images, create a filesystem volume too. - if d.checkVMBlock(vol) { - fsVol := NewVolume(d, d.name, vol.volType, ContentTypeFS, vol.name, vol.config, vol.poolConfig) + if vol.IsVMBlock() { + fsVol := vol.NewVMBlockFilesystemVolume() err := d.RenameVolumeSnapshot(fsVol, newSnapshotName, op) if err != nil { return err From c8e0fb734be38aa88779cb9a53a3d8a9c249a00b Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Mon, 13 Jan 2020 11:01:04 +0000 Subject: [PATCH 3/3] lxd/storage/drivers/driver/zfs/utils: Removes unused checkVMBlock Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/storage/drivers/driver_zfs_utils.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lxd/storage/drivers/driver_zfs_utils.go b/lxd/storage/drivers/driver_zfs_utils.go index a5ac0ea914..5fb81cd2a5 100644 --- a/lxd/storage/drivers/driver_zfs_utils.go +++ b/lxd/storage/drivers/driver_zfs_utils.go @@ -81,10 +81,6 @@ func (d *zfs) checkDataset(dataset string) bool { return strings.TrimSpace(out) == dataset } -func (d *zfs) checkVMBlock(vol Volume) bool { - return (vol.volType == VolumeTypeVM || vol.volType == VolumeTypeImage) && vol.contentType == ContentTypeBlock -} - func (d *zfs) getClones(dataset string) ([]string, error) { out, err := shared.RunCommand("zfs", "get", "-H", "-p", "-o", "value", "-r", "clones", dataset) if err != nil {
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel