Add statsclient - pure Go implementation for stats API
[govpp.git] / adapter / socketclient / socketclient.go
index 2b67645..e56f89c 100644 (file)
@@ -1,3 +1,17 @@
+// Copyright (c) 2019 Cisco and/or its affiliates.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at:
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 package socketclient
 
 import (
@@ -18,7 +32,7 @@ import (
 
        "git.fd.io/govpp.git/adapter"
        "git.fd.io/govpp.git/codec"
-       "git.fd.io/govpp.git/examples/bin_api/memclnt"
+       "git.fd.io/govpp.git/examples/binapi/memclnt"
 )
 
 const (
@@ -165,19 +179,18 @@ func (c *vppClient) Connect() error {
 }
 
 func (c *vppClient) connect(sockAddr string) error {
-       addr, err := net.ResolveUnixAddr("unixpacket", sockAddr)
-       if err != nil {
-               Log.Debugln("ResolveUnixAddr error:", err)
-               return err
-       }
+       addr := &net.UnixAddr{Name: sockAddr, Net: "unix"}
 
        conn, err := net.DialUnix("unix", nil, addr)
        if err != nil {
+               // we try different type of socket for backwards compatbility with VPP<=19.04
                if strings.Contains(err.Error(), "wrong type for socket") {
+                       addr.Net = "unixpacket"
+                       Log.Debugf("%s, retrying connect with type unixpacket", err)
                        conn, err = net.DialUnix("unixpacket", nil, addr)
                }
                if err != nil {
-                       Log.Debugln("Dial error:", err)
+                       Log.Debugf("Connecting to socket %s failed: %s", addr, err)
                        return err
                }
        }
@@ -276,7 +289,7 @@ func (c *vppClient) Disconnect() error {
        }
 
        if err := c.conn.Close(); err != nil {
-               Log.Debugln("Close socket conn failed:", err)
+               Log.Debugln("Closing socket failed:", err)
                return err
        }
 
@@ -297,7 +310,7 @@ func (c *vppClient) close() error {
        // set non-0 context
        msg[5] = deleteMsgContext
 
-       Log.Debugf("sending socklntDel (%d byes): % 0X\n", len(msg), msg)
+       Log.Debugf("sending socklntDel (%d byes): % 0X", len(msg), msg)
        if err := c.write(msg); err != nil {
                Log.Debugln("Write error: ", err)
                return err
@@ -397,7 +410,7 @@ func (c *vppClient) write(msg []byte) error {
                if x > len(msg) {
                        x = len(msg)
                }
-               Log.Debugf("x=%v i=%v len=%v mod=%v\n", x, i, len(msg), len(msg)/c.writer.Size())
+               Log.Debugf("x=%v i=%v len=%v mod=%v", x, i, len(msg), len(msg)/c.writer.Size())
                if n, err := c.writer.Write(msg[i*c.writer.Size() : x]); err != nil {
                        return err
                } else {
@@ -419,10 +432,10 @@ type msgHeader struct {
 
 func (c *vppClient) readerLoop() {
        defer c.wg.Done()
+       defer Log.Debugf("reader quit")
        for {
                select {
                case <-c.quit:
-                       Log.Debugf("reader quit")
                        return
                default:
                }
@@ -432,7 +445,7 @@ func (c *vppClient) readerLoop() {
                        if isClosedError(err) {
                                return
                        }
-                       Log.Debugf("READ FAILED: %v", err)
+                       Log.Debugf("read failed: %v", err)
                        continue
                }
                h := new(msgHeader)
@@ -465,7 +478,7 @@ func (c *vppClient) read() ([]byte, error) {
                return nil, nil
        }
        if n != 16 {
-               Log.Debug("invalid header data (%d): % 0X", n, header[:n])
+               Log.Debugf("invalid header data (%d): % 0X", n, header[:n])
                return nil, fmt.Errorf("invalid header (expected 16 bytes, got %d)", n)
        }
        Log.Debugf(" - read header %d bytes: % 0X", n, header)
@@ -491,7 +504,6 @@ func (c *vppClient) read() ([]byte, error) {
                view := msg[n:]
 
                for remain > 0 {
-
                        nbytes, err := c.reader.Read(view)
                        if err != nil {
                                return nil, err