[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