[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