[lxc-devel] [lxd/master] Storage: Updates VolumeValidateConfig to accept a volume type argument

tomponline on Github lxc-bot at linuxcontainers.org
Tue May 26 14:26:23 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 344 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200526/514b3f79/attachment.bin>
-------------- next part --------------
From d2e75f18121f17909b070c6e738bf5d891082d22 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Tue, 26 May 2020 14:58:17 +0100
Subject: [PATCH 1/3] lxd/storage/utils: Updates VolumeValidateConfig to
 require volume type

In order to provide more accurate validation.

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/storage/utils.go | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/lxd/storage/utils.go b/lxd/storage/utils.go
index 9ebcef3531..42727aec85 100644
--- a/lxd/storage/utils.go
+++ b/lxd/storage/utils.go
@@ -229,15 +229,15 @@ var StorageVolumeConfigKeys = map[string]func(value string) ([]string, error){
 }
 
 // VolumeValidateConfig validations volume config. Deprecated.
-func VolumeValidateConfig(s *state.State, name string, config map[string]string, parentPool *api.StoragePool) error {
+func VolumeValidateConfig(s *state.State, volName string, volType drivers.VolumeType, 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(s, parentPool.Driver, parentPool.Name, parentPool.Config, logger, nil, commonRules())
 	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.
-		return driver.ValidateVolume(drivers.NewVolume(driver, parentPool.Name, drivers.VolumeTypeCustom, drivers.ContentTypeFS, name, config, parentPool.Config), false)
+		// Note: This legacy validation function doesn't have the concept of validating different content
+		// types, so it is hardcoded as ContentTypeFS.
+		return driver.ValidateVolume(drivers.NewVolume(driver, parentPool.Name, volType, drivers.ContentTypeFS, volName, config, parentPool.Config), false)
 	}
 
 	// Otherwise fallback to doing legacy validation.

From 974979cdc5ba6edaf40a67b085426242a7f2c837 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Tue, 26 May 2020 14:57:01 +0100
Subject: [PATCH 2/3] lxd/storage/utils: Adds VolumeDBTypeToType function

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/storage/utils.go | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/lxd/storage/utils.go b/lxd/storage/utils.go
index 42727aec85..2b2410a0eb 100644
--- a/lxd/storage/utils.go
+++ b/lxd/storage/utils.go
@@ -107,6 +107,22 @@ func VolumeTypeToDBType(volType drivers.VolumeType) (int, error) {
 	return -1, fmt.Errorf("Invalid storage volume type")
 }
 
+// VolumeDBTypeToType converts internal volume type DB code to driver representation.
+func VolumeDBTypeToType(volDBType int) (drivers.VolumeType, error) {
+	switch volDBType {
+	case db.StoragePoolVolumeTypeContainer:
+		return drivers.VolumeTypeContainer, nil
+	case db.StoragePoolVolumeTypeVM:
+		return drivers.VolumeTypeVM, nil
+	case db.StoragePoolVolumeTypeImage:
+		return drivers.VolumeTypeImage, nil
+	case db.StoragePoolVolumeTypeCustom:
+		return drivers.VolumeTypeCustom, nil
+	}
+
+	return "", fmt.Errorf("Invalid storage volume type")
+}
+
 // InstanceTypeToVolumeType converts instance type to volume type.
 func InstanceTypeToVolumeType(instType instancetype.Type) (drivers.VolumeType, error) {
 	switch instType {

From 58ff71e5e2b53b2ff75362f0e00fbc99dfa10f0d Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Tue, 26 May 2020 14:57:57 +0100
Subject: [PATCH 3/3] lxd/storage/utils: Updates VolumeDBCreate to pass volume
 type

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/storage/utils.go | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/lxd/storage/utils.go b/lxd/storage/utils.go
index 2b2410a0eb..07cb4f9211 100644
--- a/lxd/storage/utils.go
+++ b/lxd/storage/utils.go
@@ -138,7 +138,7 @@ func InstanceTypeToVolumeType(instType instancetype.Type) (drivers.VolumeType, e
 // VolumeDBCreate creates a volume in the database.
 func VolumeDBCreate(s *state.State, project, poolName, volumeName, volumeDescription, volumeTypeName string, snapshot bool, volumeConfig map[string]string, expiryDate time.Time) error {
 	// Convert the volume type name to our internal integer representation.
-	volumeType, err := VolumeTypeNameToType(volumeTypeName)
+	volDBType, err := VolumeTypeNameToType(volumeTypeName)
 	if err != nil {
 		return err
 	}
@@ -150,7 +150,7 @@ func VolumeDBCreate(s *state.State, project, poolName, volumeName, volumeDescrip
 	}
 
 	// Check that a storage volume of the same storage volume type does not already exist.
-	volumeID, _ := s.Cluster.GetStoragePoolNodeVolumeID(project, volumeName, volumeType, poolID)
+	volumeID, _ := s.Cluster.GetStoragePoolNodeVolumeID(project, volumeName, volDBType, poolID)
 	if volumeID > 0 {
 		return fmt.Errorf("A storage volume of type %s already exists", volumeTypeName)
 	}
@@ -160,8 +160,13 @@ func VolumeDBCreate(s *state.State, project, poolName, volumeName, volumeDescrip
 		volumeConfig = map[string]string{}
 	}
 
+	volType, err := VolumeDBTypeToType(volDBType)
+	if err != nil {
+		return err
+	}
+
 	// Validate the requested storage volume configuration.
-	err = VolumeValidateConfig(s, poolName, volumeConfig, poolStruct)
+	err = VolumeValidateConfig(s, volumeName, volType, volumeConfig, poolStruct)
 	if err != nil {
 		return err
 	}
@@ -173,12 +178,12 @@ func VolumeDBCreate(s *state.State, project, poolName, volumeName, volumeDescrip
 
 	// Create the database entry for the storage volume.
 	if snapshot {
-		_, err = s.Cluster.CreateStorageVolumeSnapshot(project, volumeName, volumeDescription, volumeType, poolID, volumeConfig, expiryDate)
+		_, err = s.Cluster.CreateStorageVolumeSnapshot(project, volumeName, volumeDescription, volDBType, poolID, volumeConfig, expiryDate)
 	} else {
-		_, err = s.Cluster.CreateStoragePoolVolume(project, volumeName, volumeDescription, volumeType, poolID, volumeConfig)
+		_, err = s.Cluster.CreateStoragePoolVolume(project, volumeName, volumeDescription, volDBType, poolID, volumeConfig)
 	}
 	if err != nil {
-		return fmt.Errorf("Error inserting %s of type %s into database: %s", poolName, volumeTypeName, err)
+		return fmt.Errorf("Error inserting %q of type %q into database %q", poolName, volumeTypeName, err)
 	}
 
 	return nil


More information about the lxc-devel mailing list