[lxc-devel] [lxd/master] Fix volume snapshot renaming
monstermunchkin on Github
lxc-bot at linuxcontainers.org
Tue Jun 25 14:26:50 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 317 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190625/27f01454/attachment.bin>
-------------- next part --------------
From 220cccb0769a464ccb350439683fc65ad409c23c Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Tue, 25 Jun 2019 16:10:12 +0200
Subject: [PATCH 1/3] lxd: Fix renaming volume snapshots
Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
lxd/storage_btrfs.go | 26 ++++++--------------------
lxd/storage_ceph.go | 9 +++++----
lxd/storage_dir.go | 25 ++++++-------------------
lxd/storage_lvm.go | 13 +++++++------
lxd/storage_zfs.go | 8 +++++---
5 files changed, 29 insertions(+), 52 deletions(-)
diff --git a/lxd/storage_btrfs.go b/lxd/storage_btrfs.go
index 833756d3e6..3c74393d9a 100644
--- a/lxd/storage_btrfs.go
+++ b/lxd/storage_btrfs.go
@@ -3253,37 +3253,23 @@ func (s *storageBtrfs) StoragePoolVolumeSnapshotDelete() error {
}
func (s *storageBtrfs) StoragePoolVolumeSnapshotRename(newName string) error {
- logger.Infof("Renaming BTRFS storage volume on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, newName)
- var fullSnapshotName string
+ sourceName, _, ok := containerGetParentAndSnapshotName(s.volume.Name)
+ fullSnapshotName := fmt.Sprintf("%s%s%s", sourceName, shared.SnapshotDelimiter, newName)
- if shared.IsSnapshot(newName) {
- // When renaming volume snapshots, newName will contain the full snapshot name
- fullSnapshotName = newName
- } else {
- sourceName, _, ok := containerGetParentAndSnapshotName(s.volume.Name)
- if !ok {
- return fmt.Errorf("Not a snapshot name")
- }
-
- fullSnapshotName = fmt.Sprintf("%s%s%s", sourceName, shared.SnapshotDelimiter, newName)
+ logger.Infof("Renaming BTRFS storage volume on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, fullSnapshotName)
+ if !ok {
+ return fmt.Errorf("Not a snapshot name")
}
oldPath := getStoragePoolVolumeSnapshotMountPoint(s.pool.Name, s.volume.Name)
newPath := getStoragePoolVolumeSnapshotMountPoint(s.pool.Name, fullSnapshotName)
- if !shared.PathExists(newPath) {
- err := os.MkdirAll(newPath, customDirMode)
- if err != nil {
- return err
- }
- }
-
err := os.Rename(oldPath, newPath)
if err != nil {
return err
}
- logger.Infof("Renamed BTRFS storage volume on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, newName)
+ logger.Infof("Renamed BTRFS storage volume on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, fullSnapshotName)
return s.s.Cluster.StoragePoolVolumeRename("default", s.volume.Name, fullSnapshotName, storagePoolVolumeTypeCustom, s.poolID)
}
diff --git a/lxd/storage_ceph.go b/lxd/storage_ceph.go
index f1cb211809..9c862e0887 100644
--- a/lxd/storage_ceph.go
+++ b/lxd/storage_ceph.go
@@ -2827,7 +2827,10 @@ func (s *storageCeph) StoragePoolVolumeSnapshotDelete() error {
}
func (s *storageCeph) StoragePoolVolumeSnapshotRename(newName string) error {
- logger.Infof("Renaming CEPH storage volume on OSD storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, newName)
+ sourceName, _, ok := containerGetParentAndSnapshotName(s.volume.Name)
+ fullSnapshotName := fmt.Sprintf("%s%s%s", sourceName, shared.SnapshotDelimiter, newName)
+
+ logger.Infof("Renaming CEPH storage volume on OSD storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, fullSnapshotName)
// unmap
err := cephRBDVolumeUnmap(s.ClusterName, s.OSDPoolName, s.volume.Name, storagePoolVolumeTypeNameCustom, s.UserName, true)
@@ -2837,12 +2840,10 @@ func (s *storageCeph) StoragePoolVolumeSnapshotRename(newName string) error {
}
logger.Debugf("Unmapped RBD storage volume for container \"%s\" on storage pool \"%s\"", s.volume.Name, s.pool.Name)
- sourceName, _, ok := containerGetParentAndSnapshotName(s.volume.Name)
if !ok {
return fmt.Errorf("Not a snapshot name")
}
- fullSnapshotName := fmt.Sprintf("%s%s%s", sourceName, shared.SnapshotDelimiter, newName)
err = cephRBDVolumeRename(s.ClusterName, s.OSDPoolName, storagePoolVolumeTypeNameCustom, s.volume.Name, fullSnapshotName, s.UserName)
if err != nil {
logger.Errorf("Failed to rename RBD storage volume for container \"%s\" on storage pool \"%s\": %s", s.volume.Name, s.pool.Name, err)
@@ -2857,7 +2858,7 @@ func (s *storageCeph) StoragePoolVolumeSnapshotRename(newName string) error {
return err
}
- logger.Infof("Renamed CEPH storage volume on OSD storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, newName)
+ logger.Infof("Renamed CEPH storage volume on OSD storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, fullSnapshotName)
return s.s.Cluster.StoragePoolVolumeRename("default", s.volume.Name, fullSnapshotName, storagePoolVolumeTypeCustom, s.poolID)
}
diff --git a/lxd/storage_dir.go b/lxd/storage_dir.go
index e0f2c589a0..7f22b46fcb 100644
--- a/lxd/storage_dir.go
+++ b/lxd/storage_dir.go
@@ -1547,37 +1547,24 @@ func (s *storageDir) StoragePoolVolumeSnapshotDelete() error {
}
func (s *storageDir) StoragePoolVolumeSnapshotRename(newName string) error {
- logger.Infof("Renaming DIR storage volume on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, newName)
- var fullSnapshotName string
+ sourceName, _, ok := containerGetParentAndSnapshotName(s.volume.Name)
+ fullSnapshotName := fmt.Sprintf("%s%s%s", sourceName, shared.SnapshotDelimiter, newName)
- if shared.IsSnapshot(newName) {
- // When renaming volume snapshots, newName will contain the full snapshot name
- fullSnapshotName = newName
- } else {
- sourceName, _, ok := containerGetParentAndSnapshotName(s.volume.Name)
- if !ok {
- return fmt.Errorf("Not a snapshot name")
- }
+ logger.Infof("Renaming DIR storage volume on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, fullSnapshotName)
- fullSnapshotName = fmt.Sprintf("%s%s%s", sourceName, shared.SnapshotDelimiter, newName)
+ if !ok {
+ return fmt.Errorf("Not a snapshot name")
}
oldPath := getStoragePoolVolumeSnapshotMountPoint(s.pool.Name, s.volume.Name)
newPath := getStoragePoolVolumeSnapshotMountPoint(s.pool.Name, fullSnapshotName)
- if !shared.PathExists(newPath) {
- err := os.MkdirAll(newPath, customDirMode)
- if err != nil {
- return err
- }
- }
-
err := os.Rename(oldPath, newPath)
if err != nil {
return err
}
- logger.Infof("Renamed DIR storage volume on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, newName)
+ logger.Infof("Renamed DIR storage volume on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, fullSnapshotName)
return s.s.Cluster.StoragePoolVolumeRename("default", s.volume.Name, fullSnapshotName, storagePoolVolumeTypeCustom, s.poolID)
}
diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index 2420ccf76f..30505c41a6 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -2345,25 +2345,26 @@ func (s *storageLvm) StoragePoolVolumeSnapshotDelete() error {
}
func (s *storageLvm) StoragePoolVolumeSnapshotRename(newName string) error {
- logger.Infof("Renaming LVM storage volume on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, newName)
+ sourceName, _, ok := containerGetParentAndSnapshotName(s.volume.Name)
+ fullSnapshotName := fmt.Sprintf("%s%s%s", sourceName, shared.SnapshotDelimiter, newName)
+
+ logger.Infof("Renaming LVM storage volume on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, fullSnapshotName)
_, err := s.StoragePoolVolumeUmount()
if err != nil {
return err
}
- sourceName, _, ok := containerGetParentAndSnapshotName(s.volume.Name)
if !ok {
return fmt.Errorf("Not a snapshot name")
}
- fullSnapshotName := fmt.Sprintf("%s%s%s", sourceName, shared.SnapshotDelimiter, newName)
sourceLVName := containerNameToLVName(s.volume.Name)
targetLVName := containerNameToLVName(fullSnapshotName)
err = s.renameLVByPath("default", sourceLVName, targetLVName, storagePoolVolumeAPIEndpointCustom)
if err != nil {
- return fmt.Errorf("Failed to rename logical volume from \"%s\" to \"%s\": %s", s.volume.Name, newName, err)
+ return fmt.Errorf("Failed to rename logical volume from \"%s\" to \"%s\": %s", s.volume.Name, fullSnapshotName, err)
}
oldPath := getStoragePoolVolumeSnapshotMountPoint(s.pool.Name, s.volume.Name)
@@ -2373,7 +2374,7 @@ func (s *storageLvm) StoragePoolVolumeSnapshotRename(newName string) error {
return err
}
- logger.Infof("Renamed LVM storage volume on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, newName)
+ logger.Infof("Renamed LVM storage volume on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, fullSnapshotName)
- return s.s.Cluster.StoragePoolVolumeRename("default", s.volume.Name, newName, storagePoolVolumeTypeCustom, s.poolID)
+ return s.s.Cluster.StoragePoolVolumeRename("default", s.volume.Name, fullSnapshotName, storagePoolVolumeTypeCustom, s.poolID)
}
diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go
index 2ab21f7cd1..94abebb942 100644
--- a/lxd/storage_zfs.go
+++ b/lxd/storage_zfs.go
@@ -3465,9 +3465,11 @@ func (s *storageZfs) StoragePoolVolumeSnapshotDelete() error {
}
func (s *storageZfs) StoragePoolVolumeSnapshotRename(newName string) error {
- logger.Infof("Renaming ZFS storage volume snapshot on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, newName)
-
sourceName, snapshotOnlyName, ok := containerGetParentAndSnapshotName(s.volume.Name)
+ fullSnapshotName := fmt.Sprintf("%s%s%s", sourceName, shared.SnapshotDelimiter, newName)
+
+ logger.Infof("Renaming ZFS storage volume snapshot on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, fullSnapshotName)
+
if !ok {
return fmt.Errorf("Not a snapshot name")
}
@@ -3479,7 +3481,7 @@ func (s *storageZfs) StoragePoolVolumeSnapshotRename(newName string) error {
return err
}
- logger.Infof("Renamed ZFS storage volume snapshot on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, newName)
+ logger.Infof("Renamed ZFS storage volume snapshot on storage pool \"%s\" from \"%s\" to \"%s\"", s.pool.Name, s.volume.Name, fullSnapshotName)
return s.s.Cluster.StoragePoolVolumeRename("default", s.volume.Name, fmt.Sprintf("%s/%s", sourceName, newName), storagePoolVolumeTypeCustom, s.poolID)
}
From 779b5de6a931e99769298eb020868a6c3d98bc4d Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Tue, 25 Jun 2019 16:22:12 +0200
Subject: [PATCH 2/3] lxc: Fix renaming storage volume snapshots
Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
lxc/storage_volume.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lxc/storage_volume.go b/lxc/storage_volume.go
index 6cb1b5eb7d..b167c6d203 100644
--- a/lxc/storage_volume.go
+++ b/lxc/storage_volume.go
@@ -1219,7 +1219,7 @@ func (c *cmdStorageVolumeRename) Run(cmd *cobra.Command, args []string) error {
if isSnapshot {
// Create the storage volume entry
vol := api.StorageVolumeSnapshotPost{}
- vol.Name = args[2]
+ vol.Name = shared.ExtractSnapshotName(args[2])
// If a target member was specified, get the volume with the matching
// name on that member, if any.
From 3acb8b299135bfde28ec334e772bb60be1a07ea8 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Tue, 25 Jun 2019 16:22:33 +0200
Subject: [PATCH 3/3] tests: Test renaming storage volume snapshots
Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
test/suites/storage_snapshots.sh | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/test/suites/storage_snapshots.sh b/test/suites/storage_snapshots.sh
index cf160b14ce..37ea40c9b0 100644
--- a/test/suites/storage_snapshots.sh
+++ b/test/suites/storage_snapshots.sh
@@ -33,6 +33,14 @@ test_storage_volume_snapshots() {
lxc storage volume list "${storage_pool}" | grep "${storage_volume}/snap0"
lxc storage volume show "${storage_pool}" "${storage_volume}/snap0" | grep 'name: snap0'
+ # Test snapshot renaming
+ lxc storage volume snapshot "${storage_pool}" "${storage_volume}"
+ lxc storage volume list "${storage_pool}" | grep "${storage_volume}/snap1"
+ lxc storage volume show "${storage_pool}" "${storage_volume}/snap1" | grep 'name: snap1'
+ lxc storage volume rename "${storage_pool}" "${storage_volume}/snap1" "${storage_volume}/foo"
+ lxc storage volume list "${storage_pool}" | grep "${storage_volume}/foo"
+ lxc storage volume show "${storage_pool}" "${storage_volume}/foo" | grep 'name: foo'
+
lxc storage volume attach "${storage_pool}" "${storage_volume}" c1 /mnt
# Delete file on volume
lxc file delete c1/mnt/testfile
More information about the lxc-devel
mailing list