[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