[lxc-devel] [lxd/master] Websocket: Uses gorilla helper functions rather than lower level functions
tomponline on Github
lxc-bot at linuxcontainers.org
Wed Feb 5 17:13:48 UTC 2020
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 339 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200205/2b2b0398/attachment.bin>
-------------- next part --------------
From ec4110f4ece5647f0968778a22baeec796aed38c Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Wed, 5 Feb 2020 13:51:38 +0000
Subject: [PATCH 1/2] lxd: Switches to simpler conn.WriteMessage function
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxc/console.go | 9 +--------
lxc/exec.go | 9 +--------
lxc/exec_unix.go | 9 +--------
lxc/exec_windows.go | 9 +--------
lxd/instance/drivers/driver_qemu.go | 9 +--------
shared/netutils/network_linux.go | 13 +++++--------
shared/network.go | 25 +++----------------------
7 files changed, 13 insertions(+), 70 deletions(-)
diff --git a/lxc/console.go b/lxc/console.go
index c8131a1cb6..5e9b6c499b 100644
--- a/lxc/console.go
+++ b/lxc/console.go
@@ -49,11 +49,6 @@ func (c *cmdConsole) sendTermSize(control *websocket.Conn) error {
logger.Debugf("Window size is now: %dx%d", width, height)
- w, err := control.NextWriter(websocket.TextMessage)
- if err != nil {
- return err
- }
-
msg := api.InstanceExecControl{}
msg.Command = "window-resize"
msg.Args = make(map[string]string)
@@ -64,10 +59,8 @@ func (c *cmdConsole) sendTermSize(control *websocket.Conn) error {
if err != nil {
return err
}
- _, err = w.Write(buf)
- w.Close()
- return err
+ return control.WriteMessage(websocket.TextMessage, buf)
}
type readWriteCloser struct {
diff --git a/lxc/exec.go b/lxc/exec.go
index 009941504f..a0391ef0e4 100644
--- a/lxc/exec.go
+++ b/lxc/exec.go
@@ -71,11 +71,6 @@ func (c *cmdExec) sendTermSize(control *websocket.Conn) error {
logger.Debugf("Window size is now: %dx%d", width, height)
- w, err := control.NextWriter(websocket.TextMessage)
- if err != nil {
- return err
- }
-
msg := api.InstanceExecControl{}
msg.Command = "window-resize"
msg.Args = make(map[string]string)
@@ -86,10 +81,8 @@ func (c *cmdExec) sendTermSize(control *websocket.Conn) error {
if err != nil {
return err
}
- _, err = w.Write(buf)
- w.Close()
- return err
+ return control.WriteMessage(websocket.TextMessage, buf)
}
func (c *cmdExec) Run(cmd *cobra.Command, args []string) error {
diff --git a/lxc/exec_unix.go b/lxc/exec_unix.go
index 2572cf2f2a..15702efccf 100644
--- a/lxc/exec_unix.go
+++ b/lxc/exec_unix.go
@@ -141,11 +141,6 @@ func (c *cmdExec) controlSocketHandler(control *websocket.Conn) {
func (c *cmdExec) forwardSignal(control *websocket.Conn, sig unix.Signal) error {
logger.Debugf("Forwarding signal: %s", sig)
- w, err := control.NextWriter(websocket.TextMessage)
- if err != nil {
- return err
- }
-
msg := api.InstanceExecControl{}
msg.Command = "signal"
msg.Signal = int(sig)
@@ -154,8 +149,6 @@ func (c *cmdExec) forwardSignal(control *websocket.Conn, sig unix.Signal) error
if err != nil {
return err
}
- _, err = w.Write(buf)
- w.Close()
- return err
+ return control.WriteMessage(websocket.TextMessage, buf)
}
diff --git a/lxc/exec_windows.go b/lxc/exec_windows.go
index dcad74210f..7aa13d2fdf 100644
--- a/lxc/exec_windows.go
+++ b/lxc/exec_windows.go
@@ -56,11 +56,6 @@ func (c *cmdExec) controlSocketHandler(control *websocket.Conn) {
func (c *cmdExec) forwardSignal(control *websocket.Conn, sig windows.Signal) error {
logger.Debugf("Forwarding signal: %s", sig)
- w, err := control.NextWriter(websocket.TextMessage)
- if err != nil {
- return err
- }
-
msg := api.InstanceExecControl{}
msg.Command = "signal"
msg.Signal = int(sig)
@@ -69,8 +64,6 @@ func (c *cmdExec) forwardSignal(control *websocket.Conn, sig windows.Signal) err
if err != nil {
return err
}
- _, err = w.Write(buf)
- w.Close()
- return err
+ return control.WriteMessage(websocket.TextMessage, buf)
}
diff --git a/lxd/instance/drivers/driver_qemu.go b/lxd/instance/drivers/driver_qemu.go
index da37c0f994..f93dd60857 100644
--- a/lxd/instance/drivers/driver_qemu.go
+++ b/lxd/instance/drivers/driver_qemu.go
@@ -2882,19 +2882,12 @@ func (vm *qemu) Console() (*os.File, chan error, error) {
// forwardControlCommand is used to send command control messages to the lxd-agent.
func (vm *qemu) forwardControlCommand(control *websocket.Conn, cmd api.InstanceExecControl) error {
- w, err := control.NextWriter(websocket.TextMessage)
- if err != nil {
- return err
- }
-
buf, err := json.Marshal(cmd)
if err != nil {
return err
}
- _, err = w.Write(buf)
- w.Close()
- return err
+ return control.WriteMessage(websocket.TextMessage, buf)
}
// Exec a command inside the instance.
diff --git a/shared/netutils/network_linux.go b/shared/netutils/network_linux.go
index 40dbeda6c2..244ab73185 100644
--- a/shared/netutils/network_linux.go
+++ b/shared/netutils/network_linux.go
@@ -184,18 +184,15 @@ func WebsocketExecMirror(conn *websocket.Conn, w io.WriteCloser, r io.ReadCloser
if !ok {
r.Close()
logger.Debugf("sending write barrier")
- conn.WriteMessage(websocket.TextMessage, []byte{})
+ err := conn.WriteMessage(websocket.TextMessage, []byte{})
+ if err != nil {
+ logger.Debugf("Got err writing barrier %s", err)
+ }
readDone <- true
return
}
- w, err := conn.NextWriter(websocket.BinaryMessage)
- if err != nil {
- logger.Debugf("Got error getting next writer %s", err)
- break
- }
- _, err = w.Write(buf)
- w.Close()
+ err := conn.WriteMessage(websocket.BinaryMessage, buf)
if err != nil {
logger.Debugf("Got err writing %s", err)
break
diff --git a/shared/network.go b/shared/network.go
index 089480b318..f8604d2232 100644
--- a/shared/network.go
+++ b/shared/network.go
@@ -181,14 +181,7 @@ func WebsocketSendStream(conn *websocket.Conn, r io.Reader, bufferSize int) chan
break
}
- w, err := conn.NextWriter(websocket.BinaryMessage)
- if err != nil {
- logger.Debugf("Got error getting next writer %s", err)
- break
- }
-
- _, err = w.Write(buf)
- w.Close()
+ err := conn.WriteMessage(websocket.BinaryMessage, buf)
if err != nil {
logger.Debugf("Got err writing %s", err)
break
@@ -308,14 +301,8 @@ func defaultReader(conn *websocket.Conn, r io.ReadCloser, readDone chan<- bool)
readDone <- true
return
}
- w, err := conn.NextWriter(websocket.BinaryMessage)
- if err != nil {
- logger.Debugf("Got error getting next writer %s", err)
- break
- }
- _, err = w.Write(buf)
- w.Close()
+ err := conn.WriteMessage(websocket.BinaryMessage, buf)
if err != nil {
logger.Debugf("Got err writing %s", err)
break
@@ -479,14 +466,8 @@ func WebsocketConsoleMirror(conn *websocket.Conn, w io.WriteCloser, r io.ReadClo
readDone <- true
return
}
- w, err := conn.NextWriter(websocket.BinaryMessage)
- if err != nil {
- logger.Debugf("Got error getting next writer %s", err)
- break
- }
- _, err = w.Write(buf)
- w.Close()
+ err := conn.WriteMessage(websocket.BinaryMessage, buf)
if err != nil {
logger.Debugf("Got err writing %s", err)
break
From e3cb566d5e5d296832bb77f937e29f86cbc9e725 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Wed, 5 Feb 2020 15:03:54 +0000
Subject: [PATCH 2/2] lxd: Uses gorilla WriteJSON where possible
Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
lxc/console.go | 8 +-------
lxc/exec.go | 8 +-------
lxc/exec_unix.go | 8 +-------
lxc/exec_windows.go | 7 +------
lxd/events/events.go | 7 +------
lxd/instance/drivers/driver_qemu.go | 14 +-------------
shared/netutils/network_linux.go | 1 +
7 files changed, 7 insertions(+), 46 deletions(-)
diff --git a/lxc/console.go b/lxc/console.go
index 5e9b6c499b..ae34290130 100644
--- a/lxc/console.go
+++ b/lxc/console.go
@@ -1,7 +1,6 @@
package main
import (
- "encoding/json"
"fmt"
"io"
"io/ioutil"
@@ -55,12 +54,7 @@ func (c *cmdConsole) sendTermSize(control *websocket.Conn) error {
msg.Args["width"] = strconv.Itoa(width)
msg.Args["height"] = strconv.Itoa(height)
- buf, err := json.Marshal(msg)
- if err != nil {
- return err
- }
-
- return control.WriteMessage(websocket.TextMessage, buf)
+ return control.WriteJSON(msg)
}
type readWriteCloser struct {
diff --git a/lxc/exec.go b/lxc/exec.go
index a0391ef0e4..f832cfa710 100644
--- a/lxc/exec.go
+++ b/lxc/exec.go
@@ -2,7 +2,6 @@ package main
import (
"bytes"
- "encoding/json"
"fmt"
"io"
"io/ioutil"
@@ -77,12 +76,7 @@ func (c *cmdExec) sendTermSize(control *websocket.Conn) error {
msg.Args["width"] = strconv.Itoa(width)
msg.Args["height"] = strconv.Itoa(height)
- buf, err := json.Marshal(msg)
- if err != nil {
- return err
- }
-
- return control.WriteMessage(websocket.TextMessage, buf)
+ return control.WriteJSON(msg)
}
func (c *cmdExec) Run(cmd *cobra.Command, args []string) error {
diff --git a/lxc/exec_unix.go b/lxc/exec_unix.go
index 15702efccf..02429b9d36 100644
--- a/lxc/exec_unix.go
+++ b/lxc/exec_unix.go
@@ -3,7 +3,6 @@
package main
import (
- "encoding/json"
"os"
"os/signal"
@@ -145,10 +144,5 @@ func (c *cmdExec) forwardSignal(control *websocket.Conn, sig unix.Signal) error
msg.Command = "signal"
msg.Signal = int(sig)
- buf, err := json.Marshal(msg)
- if err != nil {
- return err
- }
-
- return control.WriteMessage(websocket.TextMessage, buf)
+ return control.WriteJSON(msg)
}
diff --git a/lxc/exec_windows.go b/lxc/exec_windows.go
index 7aa13d2fdf..17ae8b503c 100644
--- a/lxc/exec_windows.go
+++ b/lxc/exec_windows.go
@@ -60,10 +60,5 @@ func (c *cmdExec) forwardSignal(control *websocket.Conn, sig windows.Signal) err
msg.Command = "signal"
msg.Signal = int(sig)
- buf, err := json.Marshal(msg)
- if err != nil {
- return err
- }
-
- return control.WriteMessage(websocket.TextMessage, buf)
+ return control.WriteJSON(msg)
}
diff --git a/lxd/events/events.go b/lxd/events/events.go
index d9c4e0bba6..ef713d73d1 100644
--- a/lxd/events/events.go
+++ b/lxd/events/events.go
@@ -152,12 +152,7 @@ func (s *Server) broadcast(group string, event api.Event, isForward bool) error
event = eventCopy
}
- body, err := json.Marshal(event)
- if err != nil {
- return
- }
-
- err = listener.connection.WriteMessage(websocket.TextMessage, body)
+ err := listener.connection.WriteJSON(event)
if err != nil {
// Remove the listener from the list
s.lock.Lock()
diff --git a/lxd/instance/drivers/driver_qemu.go b/lxd/instance/drivers/driver_qemu.go
index f93dd60857..d85468be2b 100644
--- a/lxd/instance/drivers/driver_qemu.go
+++ b/lxd/instance/drivers/driver_qemu.go
@@ -2,7 +2,6 @@ package drivers
import (
"bytes"
- "encoding/json"
"fmt"
"io"
"io/ioutil"
@@ -2880,16 +2879,6 @@ func (vm *qemu) Console() (*os.File, chan error, error) {
return console, chDisconnect, nil
}
-// forwardControlCommand is used to send command control messages to the lxd-agent.
-func (vm *qemu) forwardControlCommand(control *websocket.Conn, cmd api.InstanceExecControl) error {
- buf, err := json.Marshal(cmd)
- if err != nil {
- return err
- }
-
- return control.WriteMessage(websocket.TextMessage, buf)
-}
-
// Exec a command inside the instance.
func (vm *qemu) Exec(req api.InstanceExecPost, stdin *os.File, stdout *os.File, stderr *os.File) (instance.Cmd, error) {
revert := revert.New()
@@ -2930,8 +2919,7 @@ func (vm *qemu) Exec(req api.InstanceExecPost, stdin *os.File, stdout *os.File,
for {
select {
case cmd := <-controlSendCh:
- err := vm.forwardControlCommand(control, cmd)
- controlResCh <- err
+ controlResCh <- control.WriteJSON(cmd)
case <-dataDone:
return
}
diff --git a/shared/netutils/network_linux.go b/shared/netutils/network_linux.go
index 244ab73185..f634aac8ed 100644
--- a/shared/netutils/network_linux.go
+++ b/shared/netutils/network_linux.go
@@ -198,6 +198,7 @@ func WebsocketExecMirror(conn *websocket.Conn, w io.WriteCloser, r io.ReadCloser
break
}
}
+
closeMsg := websocket.FormatCloseMessage(websocket.CloseNormalClosure, "")
conn.WriteMessage(websocket.CloseMessage, closeMsg)
readDone <- true
More information about the lxc-devel
mailing list