[lxc-devel] [lxd/master] lxd/daemon: Port daemon storage to new functions
stgraber on Github
lxc-bot at linuxcontainers.org
Wed Dec 11 02:47:09 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 354 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20191210/8ae998dc/attachment.bin>
-------------- next part --------------
From 7d6ce365f90b38507ab61f759443e6cceb459e9a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 10 Dec 2019 20:50:48 -0500
Subject: [PATCH] lxd/daemon: Port daemon storage to new functions
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxd/daemon_storage.go | 153 +++++++++++++++++++++++++++++++-----------
1 file changed, 112 insertions(+), 41 deletions(-)
diff --git a/lxd/daemon_storage.go b/lxd/daemon_storage.go
index f5efe4bf7d..29135d0e6a 100644
--- a/lxd/daemon_storage.go
+++ b/lxd/daemon_storage.go
@@ -13,6 +13,8 @@ import (
"github.com/lxc/lxd/lxd/node"
"github.com/lxc/lxd/lxd/rsync"
"github.com/lxc/lxd/lxd/state"
+ storagePools "github.com/lxc/lxd/lxd/storage"
+ storageDrivers "github.com/lxc/lxd/lxd/storage/drivers"
"github.com/lxc/lxd/shared"
)
@@ -45,14 +47,26 @@ func daemonStorageMount(s *state.State) error {
volumeName := fields[1]
// Mount volume
- volume, err := storageInit(s, "default", poolName, volumeName, storagePoolVolumeTypeCustom)
- if err != nil {
- return errors.Wrapf(err, "Unable to load storage volume \"%s\"", source)
- }
+ pool, err := storagePools.GetPoolByName(s, poolName)
+ if err != storageDrivers.ErrUnknownDriver {
+ if err != nil {
+ return err
+ }
- _, err = volume.StoragePoolVolumeMount()
- if err != nil {
- return errors.Wrapf(err, "Failed to mount storage volume \"%s\"", source)
+ _, err = pool.MountCustomVolume(volumeName, nil)
+ if err != nil {
+ return errors.Wrapf(err, "Failed to mount storage volume \"%s\"", source)
+ }
+ } else {
+ volume, err := storageInit(s, "default", poolName, volumeName, storagePoolVolumeTypeCustom)
+ if err != nil {
+ return errors.Wrapf(err, "Unable to load storage volume \"%s\"", source)
+ }
+
+ _, err = volume.StoragePoolVolumeMount()
+ if err != nil {
+ return errors.Wrapf(err, "Failed to mount storage volume \"%s\"", source)
+ }
}
return nil
@@ -116,18 +130,18 @@ func daemonStorageValidate(s *state.State, target string) error {
volumeName := fields[1]
// Validate pool exists
- poolID, pool, err := s.Cluster.StoragePoolGet(poolName)
+ poolID, dbPool, err := s.Cluster.StoragePoolGet(poolName)
if err != nil {
return errors.Wrapf(err, "Unable to load storage pool \"%s\"", poolName)
}
// Validate pool driver (can't be CEPH or CEPHFS)
- if pool.Driver == "ceph" || pool.Driver == "cephfs" {
+ if dbPool.Driver == "ceph" || dbPool.Driver == "cephfs" {
return fmt.Errorf("Server storage volumes cannot be stored on Ceph")
}
// Confirm volume exists
- volume, err := storageInit(s, "default", poolName, volumeName, storagePoolVolumeTypeCustom)
+ _, _, err = s.Cluster.StoragePoolNodeVolumeGetType(volumeName, storagePoolVolumeTypeCustom, poolID)
if err != nil {
return errors.Wrapf(err, "Unable to load storage volume \"%s\"", target)
}
@@ -141,13 +155,31 @@ func daemonStorageValidate(s *state.State, target string) error {
return fmt.Errorf("Storage volumes for use by LXD itself cannot have snapshots")
}
- // Mount volume
- ourMount, err := volume.StoragePoolVolumeMount()
- if err != nil {
- return errors.Wrapf(err, "Failed to mount storage volume \"%s\"", target)
- }
- if ourMount {
- defer volume.StoragePoolUmount()
+ pool, err := storagePools.GetPoolByName(s, poolName)
+ if err != storageDrivers.ErrUnknownDriver {
+ if err != nil {
+ return err
+ }
+
+ // Mount volume
+ ourMount, err := pool.MountCustomVolume(volumeName, nil)
+ if err != nil {
+ return errors.Wrapf(err, "Failed to mount storage volume \"%s\"", target)
+ }
+ if ourMount {
+ defer pool.UnmountCustomVolume(volumeName, nil)
+ }
+ } else {
+ volume, err := storageInit(s, "default", poolName, volumeName, storagePoolVolumeTypeCustom)
+
+ // Mount volume
+ ourMount, err := volume.StoragePoolVolumeMount()
+ if err != nil {
+ return errors.Wrapf(err, "Failed to mount storage volume \"%s\"", target)
+ }
+ if ourMount {
+ defer volume.StoragePoolUmount()
+ }
}
// Validate volume is empty (ignore lost+found)
@@ -235,15 +267,28 @@ func daemonStorageMove(s *state.State, storageType string, target string) error
return errors.Wrapf(err, "Failed to move data over to directory \"%s\"", destPath)
}
- // Unmount old volume
- volume, err := storageInit(s, "default", sourcePool, sourceVolume, storagePoolVolumeTypeCustom)
- if err != nil {
- return errors.Wrapf(err, "Unable to load storage volume \"%s/%s\"", sourcePool, sourceVolume)
- }
+ pool, err := storagePools.GetPoolByName(s, sourcePool)
+ if err != storageDrivers.ErrUnknownDriver {
+ if err != nil {
+ return err
+ }
- _, err = volume.StoragePoolVolumeUmount()
- if err != nil {
- return errors.Wrapf(err, "Failed to umount storage volume \"%s/%s\"", sourcePool, sourceVolume)
+ // Unmount old volume
+ _, err = pool.UnmountCustomVolume(sourceVolume, nil)
+ if err != nil {
+ return errors.Wrapf(err, "Failed to umount storage volume \"%s/%s\"", sourcePool, sourceVolume)
+ }
+ } else {
+ // Unmount old volume
+ volume, err := storageInit(s, "default", sourcePool, sourceVolume, storagePoolVolumeTypeCustom)
+ if err != nil {
+ return errors.Wrapf(err, "Unable to load storage volume \"%s/%s\"", sourcePool, sourceVolume)
+ }
+
+ _, err = volume.StoragePoolVolumeUmount()
+ if err != nil {
+ return errors.Wrapf(err, "Failed to umount storage volume \"%s/%s\"", sourcePool, sourceVolume)
+ }
}
return nil
@@ -258,15 +303,28 @@ func daemonStorageMove(s *state.State, storageType string, target string) error
poolName := fields[0]
volumeName := fields[1]
- // Mount volume
- volume, err := storageInit(s, "default", poolName, volumeName, storagePoolVolumeTypeCustom)
- if err != nil {
- return errors.Wrapf(err, "Unable to load storage volume \"%s\"", target)
- }
+ pool, err := storagePools.GetPoolByName(s, poolName)
+ if err != storageDrivers.ErrUnknownDriver {
+ if err != nil {
+ return err
+ }
- _, err = volume.StoragePoolVolumeMount()
- if err != nil {
- return errors.Wrapf(err, "Failed to mount storage volume \"%s\"", target)
+ // Mount volume
+ _, err = pool.MountCustomVolume(volumeName, nil)
+ if err != nil {
+ return errors.Wrapf(err, "Failed to mount storage volume \"%s\"", target)
+ }
+ } else {
+ // Mount volume
+ volume, err := storageInit(s, "default", poolName, volumeName, storagePoolVolumeTypeCustom)
+ if err != nil {
+ return errors.Wrapf(err, "Unable to load storage volume \"%s\"", target)
+ }
+
+ _, err = volume.StoragePoolVolumeMount()
+ if err != nil {
+ return errors.Wrapf(err, "Failed to mount storage volume \"%s\"", target)
+ }
}
// Set ownership & mode
@@ -303,15 +361,28 @@ func daemonStorageMove(s *state.State, storageType string, target string) error
return errors.Wrapf(err, "Failed to move data over to directory \"%s\"", destPath)
}
- // Unmount old volume
- volume, err := storageInit(s, "default", sourcePool, sourceVolume, storagePoolVolumeTypeCustom)
- if err != nil {
- return errors.Wrapf(err, "Unable to load storage volume \"%s/%s\"", sourcePool, sourceVolume)
- }
+ pool, err := storagePools.GetPoolByName(s, sourcePool)
+ if err != storageDrivers.ErrUnknownDriver {
+ if err != nil {
+ return err
+ }
- _, err = volume.StoragePoolVolumeUmount()
- if err != nil {
- return errors.Wrapf(err, "Failed to umount storage volume \"%s/%s\"", sourcePool, sourceVolume)
+ // Unmount old volume
+ _, err = pool.UnmountCustomVolume(sourceVolume, nil)
+ if err != nil {
+ return errors.Wrapf(err, "Failed to umount storage volume \"%s/%s\"", sourcePool, sourceVolume)
+ }
+ } else {
+ // Unmount old volume
+ volume, err := storageInit(s, "default", sourcePool, sourceVolume, storagePoolVolumeTypeCustom)
+ if err != nil {
+ return errors.Wrapf(err, "Unable to load storage volume \"%s/%s\"", sourcePool, sourceVolume)
+ }
+
+ _, err = volume.StoragePoolVolumeUmount()
+ if err != nil {
+ return errors.Wrapf(err, "Failed to umount storage volume \"%s/%s\"", sourcePool, sourceVolume)
+ }
}
return nil
More information about the lxc-devel
mailing list