[lxc-devel] [lxd/master] Fix remote VM exec

stgraber on Github lxc-bot at linuxcontainers.org
Mon Mar 30 23:41:51 UTC 2020


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/20200330/c077d86d/attachment-0001.bin>
-------------- next part --------------
From a0cb52545ed6152f924c135b902e514e24ac39e2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 30 Mar 2020 19:37:18 -0400
Subject: [PATCH 1/2] lxd/exec: Fix forwarding for VMs
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/instance_exec.go | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/lxd/instance_exec.go b/lxd/instance_exec.go
index 72bde90ea8..a1a1e0d123 100644
--- a/lxd/instance_exec.go
+++ b/lxd/instance_exec.go
@@ -362,7 +362,7 @@ func containerExecPost(d *Daemon, r *http.Request) response.Response {
 	}
 
 	if client != nil {
-		url := fmt.Sprintf("/containers/%s/exec?project=%s", name, project)
+		url := fmt.Sprintf("/instances/%s/exec?project=%s", name, project)
 		op, _, err := client.RawOperation("POST", url, post, "")
 		if err != nil {
 			return response.SmartError(err)
@@ -466,7 +466,10 @@ func containerExecPost(d *Daemon, r *http.Request) response.Response {
 		ws.req = post
 
 		resources := map[string][]string{}
-		resources["containers"] = []string{ws.instance.Name()}
+		if ws.instance.Type() == instancetype.Container {
+			resources["containers"] = []string{ws.instance.Name()}
+		}
+		resources["instances"] = []string{ws.instance.Name()}
 
 		op, err := operations.OperationCreate(d.State(), project, operations.OperationClassWebsocket, db.OperationCommandExec, resources, ws.Metadata(), ws.Do, nil, ws.Connect)
 		if err != nil {
@@ -507,8 +510,8 @@ func containerExecPost(d *Daemon, r *http.Request) response.Response {
 			// Update metadata with the right URLs
 			metadata["return"] = exitCode
 			metadata["output"] = shared.Jmap{
-				"1": fmt.Sprintf("/%s/containers/%s/logs/%s", version.APIVersion, inst.Name(), filepath.Base(stdout.Name())),
-				"2": fmt.Sprintf("/%s/containers/%s/logs/%s", version.APIVersion, inst.Name(), filepath.Base(stderr.Name())),
+				"1": fmt.Sprintf("/%s/instances/%s/logs/%s", version.APIVersion, inst.Name(), filepath.Base(stdout.Name())),
+				"2": fmt.Sprintf("/%s/instances/%s/logs/%s", version.APIVersion, inst.Name(), filepath.Base(stderr.Name())),
 			}
 		} else {
 			cmd, err := inst.Exec(post, nil, nil, nil)
@@ -533,7 +536,10 @@ func containerExecPost(d *Daemon, r *http.Request) response.Response {
 	}
 
 	resources := map[string][]string{}
-	resources["containers"] = []string{name}
+	if inst.Type() == instancetype.Container {
+		resources["containers"] = []string{name}
+	}
+	resources["instances"] = []string{name}
 
 	op, err := operations.OperationCreate(d.State(), project, operations.OperationClassTask, db.OperationCommandExec, resources, nil, run, nil, nil)
 	if err != nil {

From cc489d2ae58b4eb6a13b85bf33e32a0eb155cf72 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 30 Mar 2020 19:39:02 -0400
Subject: [PATCH 2/2] lxd: Rename forwarding functions
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/cluster/connect.go   |  4 ++--
 lxd/images.go            |  2 +-
 lxd/instance_backup.go   | 12 ++++++------
 lxd/instance_console.go  |  4 ++--
 lxd/instance_delete.go   |  2 +-
 lxd/instance_exec.go     |  2 +-
 lxd/instance_file.go     |  2 +-
 lxd/instance_get.go      |  2 +-
 lxd/instance_logs.go     |  6 +++---
 lxd/instance_metadata.go | 10 +++++-----
 lxd/instance_patch.go    |  2 +-
 lxd/instance_post.go     |  4 ++--
 lxd/instance_put.go      |  2 +-
 lxd/instance_snapshot.go |  6 +++---
 lxd/instance_state.go    |  4 ++--
 lxd/response.go          |  6 +++---
 16 files changed, 35 insertions(+), 35 deletions(-)

diff --git a/lxd/cluster/connect.go b/lxd/cluster/connect.go
index f2748ecf8d..2d1a1783cc 100644
--- a/lxd/cluster/connect.go
+++ b/lxd/cluster/connect.go
@@ -61,11 +61,11 @@ func Connect(address string, cert *shared.CertInfo, notify bool) (lxd.InstanceSe
 	return lxd.ConnectLXD(url, args)
 }
 
-// ConnectIfContainerIsRemote figures out the address of the node which is
+// ConnectIfInstanceIsRemote figures out the address of the node which is
 // running the container with the given name. If it's not the local node will
 // connect to it and return the connected client, otherwise it will just return
 // nil.
-func ConnectIfContainerIsRemote(cluster *db.Cluster, project, name string, cert *shared.CertInfo, instanceType instancetype.Type) (lxd.InstanceServer, error) {
+func ConnectIfInstanceIsRemote(cluster *db.Cluster, project, name string, cert *shared.CertInfo, instanceType instancetype.Type) (lxd.InstanceServer, error) {
 	var address string // Node address
 	err := cluster.Transaction(func(tx *db.ClusterTx) error {
 		var err error
diff --git a/lxd/images.go b/lxd/images.go
index 6c11850b43..31537f2dfc 100644
--- a/lxd/images.go
+++ b/lxd/images.go
@@ -708,7 +708,7 @@ func imagesPost(d *Daemon, r *http.Request) response.Response {
 		if name != "" {
 			post.Seek(0, 0)
 			r.Body = post
-			resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+			resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 			if err != nil {
 				cleanup(builddir, post)
 				return response.SmartError(err)
diff --git a/lxd/instance_backup.go b/lxd/instance_backup.go
index 4701d6cd4f..e4a2d6544c 100644
--- a/lxd/instance_backup.go
+++ b/lxd/instance_backup.go
@@ -31,7 +31,7 @@ func containerBackupsGet(d *Daemon, r *http.Request) response.Response {
 	cname := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, cname, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, cname, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -82,7 +82,7 @@ func containerBackupsPost(d *Daemon, r *http.Request) response.Response {
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node.
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -203,7 +203,7 @@ func containerBackupGet(d *Daemon, r *http.Request) response.Response {
 	backupName := mux.Vars(r)["backupName"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -231,7 +231,7 @@ func containerBackupPost(d *Daemon, r *http.Request) response.Response {
 	backupName := mux.Vars(r)["backupName"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -290,7 +290,7 @@ func containerBackupDelete(d *Daemon, r *http.Request) response.Response {
 	backupName := mux.Vars(r)["backupName"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -336,7 +336,7 @@ func containerBackupExportGet(d *Daemon, r *http.Request) response.Response {
 	backupName := mux.Vars(r)["backupName"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, proj, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, proj, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
diff --git a/lxd/instance_console.go b/lxd/instance_console.go
index 2c51563bad..54600fe33f 100644
--- a/lxd/instance_console.go
+++ b/lxd/instance_console.go
@@ -261,7 +261,7 @@ func containerConsolePost(d *Daemon, r *http.Request) response.Response {
 
 	// Forward the request if the container is remote.
 	cert := d.endpoints.NetworkCert()
-	client, err := cluster.ConnectIfContainerIsRemote(d.cluster, project, name, cert, instanceType)
+	client, err := cluster.ConnectIfInstanceIsRemote(d.cluster, project, name, cert, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -333,7 +333,7 @@ func containerConsoleLogGet(d *Daemon, r *http.Request) response.Response {
 	name := mux.Vars(r)["name"]
 
 	// Forward the request if the container is remote.
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
diff --git a/lxd/instance_delete.go b/lxd/instance_delete.go
index d09cd72fad..963b31f20f 100644
--- a/lxd/instance_delete.go
+++ b/lxd/instance_delete.go
@@ -20,7 +20,7 @@ func containerDelete(d *Daemon, r *http.Request) response.Response {
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
diff --git a/lxd/instance_exec.go b/lxd/instance_exec.go
index a1a1e0d123..598cb08795 100644
--- a/lxd/instance_exec.go
+++ b/lxd/instance_exec.go
@@ -356,7 +356,7 @@ func containerExecPost(d *Daemon, r *http.Request) response.Response {
 
 	// Forward the request if the container is remote.
 	cert := d.endpoints.NetworkCert()
-	client, err := cluster.ConnectIfContainerIsRemote(d.cluster, project, name, cert, instanceType)
+	client, err := cluster.ConnectIfInstanceIsRemote(d.cluster, project, name, cert, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
diff --git a/lxd/instance_file.go b/lxd/instance_file.go
index c1f3c031ee..62265d8964 100644
--- a/lxd/instance_file.go
+++ b/lxd/instance_file.go
@@ -24,7 +24,7 @@ func containerFileHandler(d *Daemon, r *http.Request) response.Response {
 	project := projectParam(r)
 	name := mux.Vars(r)["name"]
 
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
diff --git a/lxd/instance_get.go b/lxd/instance_get.go
index 9dbe7ab21e..ca615bc470 100644
--- a/lxd/instance_get.go
+++ b/lxd/instance_get.go
@@ -18,7 +18,7 @@ func containerGet(d *Daemon, r *http.Request) response.Response {
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
diff --git a/lxd/instance_logs.go b/lxd/instance_logs.go
index 484dc52ad9..0f7df6893b 100644
--- a/lxd/instance_logs.go
+++ b/lxd/instance_logs.go
@@ -57,7 +57,7 @@ func containerLogsGet(d *Daemon, r *http.Request) response.Response {
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -110,7 +110,7 @@ func containerLogGet(d *Daemon, r *http.Request) response.Response {
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, projectName, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, projectName, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -147,7 +147,7 @@ func containerLogDelete(d *Daemon, r *http.Request) response.Response {
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
diff --git a/lxd/instance_metadata.go b/lxd/instance_metadata.go
index 6cdd557163..53050d67f1 100644
--- a/lxd/instance_metadata.go
+++ b/lxd/instance_metadata.go
@@ -29,7 +29,7 @@ func containerMetadataGet(d *Daemon, r *http.Request) response.Response {
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -90,7 +90,7 @@ func containerMetadataPut(d *Daemon, r *http.Request) response.Response {
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -144,7 +144,7 @@ func containerMetadataTemplatesGet(d *Daemon, r *http.Request) response.Response
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -238,7 +238,7 @@ func containerMetadataTemplatesPostPut(d *Daemon, r *http.Request) response.Resp
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -311,7 +311,7 @@ func containerMetadataTemplatesDelete(d *Daemon, r *http.Request) response.Respo
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
diff --git a/lxd/instance_patch.go b/lxd/instance_patch.go
index 5d2bcc2234..13a856f127 100644
--- a/lxd/instance_patch.go
+++ b/lxd/instance_patch.go
@@ -32,7 +32,7 @@ func containerPatch(d *Daemon, r *http.Request) response.Response {
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
diff --git a/lxd/instance_post.go b/lxd/instance_post.go
index 791d43d8cd..af2cec96c2 100644
--- a/lxd/instance_post.go
+++ b/lxd/instance_post.go
@@ -130,7 +130,7 @@ func containerPost(d *Daemon, r *http.Request) response.Response {
 	// and we'll either forward the request or load the container.
 	if targetNode == "" || !sourceNodeOffline {
 		// Handle requests targeted to a container on a different node.
-		resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+		resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 		if err != nil {
 			return response.SmartError(err)
 		}
@@ -454,7 +454,7 @@ func containerPostClusteringMigrateWithCeph(d *Daemon, c instance.Instance, proj
 
 		// Create the container mount point on the target node
 		cert := d.endpoints.NetworkCert()
-		client, err := cluster.ConnectIfContainerIsRemote(d.cluster, projectName, newName, cert, instanceType)
+		client, err := cluster.ConnectIfInstanceIsRemote(d.cluster, projectName, newName, cert, instanceType)
 		if err != nil {
 			return errors.Wrap(err, "Failed to connect to target node")
 		}
diff --git a/lxd/instance_put.go b/lxd/instance_put.go
index 49f430783c..df8b9a813a 100644
--- a/lxd/instance_put.go
+++ b/lxd/instance_put.go
@@ -36,7 +36,7 @@ func containerPut(d *Daemon, r *http.Request) response.Response {
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
diff --git a/lxd/instance_snapshot.go b/lxd/instance_snapshot.go
index d9545732e1..dfc80d9fa7 100644
--- a/lxd/instance_snapshot.go
+++ b/lxd/instance_snapshot.go
@@ -34,7 +34,7 @@ func containerSnapshotsGet(d *Daemon, r *http.Request) response.Response {
 	cname := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, projectName, cname, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, projectName, cname, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -100,7 +100,7 @@ func containerSnapshotsPost(d *Daemon, r *http.Request) response.Response {
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -195,7 +195,7 @@ func containerSnapshotHandler(d *Daemon, r *http.Request) response.Response {
 	containerName := mux.Vars(r)["name"]
 	snapshotName := mux.Vars(r)["snapshotName"]
 
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, containerName, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, containerName, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
diff --git a/lxd/instance_state.go b/lxd/instance_state.go
index 88f3dcc0cc..e1b55e9754 100644
--- a/lxd/instance_state.go
+++ b/lxd/instance_state.go
@@ -27,7 +27,7 @@ func containerState(d *Daemon, r *http.Request) response.Response {
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -57,7 +57,7 @@ func containerStatePut(d *Daemon, r *http.Request) response.Response {
 	name := mux.Vars(r)["name"]
 
 	// Handle requests targeted to a container on a different node
-	resp, err := forwardedResponseIfContainerIsRemote(d, r, project, name, instanceType)
+	resp, err := forwardedResponseIfInstanceIsRemote(d, r, project, name, instanceType)
 	if err != nil {
 		return response.SmartError(err)
 	}
diff --git a/lxd/response.go b/lxd/response.go
index c071d78204..01c3c9c605 100644
--- a/lxd/response.go
+++ b/lxd/response.go
@@ -37,12 +37,12 @@ func forwardedResponseIfTargetIsRemote(d *Daemon, request *http.Request) respons
 	return nil
 }
 
-// forwardedResponseIfContainerIsRemote redirects a request to the node running
+// forwardedResponseIfInstanceIsRemote redirects a request to the node running
 // the container with the given name. If the container is local, nothing gets
 // done and nil is returned.
-func forwardedResponseIfContainerIsRemote(d *Daemon, r *http.Request, project, name string, instanceType instancetype.Type) (response.Response, error) {
+func forwardedResponseIfInstanceIsRemote(d *Daemon, r *http.Request, project, name string, instanceType instancetype.Type) (response.Response, error) {
 	cert := d.endpoints.NetworkCert()
-	client, err := cluster.ConnectIfContainerIsRemote(d.cluster, project, name, cert, instanceType)
+	client, err := cluster.ConnectIfInstanceIsRemote(d.cluster, project, name, cert, instanceType)
 	if err != nil {
 		return nil, err
 	}


More information about the lxc-devel mailing list