The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6840
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === Simplifies some of the websocket code.
From ec4110f4ece5647f0968778a22baeec796aed38c Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@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.parr...@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.parr...@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.parr...@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
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel