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

Reply via email to