The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6066
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 3d78fd7951483dd740c569112d5a0f7d497600b9 Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Thu, 2 May 2019 14:51:19 +0200 Subject: [PATCH 1/5] storage: Remove shared code from backends This removes common code from the storage backends to the shared code section. Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- lxd/storage_btrfs.go | 28 ---------------------------- lxd/storage_ceph.go | 29 ----------------------------- lxd/storage_dir.go | 29 ----------------------------- lxd/storage_lvm.go | 29 ----------------------------- lxd/storage_shared.go | 28 ++++++++++++++++++++++++++++ lxd/storage_zfs.go | 29 ----------------------------- 6 files changed, 28 insertions(+), 144 deletions(-) diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go index d323f14f4a..8553e9259a 100644 --- a/lxd/storage_btrfs.go +++ b/lxd/storage_btrfs.go @@ -537,14 +537,6 @@ func (s *storageBtrfs) StoragePoolUpdate(writable *api.StoragePoolPut, return nil } -func (s *storageBtrfs) GetStoragePoolWritable() api.StoragePoolPut { - return s.pool.Writable() -} - -func (s *storageBtrfs) SetStoragePoolWritable(writable *api.StoragePoolPut) { - s.pool.StoragePoolPut = *writable -} - func (s *storageBtrfs) GetContainerPoolInfo() (int64, string, string) { return s.poolID, s.pool.Name, s.pool.Name } @@ -806,14 +798,6 @@ func (s *storageBtrfs) StoragePoolVolumeRename(newName string) error { return nil } -func (s *storageBtrfs) GetStoragePoolVolumeWritable() api.StorageVolumePut { - return s.volume.Writable() -} - -func (s *storageBtrfs) SetStoragePoolVolumeWritable(writable *api.StorageVolumePut) { - s.volume.StorageVolumePut = *writable -} - // Functions dealing with container storage. func (s *storageBtrfs) ContainerStorageReady(container container) bool { containerMntPoint := getContainerMountPoint(container.Project(), s.pool.Name, container.Name()) @@ -3158,18 +3142,6 @@ func (s *storageBtrfs) StorageMigrationSink(conn *websocket.Conn, op *operation, return rsyncStorageMigrationSink(conn, op, args) } -func (s *storageBtrfs) GetStoragePool() *api.StoragePool { - return s.pool -} - -func (s *storageBtrfs) GetStoragePoolVolume() *api.StorageVolume { - return s.volume -} - -func (s *storageBtrfs) GetState() *state.State { - return s.s -} - func (s *storageBtrfs) StoragePoolVolumeSnapshotCreate(target *api.StorageVolumeSnapshotsPost) error { logger.Infof("Creating BTRFS storage volume snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name) diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go index 279ea043a8..ff0fd419e4 100644 --- a/lxd/storage_ceph.go +++ b/lxd/storage_ceph.go @@ -15,7 +15,6 @@ import ( "github.com/lxc/lxd/lxd/db" "github.com/lxc/lxd/lxd/project" - "github.com/lxc/lxd/lxd/state" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/ioprogress" @@ -297,22 +296,6 @@ func (s *storageCeph) StoragePoolUmount() (bool, error) { return true, nil } -func (s *storageCeph) GetStoragePoolWritable() api.StoragePoolPut { - return s.pool.StoragePoolPut -} - -func (s *storageCeph) GetStoragePoolVolumeWritable() api.StorageVolumePut { - return s.volume.Writable() -} - -func (s *storageCeph) SetStoragePoolWritable(writable *api.StoragePoolPut) { - s.pool.StoragePoolPut = *writable -} - -func (s *storageCeph) SetStoragePoolVolumeWritable(writable *api.StorageVolumePut) { - s.volume.StorageVolumePut = *writable -} - func (s *storageCeph) GetContainerPoolInfo() (int64, string, string) { return s.poolID, s.pool.Name, s.OSDPoolName } @@ -2712,18 +2695,6 @@ func (s *storageCeph) StorageMigrationSink(conn *websocket.Conn, op *operation, return rsyncStorageMigrationSink(conn, op, args) } -func (s *storageCeph) GetStoragePool() *api.StoragePool { - return s.pool -} - -func (s *storageCeph) GetStoragePoolVolume() *api.StorageVolume { - return s.volume -} - -func (s *storageCeph) GetState() *state.State { - return s.s -} - func (s *storageCeph) StoragePoolVolumeSnapshotCreate(target *api.StorageVolumeSnapshotsPost) error { logger.Debugf("Creating RBD storage volume snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name) sourcePath := getStoragePoolVolumeMountPoint(s.pool.Name, s.volume.Name) diff --git a/lxd/storage_dir.go b/lxd/storage_dir.go index 40ee902a0c..fd0239f575 100644 --- a/lxd/storage_dir.go +++ b/lxd/storage_dir.go @@ -14,7 +14,6 @@ import ( "github.com/lxc/lxd/lxd/migration" "github.com/lxc/lxd/lxd/project" - "github.com/lxc/lxd/lxd/state" "github.com/lxc/lxd/lxd/storage/quota" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" @@ -279,22 +278,6 @@ func (s *storageDir) StoragePoolUmount() (bool, error) { return true, nil } -func (s *storageDir) GetStoragePoolWritable() api.StoragePoolPut { - return s.pool.Writable() -} - -func (s *storageDir) GetStoragePoolVolumeWritable() api.StorageVolumePut { - return s.volume.Writable() -} - -func (s *storageDir) SetStoragePoolWritable(writable *api.StoragePoolPut) { - s.pool.StoragePoolPut = *writable -} - -func (s *storageDir) SetStoragePoolVolumeWritable(writable *api.StorageVolumePut) { - s.volume.StorageVolumePut = *writable -} - func (s *storageDir) GetContainerPoolInfo() (int64, string, string) { return s.poolID, s.pool.Name, s.pool.Name } @@ -1466,18 +1449,6 @@ func (s *storageDir) StorageMigrationSink(conn *websocket.Conn, op *operation, a return rsyncStorageMigrationSink(conn, op, args) } -func (s *storageDir) GetStoragePool() *api.StoragePool { - return s.pool -} - -func (s *storageDir) GetStoragePoolVolume() *api.StorageVolume { - return s.volume -} - -func (s *storageDir) GetState() *state.State { - return s.s -} - func (s *storageDir) StoragePoolVolumeSnapshotCreate(target *api.StorageVolumeSnapshotsPost) error { logger.Infof("Creating DIR storage volume snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name) diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go index ae851fbcd9..0dfd90c906 100644 --- a/lxd/storage_lvm.go +++ b/lxd/storage_lvm.go @@ -15,7 +15,6 @@ import ( "github.com/lxc/lxd/lxd/migration" "github.com/lxc/lxd/lxd/project" - "github.com/lxc/lxd/lxd/state" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/ioprogress" @@ -681,22 +680,6 @@ func (s *storageLvm) StoragePoolVolumeUmount() (bool, error) { return ourUmount, nil } -func (s *storageLvm) GetStoragePoolWritable() api.StoragePoolPut { - return s.pool.Writable() -} - -func (s *storageLvm) GetStoragePoolVolumeWritable() api.StorageVolumePut { - return s.volume.Writable() -} - -func (s *storageLvm) SetStoragePoolWritable(writable *api.StoragePoolPut) { - s.pool.StoragePoolPut = *writable -} - -func (s *storageLvm) SetStoragePoolVolumeWritable(writable *api.StorageVolumePut) { - s.volume.StorageVolumePut = *writable -} - func (s *storageLvm) GetContainerPoolInfo() (int64, string, string) { return s.poolID, s.pool.Name, s.getOnDiskPoolName() } @@ -2289,18 +2272,6 @@ func (s *storageLvm) StorageMigrationSink(conn *websocket.Conn, op *operation, a return rsyncStorageMigrationSink(conn, op, args) } -func (s *storageLvm) GetStoragePool() *api.StoragePool { - return s.pool -} - -func (s *storageLvm) GetStoragePoolVolume() *api.StorageVolume { - return s.volume -} - -func (s *storageLvm) GetState() *state.State { - return s.s -} - func (s *storageLvm) StoragePoolVolumeSnapshotCreate(target *api.StorageVolumeSnapshotsPost) error { logger.Debugf("Creating LVM storage volume for snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name) diff --git a/lxd/storage_shared.go b/lxd/storage_shared.go index 8fb89b2da6..11875f06ec 100644 --- a/lxd/storage_shared.go +++ b/lxd/storage_shared.go @@ -30,6 +30,34 @@ func (s *storageShared) GetStorageTypeVersion() string { return s.sTypeVersion } +func (s *storageShared) GetStoragePool() *api.StoragePool { + return s.pool +} + +func (s *storageShared) GetStoragePoolVolume() *api.StorageVolume { + return s.volume +} + +func (s *storageShared) GetState() *state.State { + return s.s +} + +func (s *storageShared) GetStoragePoolWritable() api.StoragePoolPut { + return s.pool.Writable() +} + +func (s *storageShared) GetStoragePoolVolumeWritable() api.StorageVolumePut { + return s.volume.Writable() +} + +func (s *storageShared) SetStoragePoolWritable(writable *api.StoragePoolPut) { + s.pool.StoragePoolPut = *writable +} + +func (s *storageShared) SetStoragePoolVolumeWritable(writable *api.StorageVolumePut) { + s.volume.StorageVolumePut = *writable +} + func (s *storageShared) createImageDbPoolVolume(fingerprint string) error { // Fill in any default volume config. volumeConfig := map[string]string{} diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go index 23176d87ec..2d671d667c 100644 --- a/lxd/storage_zfs.go +++ b/lxd/storage_zfs.go @@ -16,7 +16,6 @@ import ( "github.com/lxc/lxd/lxd/migration" "github.com/lxc/lxd/lxd/project" - "github.com/lxc/lxd/lxd/state" "github.com/lxc/lxd/lxd/util" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" @@ -622,22 +621,6 @@ func (s *storageZfs) StoragePoolVolumeUmount() (bool, error) { return ourUmount, nil } -func (s *storageZfs) GetStoragePoolWritable() api.StoragePoolPut { - return s.pool.Writable() -} - -func (s *storageZfs) GetStoragePoolVolumeWritable() api.StorageVolumePut { - return s.volume.Writable() -} - -func (s *storageZfs) SetStoragePoolWritable(writable *api.StoragePoolPut) { - s.pool.StoragePoolPut = *writable -} - -func (s *storageZfs) SetStoragePoolVolumeWritable(writable *api.StorageVolumePut) { - s.volume.StorageVolumePut = *writable -} - func (s *storageZfs) GetContainerPoolInfo() (int64, string, string) { return s.poolID, s.pool.Name, s.getOnDiskPoolName() } @@ -3369,18 +3352,6 @@ func (s *storageZfs) StorageMigrationSink(conn *websocket.Conn, op *operation, a return rsyncStorageMigrationSink(conn, op, args) } -func (s *storageZfs) GetStoragePool() *api.StoragePool { - return s.pool -} - -func (s *storageZfs) GetStoragePoolVolume() *api.StorageVolume { - return s.volume -} - -func (s *storageZfs) GetState() *state.State { - return s.s -} - func (s *storageZfs) StoragePoolVolumeSnapshotCreate(target *api.StorageVolumeSnapshotsPost) error { logger.Infof("Creating ZFS storage volume snapshot \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name) From d6c92ea7f13b67b4a10c085a70a050aaf351c42a Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Thu, 2 May 2019 14:55:54 +0200 Subject: [PATCH 2/5] lxd: Remove ContainerCanRestore from storage interface The function ContainerCanRestore is only used by zfs, and therefore should be zfs specific. Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- lxd/container_lxc.go | 6 ------ lxd/storage.go | 1 - lxd/storage_btrfs.go | 4 ---- lxd/storage_ceph.go | 4 ---- lxd/storage_dir.go | 4 ---- lxd/storage_lvm.go | 4 ---- lxd/storage_mock.go | 4 ---- lxd/storage_zfs.go | 48 ++++++++++++++++++-------------------------- 8 files changed, 19 insertions(+), 56 deletions(-) diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go index d59356fc5c..e9e6b8f9a1 100644 --- a/lxd/container_lxc.go +++ b/lxd/container_lxc.go @@ -3724,12 +3724,6 @@ func (c *containerLXC) Restore(sourceContainer container, stateful bool) error { defer c.StorageStop() } - // Check if we can restore the container - err = c.storage.ContainerCanRestore(c, sourceContainer) - if err != nil { - return err - } - /* let's also check for CRIU if necessary, before doing a bunch of * filesystem manipulations */ diff --git a/lxd/storage.go b/lxd/storage.go index 6786c190db..7593ef7a6f 100644 --- a/lxd/storage.go +++ b/lxd/storage.go @@ -182,7 +182,6 @@ type storage interface { // ContainerCreateFromImage creates a container from a image. ContainerCreateFromImage(c container, fingerprint string, tracker *ioprogress.ProgressTracker) error - ContainerCanRestore(target container, source container) error ContainerDelete(c container) error ContainerCopy(target container, source container, containerOnly bool) error ContainerRefresh(target container, source container, snapshots []container) error diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go index 8553e9259a..cf094c145b 100644 --- a/lxd/storage_btrfs.go +++ b/lxd/storage_btrfs.go @@ -937,10 +937,6 @@ func (s *storageBtrfs) ContainerCreateFromImage(container container, fingerprint return nil } -func (s *storageBtrfs) ContainerCanRestore(container container, sourceContainer container) error { - return nil -} - func (s *storageBtrfs) ContainerDelete(container container) error { logger.Debugf("Deleting BTRFS storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name) diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go index ff0fd419e4..ec4bd72736 100644 --- a/lxd/storage_ceph.go +++ b/lxd/storage_ceph.go @@ -941,10 +941,6 @@ func (s *storageCeph) ContainerCreateFromImage(container container, fingerprint return nil } -func (s *storageCeph) ContainerCanRestore(container container, sourceContainer container) error { - return nil -} - func (s *storageCeph) ContainerDelete(container container) error { containerName := container.Name() logger.Debugf(`Deleting RBD storage volume for container "%s" on storage pool "%s"`, containerName, s.pool.Name) diff --git a/lxd/storage_dir.go b/lxd/storage_dir.go index fd0239f575..87e5261ee4 100644 --- a/lxd/storage_dir.go +++ b/lxd/storage_dir.go @@ -585,10 +585,6 @@ func (s *storageDir) ContainerCreateFromImage(container container, imageFingerpr return nil } -func (s *storageDir) ContainerCanRestore(container container, sourceContainer container) error { - return nil -} - func (s *storageDir) ContainerDelete(container container) error { logger.Debugf("Deleting DIR storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name) diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go index 0dfd90c906..eac2d7780c 100644 --- a/lxd/storage_lvm.go +++ b/lxd/storage_lvm.go @@ -1062,10 +1062,6 @@ func (s *storageLvm) ContainerCreateFromImage(container container, fingerprint s return nil } -func (s *storageLvm) ContainerCanRestore(container container, sourceContainer container) error { - return nil -} - func lvmContainerDeleteInternal(projectName, poolName string, ctName string, isSnapshot bool, vgName string, ctPath string) error { containerMntPoint := "" containerLvmName := containerNameToLVName(ctName) diff --git a/lxd/storage_mock.go b/lxd/storage_mock.go index 58c993f511..950aa4d215 100644 --- a/lxd/storage_mock.go +++ b/lxd/storage_mock.go @@ -123,10 +123,6 @@ func (s *storageMock) ContainerCreateFromImage( return nil } -func (s *storageMock) ContainerCanRestore(container container, sourceContainer container) error { - return nil -} - func (s *storageMock) ContainerDelete(container container) error { return nil } diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go index 2d671d667c..5338226bbc 100644 --- a/lxd/storage_zfs.go +++ b/lxd/storage_zfs.go @@ -915,29 +915,6 @@ func (s *storageZfs) ContainerCreateFromImage(container container, fingerprint s return nil } -func (s *storageZfs) ContainerCanRestore(container container, sourceContainer container) error { - snaps, err := container.Snapshots() - if err != nil { - return err - } - - if snaps[len(snaps)-1].Name() != sourceContainer.Name() { - if s.pool.Config["volume.zfs.remove_snapshots"] != "" { - zfsRemoveSnapshots = s.pool.Config["volume.zfs.remove_snapshots"] - } - if s.volume.Config["zfs.remove_snapshots"] != "" { - zfsRemoveSnapshots = s.volume.Config["zfs.remove_snapshots"] - } - if !shared.IsTrue(zfsRemoveSnapshots) { - return fmt.Errorf("ZFS can only restore from the latest snapshot. Delete newer snapshots or copy the snapshot into a new container instead") - } - - return nil - } - - return nil -} - func (s *storageZfs) ContainerDelete(container container) error { err := s.doContainerDelete(container.Project(), container.Name()) if err != nil { @@ -1503,6 +1480,25 @@ func (s *storageZfs) ContainerRename(container container, newName string) error func (s *storageZfs) ContainerRestore(target container, source container) error { logger.Debugf("Restoring ZFS storage volume for container \"%s\" from %s to %s", s.volume.Name, source.Name(), target.Name()) + snaps, err := target.Snapshots() + if err != nil { + return err + } + + if snaps[len(snaps)-1].Name() != source.Name() { + if s.pool.Config["volume.zfs.remove_snapshots"] != "" { + zfsRemoveSnapshots = s.pool.Config["volume.zfs.remove_snapshots"] + } + + if s.volume.Config["zfs.remove_snapshots"] != "" { + zfsRemoveSnapshots = s.volume.Config["zfs.remove_snapshots"] + } + + if !shared.IsTrue(zfsRemoveSnapshots) { + return fmt.Errorf("ZFS can only restore from the latest snapshot. Delete newer snapshots or copy the snapshot into a new container instead") + } + } + // Start storage for source container ourSourceStart, err := source.StorageStart() if err != nil { @@ -1521,12 +1517,6 @@ func (s *storageZfs) ContainerRestore(target container, source container) error defer target.StorageStop() } - // Remove any needed snapshot - snaps, err := target.Snapshots() - if err != nil { - return err - } - for i := len(snaps) - 1; i != 0; i-- { if snaps[i].Name() == source.Name() { break From 2efbf7e587bde2e3c1cc4a92e3ad8709fc15b5ea Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Thu, 2 May 2019 16:05:56 +0200 Subject: [PATCH 3/5] lxd: Remove Image{Umount,Mount} from storage interface These functions are not called from anywhere outside of the actual storage backend code. Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- lxd/storage.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/lxd/storage.go b/lxd/storage.go index 7593ef7a6f..a880b1aae4 100644 --- a/lxd/storage.go +++ b/lxd/storage.go @@ -208,8 +208,6 @@ type storage interface { // Functions dealing with image storage volumes. ImageCreate(fingerprint string, tracker *ioprogress.ProgressTracker) error ImageDelete(fingerprint string) error - ImageMount(fingerprint string) (bool, error) - ImageUmount(fingerprint string) (bool, error) // Storage type agnostic functions. StorageEntitySetQuota(volumeType int, size int64, data interface{}) error From a20ac15da114897bb0d270990e3505810487d572 Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Fri, 14 Jun 2019 20:21:51 +0200 Subject: [PATCH 4/5] test: Remove the attached testvolume Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- test/suites/storage_volume_attach.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/test/suites/storage_volume_attach.sh b/test/suites/storage_volume_attach.sh index 22c73f3d11..3a737deb80 100644 --- a/test/suites/storage_volume_attach.sh +++ b/test/suites/storage_volume_attach.sh @@ -57,6 +57,7 @@ test_storage_volume_attach() { if [ "${UIDs}" -lt 500000 ] || [ "${GIDs}" -lt 500000 ]; then echo "==> SKIP: The storage volume attach test requires at least 500000 uids and gids" lxc rm -f c1 c2 + lxc storage volume delete "lxdtest-$(basename "${LXD_DIR}")" testvolume return fi From 605a51ed0e0d71da0995b2c2651be129edc99447 Mon Sep 17 00:00:00 2001 From: Thomas Hipp <thomas.h...@canonical.com> Date: Thu, 2 May 2019 15:13:48 +0200 Subject: [PATCH 5/5] migration: Remove unused Snapshots() function from interface Signed-off-by: Thomas Hipp <thomas.h...@canonical.com> --- lxd/storage_btrfs.go | 4 ---- lxd/storage_migration.go | 7 ------- lxd/storage_zfs.go | 4 ---- 3 files changed, 15 deletions(-) diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go index cf094c145b..e4b0328ed5 100644 --- a/lxd/storage_btrfs.go +++ b/lxd/storage_btrfs.go @@ -2438,10 +2438,6 @@ type btrfsMigrationSourceDriver struct { stoppedSnapName string } -func (s *btrfsMigrationSourceDriver) Snapshots() []container { - return s.snapshots -} - func (s *btrfsMigrationSourceDriver) send(conn *websocket.Conn, btrfsPath string, btrfsParent string, readWrapper func(io.ReadCloser) io.ReadCloser) error { args := []string{"send"} if btrfsParent != "" { diff --git a/lxd/storage_migration.go b/lxd/storage_migration.go index 7767f0eafa..13716a39b9 100644 --- a/lxd/storage_migration.go +++ b/lxd/storage_migration.go @@ -18,9 +18,6 @@ import ( // MigrationStorageSourceDriver defines the functions needed to implement a // migration source driver. type MigrationStorageSourceDriver interface { - /* snapshots for this container, if any */ - Snapshots() []container - /* send any bits of the container/snapshots that are possible while the * container is still running. */ @@ -47,10 +44,6 @@ type rsyncStorageSourceDriver struct { rsyncFeatures []string } -func (s rsyncStorageSourceDriver) Snapshots() []container { - return s.snapshots -} - func (s rsyncStorageSourceDriver) SendStorageVolume(conn *websocket.Conn, op *operation, bwlimit string, storage storage, volumeOnly bool) error { ourMount, err := storage.StoragePoolVolumeMount() if err != nil { diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go index 5338226bbc..1d1a892b91 100644 --- a/lxd/storage_zfs.go +++ b/lxd/storage_zfs.go @@ -2515,10 +2515,6 @@ type zfsMigrationSourceDriver struct { zfsFeatures []string } -func (s *zfsMigrationSourceDriver) Snapshots() []container { - return s.snapshots -} - func (s *zfsMigrationSourceDriver) send(conn *websocket.Conn, zfsName string, zfsParent string, readWrapper func(io.ReadCloser) io.ReadCloser) error { sourceParentName, _, _ := containerGetParentAndSnapshotName(s.container.Name()) poolName := s.zfs.getOnDiskPoolName()
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel