The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6640
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 2c9315386c40b2cc3df60bce5de507130999bbdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 17 Dec 2019 12:30:35 -0500 Subject: [PATCH 1/7] lxd/storage/cephfs: Use common functions 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_cephfs_volumes.go | 63 +------------------- 1 file changed, 2 insertions(+), 61 deletions(-) diff --git a/lxd/storage/drivers/driver_cephfs_volumes.go b/lxd/storage/drivers/driver_cephfs_volumes.go index 337cade4cd..9c04180f43 100644 --- a/lxd/storage/drivers/driver_cephfs_volumes.go +++ b/lxd/storage/drivers/driver_cephfs_volumes.go @@ -3,7 +3,6 @@ package drivers import ( "fmt" "io" - "io/ioutil" "os" "path/filepath" "strconv" @@ -433,39 +432,7 @@ func (d *cephfs) MigrateVolume(vol Volume, conn io.ReadWriteCloser, volSrcArgs m return fmt.Errorf("Migration type not supported") } - bwlimit := d.config["rsync.bwlimit"] - - for _, snapName := range volSrcArgs.Snapshots { - snapshot, err := vol.NewSnapshot(snapName) - if err != nil { - return err - } - - // Send snapshot to recipient (ensure local snapshot volume is mounted if needed). - err = snapshot.MountTask(func(mountPath string, op *operations.Operation) error { - var wrapper *ioprogress.ProgressTracker - if volSrcArgs.TrackProgress { - wrapper = migration.ProgressTracker(op, "fs_progress", snapshot.name) - } - - path := shared.AddSlash(mountPath) - return rsync.Send(snapshot.name, path, conn, wrapper, volSrcArgs.MigrationType.Features, bwlimit, d.state.OS.ExecPath) - }, op) - if err != nil { - return err - } - } - - // Send volume to recipient (ensure local volume is mounted if needed). - return vol.MountTask(func(mountPath string, op *operations.Operation) error { - var wrapper *ioprogress.ProgressTracker - if volSrcArgs.TrackProgress { - wrapper = migration.ProgressTracker(op, "fs_progress", vol.name) - } - - path := shared.AddSlash(mountPath) - return rsync.Send(vol.name, path, conn, wrapper, volSrcArgs.MigrationType.Features, bwlimit, d.state.OS.ExecPath) - }, op) + return d.vfsMigrateVolume(vol, conn, volSrcArgs, op) } // BackupVolume creates an exported version of a volume. @@ -536,33 +503,7 @@ func (d *cephfs) UnmountVolumeSnapshot(snapVol Volume, op *operations.Operation) // VolumeSnapshots returns a list of snapshot names for the volume. func (d *cephfs) VolumeSnapshots(vol Volume, op *operations.Operation) ([]string, error) { - snapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, vol.name) - snapshots := []string{} - - ents, err := ioutil.ReadDir(snapshotDir) - if err != nil { - // If the snapshots directory doesn't exist, there are no snapshots. - if os.IsNotExist(err) { - return snapshots, nil - } - - return nil, err - } - - for _, ent := range ents { - fileInfo, err := os.Stat(filepath.Join(snapshotDir, ent.Name())) - if err != nil { - return nil, err - } - - if !fileInfo.IsDir() { - continue - } - - snapshots = append(snapshots, ent.Name()) - } - - return snapshots, nil + return d.vfsVolumeSnapshots(vol, op) } // RestoreVolume resets a volume to its snapshotted state. From 6fd3b2befd0356df892917ef02cc0ee0c60ab885 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 17 Dec 2019 14:00:37 -0500 Subject: [PATCH 2/7] lxd/storage/common: Add vfsHasVolume 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_cephfs_volumes.go | 6 +----- lxd/storage/drivers/driver_common.go | 10 ++++++++++ lxd/storage/drivers/driver_dir_volumes.go | 6 +----- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/lxd/storage/drivers/driver_cephfs_volumes.go b/lxd/storage/drivers/driver_cephfs_volumes.go index 9c04180f43..776bd42231 100644 --- a/lxd/storage/drivers/driver_cephfs_volumes.go +++ b/lxd/storage/drivers/driver_cephfs_volumes.go @@ -262,11 +262,7 @@ func (d *cephfs) DeleteVolume(vol Volume, op *operations.Operation) error { // HasVolume indicates whether a specific volume exists on the storage pool. func (d *cephfs) HasVolume(vol Volume) bool { - if shared.PathExists(vol.MountPath()) { - return true - } - - return false + return d.vfsHasVolume(vol) } // ValidateVolume validates the supplied volume config. diff --git a/lxd/storage/drivers/driver_common.go b/lxd/storage/drivers/driver_common.go index e2e44ccb3e..a55047cefd 100644 --- a/lxd/storage/drivers/driver_common.go +++ b/lxd/storage/drivers/driver_common.go @@ -219,6 +219,7 @@ func (d *common) vfsRenameVolumeSnapshot(snapVol Volume, newSnapshotName string, return nil } +// vfsMigrateVolume is a generic MigrateVolume implementation for VFS-only drivers. func (d *common) vfsMigrateVolume(vol Volume, conn io.ReadWriteCloser, volSrcArgs migration.VolumeSourceArgs, op *operations.Operation) error { bwlimit := d.config["rsync.bwlimit"] @@ -254,3 +255,12 @@ func (d *common) vfsMigrateVolume(vol Volume, conn io.ReadWriteCloser, volSrcArg return rsync.Send(vol.name, path, conn, wrapper, volSrcArgs.MigrationType.Features, bwlimit, d.state.OS.ExecPath) }, op) } + +// vfsHasVolume is a generic HasVolume implementation for VFS-only drivers. +func (d *common) vfsHasVolume(vol Volume) bool { + if shared.PathExists(vol.MountPath()) { + return true + } + + return false +} diff --git a/lxd/storage/drivers/driver_dir_volumes.go b/lxd/storage/drivers/driver_dir_volumes.go index d36a0d8bef..000acee849 100644 --- a/lxd/storage/drivers/driver_dir_volumes.go +++ b/lxd/storage/drivers/driver_dir_volumes.go @@ -386,11 +386,7 @@ func (d *dir) DeleteVolume(vol Volume, op *operations.Operation) error { // HasVolume indicates whether a specific volume exists on the storage pool. func (d *dir) HasVolume(vol Volume) bool { - if shared.PathExists(vol.MountPath()) { - return true - } - - return false + return d.vfsHasVolume(vol) } // ValidateVolume validates the supplied volume config. From fb7b54c4ed70eed18d345b8ad920e3797cf48067 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 17 Dec 2019 14:11:42 -0500 Subject: [PATCH 3/7] lxd/storage/common: Add vfsGetVolumeDiskPath 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_common.go | 9 +++++++++ lxd/storage/drivers/driver_dir_volumes.go | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lxd/storage/drivers/driver_common.go b/lxd/storage/drivers/driver_common.go index a55047cefd..5f9ce8560b 100644 --- a/lxd/storage/drivers/driver_common.go +++ b/lxd/storage/drivers/driver_common.go @@ -264,3 +264,12 @@ func (d *common) vfsHasVolume(vol Volume) bool { return false } + +// vfsGetVolumeDiskPath is a generic GetVolumeDiskPath implementation for VFS-only drivers. +func (d *common) vfsGetVolumeDiskPath(vol Volume) (string, error) { + if vol.contentType != ContentTypeBlock { + return "", fmt.Errorf("No disk paths for filesystems") + } + + return filepath.Join(vol.MountPath(), "root.img"), nil +} diff --git a/lxd/storage/drivers/driver_dir_volumes.go b/lxd/storage/drivers/driver_dir_volumes.go index 000acee849..acbc6b2a79 100644 --- a/lxd/storage/drivers/driver_dir_volumes.go +++ b/lxd/storage/drivers/driver_dir_volumes.go @@ -454,7 +454,7 @@ func (d *dir) SetVolumeQuota(vol Volume, size string, op *operations.Operation) // GetVolumeDiskPath returns the location of a disk volume. func (d *dir) GetVolumeDiskPath(vol Volume) (string, error) { - return filepath.Join(vol.MountPath(), "root.img"), nil + return d.vfsGetVolumeDiskPath(vol) } // MountVolume simulates mounting a volume. As dir driver doesn't have volumes to mount it returns From 713d8bd692204591eec70d013d30145f840cac30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 17 Dec 2019 15:07:41 -0500 Subject: [PATCH 4/7] lxd/storage: Always init driver with state/logger 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/utils.go | 10 +++++++--- lxd/storage_volumes.go | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lxd/storage/utils.go b/lxd/storage/utils.go index 0ccd6b0a4f..bcd370f3f0 100644 --- a/lxd/storage/utils.go +++ b/lxd/storage/utils.go @@ -17,7 +17,9 @@ import ( "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/ioprogress" + log "github.com/lxc/lxd/shared/log15" "github.com/lxc/lxd/shared/logger" + "github.com/lxc/lxd/shared/logging" "github.com/lxc/lxd/shared/units" ) @@ -384,7 +386,7 @@ func VolumeDBCreate(s *state.State, project, poolName, volumeName, volumeDescrip } // Validate the requested storage volume configuration. - err = VolumeValidateConfig(poolName, volumeConfig, poolStruct) + err = VolumeValidateConfig(s, poolName, volumeConfig, poolStruct) if err != nil { return err } @@ -464,9 +466,11 @@ var StorageVolumeConfigKeys = map[string]func(value string) ([]string, error){ } // VolumeValidateConfig validations volume config. Deprecated. -func VolumeValidateConfig(name string, config map[string]string, parentPool *api.StoragePool) error { +func VolumeValidateConfig(s *state.State, name string, config map[string]string, parentPool *api.StoragePool) error { + logger := logging.AddContext(logger.Log, log.Ctx{"driver": parentPool.Driver, "pool": parentPool.Name}) + // Validate volume config using the new driver interface if supported. - driver, err := drivers.Load(nil, parentPool.Driver, parentPool.Name, parentPool.Config, nil, nil, validateVolumeCommonRules) + driver, err := drivers.Load(s, parentPool.Driver, parentPool.Name, parentPool.Config, logger, nil, validateVolumeCommonRules) if err != drivers.ErrUnknownDriver { // Note: This legacy validation function doesn't have the concept of validating // different volumes types, so the types are hard coded as Custom and FS. diff --git a/lxd/storage_volumes.go b/lxd/storage_volumes.go index f6636c0482..6748d3f2b7 100644 --- a/lxd/storage_volumes.go +++ b/lxd/storage_volumes.go @@ -1039,7 +1039,7 @@ func storagePoolVolumeTypePut(d *Daemon, r *http.Request, volumeTypeName string) } } else { // Validate the configuration - err = storagePools.VolumeValidateConfig(volumeName, req.Config, poolRow) + err = storagePools.VolumeValidateConfig(d.State(), volumeName, req.Config, poolRow) if err != nil { return response.BadRequest(err) } @@ -1153,7 +1153,7 @@ func storagePoolVolumeTypePatch(d *Daemon, r *http.Request, volumeTypeName strin } } else { // Validate the configuration. - err = storagePools.VolumeValidateConfig(volumeName, req.Config, poolRow) + err = storagePools.VolumeValidateConfig(d.State(), volumeName, req.Config, poolRow) if err != nil { return response.BadRequest(err) } From 25e92d23603e341475680e5b854ea92a9f820c16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 17 Dec 2019 16:29:00 -0500 Subject: [PATCH 5/7] lxd/storage: Replace CreateMountPath with EnsureMountPath 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_cephfs_volumes.go | 10 ++++++---- lxd/storage/drivers/driver_dir_utils.go | 2 +- lxd/storage/drivers/driver_dir_volumes.go | 8 ++++---- lxd/storage/drivers/volume.go | 21 +++++++++++--------- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/lxd/storage/drivers/driver_cephfs_volumes.go b/lxd/storage/drivers/driver_cephfs_volumes.go index 776bd42231..c021acfae6 100644 --- a/lxd/storage/drivers/driver_cephfs_volumes.go +++ b/lxd/storage/drivers/driver_cephfs_volumes.go @@ -25,13 +25,14 @@ func (d *cephfs) CreateVolume(vol Volume, filler *VolumeFiller, op *operations.O return fmt.Errorf("Content type not supported") } + // Create the main volume path. volPath := vol.MountPath() - - err := os.MkdirAll(volPath, 0711) + err := vol.EnsureMountPath() if err != nil { return err } + // Setup for revert. revertPath := true defer func() { if revertPath { @@ -39,6 +40,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") err = filler.Fill(volPath, "") @@ -62,7 +64,7 @@ func (d *cephfs) CreateVolumeFromCopy(vol Volume, srcVol Volume, copySnapshots b // Create the main volume path. volPath := vol.MountPath() - err := vol.CreateMountPath() + err := vol.EnsureMountPath() if err != nil { return err } @@ -144,7 +146,7 @@ func (d *cephfs) CreateVolumeFromMigration(vol Volume, conn io.ReadWriteCloser, // Create the main volume path. volPath := vol.MountPath() - err := vol.CreateMountPath() + err := vol.EnsureMountPath() if err != nil { return err } diff --git a/lxd/storage/drivers/driver_dir_utils.go b/lxd/storage/drivers/driver_dir_utils.go index 868c9a91dd..1ba9dcfdca 100644 --- a/lxd/storage/drivers/driver_dir_utils.go +++ b/lxd/storage/drivers/driver_dir_utils.go @@ -28,7 +28,7 @@ func (d *dir) copyVolume(vol Volume, srcVol Volume, srcSnapshots []Volume, op *o // Create the main volume path. volPath := vol.MountPath() - err = vol.CreateMountPath() + err = vol.EnsureMountPath() if err != nil { return err } diff --git a/lxd/storage/drivers/driver_dir_volumes.go b/lxd/storage/drivers/driver_dir_volumes.go index acbc6b2a79..e664f8fd07 100644 --- a/lxd/storage/drivers/driver_dir_volumes.go +++ b/lxd/storage/drivers/driver_dir_volumes.go @@ -20,7 +20,7 @@ import ( // filler function. func (d *dir) CreateVolume(vol Volume, filler *VolumeFiller, op *operations.Operation) error { volPath := vol.MountPath() - err := vol.CreateMountPath() + err := vol.EnsureMountPath() if err != nil { return err } @@ -123,7 +123,7 @@ func (d *dir) CreateVolumeFromBackup(vol Volume, snapshots []string, srcData io. }() volPath := vol.MountPath() - err := vol.CreateMountPath() + err := vol.EnsureMountPath() if err != nil { return nil, nil, err } @@ -222,7 +222,7 @@ func (d *dir) CreateVolumeFromMigration(vol Volume, conn io.ReadWriteCloser, vol // Create the main volume path. volPath := vol.MountPath() - err = vol.CreateMountPath() + err = vol.EnsureMountPath() if err != nil { return err } @@ -552,7 +552,7 @@ func (d *dir) CreateVolumeSnapshot(snapVol Volume, op *operations.Operation) err } // Create snapshot directory. - err = snapVol.CreateMountPath() + err = snapVol.EnsureMountPath() if err != nil { return err } diff --git a/lxd/storage/drivers/volume.go b/lxd/storage/drivers/volume.go index fff2150178..cd1ff93746 100644 --- a/lxd/storage/drivers/volume.go +++ b/lxd/storage/drivers/volume.go @@ -89,23 +89,26 @@ func (v Volume) MountPath() string { return GetVolumeMountPath(v.pool, v.volType, v.name) } -// CreateMountPath creates the volume's mount path and sets the correct permission for the type. -func (v Volume) CreateMountPath() error { +// EnsureMountPath creates the volume's mount path if missing, then sets the correct permission for the type. +func (v Volume) EnsureMountPath() error { volPath := v.MountPath() // Create volume's mount path, with any created directories set to 0711. - err := os.MkdirAll(volPath, 0711) - if err != nil { + err := os.Mkdir(volPath, 0711) + if err != nil && !os.IsExist(err) { return err } // Set very restrictive mode 0100 for non-custom and non-image volumes. + mode := os.FileMode(0711) if v.volType != VolumeTypeCustom && v.volType != VolumeTypeImage { - // Set mode of actual volume's mount path. - err = os.Chmod(volPath, 0100) - if err != nil { - return err - } + mode = os.FileMode(0100) + } + + // Set mode of actual volume's mount path. + err = os.Chmod(volPath, mode) + if err != nil { + return err } return nil From 05c99fd684a0c4c6ee3a5558b86cdeb176316869 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 17 Dec 2019 16:29:28 -0500 Subject: [PATCH 6/7] lxd/storage/cephfs: Use helper functions 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_cephfs_volumes.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lxd/storage/drivers/driver_cephfs_volumes.go b/lxd/storage/drivers/driver_cephfs_volumes.go index c021acfae6..b0dde7aadd 100644 --- a/lxd/storage/drivers/driver_cephfs_volumes.go +++ b/lxd/storage/drivers/driver_cephfs_volumes.go @@ -329,10 +329,8 @@ func (d *cephfs) UnmountVolume(vol Volume, op *operations.Operation) (bool, erro // RenameVolume renames the volume and all related filesystem entries. func (d *cephfs) RenameVolume(vol Volume, newName string, op *operations.Operation) error { - // Create new snapshots directory. - snapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, newName) - - err := os.MkdirAll(snapshotDir, 0711) + // Create the parent directory. + err := createParentSnapshotDirIfMissing(d.name, vol.volType, newName) if err != nil { return err } @@ -357,6 +355,7 @@ func (d *cephfs) RenameVolume(vol Volume, newName string, op *operations.Operati // Remove the new snapshot directory if we are reverting. if len(revertPaths) > 0 { + snapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, newName) err = os.RemoveAll(snapshotDir) } }() @@ -451,13 +450,14 @@ func (d *cephfs) CreateVolumeSnapshot(snapVol Volume, op *operations.Operation) return err } - targetPath := snapVol.MountPath() - - err = os.MkdirAll(filepath.Dir(targetPath), 0711) + // Create the parent directory. + err = createParentSnapshotDirIfMissing(d.name, snapVol.volType, parentName) if err != nil { return err } + // Create the symlink. + targetPath := snapVol.MountPath() err = os.Symlink(cephSnapPath, targetPath) if err != nil { return err From ad10d6b65dda6237a4a2a15d9cb57c0c28df5e29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 17 Dec 2019 16:33:19 -0500 Subject: [PATCH 7/7] lxd/storage/dir: Use helper functions 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_dir_volumes.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lxd/storage/drivers/driver_dir_volumes.go b/lxd/storage/drivers/driver_dir_volumes.go index e664f8fd07..35d04b8dd8 100644 --- a/lxd/storage/drivers/driver_dir_volumes.go +++ b/lxd/storage/drivers/driver_dir_volumes.go @@ -153,12 +153,12 @@ func (d *dir) CreateVolumeFromBackup(vol Volume, snapshots []string, srcData io. if len(snapshots) > 0 { // Create new snapshots directory. - snapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, vol.name) - err := os.MkdirAll(snapshotDir, 0711) + err := createParentSnapshotDirIfMissing(d.name, vol.volType, vol.name) if err != nil { return nil, nil, err } + snapshotDir := GetVolumeSnapshotDir(d.name, vol.volType, vol.name) revertPaths = append(revertPaths, snapshotDir) // Prepare tar arguments.
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel