[lxc-devel] [lxd/master] Instance: Fix copying snapshot to new instance in different project

tomponline on Github lxc-bot at linuxcontainers.org
Fri Dec 18 14:27:07 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 377 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20201218/5dfc1159/attachment.bin>
-------------- next part --------------
From 954eadfa158f37860127f06422658a6d73ced0a0 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Fri, 18 Dec 2020 14:02:06 +0000
Subject: [PATCH 1/5] lxd/instances/post: Use source.Project when loading
 instance to get instance type in containersPost

Fixes #8273

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instances_post.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/instances_post.go b/lxd/instances_post.go
index 92047db448..e10f4d79e1 100644
--- a/lxd/instances_post.go
+++ b/lxd/instances_post.go
@@ -838,7 +838,7 @@ func containersPost(d *Daemon, r *http.Request) response.Response {
 					return fmt.Errorf("Must specify a source instance")
 				}
 
-				source, err := instance.LoadInstanceDatabaseObject(tx, project, req.Source.Source)
+				source, err := instance.LoadInstanceDatabaseObject(tx, req.Source.Project, req.Source.Source)
 				if err != nil {
 					return errors.Wrap(err, "Load source instance from database")
 				}

From 48df8c87eef5e4e106d1f8f740464773541d9233 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Fri, 18 Dec 2020 14:06:24 +0000
Subject: [PATCH 2/5] lxd/instances/post: Rename project to targetProject to
 differentiate between source.Project in containersPost

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instances_post.go | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/lxd/instances_post.go b/lxd/instances_post.go
index e10f4d79e1..edc32e78ba 100644
--- a/lxd/instances_post.go
+++ b/lxd/instances_post.go
@@ -722,12 +722,12 @@ func createFromBackup(d *Daemon, projectName string, data io.Reader, pool string
 }
 
 func containersPost(d *Daemon, r *http.Request) response.Response {
-	project := projectParam(r)
+	targetProject := projectParam(r)
 	logger.Debugf("Responding to instance create")
 
 	// If we're getting binary content, process separately
 	if r.Header.Get("Content-Type") == "application/octet-stream" {
-		return createFromBackup(d, project, r.Body, r.Header.Get("X-LXD-pool"), r.Header.Get("X-LXD-name"))
+		return createFromBackup(d, targetProject, r.Body, r.Header.Get("X-LXD-pool"), r.Header.Get("X-LXD-name"))
 	}
 
 	// Parse the request
@@ -754,7 +754,7 @@ func containersPost(d *Daemon, r *http.Request) response.Response {
 		// the selected node is the local one, this is effectively a
 		// no-op, since GetNodeWithLeastInstances() will return an empty
 		// string.
-		architectures, err := instance.SuitableArchitectures(d.State(), project, req)
+		architectures, err := instance.SuitableArchitectures(d.State(), targetProject, req)
 		if err != nil {
 			return response.BadRequest(err)
 		}
@@ -780,7 +780,7 @@ func containersPost(d *Daemon, r *http.Request) response.Response {
 				return response.SmartError(err)
 			}
 
-			client = client.UseProject(project)
+			client = client.UseProject(targetProject)
 			client = client.UseTarget(targetNode)
 
 			logger.Debugf("Forward instance post request to %s", address)
@@ -790,7 +790,7 @@ func containersPost(d *Daemon, r *http.Request) response.Response {
 			}
 
 			opAPI := op.Get()
-			return operations.ForwardedOperationResponse(project, &opAPI)
+			return operations.ForwardedOperationResponse(targetProject, &opAPI)
 		}
 	}
 
@@ -849,13 +849,13 @@ func containersPost(d *Daemon, r *http.Request) response.Response {
 			}
 		}
 
-		err := projecthelpers.AllowInstanceCreation(tx, project, req)
+		err := projecthelpers.AllowInstanceCreation(tx, targetProject, req)
 		if err != nil {
 			return err
 		}
 
 		if req.Name == "" {
-			names, err := tx.GetInstanceNames(project)
+			names, err := tx.GetInstanceNames(targetProject)
 			if err != nil {
 				return err
 			}
@@ -883,13 +883,13 @@ func containersPost(d *Daemon, r *http.Request) response.Response {
 
 	switch req.Source.Type {
 	case "image":
-		return createFromImage(d, project, &req)
+		return createFromImage(d, targetProject, &req)
 	case "none":
-		return createFromNone(d, project, &req)
+		return createFromNone(d, targetProject, &req)
 	case "migration":
-		return createFromMigration(d, project, &req)
+		return createFromMigration(d, targetProject, &req)
 	case "copy":
-		return createFromCopy(d, project, &req)
+		return createFromCopy(d, targetProject, &req)
 	default:
 		return response.BadRequest(fmt.Errorf("Unknown source type %s", req.Source.Type))
 	}

From dc934a91e4315f2a7a2c9affce19d51f4c8611b1 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Fri, 18 Dec 2020 14:06:50 +0000
Subject: [PATCH 3/5] lxd/instances/post: Error quoting in containersPost

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instances_post.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/instances_post.go b/lxd/instances_post.go
index edc32e78ba..5d8d0494c7 100644
--- a/lxd/instances_post.go
+++ b/lxd/instances_post.go
@@ -822,7 +822,7 @@ func containersPost(d *Daemon, r *http.Request) response.Response {
 	}
 
 	if strings.Contains(req.Name, shared.SnapshotDelimiter) {
-		return response.BadRequest(fmt.Errorf("Invalid instance name: '%s' is reserved for snapshots", shared.SnapshotDelimiter))
+		return response.BadRequest(fmt.Errorf("Invalid instance name: %q is reserved for snapshots", shared.SnapshotDelimiter))
 	}
 
 	// Check that the project's limits are not violated. Also, possibly

From 2cc26d7eb34429ee0486c1fbac99cbe6447a192d Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Fri, 18 Dec 2020 14:16:49 +0000
Subject: [PATCH 4/5] lxd/instances/post: Add comment about default instance
 type for migration in containersPost

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instances_post.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/instances_post.go b/lxd/instances_post.go
index 5d8d0494c7..54bf6c88ea 100644
--- a/lxd/instances_post.go
+++ b/lxd/instances_post.go
@@ -845,7 +845,7 @@ func containersPost(d *Daemon, r *http.Request) response.Response {
 
 				req.Type = api.InstanceType(source.Type.String())
 			case "migration":
-				req.Type = api.InstanceTypeContainer
+				req.Type = api.InstanceTypeContainer // Default to container if not specified.
 			}
 		}
 

From 0fe49e76e33f632fce66e39d92dc01ccff0c1b6c Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Fri, 18 Dec 2020 14:26:13 +0000
Subject: [PATCH 5/5] test/suites/projects: Adds tests for copying snapshot to
 another project

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 test/suites/projects.sh | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/test/suites/projects.sh b/test/suites/projects.sh
index 5b676ba6bb..7be7499049 100644
--- a/test/suites/projects.sh
+++ b/test/suites/projects.sh
@@ -153,6 +153,10 @@ test_projects_copy() {
   lxc --project foo snapshot c1
   lxc --project foo snapshot c1
 
+  lxc --project foo copy c1/snap0 c1 --target-project bar
+  lxc --project bar start c1
+  lxc --project bar delete c1 -f
+
   lxc --project foo copy c1 c1 --target-project bar
   lxc --project foo start c1
   lxc --project bar start c1


More information about the lxc-devel mailing list