[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