[lxc-devel] [lxd/master] storage: improvements + implement lvm volume group renaming.

brauner on Github lxc-bot at linuxcontainers.org
Tue Feb 28 12:41:54 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 315 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20170228/7b2de284/attachment.bin>
-------------- next part --------------
From c6f95056f4e576c2e3ae0a3b87b1bd48595dcd52 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 28 Feb 2017 13:22:00 +0100
Subject: [PATCH 1/3] storage: change signature for StoragePoolUpdate()

	StoragePoolUpdate(changedConfig []string) error
becomes
	StoragePoolUpdate(writable *api.StoragePoolPut, changedConfig []string) error

because we need access to the writable fields.

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 lxd/storage.go             | 2 +-
 lxd/storage_btrfs.go       | 2 +-
 lxd/storage_dir.go         | 2 +-
 lxd/storage_lvm.go         | 7 ++++++-
 lxd/storage_mock.go        | 2 +-
 lxd/storage_pools_utils.go | 6 +++---
 lxd/storage_zfs.go         | 2 +-
 7 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/lxd/storage.go b/lxd/storage.go
index 0765294..3d118d3 100644
--- a/lxd/storage.go
+++ b/lxd/storage.go
@@ -202,7 +202,7 @@ type storage interface {
 	StoragePoolDelete() error
 	StoragePoolMount() (bool, error)
 	StoragePoolUmount() (bool, error)
-	StoragePoolUpdate(changedConfig []string) error
+	StoragePoolUpdate(writable *api.StoragePoolPut, changedConfig []string) error
 	GetStoragePoolWritable() api.StoragePoolPut
 	SetStoragePoolWritable(writable *api.StoragePoolPut)
 
diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go
index 1a980da..7d62ae3 100644
--- a/lxd/storage_btrfs.go
+++ b/lxd/storage_btrfs.go
@@ -418,7 +418,7 @@ func (s *storageBtrfs) StoragePoolUmount() (bool, error) {
 	return true, nil
 }
 
-func (s *storageBtrfs) StoragePoolUpdate(changedConfig []string) error {
+func (s *storageBtrfs) StoragePoolUpdate(writable *api.StoragePoolPut, changedConfig []string) error {
 	return fmt.Errorf("Btrfs storage properties cannot be changed.")
 }
 
diff --git a/lxd/storage_dir.go b/lxd/storage_dir.go
index 2691359..c9b0c1e 100644
--- a/lxd/storage_dir.go
+++ b/lxd/storage_dir.go
@@ -144,7 +144,7 @@ func (s *storageDir) GetContainerPoolInfo() (int64, string) {
 	return s.poolID, s.pool.Name
 }
 
-func (s *storageDir) StoragePoolUpdate(changedConfig []string) error {
+func (s *storageDir) StoragePoolUpdate(writable *api.StoragePoolPut, changedConfig []string) error {
 	return fmt.Errorf("Dir storage properties cannot be changed.")
 }
 
diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index afac382..d8a1d5a 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -698,9 +698,14 @@ func (s *storageLvm) GetContainerPoolInfo() (int64, string) {
 	return s.poolID, s.pool.Name
 }
 
-func (s *storageLvm) StoragePoolUpdate(changedConfig []string) error {
+func (s *storageLvm) StoragePoolUpdate(writable *api.StoragePoolPut, changedConfig []string) error {
 	shared.LogInfof("Updating LVM storage pool \"%s\".", s.pool.Name)
 
+	err := s.StoragePoolCheck()
+	if err != nil {
+		return err
+	}
+
 	if shared.StringInSlice("size", changedConfig) {
 		return fmt.Errorf("The \"size\" property cannot be changed.")
 	}
diff --git a/lxd/storage_mock.go b/lxd/storage_mock.go
index eabf196..f0ab7e6 100644
--- a/lxd/storage_mock.go
+++ b/lxd/storage_mock.go
@@ -99,7 +99,7 @@ func (s *storageMock) StoragePoolVolumeUpdate(changedConfig []string) error {
 	return nil
 }
 
-func (s *storageMock) StoragePoolUpdate(changedConfig []string) error {
+func (s *storageMock) StoragePoolUpdate(writable *api.StoragePoolPut, changedConfig []string) error {
 	return nil
 }
 
diff --git a/lxd/storage_pools_utils.go b/lxd/storage_pools_utils.go
index c4f1f48..940bae8 100644
--- a/lxd/storage_pools_utils.go
+++ b/lxd/storage_pools_utils.go
@@ -42,20 +42,20 @@ func storagePoolUpdate(d *Daemon, name string, newConfig map[string]string) erro
 		return nil
 	}
 
+	newWritable.Config = newConfig
+
 	// Update the storage pool
 	if !userOnly {
 		if shared.StringInSlice("driver", changedConfig) {
 			return fmt.Errorf("The \"driver\" property of a storage pool cannot be changed.")
 		}
 
-		err = s.StoragePoolUpdate(changedConfig)
+		err = s.StoragePoolUpdate(&newWritable, changedConfig)
 		if err != nil {
 			return err
 		}
 	}
 
-	newWritable.Config = newConfig
-
 	// Apply the new configuration
 	s.SetStoragePoolWritable(&newWritable)
 
diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go
index 0573638..6b2cb6f 100644
--- a/lxd/storage_zfs.go
+++ b/lxd/storage_zfs.go
@@ -315,7 +315,7 @@ func (s *storageZfs) GetContainerPoolInfo() (int64, string) {
 	return s.poolID, s.pool.Name
 }
 
-func (s *storageZfs) StoragePoolUpdate(changedConfig []string) error {
+func (s *storageZfs) StoragePoolUpdate(writable *api.StoragePoolPut, changedConfig []string) error {
 	shared.LogInfof("Updating ZFS storage pool \"%s\".", s.pool.Name)
 
 	if shared.StringInSlice("size", changedConfig) {

From 6d8123efd907404a0392037c367128833315050c Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 28 Feb 2017 13:40:02 +0100
Subject: [PATCH 2/3] lvm: implement volume group renaming

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 lxd/storage_lvm.go     | 33 ++++++++++++++++++++++++++++++++-
 test/suites/storage.sh |  3 +++
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index d8a1d5a..dc8374a 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -173,6 +173,15 @@ func storageLVMValidateThinPoolName(d *Daemon, vgName string, value string) erro
 	return nil
 }
 
+func lvmVGRename(oldName string, newName string) error {
+	output, err := tryExec("vgrename", oldName, newName)
+	if err != nil {
+		return fmt.Errorf("Could not rename volume group from \"%s\" to \"%s\": %s.", oldName, newName, string(output))
+	}
+
+	return nil
+}
+
 func xfsGenerateNewUUID(lvpath string) error {
 	output, err := exec.Command(
 		"xfs_admin",
@@ -244,6 +253,11 @@ func (s *storageLvm) getOnDiskPoolName() string {
 	return s.pool.Name
 }
 
+func (s *storageLvm) setOnDiskPoolName(newName string) {
+	s.vgName = newName
+	s.pool.Config["source"] = newName
+}
+
 func getLvmDevPath(lvmPool string, volumeType string, lvmVolume string) string {
 	return fmt.Sprintf("/dev/%s/%s_%s", lvmPool, volumeType, lvmVolume)
 }
@@ -743,7 +757,24 @@ func (s *storageLvm) StoragePoolUpdate(writable *api.StoragePoolPut, changedConf
 	}
 
 	if shared.StringInSlice("lvm.vg_name", changedConfig) {
-		return fmt.Errorf("The \"lvm.vg_name\" property cannot be changed.")
+		newName := writable.Config["lvm.vg_name"]
+		// Paranoia check
+		if newName == "" {
+			return fmt.Errorf("Could not rename volume group: No new name provided.")
+		}
+		writable.Config["source"] = newName
+
+		oldPoolName := s.getOnDiskPoolName()
+		err := lvmVGRename(oldPoolName, newName)
+		if err != nil {
+			return err
+		}
+
+		// Already set the new dataset name so that any potentially
+		// following operations use the correct on-disk name of the
+		// volume group.
+		s.setOnDiskPoolName(newName)
+		return nil
 	}
 
 	shared.LogInfof("Updated LVM storage pool \"%s\".", s.pool.Name)
diff --git a/test/suites/storage.sh b/test/suites/storage.sh
index 5be6a92..f18b750 100644
--- a/test/suites/storage.sh
+++ b/test/suites/storage.sh
@@ -209,6 +209,9 @@ test_storage() {
       lxc init testimage c10pool6 -s "lxdtest-$(basename "${LXD_DIR}")-pool6"
       lxc list -c b c10pool6 | grep "lxdtest-$(basename "${LXD_DIR}")-pool6"
 
+      # Test if volume group renaming works by setting lvm.vg_name.
+      lxc storage set "lxdtest-$(basename "${LXD_DIR}")-pool6" lvm.vg_name "lxdtest-$(basename "${LXD_DIR}")-pool6-newName" 
+
       lxc launch testimage c12pool6 -s "lxdtest-$(basename "${LXD_DIR}")-pool6"
       lxc list -c b c12pool6 | grep "lxdtest-$(basename "${LXD_DIR}")-pool6"
 

From 27291ccd01aea292ab77feb01046dab3f177ff3b Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 28 Feb 2017 13:40:25 +0100
Subject: [PATCH 3/3] doc: document lvm volume group renaming extension

Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
 doc/api-extensions.md | 3 +++
 lxd/api_1.0.go        | 1 +
 2 files changed, 4 insertions(+)

diff --git a/doc/api-extensions.md b/doc/api-extensions.md
index dbf18c6..175b98d 100644
--- a/doc/api-extensions.md
+++ b/doc/api-extensions.md
@@ -211,3 +211,6 @@ Implements the X-LXD-write header which can be one of "overwrite" or "append".
 
 ## network\_dhcp\_expiry
 Introduces "ipv4.dhcp.expiry" and "ipv6.dhcp.expiry" allowing to set the DHCP lease expiry time.
+
+## storage\_lvm\_vg\_rename
+Introduces the ability to rename a volume group by setting "storage.lvm.vg_name".
diff --git a/lxd/api_1.0.go b/lxd/api_1.0.go
index 2c4cab9..27ba1a9 100644
--- a/lxd/api_1.0.go
+++ b/lxd/api_1.0.go
@@ -93,6 +93,7 @@ func api10Get(d *Daemon, r *http.Request) Response {
 			"file_delete",
 			"file_append",
 			"network_dhcp_expiry",
+			"storage_lvm_vg_rename",
 		},
 		APIStatus:  "stable",
 		APIVersion: version.APIVersion,


More information about the lxc-devel mailing list