Exit xds-cli on XDS-Server disconneciton.
authorSebastien Douheret <sebastien.douheret@iot.bzh>
Mon, 12 Mar 2018 15:10:40 +0000 (16:10 +0100)
committerSebastien Douheret <sebastien.douheret@iot.bzh>
Mon, 12 Mar 2018 15:10:40 +0000 (16:10 +0100)
Signed-off-by: Sebastien Douheret <sebastien.douheret@iot.bzh>
cmd-exec.go
cmd-sdks.go
cmd-target.go
iosocket-client.go

index c988f95..819b911 100644 (file)
@@ -160,6 +160,10 @@ func execCmd(ctx *cli.Context) error {
 
        // Wait exit
        select {
+       case res := <-IOSkClient.ServerDiscoChan:
+               Log.Debugf("XDS Server disconnected %v", res)
+               return cli.NewExitError(res.error, res.code)
+
        case res := <-exitChan:
                errStr := ""
                if res.code == 0 {
index eeebffa..e4012e7 100644 (file)
@@ -305,6 +305,10 @@ func sdksInstall(ctx *cli.Context) error {
 
        // Wait exit
        select {
+       case res := <-IOSkClient.ServerDiscoChan:
+               Log.Debugf("XDS Server disconnected %v", res)
+               return cli.NewExitError(res.error, res.code)
+
        case res := <-exitChan:
                if res.code == 0 {
                        Log.Debugln("Exit successfully")
index cd96ed4..33b757d 100644 (file)
@@ -437,6 +437,10 @@ func terminalOpen(ctx *cli.Context) error {
 
        // Wait exit - blocking
        select {
+       case res := <-IOSkClient.ServerDiscoChan:
+               Log.Debugf("XDS Server disconnected %v", res)
+               return cli.NewExitError(res.error, res.code)
+
        case res := <-exitChan:
                errStr := ""
                if res.code == 0 {
index 9115b10..cd4b8ba 100644 (file)
@@ -22,17 +22,27 @@ import (
        "fmt"
        "sync"
 
+       "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent.git/lib/xaapiv1"
+
        socketio_client "github.com/sebd71/go-socket.io-client"
 )
 
+// Disconnection Channel used to notify XDS Server disconnection
+type Disconnection struct {
+       error   string
+       code    int
+       svrConf xaapiv1.ServerCfg
+}
+
 // IOSockClient .
 type IOSockClient struct {
-       URL        string
-       Conn       *socketio_client.Client
-       Options    *socketio_client.Options
-       EmitMutex  *sync.Mutex
-       Connected  bool
-       EscapeKeys []byte
+       URL             string
+       Conn            *socketio_client.Client
+       Options         *socketio_client.Options
+       EmitMutex       *sync.Mutex
+       Connected       bool
+       ServerDiscoChan chan Disconnection
+       EscapeKeys      []byte
 }
 
 // NewIoSocketClient Create a new IOSockClient
@@ -47,6 +57,7 @@ func NewIoSocketClient(url, clientID string) (*IOSockClient, error) {
                        Transport: "websocket",
                        Header:    make(map[string][]string),
                },
+               ServerDiscoChan: make(chan Disconnection, 1),
        }
        sCli.Options.Header["XDS-AGENT-SID"] = []string{clientID}
 
@@ -64,6 +75,22 @@ func NewIoSocketClient(url, clientID string) (*IOSockClient, error) {
                sCli.Connected = false
        })
 
+       args := xaapiv1.EventRegisterArgs{Name: xaapiv1.EVTServerConfig}
+       if err := HTTPCli.Post("/events/register", args, nil); err != nil {
+               return sCli, err
+       }
+
+       sCli.Conn.On(xaapiv1.EVTServerConfig, func(ev xaapiv1.EventMsg) {
+               svrCfg, err := ev.DecodeServerCfg()
+               if err == nil && !svrCfg.Connected {
+                       sCli.ServerDiscoChan <- Disconnection{
+                               error:   "\nXDS Server (id " + svrCfg.ID + ") disconnected !",
+                               code:    1,
+                               svrConf: svrCfg,
+                       }
+               }
+       })
+
        return sCli, nil
 }