[lxc-devel] [lxd/master] Fix copy of containers/snapshots in projects

stgraber on Github lxc-bot at linuxcontainers.org
Tue Nov 13 07:00:11 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20181113/d4238b6c/attachment.bin>
-------------- next part --------------
From d4266326b4b78fc2219936a967252fdbd2a0df7e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 12 Nov 2018 16:35:52 -0800
Subject: [PATCH 1/3] lxd/containers: Fix snapshot URLs in projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/container_snapshot.go | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/lxd/container_snapshot.go b/lxd/container_snapshot.go
index b41a62213c..9e3fcdf944 100644
--- a/lxd/container_snapshot.go
+++ b/lxd/container_snapshot.go
@@ -49,8 +49,13 @@ func containerSnapshotsGet(d *Daemon, r *http.Request) Response {
 	for _, snap := range snaps {
 		_, snapName, _ := containerGetParentAndSnapshotName(snap.Name())
 		if !recursion {
-			url := fmt.Sprintf("/%s/containers/%s/snapshots/%s", version.APIVersion, cname, snapName)
-			resultString = append(resultString, url)
+			if snap.Project() == "default" {
+				url := fmt.Sprintf("/%s/containers/%s/snapshots/%s", version.APIVersion, cname, snapName)
+				resultString = append(resultString, url)
+			} else {
+				url := fmt.Sprintf("/%s/containers/%s/snapshots/%s?project=%s", version.APIVersion, cname, snapName, snap.Project())
+				resultString = append(resultString, url)
+			}
 		} else {
 			render, _, err := snap.Render()
 			if err != nil {

From 4453ec8bab05a0053350b6908d40e157b81dc8ac Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 12 Nov 2018 16:55:59 -0800
Subject: [PATCH 2/3] lxd/storage/zfs: Fix project copies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/storage_zfs.go | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go
index f1d351ea6b..794a9e05e0 100644
--- a/lxd/storage_zfs.go
+++ b/lxd/storage_zfs.go
@@ -980,7 +980,7 @@ func (s *storageZfs) copyWithoutSnapshotsSparse(target container, source contain
 	sourceZfsDatasetSnapshot := ""
 	sourceName, sourceSnapOnlyName, isSnapshotName := containerGetParentAndSnapshotName(sourceContainerName)
 
-	targetZfsDataset := fmt.Sprintf("containers/%s", targetContainerName)
+	targetZfsDataset := fmt.Sprintf("containers/%s", projectPrefix(target.Project(), targetContainerName))
 
 	if isSnapshotName {
 		sourceZfsDatasetSnapshot = sourceSnapOnlyName
@@ -1415,7 +1415,6 @@ func (s *storageZfs) ContainerCopy(target container, source container, container
 		if err != nil {
 			return err
 		}
-
 	}
 
 	logger.Debugf("Copied ZFS container storage %s to %s", source.Name(), target.Name())

From a45f2d904801626c43d400a7cd463cea36c35ada Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 12 Nov 2018 17:27:03 -0800
Subject: [PATCH 3/3] lxd/projects: Fix copy of snapshots
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/container.go        |  1 +
 lxd/storage_zfs.go      | 18 +++++++++---------
 test/suites/projects.sh |  6 ++++++
 3 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/lxd/container.go b/lxd/container.go
index aca66cddf3..00b9140499 100644
--- a/lxd/container.go
+++ b/lxd/container.go
@@ -936,6 +936,7 @@ func containerCreateAsCopy(s *state.State, args db.ContainerArgs, sourceContaine
 				Ephemeral:    snap.IsEphemeral(),
 				Name:         newSnapName,
 				Profiles:     snap.Profiles(),
+				Project:      args.Project,
 			}
 
 			// Create the snapshots.
diff --git a/lxd/storage_zfs.go b/lxd/storage_zfs.go
index 794a9e05e0..a915356899 100644
--- a/lxd/storage_zfs.go
+++ b/lxd/storage_zfs.go
@@ -1182,16 +1182,16 @@ func (s *storageZfs) copyWithSnapshots(target container, source container, paren
 
 	poolName := s.getOnDiskPoolName()
 	sourceParentName, sourceSnapOnlyName, _ := containerGetParentAndSnapshotName(sourceName)
-	currentSnapshotDataset := fmt.Sprintf("%s/containers/%s at snapshot-%s", poolName, sourceParentName, sourceSnapOnlyName)
+	currentSnapshotDataset := fmt.Sprintf("%s/containers/%s at snapshot-%s", poolName, projectPrefix(source.Project(), sourceParentName), sourceSnapOnlyName)
 	args := []string{"send", currentSnapshotDataset}
 	if parentSnapshot != "" {
 		parentName, parentSnaponlyName, _ := containerGetParentAndSnapshotName(parentSnapshot)
-		parentSnapshotDataset := fmt.Sprintf("%s/containers/%s at snapshot-%s", poolName, parentName, parentSnaponlyName)
+		parentSnapshotDataset := fmt.Sprintf("%s/containers/%s at snapshot-%s", poolName, projectPrefix(source.Project(), parentName), parentSnaponlyName)
 		args = append(args, "-i", parentSnapshotDataset)
 	}
 
 	zfsSendCmd := exec.Command("zfs", args...)
-	targetSnapshotDataset := fmt.Sprintf("%s/containers/%s at snapshot-%s", poolName, targetParentName, targetSnapOnlyName)
+	targetSnapshotDataset := fmt.Sprintf("%s/containers/%s at snapshot-%s", poolName, projectPrefix(target.Project(), targetParentName), targetSnapOnlyName)
 	zfsRecvCmd := exec.Command("zfs", "receive", "-F", targetSnapshotDataset)
 
 	zfsRecvCmd.Stdin, _ = zfsSendCmd.StdoutPipe()
@@ -1372,15 +1372,15 @@ func (s *storageZfs) ContainerCopy(target container, source container, container
 			return err
 		}
 
-		currentSnapshotDataset := fmt.Sprintf("%s/containers/%s@%s", poolName, source.Name(), tmpSnapshotName)
+		currentSnapshotDataset := fmt.Sprintf("%s/containers/%s@%s", poolName, projectPrefix(source.Project(), source.Name()), tmpSnapshotName)
 		args := []string{"send", currentSnapshotDataset}
 		if prevSnapOnlyName != "" {
-			parentSnapshotDataset := fmt.Sprintf("%s/containers/%s at snapshot-%s", poolName, source.Name(), prevSnapOnlyName)
+			parentSnapshotDataset := fmt.Sprintf("%s/containers/%s at snapshot-%s", poolName, projectPrefix(source.Project(), source.Name()), prevSnapOnlyName)
 			args = append(args, "-i", parentSnapshotDataset)
 		}
 
 		zfsSendCmd := exec.Command("zfs", args...)
-		targetSnapshotDataset := fmt.Sprintf("%s/containers/%s@%s", poolName, target.Name(), tmpSnapshotName)
+		targetSnapshotDataset := fmt.Sprintf("%s/containers/%s@%s", poolName, projectPrefix(target.Project(), target.Name()), tmpSnapshotName)
 		zfsRecvCmd := exec.Command("zfs", "receive", "-F", targetSnapshotDataset)
 
 		zfsRecvCmd.Stdin, _ = zfsSendCmd.StdoutPipe()
@@ -1402,10 +1402,10 @@ func (s *storageZfs) ContainerCopy(target container, source container, container
 			return err
 		}
 
-		zfsPoolVolumeSnapshotDestroy(poolName, fmt.Sprintf("containers/%s", source.Name()), tmpSnapshotName)
-		zfsPoolVolumeSnapshotDestroy(poolName, fmt.Sprintf("containers/%s", target.Name()), tmpSnapshotName)
+		zfsPoolVolumeSnapshotDestroy(poolName, fmt.Sprintf("containers/%s", projectPrefix(source.Project(), source.Name())), tmpSnapshotName)
+		zfsPoolVolumeSnapshotDestroy(poolName, fmt.Sprintf("containers/%s", projectPrefix(target.Project(), target.Name())), tmpSnapshotName)
 
-		fs := fmt.Sprintf("containers/%s", target.Name())
+		fs := fmt.Sprintf("containers/%s", projectPrefix(target.Project(), target.Name()))
 		err = zfsPoolVolumeSet(poolName, fs, "canmount", "noauto")
 		if err != nil {
 			return err
diff --git a/test/suites/projects.sh b/test/suites/projects.sh
index dc9aed7895..d24ddb2b09 100644
--- a/test/suites/projects.sh
+++ b/test/suites/projects.sh
@@ -154,6 +154,12 @@ test_projects_snapshots() {
   lxc rename c1/snap0 c1/foo
   lxc delete c1/foo
 
+  # Test copies
+  lxc snapshot c1
+  lxc snapshot c1
+  lxc copy c1 c2
+  lxc delete c2
+
   # Create a snapshot in this project and another one in the default project
   lxc snapshot c1
 


More information about the lxc-devel mailing list