The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6686
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 fdbc2d8e89c25f0f06ab3ae36b10f3db359d1bd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Thu, 9 Jan 2020 17:25:26 -0500 Subject: [PATCH 1/3] lxd/storage/drivers: Use standard errors --- lxd/storage/drivers/driver_btrfs_volumes.go | 12 ++++++------ lxd/storage/drivers/driver_cephfs_volumes.go | 8 ++++---- lxd/storage/drivers/driver_dir_volumes.go | 10 +++++----- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lxd/storage/drivers/driver_btrfs_volumes.go b/lxd/storage/drivers/driver_btrfs_volumes.go index c8826b447f..80e26bf1ee 100644 --- a/lxd/storage/drivers/driver_btrfs_volumes.go +++ b/lxd/storage/drivers/driver_btrfs_volumes.go @@ -240,14 +240,14 @@ func (d *btrfs) CreateVolumeFromCopy(vol Volume, srcVol Volume, copySnapshots bo // CreateVolumeFromMigration creates a volume being sent via a migration. func (d *btrfs) CreateVolumeFromMigration(vol Volume, conn io.ReadWriteCloser, volTargetArgs migration.VolumeTargetArgs, preFiller *VolumeFiller, op *operations.Operation) error { if vol.contentType != ContentTypeFS { - return fmt.Errorf("Content type not supported") + return ErrNotSupported } // Handle simple rsync through generic. if volTargetArgs.MigrationType.FSType == migration.MigrationFSType_RSYNC { return genericCreateVolumeFromMigration(d, nil, vol, conn, volTargetArgs, preFiller, op) } else if volTargetArgs.MigrationType.FSType != migration.MigrationFSType_BTRFS { - return fmt.Errorf("Migration type not supported") + return ErrNotSupported } // Handle btrfs send/receive migration. @@ -349,11 +349,11 @@ func (d *btrfs) ValidateVolume(vol Volume, removeUnknownKeys bool) error { // UpdateVolume applies config changes to the volume. func (d *btrfs) UpdateVolume(vol Volume, changedConfig map[string]string) error { if vol.contentType != ContentTypeFS { - return fmt.Errorf("Content type not supported") + return ErrNotSupported } if vol.volType != VolumeTypeCustom { - return fmt.Errorf("Volume type not supported") + return ErrNotSupported } return d.SetVolumeQuota(vol, vol.config["size"], nil) @@ -476,14 +476,14 @@ func (d *btrfs) RenameVolume(vol Volume, newVolName string, op *operations.Opera // MigrateVolume sends a volume for migration. func (d *btrfs) MigrateVolume(vol Volume, conn io.ReadWriteCloser, volSrcArgs migration.VolumeSourceArgs, op *operations.Operation) error { if vol.contentType != ContentTypeFS { - return fmt.Errorf("Content type not supported") + return ErrNotSupported } // Handle simple rsync through generic. if volSrcArgs.MigrationType.FSType == migration.MigrationFSType_RSYNC { return d.vfsMigrateVolume(vol, conn, volSrcArgs, op) } else if volSrcArgs.MigrationType.FSType != migration.MigrationFSType_BTRFS { - return fmt.Errorf("Migration type not supported") + return ErrNotSupported } // Handle btrfs send/receive migration. diff --git a/lxd/storage/drivers/driver_cephfs_volumes.go b/lxd/storage/drivers/driver_cephfs_volumes.go index a1cb7ebde9..857ea0ce96 100644 --- a/lxd/storage/drivers/driver_cephfs_volumes.go +++ b/lxd/storage/drivers/driver_cephfs_volumes.go @@ -18,11 +18,11 @@ import ( // CreateVolume creates a new storage volume on disk. func (d *cephfs) CreateVolume(vol Volume, filler *VolumeFiller, op *operations.Operation) error { if vol.volType != VolumeTypeCustom { - return fmt.Errorf("Volume type not supported") + return ErrNotSupported } if vol.contentType != ContentTypeFS { - return fmt.Errorf("Content type not supported") + return ErrNotSupported } // Create the main volume path. @@ -141,7 +141,7 @@ func (d *cephfs) CreateVolumeFromCopy(vol Volume, srcVol Volume, copySnapshots b // CreateVolumeFromMigration creates a new volume (with or without snapshots) from a migration data stream. func (d *cephfs) CreateVolumeFromMigration(vol Volume, conn io.ReadWriteCloser, volTargetArgs migration.VolumeTargetArgs, preFiller *VolumeFiller, op *operations.Operation) error { if volTargetArgs.MigrationType.FSType != migration.MigrationFSType_RSYNC { - return fmt.Errorf("Migration type not supported") + return ErrNotSupported } // Create the main volume path. @@ -427,7 +427,7 @@ func (d *cephfs) RenameVolume(vol Volume, newName string, op *operations.Operati // MigrateVolume streams the volume (with or without snapshots) func (d *cephfs) MigrateVolume(vol Volume, conn io.ReadWriteCloser, volSrcArgs migration.VolumeSourceArgs, op *operations.Operation) error { if volSrcArgs.MigrationType.FSType != migration.MigrationFSType_RSYNC { - return fmt.Errorf("Migration type not supported") + return ErrNotSupported } return d.vfsMigrateVolume(vol, conn, volSrcArgs, op) diff --git a/lxd/storage/drivers/driver_dir_volumes.go b/lxd/storage/drivers/driver_dir_volumes.go index 67df0ffe44..3a1c8d92b0 100644 --- a/lxd/storage/drivers/driver_dir_volumes.go +++ b/lxd/storage/drivers/driver_dir_volumes.go @@ -118,11 +118,11 @@ func (d *dir) CreateVolumeFromCopy(vol Volume, srcVol Volume, copySnapshots bool // CreateVolumeFromMigration creates a volume being sent via a migration. func (d *dir) CreateVolumeFromMigration(vol Volume, conn io.ReadWriteCloser, volTargetArgs migration.VolumeTargetArgs, preFiller *VolumeFiller, op *operations.Operation) error { if vol.contentType != ContentTypeFS { - return fmt.Errorf("Content type not supported") + return ErrNotSupported } if volTargetArgs.MigrationType.FSType != migration.MigrationFSType_RSYNC { - return fmt.Errorf("Migration type not supported") + return ErrNotSupported } return genericCreateVolumeFromMigration(d, d.setupInitialQuota, vol, conn, volTargetArgs, preFiller, op) @@ -193,7 +193,7 @@ func (d *dir) ValidateVolume(vol Volume, removeUnknownKeys bool) error { // UpdateVolume applies config changes to the volume. func (d *dir) UpdateVolume(vol Volume, changedConfig map[string]string) error { if vol.contentType != ContentTypeFS { - return fmt.Errorf("Content type not supported") + return ErrNotSupported } if _, changed := changedConfig["size"]; changed { @@ -268,11 +268,11 @@ func (d *dir) RenameVolume(vol Volume, newVolName string, op *operations.Operati // MigrateVolume sends a volume for migration. func (d *dir) MigrateVolume(vol Volume, conn io.ReadWriteCloser, volSrcArgs migration.VolumeSourceArgs, op *operations.Operation) error { if vol.contentType != ContentTypeFS { - return fmt.Errorf("Content type not supported") + return ErrNotSupported } if volSrcArgs.MigrationType.FSType != migration.MigrationFSType_RSYNC { - return fmt.Errorf("Migration type not supported") + return ErrNotSupported } return d.vfsMigrateVolume(vol, conn, volSrcArgs, op) From 5636f107bc0b62f6bb9720f5f101f9b5bcf9e229 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Thu, 9 Jan 2020 17:45:25 -0500 Subject: [PATCH 2/3] lxd/storage/btrfs: Disable send/receive inside containers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/storage/drivers/driver_btrfs.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lxd/storage/drivers/driver_btrfs.go b/lxd/storage/drivers/driver_btrfs.go index 3f0de22616..e51abbd710 100644 --- a/lxd/storage/drivers/driver_btrfs.go +++ b/lxd/storage/drivers/driver_btrfs.go @@ -347,10 +347,8 @@ func (d *btrfs) MigrationTypes(contentType ContentType, refresh bool) []migratio return nil } - // When performing a refresh, always use rsync. Using btrfs send/receive - // here doesn't make sense since it would need to send everything again - // which defeats the purpose of a refresh. - if refresh { + // Only use rsync for refreshes and if running in an unprivileged container. + if refresh || d.state.OS.RunningInUserNS { return []migration.Type{ { FSType: migration.MigrationFSType_RSYNC, From d35758530b054a4c3fa1355745c1571a4112807f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Thu, 9 Jan 2020 16:59:07 -0500 Subject: [PATCH 3/3] lxd/init: Support new storage drivers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> --- lxd/main_init.go | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/lxd/main_init.go b/lxd/main_init.go index a0a26cb157..00a4a574a5 100644 --- a/lxd/main_init.go +++ b/lxd/main_init.go @@ -7,6 +7,9 @@ import ( "github.com/spf13/cobra" "github.com/lxc/lxd/client" + "github.com/lxc/lxd/lxd/state" + storageDrivers "github.com/lxc/lxd/lxd/storage/drivers" + "github.com/lxc/lxd/lxd/sys" "github.com/lxc/lxd/lxd/util" "github.com/lxc/lxd/shared" ) @@ -163,6 +166,14 @@ func (c *cmdInit) availableStorageDrivers(poolType string) []string { backingFs = "dir" } + // Get info for new drivers. + s := state.NewState(nil, nil, nil, sys.DefaultOS(), nil, nil, nil, nil, nil) + info := storageDrivers.SupportedDrivers(s) + availableDrivers := []string{} + for _, entry := range info { + availableDrivers = append(availableDrivers, entry.Name) + } + // Check available backends for _, driver := range supportedStoragePoolDrivers { if poolType == "remote" && !shared.StringInSlice(driver, []string{"ceph", "cephfs"}) { @@ -182,19 +193,23 @@ func (c *cmdInit) availableStorageDrivers(poolType string) []string { continue } - // btrfs can work in user namespaces too. (If - // source=/some/path/on/btrfs is used.) + // btrfs can work in user namespaces too. (If source=/some/path/on/btrfs is used.) if shared.RunningInUserNS() && (backingFs != "btrfs" || driver != "btrfs") { continue } - // Initialize a core storage interface for the given driver. - _, err := storageCoreInit(driver) - if err != nil { + // Check if available as a new style driver. + if shared.StringInSlice(driver, availableDrivers) { + drivers = append(drivers, driver) continue } - drivers = append(drivers, driver) + // Check if available as an old style driver. + _, err := storageCoreInit(driver) + if err == nil { + drivers = append(drivers, driver) + continue + } } return drivers
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel