cisco_telemetry_mdt enhancement (#8661)

This commit is contained in:
Shangxin Du 2021-03-16 14:49:07 -07:00 committed by GitHub
parent 8a47d6f104
commit f5552944d1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 1269 additions and 7 deletions

View File

@ -1,8 +1,8 @@
# Cisco Model-Driven Telemetry (MDT) Input Plugin
# Cisco model-driven telemetry (MDT)
Cisco model-driven telemetry (MDT) is an input plugin that consumes
telemetry data from Cisco IOS XR, IOS XE and NX-OS platforms. It supports TCP & GRPC dialout transports.
GRPC-based transport can utilize TLS for authentication and encryption.
RPC-based transport can utilize TLS for authentication and encryption.
Telemetry data is expected to be GPB-KV (self-describing-gpb) encoded.
The GRPC dialout transport is supported on various IOS XR (64-bit) 6.1.x and later, IOS XE 16.10 and later, as well as NX-OS 7.x and later platforms.
@ -21,6 +21,9 @@ The TCP dialout transport is supported on IOS XR (32-bit and 64-bit) 6.1.x and l
## Address and port to host telemetry listener
service_address = ":57000"
## Grpc Maximum Message Size, default is 4MB, increase the size.
max_msg_size = 20000000
## Enable TLS; grpc transport only.
# tls_cert = "/etc/telegraf/cert.pem"
# tls_key = "/etc/telegraf/key.pem"
@ -35,6 +38,19 @@ The TCP dialout transport is supported on IOS XR (32-bit and 64-bit) 6.1.x and l
## Define aliases to map telemetry encoding paths to simple measurement names
[inputs.cisco_telemetry_mdt.aliases]
ifstats = "ietf-interfaces:interfaces-state/interface/statistics"
[inputs.cisco_telemetry_mdt.dmes]
# Global Property Xformation.
# prop1 = "uint64 to int"
# prop2 = "uint64 to string"
# prop3 = "string to uint64"
# prop4 = "string to int64"
# prop5 = "string to float64"
# auto-prop-xfrom = "auto-float-xfrom" #Xform any property which is string, and has float number to type float64
# Per Path property xformation, Name is telemetry configuration under sensor-group, path configuration "WORD Distinguished Name"
# Per Path configuration is better as it avoid property collision issue of types.
# dnpath = '{"Name": "show ip route summary","prop": [{"Key": "routes","Value": "string"}, {"Key": "best-paths","Value": "string"}]}'
# dnpath2 = '{"Name": "show processes cpu","prop": [{"Key": "kernel_percent","Value": "float"}, {"Key": "idle_percent","Value": "float"}, {"Key": "process","Value": "string"}, {"Key": "user_percent","Value": "float"}, {"Key": "onesec","Value": "float"}]}'
# dnpath3 = '{"Name": "show processes memory physical","prop": [{"Key": "processname","Value": "string"}]}'
```
### Example Output:
@ -42,3 +58,47 @@ The TCP dialout transport is supported on IOS XR (32-bit and 64-bit) 6.1.x and l
ifstats,path=ietf-interfaces:interfaces-state/interface/statistics,host=linux,name=GigabitEthernet2,source=csr1kv,subscription=101 in-unicast-pkts=27i,in-multicast-pkts=0i,discontinuity-time="2019-05-23T07:40:23.000362+00:00",in-octets=5233i,in-errors=0i,out-multicast-pkts=0i,out-discards=0i,in-broadcast-pkts=0i,in-discards=0i,in-unknown-protos=0i,out-unicast-pkts=0i,out-broadcast-pkts=0i,out-octets=0i,out-errors=0i 1559150462624000000
ifstats,path=ietf-interfaces:interfaces-state/interface/statistics,host=linux,name=GigabitEthernet1,source=csr1kv,subscription=101 in-octets=3394770806i,in-broadcast-pkts=0i,in-multicast-pkts=0i,out-broadcast-pkts=0i,in-unknown-protos=0i,out-octets=350212i,in-unicast-pkts=9477273i,in-discards=0i,out-unicast-pkts=2726i,out-discards=0i,discontinuity-time="2019-05-23T07:40:23.000363+00:00",in-errors=30i,out-multicast-pkts=0i,out-errors=0i 1559150462624000000
```
### NX-OS Configuration Example:
```
Requirement DATA-SOURCE Configuration
-----------------------------------------
Environment DME path sys/ch query-condition query-target=subtree&target-subtree-class=eqptPsuSlot,eqptFtSlot,eqptSupCSlot,eqptPsu,eqptFt,eqptSensor,eqptLCSlot
DME path sys/ch depth 5 (Another configuration option)
Environment NXAPI show environment power
NXAPI show environment fan
NXAPI show environment temperature
Interface Stats DME path sys/intf query-condition query-target=subtree&target-subtree-class=rmonIfIn,rmonIfOut,rmonIfHCIn,rmonIfHCOut,rmonEtherStats
Interface State DME path sys/intf depth unbounded query-condition query-target=subtree&target-subtree-class=l1PhysIf,pcAggrIf,l3EncRtdIf,l3LbRtdIf,ethpmPhysIf
VPC DME path sys/vpc query-condition query-target=subtree&target-subtree-class=vpcDom,vpcIf
Resources cpu DME path sys/procsys query-condition query-target=subtree&target-subtree-class=procSystem,procSysCore,procSysCpuSummary,procSysCpu,procIdle,procIrq,procKernel,procNice,procSoftirq,procTotal,procUser,procWait,procSysCpuHistory,procSysLoad
Resources Mem DME path sys/procsys/sysmem/sysmemused
path sys/procsys/sysmem/sysmemusage
path sys/procsys/sysmem/sysmemfree
Per Process cpu DME path sys/proc depth unbounded query-condition rsp-foreign-subtree=ephemeral
vxlan(svi stats) DME path sys/bd query-condition query-target=subtree&target-subtree-class=l2VlanStats
BGP DME path sys/bgp query-condition query-target=subtree&target-subtree-class=bgpDom,bgpPeer,bgpPeerAf,bgpDomAf,bgpPeerAfEntry,bgpOperRtctrlL3,bgpOperRttP,bgpOperRttEntry,bgpOperAfCtrl
mac dynamic DME path sys/mac query-condition query-target=subtree&target-subtree-class=l2MacAddressTable
bfd DME path sys/bfd/inst depth unbounded
lldp DME path sys/lldp depth unbounded
urib DME path sys/urib depth unbounded query-condition rsp-foreign-subtree=ephemeral
u6rib DME path sys/u6rib depth unbounded query-condition rsp-foreign-subtree=ephemeral
multicast flow DME path sys/mca/show/flows depth unbounded
multicast stats DME path sys/mca/show/stats depth unbounded
multicast igmp NXAPI show ip igmp groups vrf all
multicast igmp NXAPI show ip igmp interface vrf all
multicast igmp NXAPI show ip igmp snooping
multicast igmp NXAPI show ip igmp snooping groups
multicast igmp NXAPI show ip igmp snooping groups detail
multicast igmp NXAPI show ip igmp snooping groups summary
multicast igmp NXAPI show ip igmp snooping mrouter
multicast igmp NXAPI show ip igmp snooping statistics
multicast pim NXAPI show ip pim interface vrf all
multicast pim NXAPI show ip pim neighbor vrf all
multicast pim NXAPI show ip pim route vrf all
multicast pim NXAPI show ip pim rp vrf all
multicast pim NXAPI show ip pim statistics vrf all
multicast pim NXAPI show ip pim vrf all
```

View File

@ -3,6 +3,7 @@ package cisco_telemetry_mdt
import (
"bytes"
"encoding/binary"
"encoding/json"
"fmt"
"io"
"net"
@ -37,6 +38,7 @@ type CiscoTelemetryMDT struct {
ServiceAddress string `toml:"service_address"`
MaxMsgSize int `toml:"max_msg_size"`
Aliases map[string]string `toml:"aliases"`
Dmes map[string]string `toml:"dmes"`
EmbeddedTags []string `toml:"embedded_tags"`
Log telegraf.Logger
@ -50,13 +52,24 @@ type CiscoTelemetryMDT struct {
// Internal state
aliases map[string]string
dmesFuncs map[string]string
warned map[string]struct{}
extraTags map[string]map[string]struct{}
nxpathMap map[string]map[string]string //per path map
propMap map[string]func(field *telemetry.TelemetryField, value interface{}) interface{}
mutex sync.Mutex
acc telegraf.Accumulator
wg sync.WaitGroup
}
type NxPayloadXfromStructure struct {
Name string `json:"Name"`
Prop []struct {
Key string `json:"Key"`
Value string `json:"Value"`
} `json:"prop"`
}
// Start the Cisco MDT service
func (c *CiscoTelemetryMDT) Start(acc telegraf.Accumulator) error {
var err error
@ -66,12 +79,55 @@ func (c *CiscoTelemetryMDT) Start(acc telegraf.Accumulator) error {
return err
}
c.propMap = make(map[string]func(field *telemetry.TelemetryField, value interface{}) interface{}, 100)
c.propMap["test"] = nxosValueXformUint64Toint64
c.propMap["asn"] = nxosValueXformUint64ToString //uint64 to string.
c.propMap["subscriptionId"] = nxosValueXformUint64ToString //uint64 to string.
c.propMap["operState"] = nxosValueXformUint64ToString //uint64 to string.
// Invert aliases list
c.warned = make(map[string]struct{})
c.aliases = make(map[string]string, len(c.Aliases))
for alias, path := range c.Aliases {
c.aliases[path] = alias
}
c.initDb()
c.dmesFuncs = make(map[string]string, len(c.Dmes))
for dme, path := range c.Dmes {
c.dmesFuncs[path] = dme
switch path {
case "uint64 to int":
c.propMap[dme] = nxosValueXformUint64Toint64
case "uint64 to string":
c.propMap[dme] = nxosValueXformUint64ToString
case "string to float64":
c.propMap[dme] = nxosValueXformStringTofloat
case "string to uint64":
c.propMap[dme] = nxosValueXformStringToUint64
case "string to int64":
c.propMap[dme] = nxosValueXformStringToInt64
case "auto-float-xfrom":
c.propMap[dme] = nxosValueAutoXformFloatProp
default:
if !strings.HasPrefix(dme, "dnpath") { // not path based property map
continue
}
var jsStruct NxPayloadXfromStructure
err := json.Unmarshal([]byte(path), &jsStruct)
if err != nil {
continue
}
// Build 2 level Hash nxpathMap Key = jsStruct.Name, Value = map of jsStruct.Prop
// It will override the default of code if same path is provided in configuration.
c.nxpathMap[jsStruct.Name] = make(map[string]string, len(jsStruct.Prop))
for _, prop := range jsStruct.Prop {
c.nxpathMap[jsStruct.Name][prop.Key] = prop.Value
}
}
}
// Fill extra tags
c.extraTags = make(map[string]map[string]struct{})
@ -296,7 +352,9 @@ func (c *CiscoTelemetryMDT) handleTelemetry(data []byte) {
// Parse keys
tags = make(map[string]string, len(keys.Fields)+3)
tags["source"] = msg.GetNodeIdStr()
tags["subscription"] = msg.GetSubscriptionIdStr()
if msgID := msg.GetSubscriptionIdStr(); msgID != "" {
tags["subscription"] = msgID
}
tags["path"] = msg.GetEncodingPath()
for _, subfield := range keys.Fields {
@ -391,9 +449,72 @@ func (c *CiscoTelemetryMDT) parseKeyField(tags map[string]string, field *telemet
}
}
func (c *CiscoTelemetryMDT) parseRib(grouper *metric.SeriesGrouper, field *telemetry.TelemetryField, prefix string, path string, tags map[string]string, timestamp time.Time) {
// RIB
measurement := path
for _, subfield := range field.Fields {
//For Every table fill the keys which are vrfName, address and masklen
switch subfield.Name {
case "vrfName", "address", "maskLen":
tags[subfield.Name] = decodeTag(subfield)
}
if value := decodeValue(subfield); value != nil {
grouper.Add(measurement, tags, timestamp, subfield.Name, value)
}
if subfield.Name != "nextHop" {
continue
}
//For next hop table fill the keys in the tag - which is address and vrfname
for _, subf := range subfield.Fields {
for _, ff := range subf.Fields {
switch ff.Name {
case "address", "vrfName":
key := "nextHop/" + ff.Name
tags[key] = decodeTag(ff)
}
if value := decodeValue(ff); value != nil {
name := "nextHop/" + ff.Name
grouper.Add(measurement, tags, timestamp, name, value)
}
}
}
}
}
func (c *CiscoTelemetryMDT) parseClassAttributeField(grouper *metric.SeriesGrouper, field *telemetry.TelemetryField, prefix string, path string, tags map[string]string, timestamp time.Time) {
// DME structure: https://developer.cisco.com/site/nxapi-dme-model-reference-api/
var nxAttributes *telemetry.TelemetryField
isDme := strings.Contains(path, "sys/")
if path == "rib" {
//handle native data path rib
c.parseRib(grouper, field, prefix, path, tags, timestamp)
return
}
if field == nil || !isDme || len(field.Fields) == 0 || len(field.Fields[0].Fields) == 0 || len(field.Fields[0].Fields[0].Fields) == 0 {
return
}
if field.Fields[0] != nil && field.Fields[0].Fields != nil && field.Fields[0].Fields[0] != nil && field.Fields[0].Fields[0].Fields[0].Name != "attributes" {
return
}
nxAttributes = field.Fields[0].Fields[0].Fields[0].Fields[0]
for _, subfield := range nxAttributes.Fields {
if subfield.Name == "dn" {
tags["dn"] = decodeTag(subfield)
} else {
c.parseContentField(grouper, subfield, "", path, tags, timestamp)
}
}
}
func (c *CiscoTelemetryMDT) parseContentField(grouper *metric.SeriesGrouper, field *telemetry.TelemetryField, prefix string,
path string, tags map[string]string, timestamp time.Time) {
name := strings.Replace(field.Name, "-", "_", -1)
if (name == "modTs" || name == "createTs") && decodeValue(field) == "never" {
return
}
if len(name) == 0 {
name = prefix
} else if len(prefix) > 0 {
@ -416,7 +537,11 @@ func (c *CiscoTelemetryMDT) parseContentField(grouper *metric.SeriesGrouper, fie
c.mutex.Unlock()
}
if val := c.nxosValueXform(field, value, path); val != nil {
grouper.Add(measurement, tags, timestamp, name, val)
} else {
grouper.Add(measurement, tags, timestamp, name, value)
}
return
}
@ -430,11 +555,28 @@ func (c *CiscoTelemetryMDT) parseContentField(grouper *metric.SeriesGrouper, fie
var nxAttributes, nxChildren, nxRows *telemetry.TelemetryField
isNXOS := !strings.ContainsRune(path, ':') // IOS-XR and IOS-XE have a colon in their encoding path, NX-OS does not
isEVENT := isNXOS && strings.Contains(path, "EVENT-LIST")
nxChildren = nil
nxAttributes = nil
for _, subfield := range field.Fields {
if isNXOS && subfield.Name == "attributes" && len(subfield.Fields) > 0 {
nxAttributes = subfield.Fields[0]
} else if isNXOS && subfield.Name == "children" && len(subfield.Fields) > 0 {
if !isEVENT {
nxChildren = subfield
} else {
sub := subfield.Fields
if len(sub) > 0 && sub[0] != nil && sub[0].Fields[0].Name == "subscriptionId" && len(sub[0].Fields) >= 2 {
nxAttributes = sub[0].Fields[1].Fields[0].Fields[0].Fields[0].Fields[0].Fields[0]
}
}
//if nxAttributes == NULL then class based query.
if nxAttributes == nil {
//call function walking over walking list.
for _, sub := range subfield.Fields {
c.parseClassAttributeField(grouper, sub, name, path, tags, timestamp)
}
}
} else if isNXOS && strings.HasPrefix(subfield.Name, "ROW_") {
nxRows = subfield
} else if _, isExtraTag := extraTags[subfield.Name]; !isExtraTag { // Regular telemetry decoding
@ -450,9 +592,16 @@ func (c *CiscoTelemetryMDT) parseContentField(grouper *metric.SeriesGrouper, fie
for i, subfield := range row.Fields {
if i == 0 { // First subfield contains the index, promote it from value to tag
tags[prefix] = decodeTag(subfield)
//We can have subfield so recursively handle it.
if len(row.Fields) == 1 {
tags["row_number"] = strconv.FormatInt(int64(i), 10)
c.parseContentField(grouper, subfield, "", path, tags, timestamp)
}
} else {
c.parseContentField(grouper, subfield, "", path, tags, timestamp)
}
// Nxapi we can't identify keys always from prefix
tags["row_number"] = strconv.FormatInt(int64(i), 10)
}
delete(tags, prefix)
}
@ -531,6 +680,10 @@ const sampleConfig = `
## Define aliases to map telemetry encoding paths to simple measurement names
[inputs.cisco_telemetry_mdt.aliases]
ifstats = "ietf-interfaces:interfaces-state/interface/statistics"
##Define Property Xformation, please refer README and https://pubhub.devnetcloud.com/media/dme-docs-9-3-3/docs/appendix/ for Model details.
[inputs.cisco_telemetry_mdt.dmes]
ModTs = "ignore"
CreateTs = "ignore"
`
// SampleConfig of plugin

View File

@ -311,14 +311,171 @@ func TestHandleNXAPI(t *testing.T) {
c.handleTelemetry(data)
require.Empty(t, acc.Errors)
tags1 := map[string]string{"path": "show nxapi", "foo": "bar", "TABLE_nxapi": "i1", "source": "hostname", "subscription": "subscription"}
tags1 := map[string]string{"path": "show nxapi", "foo": "bar", "TABLE_nxapi": "i1", "row_number": "0", "source": "hostname", "subscription": "subscription"}
fields1 := map[string]interface{}{"value": "foo"}
tags2 := map[string]string{"path": "show nxapi", "foo": "bar", "TABLE_nxapi": "i2", "source": "hostname", "subscription": "subscription"}
tags2 := map[string]string{"path": "show nxapi", "foo": "bar", "TABLE_nxapi": "i2", "row_number": "0", "source": "hostname", "subscription": "subscription"}
fields2 := map[string]interface{}{"value": "bar"}
acc.AssertContainsTaggedFields(t, "nxapi", fields1, tags1)
acc.AssertContainsTaggedFields(t, "nxapi", fields2, tags2)
}
func TestHandleNXAPIXformNXAPI(t *testing.T) {
c := &CiscoTelemetryMDT{Log: testutil.Logger{}, Transport: "dummy", Aliases: map[string]string{"nxapi": "show nxapi"}}
acc := &testutil.Accumulator{}
err := c.Start(acc)
// error is expected since we are passing in dummy transport
require.Error(t, err)
telemetry := &telemetry.Telemetry{
MsgTimestamp: 1543236572000,
EncodingPath: "show processes cpu",
NodeId: &telemetry.Telemetry_NodeIdStr{NodeIdStr: "hostname"},
Subscription: &telemetry.Telemetry_SubscriptionIdStr{SubscriptionIdStr: "subscription"},
DataGpbkv: []*telemetry.TelemetryField{
{
Fields: []*telemetry.TelemetryField{
{
Name: "keys",
Fields: []*telemetry.TelemetryField{
{
Name: "foo",
ValueByType: &telemetry.TelemetryField_StringValue{StringValue: "bar"},
},
},
},
{
Name: "content",
Fields: []*telemetry.TelemetryField{
{
Fields: []*telemetry.TelemetryField{
{
Name: "TABLE_process_cpu",
Fields: []*telemetry.TelemetryField{
{
Fields: []*telemetry.TelemetryField{
{
Name: "ROW_process_cpu",
Fields: []*telemetry.TelemetryField{
{
Fields: []*telemetry.TelemetryField{
{
Name: "index",
ValueByType: &telemetry.TelemetryField_StringValue{StringValue: "i1"},
},
{
Name: "value",
ValueByType: &telemetry.TelemetryField_StringValue{StringValue: "foo"},
},
},
},
},
},
},
},
},
},
},
},
},
},
},
},
},
}
data, _ := proto.Marshal(telemetry)
c.handleTelemetry(data)
require.Empty(t, acc.Errors)
tags1 := map[string]string{"path": "show processes cpu", "foo": "bar", "TABLE_process_cpu": "i1", "row_number": "0", "source": "hostname", "subscription": "subscription"}
fields1 := map[string]interface{}{"value": "foo"}
acc.AssertContainsTaggedFields(t, "show processes cpu", fields1, tags1)
}
func TestHandleNXXformMulti(t *testing.T) {
c := &CiscoTelemetryMDT{Transport: "dummy", Aliases: map[string]string{"dme": "sys/lldp"}}
acc := &testutil.Accumulator{}
err := c.Start(acc)
// error is expected since we are passing in dummy transport
require.Error(t, err)
telemetry := &telemetry.Telemetry{
MsgTimestamp: 1543236572000,
EncodingPath: "sys/lldp",
NodeId: &telemetry.Telemetry_NodeIdStr{NodeIdStr: "hostname"},
Subscription: &telemetry.Telemetry_SubscriptionIdStr{SubscriptionIdStr: "subscription"},
DataGpbkv: []*telemetry.TelemetryField{
{
Fields: []*telemetry.TelemetryField{
{
Name: "keys",
Fields: []*telemetry.TelemetryField{
{
Name: "foo",
ValueByType: &telemetry.TelemetryField_StringValue{StringValue: "bar"},
},
},
},
{
Name: "content",
Fields: []*telemetry.TelemetryField{
{
Fields: []*telemetry.TelemetryField{
{
Name: "fooEntity",
Fields: []*telemetry.TelemetryField{
{
Fields: []*telemetry.TelemetryField{
{
Name: "attributes",
Fields: []*telemetry.TelemetryField{
{
Fields: []*telemetry.TelemetryField{
{
Name: "rn",
ValueByType: &telemetry.TelemetryField_StringValue{StringValue: "some-rn"},
},
{
Name: "portIdV",
ValueByType: &telemetry.TelemetryField_Uint32Value{Uint32Value: 12},
},
{
Name: "portDesc",
ValueByType: &telemetry.TelemetryField_Uint64Value{Uint64Value: 100},
},
{
Name: "test",
ValueByType: &telemetry.TelemetryField_Uint64Value{Uint64Value: 281474976710655},
},
{
Name: "subscriptionId",
ValueByType: &telemetry.TelemetryField_Uint64Value{Uint64Value: 2814749767106551},
},
},
},
},
},
},
},
},
},
},
},
},
},
},
},
},
}
data, _ := proto.Marshal(telemetry)
c.handleTelemetry(data)
require.Empty(t, acc.Errors)
//validate various transformation scenaarios newly added in the code.
fields := map[string]interface{}{"portIdV": "12", "portDesc": "100", "test": int64(281474976710655), "subscriptionId": "2814749767106551"}
acc.AssertContainsFields(t, "dme", fields)
}
func TestHandleNXDME(t *testing.T) {
c := &CiscoTelemetryMDT{Transport: "dummy", Aliases: map[string]string{"dme": "sys/dme"}}
acc := &testutil.Accumulator{}

View File

@ -0,0 +1,892 @@
package cisco_telemetry_mdt
import (
telemetry "github.com/cisco-ie/nx-telemetry-proto/telemetry_bis"
"strconv"
"strings"
)
//xform Field to string
func xformValueString(field *telemetry.TelemetryField) string {
var str string
switch val := field.ValueByType.(type) {
case *telemetry.TelemetryField_StringValue:
if len(val.StringValue) > 0 {
return val.StringValue
}
case *telemetry.TelemetryField_Uint32Value:
str = strconv.FormatUint(uint64(val.Uint32Value), 10)
return str
case *telemetry.TelemetryField_Uint64Value:
str = strconv.FormatUint(val.Uint64Value, 10)
return str
case *telemetry.TelemetryField_Sint32Value:
str = strconv.FormatInt(int64(val.Sint32Value), 10)
return str
case *telemetry.TelemetryField_Sint64Value:
str = strconv.FormatInt(val.Sint64Value, 10)
return str
}
return ""
}
//xform Uint64 to int64
func nxosValueXformUint64Toint64(field *telemetry.TelemetryField, value interface{}) interface{} {
if field.GetUint64Value() != 0 {
return int64(value.(uint64))
}
return nil
}
//xform string to float
func nxosValueXformStringTofloat(field *telemetry.TelemetryField, value interface{}) interface{} {
//convert property to float from string.
vals := field.GetStringValue()
if vals != "" {
if valf, err := strconv.ParseFloat(vals, 64); err == nil {
return valf
}
}
return nil
}
//xform string to uint64
func nxosValueXformStringToUint64(field *telemetry.TelemetryField, value interface{}) interface{} {
//string to uint64
vals := field.GetStringValue()
if vals != "" {
if val64, err := strconv.ParseUint(vals, 10, 64); err == nil {
return val64
}
}
return nil
}
//xform string to int64
func nxosValueXformStringToInt64(field *telemetry.TelemetryField, value interface{}) interface{} {
//string to int64
vals := field.GetStringValue()
if vals != "" {
if val64, err := strconv.ParseInt(vals, 10, 64); err == nil {
return val64
}
}
return nil
}
//auto-xform
func nxosValueAutoXform(field *telemetry.TelemetryField, value interface{}) interface{} {
//check if we want auto xformation
vals := field.GetStringValue()
if vals != "" {
if val64, err := strconv.ParseUint(vals, 10, 64); err == nil {
return val64
}
if valf, err := strconv.ParseFloat(vals, 64); err == nil {
return valf
}
if val64, err := strconv.ParseInt(vals, 10, 64); err == nil {
return val64
}
} // switch
return nil
}
//auto-xform float properties
func nxosValueAutoXformFloatProp(field *telemetry.TelemetryField, value interface{}) interface{} {
//check if we want auto xformation
vals := field.GetStringValue()
if vals != "" {
if valf, err := strconv.ParseFloat(vals, 64); err == nil {
return valf
}
} // switch
return nil
}
//xform uint64 to string
func nxosValueXformUint64ToString(field *telemetry.TelemetryField, value interface{}) interface{} {
switch val := field.ValueByType.(type) {
case *telemetry.TelemetryField_StringValue:
if len(val.StringValue) > 0 {
return val.StringValue
}
case *telemetry.TelemetryField_Uint64Value:
return strconv.FormatUint(val.Uint64Value, 10)
}
return nil
}
//Xform value field.
func (c *CiscoTelemetryMDT) nxosValueXform(field *telemetry.TelemetryField, value interface{}, path string) interface{} {
if strings.ContainsRune(path, ':') {
// not NXOS
return nil
}
if _, ok := c.propMap[field.Name]; ok {
return c.propMap[field.Name](field, value)
}
//check if we want auto xformation
if _, ok := c.propMap["auto-prop-xfromi"]; ok {
return c.propMap["auto-prop-xfrom"](field, value)
}
//Now check path based conversion.
//If mapping is found then do the required transformation.
if c.nxpathMap[path] == nil {
return nil
}
switch c.nxpathMap[path][field.Name] {
//Xformation supported is only from String, Uint32 and Uint64
case "integer":
switch val := field.ValueByType.(type) {
case *telemetry.TelemetryField_StringValue:
if vali, err := strconv.ParseInt(val.StringValue, 10, 32); err == nil {
return vali
}
case *telemetry.TelemetryField_Uint32Value:
vali, ok := value.(uint32)
if ok == true {
return vali
}
case *telemetry.TelemetryField_Uint64Value:
vali, ok := value.(uint64)
if ok == true {
return vali
}
} //switch
return nil
//Xformation supported is only from String
case "float":
switch val := field.ValueByType.(type) {
case *telemetry.TelemetryField_StringValue:
if valf, err := strconv.ParseFloat(val.StringValue, 64); err == nil {
return valf
}
} //switch
return nil
case "string":
return xformValueString(field)
case "int64":
switch val := field.ValueByType.(type) {
case *telemetry.TelemetryField_StringValue:
if vali, err := strconv.ParseInt(val.StringValue, 10, 64); err == nil {
return vali
}
case *telemetry.TelemetryField_Uint64Value:
return int64(value.(uint64))
} //switch
} //switch
return nil
}
func (c *CiscoTelemetryMDT) initMemPhys() {
c.nxpathMap["show processes memory physical"] = map[string]string{"processname": "string"}
}
func (c *CiscoTelemetryMDT) initBgpV4() {
key := "show bgp ipv4 unicast"
c.nxpathMap[key] = make(map[string]string, 1)
c.nxpathMap[key]["aspath"] = "string"
}
func (c *CiscoTelemetryMDT) initCpu() {
key := "show processes cpu"
c.nxpathMap[key] = make(map[string]string, 5)
c.nxpathMap[key]["kernel_percent"] = "float"
c.nxpathMap[key]["idle_percent"] = "float"
c.nxpathMap[key]["process"] = "string"
c.nxpathMap[key]["user_percent"] = "float"
c.nxpathMap[key]["onesec"] = "float"
}
func (c *CiscoTelemetryMDT) initResources() {
key := "show system resources"
c.nxpathMap[key] = make(map[string]string, 20)
c.nxpathMap[key]["cpu_state_user"] = "float"
c.nxpathMap[key]["kernel"] = "float"
c.nxpathMap[key]["current_memory_status"] = "string"
c.nxpathMap[key]["load_avg_15min"] = "float"
c.nxpathMap[key]["idle"] = "float"
c.nxpathMap[key]["load_avg_1min"] = "float"
c.nxpathMap[key]["user"] = "float"
c.nxpathMap[key]["cpu_state_idle"] = "float"
c.nxpathMap[key]["load_avg_5min"] = "float"
c.nxpathMap[key]["cpu_state_kernel"] = "float"
}
func (c *CiscoTelemetryMDT) initPower() {
key := "show environment power"
c.nxpathMap[key] = make(map[string]string, 100)
c.nxpathMap[key]["reserve_sup"] = "string"
c.nxpathMap[key]["det_volt"] = "string"
c.nxpathMap[key]["heatsink_temp"] = "string"
c.nxpathMap[key]["det_pintot"] = "string"
c.nxpathMap[key]["det_iinb"] = "string"
c.nxpathMap[key]["ps_input_current"] = "string"
c.nxpathMap[key]["modnum"] = "string"
c.nxpathMap[key]["trayfannum"] = "string"
c.nxpathMap[key]["modstatus_3k"] = "string"
c.nxpathMap[key]["fan2rpm"] = "string"
c.nxpathMap[key]["amps_alloced"] = "string"
c.nxpathMap[key]["all_inlets_connected"] = "string"
c.nxpathMap[key]["tot_pow_out_actual_draw"] = "string"
c.nxpathMap[key]["ps_redun_op_mode"] = "string"
c.nxpathMap[key]["curtemp"] = "string"
c.nxpathMap[key]["mod_model"] = "string"
c.nxpathMap[key]["fanmodel"] = "string"
c.nxpathMap[key]["ps_output_current"] = "string"
c.nxpathMap[key]["majthres"] = "string"
c.nxpathMap[key]["input_type"] = "string"
c.nxpathMap[key]["allocated"] = "string"
c.nxpathMap[key]["fanhwver"] = "string"
c.nxpathMap[key]["clkhwver"] = "string"
c.nxpathMap[key]["fannum"] = "string"
c.nxpathMap[key]["watts_requested"] = "string"
c.nxpathMap[key]["cumulative_power"] = "string"
c.nxpathMap[key]["tot_gridB_capacity"] = "string"
c.nxpathMap[key]["pow_used_by_mods"] = "string"
c.nxpathMap[key]["tot_pow_alloc_budgeted"] = "string"
c.nxpathMap[key]["psumod"] = "string"
c.nxpathMap[key]["ps_status_3k"] = "string"
c.nxpathMap[key]["temptype"] = "string"
c.nxpathMap[key]["regval"] = "string"
c.nxpathMap[key]["inlet_temp"] = "string"
c.nxpathMap[key]["det_cord"] = "string"
c.nxpathMap[key]["reserve_fan"] = "string"
c.nxpathMap[key]["det_pina"] = "string"
c.nxpathMap[key]["minthres"] = "string"
c.nxpathMap[key]["actual_draw"] = "string"
c.nxpathMap[key]["sensor"] = "string"
c.nxpathMap[key]["zone"] = "string"
c.nxpathMap[key]["det_iin"] = "string"
c.nxpathMap[key]["det_iout"] = "string"
c.nxpathMap[key]["det_vin"] = "string"
c.nxpathMap[key]["fan1rpm"] = "string"
c.nxpathMap[key]["tot_gridA_capacity"] = "string"
c.nxpathMap[key]["fanperc"] = "string"
c.nxpathMap[key]["det_pout"] = "string"
c.nxpathMap[key]["alarm_str"] = "string"
c.nxpathMap[key]["zonespeed"] = "string"
c.nxpathMap[key]["det_total_cap"] = "string"
c.nxpathMap[key]["reserve_xbar"] = "string"
c.nxpathMap[key]["det_vout"] = "string"
c.nxpathMap[key]["watts_alloced"] = "string"
c.nxpathMap[key]["ps_in_power"] = "string"
c.nxpathMap[key]["tot_pow_input_actual_draw"] = "string"
c.nxpathMap[key]["ps_output_voltage"] = "string"
c.nxpathMap[key]["det_name"] = "string"
c.nxpathMap[key]["tempmod"] = "string"
c.nxpathMap[key]["clockname"] = "string"
c.nxpathMap[key]["fanname"] = "string"
c.nxpathMap[key]["regnumstr"] = "string"
c.nxpathMap[key]["bitnumstr"] = "string"
c.nxpathMap[key]["ps_slot"] = "string"
c.nxpathMap[key]["actual_out"] = "string"
c.nxpathMap[key]["ps_input_voltage"] = "string"
c.nxpathMap[key]["psmodel"] = "string"
c.nxpathMap[key]["speed"] = "string"
c.nxpathMap[key]["clkmodel"] = "string"
c.nxpathMap[key]["ps_redun_mode_3k"] = "string"
c.nxpathMap[key]["tot_pow_capacity"] = "string"
c.nxpathMap[key]["amps"] = "string"
c.nxpathMap[key]["available_pow"] = "string"
c.nxpathMap[key]["reserve_supxbarfan"] = "string"
c.nxpathMap[key]["watts"] = "string"
c.nxpathMap[key]["det_pinb"] = "string"
c.nxpathMap[key]["det_vinb"] = "string"
c.nxpathMap[key]["ps_state"] = "string"
c.nxpathMap[key]["det_sw_alarm"] = "string"
c.nxpathMap[key]["regnum"] = "string"
c.nxpathMap[key]["amps_requested"] = "string"
c.nxpathMap[key]["fanrpm"] = "string"
c.nxpathMap[key]["actual_input"] = "string"
c.nxpathMap[key]["outlet_temp"] = "string"
c.nxpathMap[key]["tot_capa"] = "string"
}
func (c *CiscoTelemetryMDT) initPtpCorrection() {
key := "show ptp corrections"
c.nxpathMap[key] = make(map[string]string, 20)
c.nxpathMap[key]["sup-time"] = "string"
c.nxpathMap[key]["correction-val"] = "int64"
c.nxpathMap[key]["ptp-header"] = "string"
c.nxpathMap[key]["intf-name"] = "string"
c.nxpathMap[key]["ptp-end"] = "string"
}
func (c *CiscoTelemetryMDT) initTrans() {
key := "show interface transceiver details"
c.nxpathMap[key] = make(map[string]string, 100)
c.nxpathMap[key]["uncorrect_ber_alrm_hi"] = "string"
c.nxpathMap[key]["uncorrect_ber_cur_warn_lo"] = "string"
c.nxpathMap[key]["current_warn_lo"] = "float"
c.nxpathMap[key]["pre_fec_ber_max_alrm_hi"] = "string"
c.nxpathMap[key]["serialnum"] = "string"
c.nxpathMap[key]["pre_fec_ber_acc_warn_lo"] = "string"
c.nxpathMap[key]["pre_fec_ber_max_warn_lo"] = "string"
c.nxpathMap[key]["laser_temp_warn_hi"] = "float"
c.nxpathMap[key]["type"] = "string"
c.nxpathMap[key]["rx_pwr_0"] = "float"
c.nxpathMap[key]["rx_pwr_warn_hi"] = "float"
c.nxpathMap[key]["uncorrect_ber_warn_hi"] = "string"
c.nxpathMap[key]["qsfp_or_cfp"] = "string"
c.nxpathMap[key]["protocol_type"] = "string"
c.nxpathMap[key]["uncorrect_ber"] = "string"
c.nxpathMap[key]["uncorrect_ber_cur_alrm_hi"] = "string"
c.nxpathMap[key]["tec_current"] = "float"
c.nxpathMap[key]["pre_fec_ber"] = "string"
c.nxpathMap[key]["uncorrect_ber_max_warn_lo"] = "string"
c.nxpathMap[key]["uncorrect_ber_min"] = "string"
c.nxpathMap[key]["current_alrm_lo"] = "float"
c.nxpathMap[key]["uncorrect_ber_acc_warn_lo"] = "string"
c.nxpathMap[key]["snr_warn_lo"] = "float"
c.nxpathMap[key]["rev"] = "string"
c.nxpathMap[key]["laser_temp_alrm_lo"] = "float"
c.nxpathMap[key]["current"] = "float"
c.nxpathMap[key]["rx_pwr_1"] = "float"
c.nxpathMap[key]["tec_current_warn_hi"] = "float"
c.nxpathMap[key]["pre_fec_ber_cur_warn_lo"] = "string"
c.nxpathMap[key]["cisco_part_number"] = "string"
c.nxpathMap[key]["uncorrect_ber_acc_warn_hi"] = "string"
c.nxpathMap[key]["temp_warn_hi"] = "float"
c.nxpathMap[key]["laser_freq_warn_lo"] = "float"
c.nxpathMap[key]["uncorrect_ber_max_alrm_lo"] = "string"
c.nxpathMap[key]["snr_alrm_hi"] = "float"
c.nxpathMap[key]["pre_fec_ber_cur_alrm_lo"] = "string"
c.nxpathMap[key]["tx_pwr_alrm_hi"] = "float"
c.nxpathMap[key]["pre_fec_ber_min_warn_lo"] = "string"
c.nxpathMap[key]["pre_fec_ber_min_warn_hi"] = "string"
c.nxpathMap[key]["rx_pwr_alrm_hi"] = "float"
c.nxpathMap[key]["tec_current_warn_lo"] = "float"
c.nxpathMap[key]["uncorrect_ber_acc_alrm_hi"] = "string"
c.nxpathMap[key]["rx_pwr_4"] = "float"
c.nxpathMap[key]["uncorrect_ber_cur"] = "string"
c.nxpathMap[key]["pre_fec_ber_alrm_hi"] = "string"
c.nxpathMap[key]["rx_pwr_warn_lo"] = "float"
c.nxpathMap[key]["bit_encoding"] = "string"
c.nxpathMap[key]["pre_fec_ber_acc"] = "string"
c.nxpathMap[key]["sfp"] = "string"
c.nxpathMap[key]["pre_fec_ber_acc_alrm_hi"] = "string"
c.nxpathMap[key]["pre_fec_ber_min"] = "string"
c.nxpathMap[key]["current_warn_hi"] = "float"
c.nxpathMap[key]["pre_fec_ber_max_alrm_lo"] = "string"
c.nxpathMap[key]["uncorrect_ber_cur_warn_hi"] = "string"
c.nxpathMap[key]["current_alrm_hi"] = "float"
c.nxpathMap[key]["pre_fec_ber_acc_alrm_lo"] = "string"
c.nxpathMap[key]["snr_alrm_lo"] = "float"
c.nxpathMap[key]["uncorrect_ber_acc"] = "string"
c.nxpathMap[key]["tx_len"] = "string"
c.nxpathMap[key]["uncorrect_ber_alrm_lo"] = "string"
c.nxpathMap[key]["pre_fec_ber_alrm_lo"] = "string"
c.nxpathMap[key]["txcvr_type"] = "string"
c.nxpathMap[key]["tec_current_alrm_lo"] = "float"
c.nxpathMap[key]["volt_alrm_lo"] = "float"
c.nxpathMap[key]["temp_alrm_hi"] = "float"
c.nxpathMap[key]["uncorrect_ber_min_warn_lo"] = "string"
c.nxpathMap[key]["laser_freq"] = "float"
c.nxpathMap[key]["uncorrect_ber_min_warn_hi"] = "string"
c.nxpathMap[key]["uncorrect_ber_cur_alrm_lo"] = "string"
c.nxpathMap[key]["pre_fec_ber_max_warn_hi"] = "string"
c.nxpathMap[key]["name"] = "string"
c.nxpathMap[key]["fiber_type_byte0"] = "string"
c.nxpathMap[key]["laser_freq_alrm_lo"] = "float"
c.nxpathMap[key]["pre_fec_ber_cur_warn_hi"] = "string"
c.nxpathMap[key]["partnum"] = "string"
c.nxpathMap[key]["snr"] = "float"
c.nxpathMap[key]["volt_alrm_hi"] = "float"
c.nxpathMap[key]["connector_type"] = "string"
c.nxpathMap[key]["tx_medium"] = "string"
c.nxpathMap[key]["tx_pwr_warn_hi"] = "float"
c.nxpathMap[key]["cisco_vendor_id"] = "string"
c.nxpathMap[key]["cisco_ext_id"] = "string"
c.nxpathMap[key]["uncorrect_ber_max_warn_hi"] = "string"
c.nxpathMap[key]["pre_fec_ber_max"] = "string"
c.nxpathMap[key]["uncorrect_ber_min_alrm_hi"] = "string"
c.nxpathMap[key]["pre_fec_ber_warn_hi"] = "string"
c.nxpathMap[key]["tx_pwr_alrm_lo"] = "float"
c.nxpathMap[key]["uncorrect_ber_warn_lo"] = "string"
c.nxpathMap[key]["10gbe_code"] = "string"
c.nxpathMap[key]["cable_type"] = "string"
c.nxpathMap[key]["laser_freq_alrm_hi"] = "float"
c.nxpathMap[key]["rx_pwr_3"] = "float"
c.nxpathMap[key]["rx_pwr"] = "float"
c.nxpathMap[key]["volt_warn_hi"] = "float"
c.nxpathMap[key]["pre_fec_ber_cur_alrm_hi"] = "string"
c.nxpathMap[key]["temperature"] = "float"
c.nxpathMap[key]["voltage"] = "float"
c.nxpathMap[key]["tx_pwr"] = "float"
c.nxpathMap[key]["laser_temp_alrm_hi"] = "float"
c.nxpathMap[key]["tx_speeds"] = "string"
c.nxpathMap[key]["uncorrect_ber_min_alrm_lo"] = "string"
c.nxpathMap[key]["pre_fec_ber_min_alrm_hi"] = "string"
c.nxpathMap[key]["ciscoid"] = "string"
c.nxpathMap[key]["tx_pwr_warn_lo"] = "float"
c.nxpathMap[key]["cisco_product_id"] = "string"
c.nxpathMap[key]["info_not_available"] = "string"
c.nxpathMap[key]["laser_temp"] = "float"
c.nxpathMap[key]["pre_fec_ber_cur"] = "string"
c.nxpathMap[key]["fiber_type_byte1"] = "string"
c.nxpathMap[key]["tx_type"] = "string"
c.nxpathMap[key]["pre_fec_ber_min_alrm_lo"] = "string"
c.nxpathMap[key]["pre_fec_ber_warn_lo"] = "string"
c.nxpathMap[key]["temp_alrm_lo"] = "float"
c.nxpathMap[key]["volt_warn_lo"] = "float"
c.nxpathMap[key]["rx_pwr_alrm_lo"] = "float"
c.nxpathMap[key]["rx_pwr_2"] = "float"
c.nxpathMap[key]["tec_current_alrm_hi"] = "float"
c.nxpathMap[key]["uncorrect_ber_acc_alrm_lo"] = "string"
c.nxpathMap[key]["uncorrect_ber_max_alrm_hi"] = "string"
c.nxpathMap[key]["temp_warn_lo"] = "float"
c.nxpathMap[key]["snr_warn_hi"] = "float"
c.nxpathMap[key]["laser_temp_warn_lo"] = "float"
c.nxpathMap[key]["pre_fec_ber_acc_warn_hi"] = "string"
c.nxpathMap[key]["laser_freq_warn_hi"] = "float"
c.nxpathMap[key]["uncorrect_ber_max"] = "string"
}
func (c *CiscoTelemetryMDT) initIgmp() {
key := "show ip igmp groups vrf all"
c.nxpathMap[key] = make(map[string]string, 20)
c.nxpathMap[key]["group-type"] = "string"
c.nxpathMap[key]["translate"] = "string"
c.nxpathMap[key]["sourceaddress"] = "string"
c.nxpathMap[key]["vrf-cntxt"] = "string"
c.nxpathMap[key]["expires"] = "string"
c.nxpathMap[key]["group-addr"] = "string"
c.nxpathMap[key]["uptime"] = "string"
}
func (c *CiscoTelemetryMDT) initVrfAll() {
key := "show ip igmp interface vrf all"
c.nxpathMap[key] = make(map[string]string, 20)
c.nxpathMap[key]["if-name"] = "string"
c.nxpathMap[key]["static-group-map"] = "string"
c.nxpathMap[key]["rll"] = "string"
c.nxpathMap[key]["host-proxy"] = "string"
c.nxpathMap[key]["il"] = "string"
c.nxpathMap[key]["join-group-map"] = "string"
c.nxpathMap[key]["expires"] = "string"
c.nxpathMap[key]["host-proxy-group-map"] = "string"
c.nxpathMap[key]["next-query"] = "string"
c.nxpathMap[key]["q-ver"] = "string"
c.nxpathMap[key]["if-status"] = "string"
c.nxpathMap[key]["un-solicited"] = "string"
c.nxpathMap[key]["ip-sum"] = "string"
}
func (c *CiscoTelemetryMDT) initIgmpSnoop() {
key := "show ip igmp snooping"
c.nxpathMap[key] = make(map[string]string, 20)
c.nxpathMap[key]["repsup"] = "string"
c.nxpathMap[key]["omf_enabled"] = "string"
c.nxpathMap[key]["v3repsup"] = "string"
c.nxpathMap[key]["grepsup"] = "string"
c.nxpathMap[key]["lkupmode"] = "string"
c.nxpathMap[key]["description"] = "string"
c.nxpathMap[key]["vlinklocalgrpsup"] = "string"
c.nxpathMap[key]["gv3repsup"] = "string"
c.nxpathMap[key]["reportfloodall"] = "string"
c.nxpathMap[key]["leavegroupaddress"] = "string"
c.nxpathMap[key]["enabled"] = "string"
c.nxpathMap[key]["omf"] = "string"
c.nxpathMap[key]["sq"] = "string"
c.nxpathMap[key]["sqr"] = "string"
c.nxpathMap[key]["eht"] = "string"
c.nxpathMap[key]["fl"] = "string"
c.nxpathMap[key]["reportfloodenable"] = "string"
c.nxpathMap[key]["snoop-on"] = "string"
c.nxpathMap[key]["glinklocalgrpsup"] = "string"
}
func (c *CiscoTelemetryMDT) initIgmpSnoopGroups() {
key := "show ip igmp snooping groups"
c.nxpathMap[key] = make(map[string]string, 20)
c.nxpathMap[key]["src-uptime"] = "string"
c.nxpathMap[key]["source"] = "string"
c.nxpathMap[key]["dyn-if-name"] = "string"
c.nxpathMap[key]["raddr"] = "string"
c.nxpathMap[key]["old-host"] = "string"
c.nxpathMap[key]["snoop-enabled"] = "string"
c.nxpathMap[key]["expires"] = "string"
c.nxpathMap[key]["omf-enabled"] = "string"
c.nxpathMap[key]["uptime"] = "string"
c.nxpathMap[key]["src-expires"] = "string"
c.nxpathMap[key]["addr"] = "string"
}
func (c *CiscoTelemetryMDT) initIgmpSnoopGroupDetails() {
key := "show ip igmp snooping groups detail"
c.nxpathMap[key] = make(map[string]string, 20)
c.nxpathMap[key]["src-uptime"] = "string"
c.nxpathMap[key]["source"] = "string"
c.nxpathMap[key]["dyn-if-name"] = "string"
c.nxpathMap[key]["raddr"] = "string"
c.nxpathMap[key]["old-host"] = "string"
c.nxpathMap[key]["snoop-enabled"] = "string"
c.nxpathMap[key]["expires"] = "string"
c.nxpathMap[key]["omf-enabled"] = "string"
c.nxpathMap[key]["uptime"] = "string"
c.nxpathMap[key]["src-expires"] = "string"
c.nxpathMap[key]["addr"] = "string"
}
func (c *CiscoTelemetryMDT) initIgmpSnoopGroupsSumm() {
key := "show ip igmp snooping groups summary"
c.nxpathMap[key] = make(map[string]string, 20)
c.nxpathMap[key]["src-uptime"] = "string"
c.nxpathMap[key]["source"] = "string"
c.nxpathMap[key]["dyn-if-name"] = "string"
c.nxpathMap[key]["raddr"] = "string"
c.nxpathMap[key]["old-host"] = "string"
c.nxpathMap[key]["snoop-enabled"] = "string"
c.nxpathMap[key]["expires"] = "string"
c.nxpathMap[key]["omf-enabled"] = "string"
c.nxpathMap[key]["uptime"] = "string"
c.nxpathMap[key]["src-expires"] = "string"
c.nxpathMap[key]["addr"] = "string"
}
func (c *CiscoTelemetryMDT) initMrouter() {
key := "show ip igmp snooping mrouter"
c.nxpathMap[key] = make(map[string]string, 20)
c.nxpathMap[key]["uptime"] = "string"
c.nxpathMap[key]["expires"] = "string"
}
func (c *CiscoTelemetryMDT) initSnoopStats() {
key := "show ip igmp snooping statistics"
c.nxpathMap[key] = make(map[string]string, 20)
c.nxpathMap[key]["ut"] = "string"
}
func (c *CiscoTelemetryMDT) initPimInterface() {
key := "show ip pim interface vrf all"
c.nxpathMap[key] = make(map[string]string, 20)
c.nxpathMap[key]["if-is-border"] = "string"
c.nxpathMap[key]["cached_if_status"] = "string"
c.nxpathMap[key]["genid"] = "string"
c.nxpathMap[key]["if-name"] = "string"
c.nxpathMap[key]["last-cleared"] = "string"
c.nxpathMap[key]["is-pim-vpc-svi"] = "string"
c.nxpathMap[key]["if-addr"] = "string"
c.nxpathMap[key]["is-pim-enabled"] = "string"
c.nxpathMap[key]["pim-dr-address"] = "string"
c.nxpathMap[key]["hello-timer"] = "string"
c.nxpathMap[key]["pim-bfd-enabled"] = "string"
c.nxpathMap[key]["vpc-peer-nbr"] = "string"
c.nxpathMap[key]["nbr-policy-name"] = "string"
c.nxpathMap[key]["is-auto-enabled"] = "string"
c.nxpathMap[key]["if-status"] = "string"
c.nxpathMap[key]["jp-out-policy-name"] = "string"
c.nxpathMap[key]["if-addr-summary"] = "string"
c.nxpathMap[key]["if-dr"] = "string"
c.nxpathMap[key]["jp-in-policy-name"] = "string"
}
func (c *CiscoTelemetryMDT) initPimNeigh() {
key := "show ip pim neighbor vrf all"
c.nxpathMap[key] = make(map[string]string, 20)
c.nxpathMap[key]["longest-hello-intvl"] = "string"
c.nxpathMap[key]["if-name"] = "string"
c.nxpathMap[key]["uptime"] = "string"
c.nxpathMap[key]["expires"] = "string"
c.nxpathMap[key]["bfd-state"] = "string"
}
func (c *CiscoTelemetryMDT) initPimRoute() {
key := "show ip pim route vrf all"
c.nxpathMap[key] = make(map[string]string, 20)
c.nxpathMap[key]["rpf-nbr-1"] = "string"
c.nxpathMap[key]["rpf-nbr-addr"] = "string"
c.nxpathMap[key]["register"] = "string"
c.nxpathMap[key]["sgexpire"] = "string"
c.nxpathMap[key]["oif-bf-str"] = "string"
c.nxpathMap[key]["mcast-addrs"] = "string"
c.nxpathMap[key]["rp-addr"] = "string"
c.nxpathMap[key]["immediate-bf-str"] = "string"
c.nxpathMap[key]["sgr-prune-list-bf-str"] = "string"
c.nxpathMap[key]["context-name"] = "string"
c.nxpathMap[key]["intf-name"] = "string"
c.nxpathMap[key]["immediate-timeout-bf-str"] = "string"
c.nxpathMap[key]["rp-local"] = "string"
c.nxpathMap[key]["sgrexpire"] = "string"
c.nxpathMap[key]["timeout-bf-str"] = "string"
c.nxpathMap[key]["timeleft"] = "string"
}
func (c *CiscoTelemetryMDT) initPimRp() {
key := "show ip pim rp vrf all"
c.nxpathMap[key] = make(map[string]string, 20)
c.nxpathMap[key]["is-bsr-forward-only"] = "string"
c.nxpathMap[key]["is-rpaddr-local"] = "string"
c.nxpathMap[key]["bsr-expires"] = "string"
c.nxpathMap[key]["autorp-expire-time"] = "string"
c.nxpathMap[key]["rp-announce-policy-name"] = "string"
c.nxpathMap[key]["rp-cand-policy-name"] = "string"
c.nxpathMap[key]["is-autorp-forward-only"] = "string"
c.nxpathMap[key]["rp-uptime"] = "string"
c.nxpathMap[key]["rp-owner-flags"] = "string"
c.nxpathMap[key]["df-bits-recovered"] = "string"
c.nxpathMap[key]["bs-timer"] = "string"
c.nxpathMap[key]["rp-discovery-policy-name"] = "string"
c.nxpathMap[key]["arp-rp-addr"] = "string"
c.nxpathMap[key]["auto-rp-addr"] = "string"
c.nxpathMap[key]["autorp-expires"] = "string"
c.nxpathMap[key]["is-autorp-enabled"] = "string"
c.nxpathMap[key]["is-bsr-local"] = "string"
c.nxpathMap[key]["is-autorp-listen-only"] = "string"
c.nxpathMap[key]["autorp-dis-timer"] = "string"
c.nxpathMap[key]["bsr-rp-expires"] = "string"
c.nxpathMap[key]["static-rp-group-map"] = "string"
c.nxpathMap[key]["rp-source"] = "string"
c.nxpathMap[key]["autorp-cand-address"] = "string"
c.nxpathMap[key]["autorp-up-time"] = "string"
c.nxpathMap[key]["is-bsr-enabled"] = "string"
c.nxpathMap[key]["bsr-uptime"] = "string"
c.nxpathMap[key]["is-bsr-listen-only"] = "string"
c.nxpathMap[key]["rpf-nbr-address"] = "string"
c.nxpathMap[key]["is-rp-local"] = "string"
c.nxpathMap[key]["is-autorp-local"] = "string"
c.nxpathMap[key]["bsr-policy-name"] = "string"
c.nxpathMap[key]["grange-grp"] = "string"
c.nxpathMap[key]["rp-addr"] = "string"
c.nxpathMap[key]["anycast-rp-addr"] = "string"
}
func (c *CiscoTelemetryMDT) initPimStats() {
key := "show ip pim statistics vrf all"
c.nxpathMap[key] = make(map[string]string, 1)
c.nxpathMap[key]["vrf-name"] = "string"
}
func (c *CiscoTelemetryMDT) initIntfBrief() {
key := "show interface brief"
c.nxpathMap[key] = make(map[string]string, 2)
c.nxpathMap[key]["speed"] = "string"
c.nxpathMap[key]["vlan"] = "string"
}
func (c *CiscoTelemetryMDT) initPimVrf() {
key := "show ip pim vrf all"
c.nxpathMap[key] = make(map[string]string, 1)
c.nxpathMap[key]["table-id"] = "string"
}
func (c *CiscoTelemetryMDT) initIpMroute() {
key := "show ip mroute summary vrf all"
c.nxpathMap[key] = make(map[string]string, 40)
c.nxpathMap[key]["nat-mode"] = "string"
c.nxpathMap[key]["oif-name"] = "string"
c.nxpathMap[key]["nat-route-type"] = "string"
c.nxpathMap[key]["uptime"] = "string"
c.nxpathMap[key]["mofrr-nbr"] = "string"
c.nxpathMap[key]["extranet_addr"] = "string"
c.nxpathMap[key]["stale-route"] = "string"
c.nxpathMap[key]["pending"] = "string"
c.nxpathMap[key]["bidir"] = "string"
c.nxpathMap[key]["expry_timer"] = "string"
c.nxpathMap[key]["mofrr-iif"] = "string"
c.nxpathMap[key]["group_addrs"] = "string"
c.nxpathMap[key]["mpib-name"] = "string"
c.nxpathMap[key]["rpf"] = "string"
c.nxpathMap[key]["mcast-addrs"] = "string"
c.nxpathMap[key]["route-mdt-iod"] = "string"
c.nxpathMap[key]["sr-oif"] = "string"
c.nxpathMap[key]["stats-rate-buf"] = "string"
c.nxpathMap[key]["source_addr"] = "string"
c.nxpathMap[key]["route-iif"] = "string"
c.nxpathMap[key]["rpf-nbr"] = "string"
c.nxpathMap[key]["translated-route-src"] = "string"
c.nxpathMap[key]["group_addr"] = "string"
c.nxpathMap[key]["lisp-src-rloc"] = "string"
c.nxpathMap[key]["stats-pndg"] = "string"
c.nxpathMap[key]["rate_buf"] = "string"
c.nxpathMap[key]["extranet_vrf_name"] = "string"
c.nxpathMap[key]["fabric-interest"] = "string"
c.nxpathMap[key]["translated-route-grp"] = "string"
c.nxpathMap[key]["internal"] = "string"
c.nxpathMap[key]["oif-mpib-name"] = "string"
c.nxpathMap[key]["oif-uptime"] = "string"
c.nxpathMap[key]["omd-vpc-svi"] = "string"
c.nxpathMap[key]["source_addrs"] = "string"
c.nxpathMap[key]["stale-oif"] = "string"
c.nxpathMap[key]["core-interest"] = "string"
c.nxpathMap[key]["oif-list-bitfield"] = "string"
}
func (c *CiscoTelemetryMDT) initIpv6Mroute() {
key := "show ipv6 mroute summary vrf all"
c.nxpathMap[key] = make(map[string]string, 40)
c.nxpathMap[key]["nat-mode"] = "string"
c.nxpathMap[key]["oif-name"] = "string"
c.nxpathMap[key]["nat-route-type"] = "string"
c.nxpathMap[key]["uptime"] = "string"
c.nxpathMap[key]["mofrr-nbr"] = "string"
c.nxpathMap[key]["extranet_addr"] = "string"
c.nxpathMap[key]["stale-route"] = "string"
c.nxpathMap[key]["pending"] = "string"
c.nxpathMap[key]["bidir"] = "string"
c.nxpathMap[key]["expry_timer"] = "string"
c.nxpathMap[key]["mofrr-iif"] = "string"
c.nxpathMap[key]["group_addrs"] = "string"
c.nxpathMap[key]["mpib-name"] = "string"
c.nxpathMap[key]["rpf"] = "string"
c.nxpathMap[key]["mcast-addrs"] = "string"
c.nxpathMap[key]["route-mdt-iod"] = "string"
c.nxpathMap[key]["sr-oif"] = "string"
c.nxpathMap[key]["stats-rate-buf"] = "string"
c.nxpathMap[key]["source_addr"] = "string"
c.nxpathMap[key]["route-iif"] = "string"
c.nxpathMap[key]["rpf-nbr"] = "string"
c.nxpathMap[key]["translated-route-src"] = "string"
c.nxpathMap[key]["group_addr"] = "string"
c.nxpathMap[key]["lisp-src-rloc"] = "string"
c.nxpathMap[key]["stats-pndg"] = "string"
c.nxpathMap[key]["rate_buf"] = "string"
c.nxpathMap[key]["extranet_vrf_name"] = "string"
c.nxpathMap[key]["fabric-interest"] = "string"
c.nxpathMap[key]["translated-route-grp"] = "string"
c.nxpathMap[key]["internal"] = "string"
c.nxpathMap[key]["oif-mpib-name"] = "string"
c.nxpathMap[key]["oif-uptime"] = "string"
c.nxpathMap[key]["omd-vpc-svi"] = "string"
c.nxpathMap[key]["source_addrs"] = "string"
c.nxpathMap[key]["stale-oif"] = "string"
c.nxpathMap[key]["core-interest"] = "string"
c.nxpathMap[key]["oif-list-bitfield"] = "string"
}
func (c *CiscoTelemetryMDT) initVpc() {
key := "sys/vpc"
c.nxpathMap[key] = make(map[string]string, 5)
c.nxpathMap[key]["type2CompatQualStr"] = "string"
c.nxpathMap[key]["compatQualStr"] = "string"
c.nxpathMap[key]["name"] = "string"
c.nxpathMap[key]["issuFromVer"] = "string"
c.nxpathMap[key]["issuToVer"] = "string"
}
func (c *CiscoTelemetryMDT) initBgp() {
key := "sys/bgp"
c.nxpathMap[key] = make(map[string]string, 18)
c.nxpathMap[key]["dynRtMap"] = "string"
c.nxpathMap[key]["nhRtMap"] = "string"
c.nxpathMap[key]["epePeerSet"] = "string"
c.nxpathMap[key]["asn"] = "string"
c.nxpathMap[key]["peerImp"] = "string"
c.nxpathMap[key]["wght"] = "string"
c.nxpathMap[key]["assocDom"] = "string"
c.nxpathMap[key]["tblMap"] = "string"
c.nxpathMap[key]["unSupprMap"] = "string"
c.nxpathMap[key]["sessionContImp"] = "string"
c.nxpathMap[key]["allocLblRtMap"] = "string"
c.nxpathMap[key]["defMetric"] = "string"
c.nxpathMap[key]["password"] = "string"
c.nxpathMap[key]["retainRttRtMap"] = "string"
c.nxpathMap[key]["clusterId"] = "string"
c.nxpathMap[key]["localAsn"] = "string"
c.nxpathMap[key]["name"] = "string"
c.nxpathMap[key]["defOrgRtMap"] = "string"
}
func (c *CiscoTelemetryMDT) initCh() {
key := "sys/ch"
c.nxpathMap[key] = make(map[string]string, 10)
c.nxpathMap[key]["fanName"] = "string"
c.nxpathMap[key]["typeCordConnected"] = "string"
c.nxpathMap[key]["vendor"] = "string"
c.nxpathMap[key]["model"] = "string"
c.nxpathMap[key]["rev"] = "string"
c.nxpathMap[key]["vdrId"] = "string"
c.nxpathMap[key]["hardwareAlarm"] = "string"
c.nxpathMap[key]["unit"] = "string"
c.nxpathMap[key]["hwVer"] = "string"
}
func (c *CiscoTelemetryMDT) initIntf() {
key := "sys/intf"
c.nxpathMap[key] = make(map[string]string, 10)
c.nxpathMap[key]["descr"] = "string"
c.nxpathMap[key]["name"] = "string"
c.nxpathMap[key]["lastStCause"] = "string"
c.nxpathMap[key]["description"] = "string"
c.nxpathMap[key]["unit"] = "string"
c.nxpathMap[key]["operFECMode"] = "string"
c.nxpathMap[key]["operBitset"] = "string"
c.nxpathMap[key]["mdix"] = "string"
}
func (c *CiscoTelemetryMDT) initProcsys() {
key := "sys/procsys"
c.nxpathMap[key] = make(map[string]string, 10)
c.nxpathMap[key]["name"] = "string"
c.nxpathMap[key]["id"] = "string"
c.nxpathMap[key]["upTs"] = "string"
c.nxpathMap[key]["interval"] = "string"
c.nxpathMap[key]["memstatus"] = "string"
}
func (c *CiscoTelemetryMDT) initProc() {
key := "sys/proc"
c.nxpathMap[key] = make(map[string]string, 2)
c.nxpathMap[key]["processName"] = "string"
c.nxpathMap[key]["procArg"] = "string"
}
func (c *CiscoTelemetryMDT) initBfd() {
key := "sys/bfd/inst"
c.nxpathMap[key] = make(map[string]string, 4)
c.nxpathMap[key]["descr"] = "string"
c.nxpathMap[key]["vrfName"] = "string"
c.nxpathMap[key]["name"] = "string"
c.nxpathMap[key]["name"] = "string"
}
func (c *CiscoTelemetryMDT) initLldp() {
key := "sys/lldp"
c.nxpathMap[key] = make(map[string]string, 7)
c.nxpathMap[key]["sysDesc"] = "string"
c.nxpathMap[key]["portDesc"] = "string"
c.nxpathMap[key]["portIdV"] = "string"
c.nxpathMap[key]["chassisIdV"] = "string"
c.nxpathMap[key]["sysName"] = "string"
c.nxpathMap[key]["name"] = "string"
c.nxpathMap[key]["id"] = "string"
}
func (c *CiscoTelemetryMDT) initDb() {
c.nxpathMap = make(map[string]map[string]string, 200)
c.initPower()
c.initMemPhys()
c.initBgpV4()
c.initCpu()
c.initResources()
c.initPtpCorrection()
c.initTrans()
c.initIgmp()
c.initVrfAll()
c.initIgmpSnoop()
c.initIgmpSnoopGroups()
c.initIgmpSnoopGroupDetails()
c.initIgmpSnoopGroupsSumm()
c.initMrouter()
c.initSnoopStats()
c.initPimInterface()
c.initPimNeigh()
c.initPimRoute()
c.initPimRp()
c.initPimStats()
c.initIntfBrief()
c.initPimVrf()
c.initIpMroute()
c.initIpv6Mroute()
c.initVpc()
c.initBgp()
c.initCh()
c.initIntf()
c.initProcsys()
c.initProc()
c.initBfd()
c.initLldp()
}