[lxc-devel] [lxd/master] Storage: Assorted VM related changes
tomponline on Github
lxc-bot at linuxcontainers.org
Mon Jan 13 16:59:29 UTC 2020
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200113/86129055/attachment.bin>
-------------- next part --------------
From 7899a7e6af8f13ba246bcbde9a9d4da64ef53b59 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 13 Jan 2020 15:56:25 +0000
Subject: [PATCH 1/6] lxd/storage: Updates storageRootFSApplyQuota to support
VMs
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxd/storage.go | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/lxd/storage.go b/lxd/storage.go
index 3351aed653..971465b28a 100644
--- a/lxd/storage.go
+++ b/lxd/storage.go
@@ -925,18 +925,18 @@ func storageVolumeUmount(state *state.State, poolName string, volumeName string,
// storageRootFSApplyQuota applies a quota to an instance if it can, if it cannot then it will
// return false indicating that the quota needs to be stored in volatile to be applied on next boot.
func storageRootFSApplyQuota(state *state.State, inst instance.Instance, size string) error {
- c, ok := inst.(*containerLXC)
- if !ok {
- return fmt.Errorf("Received non-LXC container instance")
- }
-
- pool, err := storagePools.GetPoolByInstance(state, c)
+ pool, err := storagePools.GetPoolByInstance(state, inst)
if err != storageDrivers.ErrUnknownDriver && err != storageDrivers.ErrNotImplemented {
- err = pool.SetInstanceQuota(c, size, nil)
+ err = pool.SetInstanceQuota(inst, size, nil)
if err != nil {
return err
}
} else {
+ c, ok := inst.(*containerLXC)
+ if !ok {
+ return fmt.Errorf("Received non-LXC container instance")
+ }
+
err := c.initStorage()
if err != nil {
return errors.Wrap(err, "Initialize storage")
From 700cb01c8361e235afdf5f54a7eabdc64752c532 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 13 Jan 2020 15:24:10 +0000
Subject: [PATCH 2/6] lxd/device/disk: Allow VM disks to be updated
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxd/device/disk.go | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/lxd/device/disk.go b/lxd/device/disk.go
index 252a42b57c..a963ece965 100644
--- a/lxd/device/disk.go
+++ b/lxd/device/disk.go
@@ -397,11 +397,7 @@ func (d *disk) postStart() error {
// Update applies configuration changes to a started device.
func (d *disk) Update(oldDevices deviceConfig.Devices, isRunning bool) error {
- if d.inst.Type() == instancetype.VM {
- if shared.IsRootDiskDevice(d.config) {
- return nil
- }
-
+ if d.inst.Type() == instancetype.VM && !shared.IsRootDiskDevice(d.config) {
return fmt.Errorf("Non-root disks not supported for VMs")
}
From ef8d69010ffa1afb1aaefdb6009a188ae1ed7710 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 13 Jan 2020 14:52:35 +0000
Subject: [PATCH 3/6] lxd/storage/drivers/utils: Adds copyDevice function
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxd/storage/drivers/utils.go | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/lxd/storage/drivers/utils.go b/lxd/storage/drivers/utils.go
index cf26c5aa80..781e5a6c56 100644
--- a/lxd/storage/drivers/utils.go
+++ b/lxd/storage/drivers/utils.go
@@ -2,6 +2,7 @@ package drivers
import (
"fmt"
+ "io"
"io/ioutil"
"os"
"path/filepath"
@@ -529,3 +530,25 @@ func regenerateFilesystemXFSUUID(devPath string) error {
return nil
}
+
+// copyDevice copies one device path to another.
+func copyDevice(inputPath, outputPath string) error {
+ from, err := os.Open(inputPath)
+ if err != nil {
+ return errors.Wrapf(err, "Error opening file for reading: %s", inputPath)
+ }
+ defer from.Close()
+
+ to, err := os.OpenFile(outputPath, os.O_WRONLY, 0)
+ if err != nil {
+ return errors.Wrapf(err, "Error opening file writing: %s", outputPath)
+ }
+ defer to.Close()
+
+ _, err = io.Copy(to, from)
+ if err != nil {
+ return errors.Wrapf(err, "Error copying file '%s' to '%s'", inputPath, outputPath)
+ }
+
+ return nil
+}
From 34b07ea9e2f202a36b51c4544b46f9a70fa4ba8d Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 13 Jan 2020 14:38:27 +0000
Subject: [PATCH 4/6] lxd/storage/drivers: Filler logging
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxd/storage/drivers/driver_cephfs_volumes.go | 3 ++-
lxd/storage/drivers/driver_dir_volumes.go | 3 ++-
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/lxd/storage/drivers/driver_cephfs_volumes.go b/lxd/storage/drivers/driver_cephfs_volumes.go
index 447fec82b8..c49b8ee17b 100644
--- a/lxd/storage/drivers/driver_cephfs_volumes.go
+++ b/lxd/storage/drivers/driver_cephfs_volumes.go
@@ -12,6 +12,7 @@ import (
"github.com/lxc/lxd/lxd/rsync"
"github.com/lxc/lxd/shared"
"github.com/lxc/lxd/shared/ioprogress"
+ log "github.com/lxc/lxd/shared/log15"
"github.com/lxc/lxd/shared/units"
)
@@ -42,7 +43,7 @@ func (d *cephfs) CreateVolume(vol Volume, filler *VolumeFiller, op *operations.O
// Fill the volume.
if filler != nil && filler.Fill != nil {
- d.logger.Debug("Running filler function")
+ d.logger.Debug("Running filler function", log.Ctx{"path": volPath})
err = filler.Fill(volPath, "")
if err != nil {
return err
diff --git a/lxd/storage/drivers/driver_dir_volumes.go b/lxd/storage/drivers/driver_dir_volumes.go
index 6e55d1781d..30ab4892db 100644
--- a/lxd/storage/drivers/driver_dir_volumes.go
+++ b/lxd/storage/drivers/driver_dir_volumes.go
@@ -11,6 +11,7 @@ import (
"github.com/lxc/lxd/lxd/rsync"
"github.com/lxc/lxd/lxd/storage/quota"
"github.com/lxc/lxd/shared"
+ log "github.com/lxc/lxd/shared/log15"
)
// CreateVolume creates an empty volume and can optionally fill it by executing the supplied
@@ -49,7 +50,7 @@ func (d *dir) CreateVolume(vol Volume, filler *VolumeFiller, op *operations.Oper
// Run the volume filler function if supplied.
if filler != nil && filler.Fill != nil {
- d.logger.Debug("Running filler function")
+ d.logger.Debug("Running filler function", log.Ctx{"path": volPath})
err = filler.Fill(volPath, rootBlockPath)
if err != nil {
return err
From 7a7862d4accacdbe91fa322a4ae08c8c3b535960 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 13 Jan 2020 14:37:51 +0000
Subject: [PATCH 5/6] lxd/storage/drivers/generic: Updates genericCopyVolume to
be VM block aware using copyDevice
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxd/storage/drivers/generic.go | 50 +++++++++++++++++++++++++++++++---
1 file changed, 46 insertions(+), 4 deletions(-)
diff --git a/lxd/storage/drivers/generic.go b/lxd/storage/drivers/generic.go
index 56df274740..b3ac53cde6 100644
--- a/lxd/storage/drivers/generic.go
+++ b/lxd/storage/drivers/generic.go
@@ -16,8 +16,8 @@ import (
// genericCopyVolume copies a volume and its snapshots using a non-optimized method.
// initVolume is run against the main volume (not the snapshots) and is often used for quota initialization.
func genericCopyVolume(d Driver, initVolume func(vol Volume) (func(), error), vol Volume, srcVol Volume, srcSnapshots []Volume, refresh bool, op *operations.Operation) error {
- if vol.contentType != ContentTypeFS || srcVol.contentType != ContentTypeFS {
- return fmt.Errorf("Content type not supported")
+ if vol.contentType != srcVol.contentType {
+ return fmt.Errorf("Content type of source and target must be the same")
}
bwlimit := d.Config()["rsync.bwlimit"]
@@ -46,7 +46,28 @@ func genericCopyVolume(d Driver, initVolume func(vol Volume) (func(), error), vo
err := srcSnapshot.MountTask(func(srcMountPath string, op *operations.Operation) error {
// Copy the snapshot.
_, err := rsync.LocalCopy(srcMountPath, mountPath, bwlimit, true)
- return err
+ if err != nil {
+ return err
+ }
+
+ if srcSnapshot.IsVMBlock() {
+ srcDevPath, err := d.GetVolumeDiskPath(srcSnapshot)
+ if err != nil {
+ return err
+ }
+
+ targetDevPath, err := d.GetVolumeDiskPath(vol)
+ if err != nil {
+ return err
+ }
+
+ err = copyDevice(srcDevPath, targetDevPath)
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
}, op)
if err != nil {
return err
@@ -79,7 +100,28 @@ func genericCopyVolume(d Driver, initVolume func(vol Volume) (func(), error), vo
// Copy source to destination (mounting each volume if needed).
err := srcVol.MountTask(func(srcMountPath string, op *operations.Operation) error {
_, err := rsync.LocalCopy(srcMountPath, mountPath, bwlimit, true)
- return err
+ if err != nil {
+ return err
+ }
+
+ if srcVol.IsVMBlock() {
+ srcDevPath, err := d.GetVolumeDiskPath(srcVol)
+ if err != nil {
+ return err
+ }
+
+ targetDevPath, err := d.GetVolumeDiskPath(vol)
+ if err != nil {
+ return err
+ }
+
+ err = copyDevice(srcDevPath, targetDevPath)
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
}, op)
if err != nil {
return err
From 709547f98ad6ab9a021d68126913c29027f38e84 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 13 Jan 2020 11:46:07 +0000
Subject: [PATCH 6/6] client/lxd/instances: Sends instance type when copying
instances
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
client/lxd_instances.go | 1 +
1 file changed, 1 insertion(+)
diff --git a/client/lxd_instances.go b/client/lxd_instances.go
index 340a4b9bf5..b40b995863 100644
--- a/client/lxd_instances.go
+++ b/client/lxd_instances.go
@@ -352,6 +352,7 @@ func (r *ProtocolLXD) CopyInstance(source InstanceServer, instance api.Instance,
req := api.InstancesPost{
Name: instance.Name,
InstancePut: instance.Writable(),
+ Type: api.InstanceType(instance.Type),
}
req.Source.BaseImage = instance.Config["volatile.base_image"]
More information about the lxc-devel
mailing list