The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6336
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) === This PR comes from #6285, but to make that PR smaller I am breaking it into parts. This PR moves some of the storage utils needed by the new storage package into the storage package. It also adds some new helper functions.
From e3dcaa696308ba975246ad9f898ddad8981aca0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Sun, 6 Oct 2019 20:56:17 -0400 Subject: [PATCH 1/3] lxd/storage/utils: Add common helpers to utils MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stéphane Graber <stgra...@ubuntu.com> Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/storage/utils.go | 274 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 274 insertions(+) diff --git a/lxd/storage/utils.go b/lxd/storage/utils.go index d23d4f4171..e370a7efd9 100644 --- a/lxd/storage/utils.go +++ b/lxd/storage/utils.go @@ -3,17 +3,41 @@ package storage import ( "fmt" "os" + "path/filepath" "strings" "time" "golang.org/x/sys/unix" "github.com/lxc/lxd/lxd/db" + "github.com/lxc/lxd/lxd/state" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/logger" + "github.com/lxc/lxd/shared/units" ) +var baseDirectories = []string{ + "containers", + "containers-snapshots", + "custom", + "custom-snapshots", + "images", + "virtual-machines", + "virtual-machines-snapshots", +} + +func createStorageStructure(path string) error { + for _, name := range baseDirectories { + err := os.MkdirAll(filepath.Join(path, name), 0711) + if err != nil && !os.IsExist(err) { + return err + } + } + + return nil +} + // MkfsOptions represents options for filesystem creation. type MkfsOptions struct { Label string @@ -360,3 +384,253 @@ func GetStorageResource(path string) (*api.ResourcesStoragePool, error) { return &res, nil } + +// VolumeTypeNameToType converts a volume type string to internal code. +func VolumeTypeNameToType(volumeTypeName string) (int, error) { + switch volumeTypeName { + case db.StoragePoolVolumeTypeNameContainer: + return db.StoragePoolVolumeTypeContainer, nil + case db.StoragePoolVolumeTypeNameImage: + return db.StoragePoolVolumeTypeImage, nil + case db.StoragePoolVolumeTypeNameCustom: + return db.StoragePoolVolumeTypeCustom, nil + } + + return -1, fmt.Errorf("invalid storage volume type name") +} + +// VolumeDBCreate creates a volume in the database. +func VolumeDBCreate(s *state.State, poolName string, volumeName, volumeDescription string, volumeTypeName string, snapshot bool, volumeConfig map[string]string) error { + // Convert the volume type name to our internal integer representation. + volumeType, err := VolumeTypeNameToType(volumeTypeName) + if err != nil { + return err + } + + // Load storage pool the volume will be attached to. + poolID, poolStruct, err := s.Cluster.StoragePoolGet(poolName) + if err != nil { + return err + } + + // Check that a storage volume of the same storage volume type does not + // already exist. + volumeID, _ := s.Cluster.StoragePoolNodeVolumeGetTypeID(volumeName, volumeType, poolID) + if volumeID > 0 { + return fmt.Errorf("a storage volume of type %s does already exist", volumeTypeName) + } + + // Make sure that we don't pass a nil to the next function. + if volumeConfig == nil { + volumeConfig = map[string]string{} + } + + // Validate the requested storage volume configuration. + err = VolumeValidateConfig(poolName, volumeConfig, poolStruct) + if err != nil { + return err + } + + err = VolumeFillDefault(poolName, volumeConfig, poolStruct) + if err != nil { + return err + } + + // Create the database entry for the storage volume. + _, err = s.Cluster.StoragePoolVolumeCreate("default", volumeName, volumeDescription, volumeType, snapshot, poolID, volumeConfig) + if err != nil { + return fmt.Errorf("Error inserting %s of type %s into database: %s", poolName, volumeTypeName, err) + } + + return nil +} + +// SupportedPoolTypes the types of pools supported. +var SupportedPoolTypes = []string{"btrfs", "ceph", "cephfs", "dir", "lvm", "zfs"} + +// StorageVolumeConfigKeys config validation for btrfs, ceph, cephfs, dir, lvm, zfs types. +var StorageVolumeConfigKeys = map[string]func(value string) ([]string, error){ + "block.filesystem": func(value string) ([]string, error) { + err := shared.IsOneOf(value, []string{"btrfs", "ext4", "xfs"}) + if err != nil { + return nil, err + } + + return []string{"ceph", "lvm"}, nil + }, + "block.mount_options": func(value string) ([]string, error) { + return []string{"ceph", "lvm"}, shared.IsAny(value) + }, + "security.shifted": func(value string) ([]string, error) { + return SupportedPoolTypes, shared.IsBool(value) + }, + "security.unmapped": func(value string) ([]string, error) { + return SupportedPoolTypes, shared.IsBool(value) + }, + "size": func(value string) ([]string, error) { + if value == "" { + return []string{"btrfs", "ceph", "cephfs", "lvm", "zfs"}, nil + } + + _, err := units.ParseByteSizeString(value) + if err != nil { + return nil, err + } + + return []string{"btrfs", "ceph", "cephfs", "lvm", "zfs"}, nil + }, + "volatile.idmap.last": func(value string) ([]string, error) { + return SupportedPoolTypes, shared.IsAny(value) + }, + "volatile.idmap.next": func(value string) ([]string, error) { + return SupportedPoolTypes, shared.IsAny(value) + }, + "zfs.remove_snapshots": func(value string) ([]string, error) { + err := shared.IsBool(value) + if err != nil { + return nil, err + } + + return []string{"zfs"}, nil + }, + "zfs.use_refquota": func(value string) ([]string, error) { + err := shared.IsBool(value) + if err != nil { + return nil, err + } + + return []string{"zfs"}, nil + }, +} + +// VolumeValidateConfig validations volume config. +func VolumeValidateConfig(name string, config map[string]string, parentPool *api.StoragePool) error { + for key, val := range config { + // User keys are not validated. + if strings.HasPrefix(key, "user.") { + continue + } + + // Validate storage volume config keys. + validator, ok := StorageVolumeConfigKeys[key] + if !ok { + return fmt.Errorf("Invalid storage volume configuration key: %s", key) + } + + _, err := validator(val) + if err != nil { + return err + } + + if parentPool.Driver != "zfs" || parentPool.Driver == "dir" { + if config["zfs.use_refquota"] != "" { + return fmt.Errorf("the key volume.zfs.use_refquota cannot be used with non zfs storage volumes") + } + + if config["zfs.remove_snapshots"] != "" { + return fmt.Errorf("the key volume.zfs.remove_snapshots cannot be used with non zfs storage volumes") + } + } + + if parentPool.Driver == "dir" { + if config["block.mount_options"] != "" { + return fmt.Errorf("the key block.mount_options cannot be used with dir storage volumes") + } + + if config["block.filesystem"] != "" { + return fmt.Errorf("the key block.filesystem cannot be used with dir storage volumes") + } + } + } + + return nil +} + +// VolumeFillDefault fills default settings into a volume config. +func VolumeFillDefault(name string, config map[string]string, parentPool *api.StoragePool) error { + if parentPool.Driver == "dir" { + config["size"] = "" + } else if parentPool.Driver == "lvm" || parentPool.Driver == "ceph" { + if config["block.filesystem"] == "" { + config["block.filesystem"] = parentPool.Config["volume.block.filesystem"] + } + if config["block.filesystem"] == "" { + // Unchangeable volume property: Set unconditionally. + config["block.filesystem"] = "ext4" + } + + if config["block.mount_options"] == "" { + config["block.mount_options"] = parentPool.Config["volume.block.mount_options"] + } + if config["block.mount_options"] == "" { + // Unchangeable volume property: Set unconditionally. + config["block.mount_options"] = "discard" + } + + // Does the pool request a default size for new storage volumes? + if config["size"] == "0" || config["size"] == "" { + config["size"] = parentPool.Config["volume.size"] + } + // Does the user explicitly request a default size for new + // storage volumes? + if config["size"] == "0" || config["size"] == "" { + config["size"] = "10GB" + } + } else { + if config["size"] != "" { + _, err := units.ParseByteSizeString(config["size"]) + if err != nil { + return err + } + } + } + + return nil +} + +// VolumeSnapshotsGet returns a list of snapshots of the form <volume>/<snapshot-name>. +func VolumeSnapshotsGet(s *state.State, pool string, volume string, volType int) ([]string, error) { + poolID, err := s.Cluster.StoragePoolGetID(pool) + if err != nil { + return nil, err + } + + snapshots, err := s.Cluster.StoragePoolVolumeSnapshotsGetType(volume, volType, poolID) + if err != nil { + return nil, err + } + + return snapshots, nil +} + +// VolumePropertiesTranslate validates the supplied volume config and removes any keys that are not +// suitable for the volume's driver type. +func VolumePropertiesTranslate(targetConfig map[string]string, targetParentPoolDriver string) (map[string]string, error) { + newConfig := make(map[string]string, len(targetConfig)) + for key, val := range targetConfig { + // User keys are not validated. + if strings.HasPrefix(key, "user.") { + continue + } + + // Validate storage volume config keys. + validator, ok := StorageVolumeConfigKeys[key] + if !ok { + return nil, fmt.Errorf("Invalid storage volume configuration key: %s", key) + } + + validStorageDrivers, err := validator(val) + if err != nil { + return nil, err + } + + // Drop invalid keys. + if !shared.StringInSlice(targetParentPoolDriver, validStorageDrivers) { + continue + } + + newConfig[key] = val + } + + return newConfig, nil +} From 79bcc4aa2cc1095abb97f10fe6c2e09826d7de21 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Wed, 9 Oct 2019 11:31:26 +0100 Subject: [PATCH 2/3] lxd/storage/volumes/config: Removes functions moved to storage package Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/storage_volumes_config.go | 173 ---------------------------------- lxd/storage_volumes_utils.go | 73 -------------- 2 files changed, 246 deletions(-) diff --git a/lxd/storage_volumes_config.go b/lxd/storage_volumes_config.go index 76dca2b558..fff20d0496 100644 --- a/lxd/storage_volumes_config.go +++ b/lxd/storage_volumes_config.go @@ -2,43 +2,8 @@ package main import ( "fmt" - "strings" - - "github.com/lxc/lxd/shared" - "github.com/lxc/lxd/shared/api" - "github.com/lxc/lxd/shared/units" ) -func storageVolumePropertiesTranslate(targetConfig map[string]string, targetParentPoolDriver string) (map[string]string, error) { - newConfig := make(map[string]string, len(targetConfig)) - for key, val := range targetConfig { - // User keys are not validated. - if strings.HasPrefix(key, "user.") { - continue - } - - // Validate storage volume config keys. - validator, ok := storageVolumeConfigKeys[key] - if !ok { - return nil, fmt.Errorf("Invalid storage volume configuration key: %s", key) - } - - validStorageDrivers, err := validator(val) - if err != nil { - return nil, err - } - - // Drop invalid keys. - if !shared.StringInSlice(targetParentPoolDriver, validStorageDrivers) { - continue - } - - newConfig[key] = val - } - - return newConfig, nil -} - func updateStoragePoolVolumeError(unchangeable []string, driverName string) error { return fmt.Errorf(`The %v properties cannot be changed for "%s" `+ `storage volumes`, unchangeable, driverName) @@ -89,141 +54,3 @@ var changeableStoragePoolVolumeProperties = map[string][]string{ "zfs.use_refquota", }, } - -// btrfs, ceph, cephfs, dir, lvm, zfs -var storageVolumeConfigKeys = map[string]func(value string) ([]string, error){ - "block.filesystem": func(value string) ([]string, error) { - err := shared.IsOneOf(value, []string{"btrfs", "ext4", "xfs"}) - if err != nil { - return nil, err - } - - return []string{"ceph", "lvm"}, nil - }, - "block.mount_options": func(value string) ([]string, error) { - return []string{"ceph", "lvm"}, shared.IsAny(value) - }, - "security.shifted": func(value string) ([]string, error) { - return supportedPoolTypes, shared.IsBool(value) - }, - "security.unmapped": func(value string) ([]string, error) { - return supportedPoolTypes, shared.IsBool(value) - }, - "size": func(value string) ([]string, error) { - if value == "" { - return []string{"btrfs", "ceph", "cephfs", "lvm", "zfs"}, nil - } - - _, err := units.ParseByteSizeString(value) - if err != nil { - return nil, err - } - - return []string{"btrfs", "ceph", "cephfs", "lvm", "zfs"}, nil - }, - "volatile.idmap.last": func(value string) ([]string, error) { - return supportedPoolTypes, shared.IsAny(value) - }, - "volatile.idmap.next": func(value string) ([]string, error) { - return supportedPoolTypes, shared.IsAny(value) - }, - "zfs.remove_snapshots": func(value string) ([]string, error) { - err := shared.IsBool(value) - if err != nil { - return nil, err - } - - return []string{"zfs"}, nil - }, - "zfs.use_refquota": func(value string) ([]string, error) { - err := shared.IsBool(value) - if err != nil { - return nil, err - } - - return []string{"zfs"}, nil - }, -} - -func storageVolumeValidateConfig(name string, config map[string]string, parentPool *api.StoragePool) error { - for key, val := range config { - // User keys are not validated. - if strings.HasPrefix(key, "user.") { - continue - } - - // Validate storage volume config keys. - validator, ok := storageVolumeConfigKeys[key] - if !ok { - return fmt.Errorf("Invalid storage volume configuration key: %s", key) - } - - _, err := validator(val) - if err != nil { - return err - } - - if parentPool.Driver != "zfs" || parentPool.Driver == "dir" { - if config["zfs.use_refquota"] != "" { - return fmt.Errorf("the key volume.zfs.use_refquota cannot be used with non zfs storage volumes") - } - - if config["zfs.remove_snapshots"] != "" { - return fmt.Errorf("the key volume.zfs.remove_snapshots cannot be used with non zfs storage volumes") - } - } - - if parentPool.Driver == "dir" { - if config["block.mount_options"] != "" { - return fmt.Errorf("the key block.mount_options cannot be used with dir storage volumes") - } - - if config["block.filesystem"] != "" { - return fmt.Errorf("the key block.filesystem cannot be used with dir storage volumes") - } - } - } - - return nil -} - -func storageVolumeFillDefault(name string, config map[string]string, parentPool *api.StoragePool) error { - if parentPool.Driver == "dir" { - config["size"] = "" - } else if parentPool.Driver == "lvm" || parentPool.Driver == "ceph" { - if config["block.filesystem"] == "" { - config["block.filesystem"] = parentPool.Config["volume.block.filesystem"] - } - if config["block.filesystem"] == "" { - // Unchangeable volume property: Set unconditionally. - config["block.filesystem"] = "ext4" - } - - if config["block.mount_options"] == "" { - config["block.mount_options"] = parentPool.Config["volume.block.mount_options"] - } - if config["block.mount_options"] == "" { - // Unchangeable volume property: Set unconditionally. - config["block.mount_options"] = "discard" - } - - // Does the pool request a default size for new storage volumes? - if config["size"] == "0" || config["size"] == "" { - config["size"] = parentPool.Config["volume.size"] - } - // Does the user explicitly request a default size for new - // storage volumes? - if config["size"] == "0" || config["size"] == "" { - config["size"] = "10GB" - } - } else { - if config["size"] != "" { - _, err := units.ParseByteSizeString(config["size"]) - if err != nil { - return err - } - } - } - - return nil -} diff --git a/lxd/storage_volumes_utils.go b/lxd/storage_volumes_utils.go index aa02763399..45da213876 100644 --- a/lxd/storage_volumes_utils.go +++ b/lxd/storage_volumes_utils.go @@ -38,19 +38,6 @@ const ( var supportedVolumeTypesExceptImages = []int{storagePoolVolumeTypeContainer, storagePoolVolumeTypeCustom} var supportedVolumeTypes = append(supportedVolumeTypesExceptImages, storagePoolVolumeTypeImage) -func storagePoolVolumeTypeNameToType(volumeTypeName string) (int, error) { - switch volumeTypeName { - case storagePoolVolumeTypeNameContainer: - return storagePoolVolumeTypeContainer, nil - case storagePoolVolumeTypeNameImage: - return storagePoolVolumeTypeImage, nil - case storagePoolVolumeTypeNameCustom: - return storagePoolVolumeTypeCustom, nil - } - - return -1, fmt.Errorf("invalid storage volume type name") -} - func storagePoolVolumeTypeNameToAPIEndpoint(volumeTypeName string) (string, error) { switch volumeTypeName { case storagePoolVolumeTypeNameContainer: @@ -524,51 +511,6 @@ func profilesUsingPoolVolumeGetNames(db *db.Cluster, volumeName string, volumeTy return usedBy, nil } -func storagePoolVolumeDBCreate(s *state.State, poolName string, volumeName, volumeDescription string, volumeTypeName string, snapshot bool, volumeConfig map[string]string) error { - // Convert the volume type name to our internal integer representation. - volumeType, err := storagePoolVolumeTypeNameToType(volumeTypeName) - if err != nil { - return err - } - - // Load storage pool the volume will be attached to. - poolID, poolStruct, err := s.Cluster.StoragePoolGet(poolName) - if err != nil { - return err - } - - // Check that a storage volume of the same storage volume type does not - // already exist. - volumeID, _ := s.Cluster.StoragePoolNodeVolumeGetTypeID(volumeName, volumeType, poolID) - if volumeID > 0 { - return fmt.Errorf("a storage volume of type %s does already exist", volumeTypeName) - } - - // Make sure that we don't pass a nil to the next function. - if volumeConfig == nil { - volumeConfig = map[string]string{} - } - - // Validate the requested storage volume configuration. - err = storageVolumeValidateConfig(poolName, volumeConfig, poolStruct) - if err != nil { - return err - } - - err = storageVolumeFillDefault(poolName, volumeConfig, poolStruct) - if err != nil { - return err - } - - // Create the database entry for the storage volume. - _, err = s.Cluster.StoragePoolVolumeCreate("default", volumeName, volumeDescription, volumeType, snapshot, poolID, volumeConfig) - if err != nil { - return fmt.Errorf("Error inserting %s of type %s into database: %s", poolName, volumeTypeName, err) - } - - return nil -} - func storagePoolVolumeDBCreateInternal(state *state.State, poolName string, vol *api.StorageVolumesPost) (storage, error) { volumeName := vol.Name volumeDescription := vol.Description @@ -729,18 +671,3 @@ func storagePoolVolumeSnapshotDBCreateInternal(state *state.State, dbArgs *db.St return s, nil } - -// storagePoolVolumeSnapshotsGet returns a list of snapshots of the form <volume>/<snapshot-name>. -func storagePoolVolumeSnapshotsGet(s *state.State, pool string, volume string, volType int) ([]string, error) { - poolID, err := s.Cluster.StoragePoolGetID(pool) - if err != nil { - return nil, err - } - - snapshots, err := s.Cluster.StoragePoolVolumeSnapshotsGetType(volume, volType, poolID) - if err != nil { - return nil, err - } - - return snapshots, nil -} From 37c28ba47441219ef472d7c5c53580d8db1c643f Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Wed, 9 Oct 2019 11:34:21 +0100 Subject: [PATCH 3/3] lxd: Updates use of funcs/vars moved to storage pkg Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/container_lxc.go | 2 +- lxd/migrate_storage_volumes.go | 3 ++- lxd/patches.go | 34 ++++++++++++++++----------------- lxd/storage.go | 2 +- lxd/storage_btrfs.go | 2 +- lxd/storage_ceph.go | 2 +- lxd/storage_ceph_utils.go | 2 +- lxd/storage_cephfs.go | 2 +- lxd/storage_dir.go | 2 +- lxd/storage_lvm.go | 2 +- lxd/storage_migration.go | 2 +- lxd/storage_pools_utils.go | 2 -- lxd/storage_shared.go | 3 ++- lxd/storage_volumes.go | 20 +++++++++---------- lxd/storage_volumes_snapshot.go | 12 ++++++------ lxd/storage_volumes_utils.go | 17 +++++++++-------- lxd/storage_zfs.go | 2 +- 17 files changed, 56 insertions(+), 55 deletions(-) diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go index f3282cdde6..7355f554d8 100644 --- a/lxd/container_lxc.go +++ b/lxd/container_lxc.go @@ -324,7 +324,7 @@ func containerLXCCreate(s *state.State, args db.InstanceArgs) (container, error) // Fill in any default volume config volumeConfig := map[string]string{} - err = storageVolumeFillDefault(storagePool, volumeConfig, pool) + err = driver.VolumeFillDefault(storagePool, volumeConfig, pool) if err != nil { c.Delete() return nil, err diff --git a/lxd/migrate_storage_volumes.go b/lxd/migrate_storage_volumes.go index 1c492dedb2..4067d9e3a7 100644 --- a/lxd/migrate_storage_volumes.go +++ b/lxd/migrate_storage_volumes.go @@ -8,6 +8,7 @@ import ( "github.com/lxc/lxd/lxd/migration" "github.com/lxc/lxd/lxd/operations" + storagePools "github.com/lxc/lxd/lxd/storage" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/logger" @@ -58,7 +59,7 @@ func (s *migrationSourceWs) DoStorage(migrateOp *operations.Operation) error { var err error - snaps, err := storagePoolVolumeSnapshotsGet(state, pool.Name, volume.Name, storagePoolVolumeTypeCustom) + snaps, err := storagePools.VolumeSnapshotsGet(state, pool.Name, volume.Name, storagePoolVolumeTypeCustom) if err == nil { poolID, err := state.Cluster.StoragePoolGetID(pool.Name) if err == nil { diff --git a/lxd/patches.go b/lxd/patches.go index 1193bbd927..e3e8e7fd35 100644 --- a/lxd/patches.go +++ b/lxd/patches.go @@ -470,7 +470,7 @@ func upgradeFromStorageTypeBtrfs(name string, d *Daemon, defaultPoolName string, // Initialize empty storage volume configuration for the // container. containerPoolVolumeConfig := map[string]string{} - err = storageVolumeFillDefault(ct, containerPoolVolumeConfig, defaultPool) + err = driver.VolumeFillDefault(ct, containerPoolVolumeConfig, defaultPool) if err != nil { return err } @@ -558,7 +558,7 @@ func upgradeFromStorageTypeBtrfs(name string, d *Daemon, defaultPoolName string, // Initialize empty storage volume configuration for the // container. snapshotPoolVolumeConfig := map[string]string{} - err = storageVolumeFillDefault(cs, snapshotPoolVolumeConfig, defaultPool) + err = driver.VolumeFillDefault(cs, snapshotPoolVolumeConfig, defaultPool) if err != nil { return err } @@ -639,7 +639,7 @@ func upgradeFromStorageTypeBtrfs(name string, d *Daemon, defaultPoolName string, images := append(imgPublic, imgPrivate...) for _, img := range images { imagePoolVolumeConfig := map[string]string{} - err = storageVolumeFillDefault(img, imagePoolVolumeConfig, defaultPool) + err = driver.VolumeFillDefault(img, imagePoolVolumeConfig, defaultPool) if err != nil { return err } @@ -757,7 +757,7 @@ func upgradeFromStorageTypeDir(name string, d *Daemon, defaultPoolName string, d // Initialize empty storage volume configuration for the // container. containerPoolVolumeConfig := map[string]string{} - err = storageVolumeFillDefault(ct, containerPoolVolumeConfig, defaultPool) + err = driver.VolumeFillDefault(ct, containerPoolVolumeConfig, defaultPool) if err != nil { return err } @@ -874,7 +874,7 @@ func upgradeFromStorageTypeDir(name string, d *Daemon, defaultPoolName string, d // Initialize empty storage volume configuration for the // container. snapshotPoolVolumeConfig := map[string]string{} - err = storageVolumeFillDefault(cs, snapshotPoolVolumeConfig, defaultPool) + err = driver.VolumeFillDefault(cs, snapshotPoolVolumeConfig, defaultPool) if err != nil { return err } @@ -904,7 +904,7 @@ func upgradeFromStorageTypeDir(name string, d *Daemon, defaultPoolName string, d images := append(imgPublic, imgPrivate...) for _, img := range images { imagePoolVolumeConfig := map[string]string{} - err = storageVolumeFillDefault(img, imagePoolVolumeConfig, defaultPool) + err = driver.VolumeFillDefault(img, imagePoolVolumeConfig, defaultPool) if err != nil { return err } @@ -1066,7 +1066,7 @@ func upgradeFromStorageTypeLvm(name string, d *Daemon, defaultPoolName string, d // Initialize empty storage volume configuration for the // container. containerPoolVolumeConfig := map[string]string{} - err = storageVolumeFillDefault(ct, containerPoolVolumeConfig, defaultPool) + err = driver.VolumeFillDefault(ct, containerPoolVolumeConfig, defaultPool) if err != nil { return err } @@ -1221,7 +1221,7 @@ func upgradeFromStorageTypeLvm(name string, d *Daemon, defaultPoolName string, d // Initialize empty storage volume configuration for the // container. snapshotPoolVolumeConfig := map[string]string{} - err = storageVolumeFillDefault(cs, snapshotPoolVolumeConfig, defaultPool) + err = driver.VolumeFillDefault(cs, snapshotPoolVolumeConfig, defaultPool) if err != nil { return err } @@ -1392,7 +1392,7 @@ func upgradeFromStorageTypeLvm(name string, d *Daemon, defaultPoolName string, d for _, img := range images { imagePoolVolumeConfig := map[string]string{} - err = storageVolumeFillDefault(img, imagePoolVolumeConfig, defaultPool) + err = driver.VolumeFillDefault(img, imagePoolVolumeConfig, defaultPool) if err != nil { return err } @@ -1584,7 +1584,7 @@ func upgradeFromStorageTypeZfs(name string, d *Daemon, defaultPoolName string, d // Initialize empty storage volume configuration for the // container. containerPoolVolumeConfig := map[string]string{} - err = storageVolumeFillDefault(ct, containerPoolVolumeConfig, defaultPool) + err = driver.VolumeFillDefault(ct, containerPoolVolumeConfig, defaultPool) if err != nil { return err } @@ -1670,7 +1670,7 @@ func upgradeFromStorageTypeZfs(name string, d *Daemon, defaultPoolName string, d // Initialize empty storage volume configuration for the // container. snapshotPoolVolumeConfig := map[string]string{} - err = storageVolumeFillDefault(cs, snapshotPoolVolumeConfig, defaultPool) + err = driver.VolumeFillDefault(cs, snapshotPoolVolumeConfig, defaultPool) if err != nil { return err } @@ -1726,7 +1726,7 @@ func upgradeFromStorageTypeZfs(name string, d *Daemon, defaultPoolName string, d images := append(imgPublic, imgPrivate...) for _, img := range images { imagePoolVolumeConfig := map[string]string{} - err = storageVolumeFillDefault(img, imagePoolVolumeConfig, defaultPool) + err = driver.VolumeFillDefault(img, imagePoolVolumeConfig, defaultPool) if err != nil { return err } @@ -2248,7 +2248,7 @@ func patchStorageApiUpdateStorageConfigs(name string, d *Daemon) error { } // Insert default values. - err := storageVolumeFillDefault(volume.Name, volume.Config, pool) + err := driver.VolumeFillDefault(volume.Name, volume.Config, pool) if err != nil { return err } @@ -2286,7 +2286,7 @@ func patchStorageApiUpdateStorageConfigs(name string, d *Daemon) error { // It shouldn't be possible that false volume types // exist in the db, so it's safe to ignore the error. - volumeType, _ := storagePoolVolumeTypeNameToType(volume.Type) + volumeType, _ := driver.VolumeTypeNameToType(volume.Type) // Update the volume config. err = d.cluster.StoragePoolVolumeUpdate(volume.Name, volumeType, poolID, volume.Description, volume.Config) if err != nil { @@ -2409,7 +2409,7 @@ func patchStorageApiDetectLVSize(name string, d *Daemon) error { volume.Config = map[string]string{} // Insert default values. - err := storageVolumeFillDefault(volume.Name, volume.Config, pool) + err := driver.VolumeFillDefault(volume.Name, volume.Config, pool) if err != nil { return err } @@ -2434,7 +2434,7 @@ func patchStorageApiDetectLVSize(name string, d *Daemon) error { // It shouldn't be possible that false volume types // exist in the db, so it's safe to ignore the error. - volumeType, _ := storagePoolVolumeTypeNameToType(volume.Type) + volumeType, _ := driver.VolumeTypeNameToType(volume.Type) // Update the volume config. err = d.cluster.StoragePoolVolumeUpdate(volume.Name, volumeType, poolID, volume.Description, volume.Config) if err != nil { @@ -2564,7 +2564,7 @@ func patchStorageZFSVolumeSize(name string, d *Daemon) error { // It shouldn't be possible that false volume types // exist in the db, so it's safe to ignore the error. - volumeType, _ := storagePoolVolumeTypeNameToType(volume.Type) + volumeType, _ := driver.VolumeTypeNameToType(volume.Type) // Update the volume config. err = d.cluster.StoragePoolVolumeUpdate(volume.Name, volumeType, poolID, volume.Description, diff --git a/lxd/storage.go b/lxd/storage.go index 4f5a1d6289..64bce90a1c 100644 --- a/lxd/storage.go +++ b/lxd/storage.go @@ -902,7 +902,7 @@ func storageVolumeMount(state *state.State, poolName string, volumeName string, return fmt.Errorf("Received non-LXC container instance") } - volumeType, _ := storagePoolVolumeTypeNameToType(volumeTypeName) + volumeType, _ := driver.VolumeTypeNameToType(volumeTypeName) s, err := storagePoolVolumeAttachInit(state, poolName, volumeName, volumeType, c) if err != nil { return err diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go index 8690f2a8ae..4619e0abd3 100644 --- a/lxd/storage_btrfs.go +++ b/lxd/storage_btrfs.go @@ -2897,7 +2897,7 @@ func (s *storageBtrfs) doCrossPoolVolumeCopy(sourcePool string, sourceName strin if !volumeOnly { // Handle snapshots - snapshots, err := storagePoolVolumeSnapshotsGet(s.s, sourcePool, sourceName, storagePoolVolumeTypeCustom) + snapshots, err := driver.VolumeSnapshotsGet(s.s, sourcePool, sourceName, storagePoolVolumeTypeCustom) if err != nil { return err } diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go index b6c4d5e29d..ec7d78d848 100644 --- a/lxd/storage_ceph.go +++ b/lxd/storage_ceph.go @@ -422,7 +422,7 @@ func (s *storageCeph) StoragePoolVolumeDelete() error { s.volume.Name, s.pool.Name) // Delete all snapshots - snapshots, err := storagePoolVolumeSnapshotsGet(s.s, s.pool.Name, s.volume.Name, storagePoolVolumeTypeCustom) + snapshots, err := driver.VolumeSnapshotsGet(s.s, s.pool.Name, s.volume.Name, storagePoolVolumeTypeCustom) if err != nil { return err } diff --git a/lxd/storage_ceph_utils.go b/lxd/storage_ceph_utils.go index 2b3d9bed36..c5fedc0898 100644 --- a/lxd/storage_ceph_utils.go +++ b/lxd/storage_ceph_utils.go @@ -1925,7 +1925,7 @@ func (s *storageCeph) doCrossPoolVolumeCopy(source *api.StorageVolumeSource) err defer srcStorage.StoragePoolUmount() } - snapshots, err := storagePoolVolumeSnapshotsGet(s.s, source.Pool, source.Name, storagePoolVolumeTypeCustom) + snapshots, err := driver.VolumeSnapshotsGet(s.s, source.Pool, source.Name, storagePoolVolumeTypeCustom) if err != nil { return err } diff --git a/lxd/storage_cephfs.go b/lxd/storage_cephfs.go index 120a6100b1..6793e2bbf3 100644 --- a/lxd/storage_cephfs.go +++ b/lxd/storage_cephfs.go @@ -799,7 +799,7 @@ func (s *storageCephFs) StoragePoolVolumeCopy(source *api.StorageVolumeSource) e // Copy the snapshots if !source.VolumeOnly { - snapshots, err := storagePoolVolumeSnapshotsGet(s.s, source.Pool, source.Name, storagePoolVolumeTypeCustom) + snapshots, err := driver.VolumeSnapshotsGet(s.s, source.Pool, source.Name, storagePoolVolumeTypeCustom) if err != nil { return err } diff --git a/lxd/storage_dir.go b/lxd/storage_dir.go index da290132c5..128f9b90f2 100644 --- a/lxd/storage_dir.go +++ b/lxd/storage_dir.go @@ -1397,7 +1397,7 @@ func (s *storageDir) StoragePoolVolumeCopy(source *api.StorageVolumeSource) erro return nil } - snapshots, err := storagePoolVolumeSnapshotsGet(s.s, source.Pool, source.Name, storagePoolVolumeTypeCustom) + snapshots, err := driver.VolumeSnapshotsGet(s.s, source.Pool, source.Name, storagePoolVolumeTypeCustom) if err != nil { return err } diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go index a3d408f6d2..3671f8055b 100644 --- a/lxd/storage_lvm.go +++ b/lxd/storage_lvm.go @@ -2221,7 +2221,7 @@ func (s *storageLvm) StoragePoolVolumeCopy(source *api.StorageVolumeSource) erro return nil } - snapshots, err := storagePoolVolumeSnapshotsGet(s.s, source.Pool, source.Name, storagePoolVolumeTypeCustom) + snapshots, err := driver.VolumeSnapshotsGet(s.s, source.Pool, source.Name, storagePoolVolumeTypeCustom) if err != nil { return err } diff --git a/lxd/storage_migration.go b/lxd/storage_migration.go index 7bb005266d..525298614f 100644 --- a/lxd/storage_migration.go +++ b/lxd/storage_migration.go @@ -62,7 +62,7 @@ func (s rsyncStorageSourceDriver) SendStorageVolume(conn *websocket.Conn, op *op volume := storage.GetStoragePoolVolume() if !volumeOnly { - snapshots, err := storagePoolVolumeSnapshotsGet(state, pool.Name, volume.Name, storagePoolVolumeTypeCustom) + snapshots, err := driver.VolumeSnapshotsGet(state, pool.Name, volume.Name, storagePoolVolumeTypeCustom) if err != nil { return err } diff --git a/lxd/storage_pools_utils.go b/lxd/storage_pools_utils.go index e122cdcf87..3da2e8d30e 100644 --- a/lxd/storage_pools_utils.go +++ b/lxd/storage_pools_utils.go @@ -12,8 +12,6 @@ import ( "github.com/lxc/lxd/shared/version" ) -var supportedPoolTypes = []string{"btrfs", "ceph", "cephfs", "dir", "lvm", "zfs"} - func storagePoolUpdate(state *state.State, name, newDescription string, newConfig map[string]string, withDB bool) error { s, err := storagePoolInit(state, name) if err != nil { diff --git a/lxd/storage_shared.go b/lxd/storage_shared.go index 11875f06ec..cf7c974840 100644 --- a/lxd/storage_shared.go +++ b/lxd/storage_shared.go @@ -2,6 +2,7 @@ package main import ( "github.com/lxc/lxd/lxd/state" + storagePools "github.com/lxc/lxd/lxd/storage" "github.com/lxc/lxd/shared/api" ) @@ -61,7 +62,7 @@ func (s *storageShared) SetStoragePoolVolumeWritable(writable *api.StorageVolume func (s *storageShared) createImageDbPoolVolume(fingerprint string) error { // Fill in any default volume config. volumeConfig := map[string]string{} - err := storageVolumeFillDefault(fingerprint, volumeConfig, s.pool) + err := storagePools.VolumeFillDefault(fingerprint, volumeConfig, s.pool) if err != nil { return err } diff --git a/lxd/storage_volumes.go b/lxd/storage_volumes.go index b3ab72ec23..c49186033a 100644 --- a/lxd/storage_volumes.go +++ b/lxd/storage_volumes.go @@ -14,13 +14,13 @@ import ( "github.com/lxc/lxd/lxd/db" "github.com/lxc/lxd/lxd/operations" "github.com/lxc/lxd/lxd/response" + storagePools "github.com/lxc/lxd/lxd/storage" "github.com/lxc/lxd/lxd/util" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" + log "github.com/lxc/lxd/shared/log15" "github.com/lxc/lxd/shared/logger" "github.com/lxc/lxd/shared/version" - - log "github.com/lxc/lxd/shared/log15" ) var storagePoolVolumesCmd = APIEndpoint{ @@ -166,7 +166,7 @@ func storagePoolVolumesTypeGet(d *Daemon, r *http.Request) response.Response { recursion := util.IsRecursionRequest(r) // Convert the volume type name to our internal integer representation. - volumeType, err := storagePoolVolumeTypeNameToType(volumeTypeName) + volumeType, err := storagePools.VolumeTypeNameToType(volumeTypeName) if err != nil { return response.BadRequest(err) } @@ -505,7 +505,7 @@ func storagePoolVolumeTypePost(d *Daemon, r *http.Request, volumeTypeName string } // Convert the volume type name to our internal integer representation. - volumeType, err := storagePoolVolumeTypeNameToType(volumeTypeName) + volumeType, err := storagePools.VolumeTypeNameToType(volumeTypeName) if err != nil { return response.BadRequest(err) } @@ -676,7 +676,7 @@ func storagePoolVolumeTypeGet(d *Daemon, r *http.Request, volumeTypeName string) poolName := mux.Vars(r)["pool"] // Convert the volume type name to our internal integer representation. - volumeType, err := storagePoolVolumeTypeNameToType(volumeTypeName) + volumeType, err := storagePools.VolumeTypeNameToType(volumeTypeName) if err != nil { return response.BadRequest(err) } @@ -754,7 +754,7 @@ func storagePoolVolumeTypePut(d *Daemon, r *http.Request, volumeTypeName string) poolName := mux.Vars(r)["pool"] // Convert the volume type name to our internal integer representation. - volumeType, err := storagePoolVolumeTypeNameToType(volumeTypeName) + volumeType, err := storagePools.VolumeTypeNameToType(volumeTypeName) if err != nil { return response.BadRequest(err) } @@ -813,7 +813,7 @@ func storagePoolVolumeTypePut(d *Daemon, r *http.Request, volumeTypeName string) } } else { // Validate the configuration - err = storageVolumeValidateConfig(volumeName, req.Config, pool) + err = storagePools.VolumeValidateConfig(volumeName, req.Config, pool) if err != nil { return response.BadRequest(err) } @@ -862,7 +862,7 @@ func storagePoolVolumeTypePatch(d *Daemon, r *http.Request, volumeTypeName strin poolName := mux.Vars(r)["pool"] // Convert the volume type name to our internal integer representation. - volumeType, err := storagePoolVolumeTypeNameToType(volumeTypeName) + volumeType, err := storagePools.VolumeTypeNameToType(volumeTypeName) if err != nil { return response.BadRequest(err) } @@ -919,7 +919,7 @@ func storagePoolVolumeTypePatch(d *Daemon, r *http.Request, volumeTypeName strin } // Validate the configuration - err = storageVolumeValidateConfig(volumeName, req.Config, pool) + err = storagePools.VolumeValidateConfig(volumeName, req.Config, pool) if err != nil { return response.BadRequest(err) } @@ -960,7 +960,7 @@ func storagePoolVolumeTypeDelete(d *Daemon, r *http.Request, volumeTypeName stri poolName := mux.Vars(r)["pool"] // Convert the volume type name to our internal integer representation. - volumeType, err := storagePoolVolumeTypeNameToType(volumeTypeName) + volumeType, err := storagePools.VolumeTypeNameToType(volumeTypeName) if err != nil { return response.BadRequest(err) } diff --git a/lxd/storage_volumes_snapshot.go b/lxd/storage_volumes_snapshot.go index bd77b92bb6..53ddc97e45 100644 --- a/lxd/storage_volumes_snapshot.go +++ b/lxd/storage_volumes_snapshot.go @@ -52,7 +52,7 @@ func storagePoolVolumeSnapshotsTypePost(d *Daemon, r *http.Request) response.Res } // Convert the volume type name to our internal integer representation. - volumeType, err := storagePoolVolumeTypeNameToType(volumeTypeName) + volumeType, err := driver.VolumeTypeNameToType(volumeTypeName) if err != nil { return response.BadRequest(err) } @@ -176,7 +176,7 @@ func storagePoolVolumeSnapshotsTypeGet(d *Daemon, r *http.Request) response.Resp volumeName := mux.Vars(r)["name"] // Convert the volume type name to our internal integer representation. - volumeType, err := storagePoolVolumeTypeNameToType(volumeTypeName) + volumeType, err := driver.VolumeTypeNameToType(volumeTypeName) if err != nil { return response.BadRequest(err) } @@ -269,7 +269,7 @@ func storagePoolVolumeSnapshotTypePost(d *Daemon, r *http.Request) response.Resp } // Convert the volume type name to our internal integer representation. - volumeType, err := storagePoolVolumeTypeNameToType(volumeTypeName) + volumeType, err := driver.VolumeTypeNameToType(volumeTypeName) if err != nil { return response.BadRequest(err) } @@ -335,7 +335,7 @@ func storagePoolVolumeSnapshotTypeGet(d *Daemon, r *http.Request) response.Respo snapshotName := mux.Vars(r)["snapshotName"] // Convert the volume type name to our internal integer representation. - volumeType, err := storagePoolVolumeTypeNameToType(volumeTypeName) + volumeType, err := driver.VolumeTypeNameToType(volumeTypeName) if err != nil { return response.BadRequest(err) } @@ -391,7 +391,7 @@ func storagePoolVolumeSnapshotTypePut(d *Daemon, r *http.Request) response.Respo snapshotName := mux.Vars(r)["snapshotName"] // Convert the volume type name to our internal integer representation. - volumeType, err := storagePoolVolumeTypeNameToType(volumeTypeName) + volumeType, err := driver.VolumeTypeNameToType(volumeTypeName) if err != nil { return response.BadRequest(err) } @@ -473,7 +473,7 @@ func storagePoolVolumeSnapshotTypeDelete(d *Daemon, r *http.Request) response.Re snapshotName := mux.Vars(r)["snapshotName"] // Convert the volume type name to our internal integer representation. - volumeType, err := storagePoolVolumeTypeNameToType(volumeTypeName) + volumeType, err := driver.VolumeTypeNameToType(volumeTypeName) if err != nil { return response.BadRequest(err) } diff --git a/lxd/storage_volumes_utils.go b/lxd/storage_volumes_utils.go index 45da213876..d58da7e98b 100644 --- a/lxd/storage_volumes_utils.go +++ b/lxd/storage_volumes_utils.go @@ -7,6 +7,7 @@ import ( "github.com/lxc/lxd/lxd/db" "github.com/lxc/lxd/lxd/state" + storagePools "github.com/lxc/lxd/lxd/storage" "github.com/lxc/lxd/shared" "github.com/lxc/lxd/shared/api" "github.com/lxc/lxd/shared/version" @@ -526,7 +527,7 @@ func storagePoolVolumeDBCreateInternal(state *state.State, poolName string, vol } driver := s.GetStorageTypeName() - newConfig, err := storageVolumePropertiesTranslate(vol.Config, driver) + newConfig, err := storagePools.VolumePropertiesTranslate(vol.Config, driver) if err != nil { return nil, err } @@ -536,7 +537,7 @@ func storagePoolVolumeDBCreateInternal(state *state.State, poolName string, vol } // Create database entry for new storage volume. - err := storagePoolVolumeDBCreate(state, poolName, volumeName, volumeDescription, volumeTypeName, false, volumeConfig) + err := storagePools.VolumeDBCreate(state, poolName, volumeName, volumeDescription, volumeTypeName, false, volumeConfig) if err != nil { return nil, err } @@ -547,7 +548,7 @@ func storagePoolVolumeDBCreateInternal(state *state.State, poolName string, vol return nil, err } - volumeType, err := storagePoolVolumeTypeNameToType(volumeTypeName) + volumeType, err := storagePools.VolumeTypeNameToType(volumeTypeName) if err != nil { state.Cluster.StoragePoolVolumeDelete("default", volumeName, volumeType, poolID) return nil, err @@ -569,7 +570,7 @@ func storagePoolVolumeCreateInternal(state *state.State, poolName string, vol *a return err } - volumeType, err1 := storagePoolVolumeTypeNameToType(vol.Type) + volumeType, err1 := storagePools.VolumeTypeNameToType(vol.Type) poolID, _, _ := s.GetContainerPoolInfo() revert := true @@ -583,7 +584,7 @@ func storagePoolVolumeCreateInternal(state *state.State, poolName string, vol *a err = s.StoragePoolVolumeCreate() } else { if !vol.Source.VolumeOnly { - snapshots, err := storagePoolVolumeSnapshotsGet(state, vol.Source.Pool, vol.Source.Name, volumeType) + snapshots, err := storagePools.VolumeSnapshotsGet(state, vol.Source.Pool, vol.Source.Name, volumeType) if err != nil { return err } @@ -609,7 +610,7 @@ func storagePoolVolumeCreateInternal(state *state.State, poolName string, vol *a } func storagePoolVolumeSnapshotCopyInternal(state *state.State, poolName string, vol *api.StorageVolumesPost, snapshotName string) (storage, error) { - volumeType, err := storagePoolVolumeTypeNameToType(vol.Type) + volumeType, err := storagePools.VolumeTypeNameToType(vol.Type) if err != nil { return nil, err } @@ -645,7 +646,7 @@ func storagePoolVolumeSnapshotCopyInternal(state *state.State, poolName string, func storagePoolVolumeSnapshotDBCreateInternal(state *state.State, dbArgs *db.StorageVolumeArgs) (storage, error) { // Create database entry for new storage volume. - err := storagePoolVolumeDBCreate(state, dbArgs.PoolName, dbArgs.Name, dbArgs.Description, dbArgs.TypeName, true, dbArgs.Config) + err := storagePools.VolumeDBCreate(state, dbArgs.PoolName, dbArgs.Name, dbArgs.Description, dbArgs.TypeName, true, dbArgs.Config) if err != nil { return nil, err } @@ -656,7 +657,7 @@ func storagePoolVolumeSnapshotDBCreateInternal(state *state.State, dbArgs *db.St return nil, err } - volumeType, err := storagePoolVolumeTypeNameToType(dbArgs.TypeName) + volumeType, err := storagePools.VolumeTypeNameToType(dbArgs.TypeName) if err != nil { state.Cluster.StoragePoolVolumeDelete("default", dbArgs.Name, volumeType, poolID) return nil, err diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go index a124173704..7ef9ca9a09 100644 --- a/lxd/storage_zfs.go +++ b/lxd/storage_zfs.go @@ -2827,7 +2827,7 @@ func (s *storageZfs) doCrossPoolStorageVolumeCopy(source *api.StorageVolumeSourc dstMountPoint := driver.GetStoragePoolVolumeMountPoint(s.pool.Name, s.volume.Name) bwlimit := s.pool.Config["rsync.bwlimit"] - snapshots, err := storagePoolVolumeSnapshotsGet(s.s, source.Pool, source.Name, storagePoolVolumeTypeCustom) + snapshots, err := driver.VolumeSnapshotsGet(s.s, source.Pool, source.Name, storagePoolVolumeTypeCustom) if err != nil { return err }
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel