The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/7435

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) ===
Allows for volume type specific validation.
From d2e75f18121f17909b070c6e738bf5d891082d22 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parr...@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.parr...@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.parr...@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.parr...@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.parr...@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.parr...@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
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to