X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=adapter%2Fvppapiclient%2Fstat_client.go;h=a124f595f395c843f54481a0b64001d3ab7d7e4e;hb=4e16c7100cc7f8dddca051ff393460d7a1a77c98;hp=2615b6537df52ea3ed57f014b9cc9b5f401db3ae;hpb=6acebecfc33da246685c1cc14b2fc8bc6be3191b;p=govpp.git diff --git a/adapter/vppapiclient/stat_client.go b/adapter/vppapiclient/stat_client.go index 2615b65..a124f59 100644 --- a/adapter/vppapiclient/stat_client.go +++ b/adapter/vppapiclient/stat_client.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// +build !windows,!darwin +// +build !windows,!darwin,!novpp,!beyond18.10 package vppapiclient @@ -25,7 +25,6 @@ package vppapiclient import "C" import ( - "errors" "fmt" "os" "unsafe" @@ -33,21 +32,11 @@ import ( "git.fd.io/govpp.git/adapter" ) -var ( - ErrStatDirBusy = errors.New("stat dir busy") - ErrStatDumpBusy = errors.New("stat dump busy") -) - -var ( - // DefaultStatSocket is the default path for the VPP stat socket file. - DefaultStatSocket = "/run/vpp/stats.sock" -) - // global VPP stats API client, library vppapiclient only supports // single connection at a time var globalStatClient *statClient -// stubStatClient is the default implementation of StatsAPI. +// statClient is the default implementation of StatsAPI. type statClient struct { socketName string } @@ -66,11 +55,18 @@ func (c *statClient) Connect() error { var sockName string if c.socketName == "" { - sockName = DefaultStatSocket + sockName = adapter.DefaultStatsSocket } else { sockName = c.socketName } + if _, err := os.Stat(sockName); err != nil { + if os.IsNotExist(err) { + return fmt.Errorf("stats socket file %q does not exists, ensure that VPP is running with `statseg { ... }` section in config", sockName) + } + return fmt.Errorf("stats socket file error: %v", err) + } + rc := C.govpp_stat_connect(C.CString(sockName)) if rc != 0 { return fmt.Errorf("connecting to VPP stats API failed (rc=%v)", rc) @@ -90,7 +86,7 @@ func (c *statClient) Disconnect() error { func (c *statClient) ListStats(patterns ...string) (stats []string, err error) { dir := C.govpp_stat_segment_ls(convertStringSlice(patterns)) if dir == nil { - return nil, ErrStatDirBusy + return nil, adapter.ErrStatsDataBusy } defer C.govpp_stat_segment_vec_free(unsafe.Pointer(dir)) @@ -104,16 +100,16 @@ func (c *statClient) ListStats(patterns ...string) (stats []string, err error) { return stats, nil } -func (c *statClient) DumpStats(patterns ...string) (stats []*adapter.StatEntry, err error) { +func (c *statClient) DumpStats(patterns ...string) (stats []adapter.StatEntry, err error) { dir := C.govpp_stat_segment_ls(convertStringSlice(patterns)) if dir == nil { - return nil, ErrStatDirBusy + return nil, adapter.ErrStatsDataBusy } defer C.govpp_stat_segment_vec_free(unsafe.Pointer(dir)) dump := C.govpp_stat_segment_dump(dir) if dump == nil { - return nil, ErrStatDumpBusy + return nil, adapter.ErrStatsDataBusy } defer C.govpp_stat_segment_data_free(dump) @@ -124,8 +120,8 @@ func (c *statClient) DumpStats(patterns ...string) (stats []*adapter.StatEntry, name := C.GoString(nameChar) typ := adapter.StatType(C.govpp_stat_segment_data_type(&v)) - stat := &adapter.StatEntry{ - Name: name, + stat := adapter.StatEntry{ + Name: []byte(name), Type: typ, } @@ -134,7 +130,7 @@ func (c *statClient) DumpStats(patterns ...string) (stats []*adapter.StatEntry, stat.Data = adapter.ScalarStat(C.govpp_stat_segment_data_get_scalar_value(&v)) case adapter.ErrorIndex: - stat.Data = adapter.ErrorStat(C.govpp_stat_segment_data_get_error_value(&v)) + stat.Data = adapter.ErrorStat([]adapter.Counter{adapter.Counter(C.govpp_stat_segment_data_get_error_value(&v))}) case adapter.SimpleCounterVector: length := int(C.govpp_stat_segment_vec_len(unsafe.Pointer(C.govpp_stat_segment_data_get_simple_counter(&v)))) @@ -151,10 +147,10 @@ func (c *statClient) DumpStats(patterns ...string) (stats []*adapter.StatEntry, vector := make([][]adapter.CombinedCounter, length) for k := 0; k < length; k++ { for j := 0; j < int(C.govpp_stat_segment_vec_len(unsafe.Pointer(C.govpp_stat_segment_data_get_combined_counter_index(&v, C.int(k))))); j++ { - vector[k] = append(vector[k], adapter.CombinedCounter{ - Packets: adapter.Counter(C.govpp_stat_segment_data_get_combined_counter_index_packets(&v, C.int(k), C.int(j))), - Bytes: adapter.Counter(C.govpp_stat_segment_data_get_combined_counter_index_bytes(&v, C.int(k), C.int(j))), - }) + vector[k] = append(vector[k], adapter.CombinedCounter([2]uint64{ + uint64(C.govpp_stat_segment_data_get_combined_counter_index_packets(&v, C.int(k), C.int(j))), + uint64(C.govpp_stat_segment_data_get_combined_counter_index_bytes(&v, C.int(k), C.int(j))), + })) } } stat.Data = adapter.CombinedCounterStat(vector) @@ -184,6 +180,14 @@ func (c *statClient) DumpStats(patterns ...string) (stats []*adapter.StatEntry, return stats, nil } +func (c *statClient) PrepareDir(prefixes ...string) (*adapter.StatDir, error) { + return nil, adapter.ErrNotImplemented +} + +func (c *statClient) UpdateDir(dir *adapter.StatDir) error { + return adapter.ErrNotImplemented +} + func convertStringSlice(strs []string) **C.uint8_t { var arr **C.uint8_t for _, str := range strs {