[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