Skip to content

Commit

Permalink
fix: collapsed fields by calling more indepth function (influxdata#10430
Browse files Browse the repository at this point in the history
)
  • Loading branch information
MyaLongmire committed Jan 27, 2022
1 parent bfac209 commit 84c1efb
Show file tree
Hide file tree
Showing 6 changed files with 128 additions and 241 deletions.
22 changes: 22 additions & 0 deletions internal/snmp/testdata/mibs/testmib
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
TGTEST-MIB DEFINITIONS ::= BEGIN

org OBJECT IDENTIFIER ::= { iso 3 } -- "iso" = 1
dod OBJECT IDENTIFIER ::= { org 6 }
internet OBJECT IDENTIFIER ::= { dod 1 }
mgmt OBJECT IDENTIFIER ::= { internet 2 }
mibs OBJECT IDENTIFIER ::= { mgmt 1 }
system OBJECT IDENTIFIER ::= { mibs 1 }
systemUpTime OBJECT IDENTIFIER ::= { system 3 }
sysUpTimeInstance OBJECT IDENTIFIER ::= { systemUpTime 0 }

private OBJECT IDENTIFIER ::= { internet 4 }
enterprises OBJECT IDENTIFIER ::= { private 1 }

snmpV2 OBJECT IDENTIFIER ::= { internet 6 }
snmpModules OBJECT IDENTIFIER ::= { snmpV2 3 }
snmpMIB OBJECT IDENTIFIER ::= { snmpModules 1 }
snmpMIBObjects OBJECT IDENTIFIER ::= { snmpMIB 1 }
snmpTraps OBJECT IDENTIFIER ::= { snmpMIBObjects 5 }
coldStart OBJECT IDENTIFIER ::= { snmpTraps 1 }

END
27 changes: 17 additions & 10 deletions internal/snmp/translate.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,22 +111,29 @@ type MibEntry struct {
}

func TrapLookup(oid string) (e MibEntry, err error) {
var node gosmi.SmiNode
node, err = gosmi.GetNodeByOID(types.OidMustFromString(oid))
var givenOid types.Oid
if givenOid, err = types.OidFromString(oid); err != nil {
return e, fmt.Errorf("could not convert OID %s: %w", oid, err)
}

// ensure modules are loaded or node will be empty (might not error)
if err != nil {
// Get node name
var node gosmi.SmiNode
if node, err = gosmi.GetNodeByOID(givenOid); err != nil {
return e, err
}
e.OidText = node.Name

e.OidText = node.RenderQualified()
// Add not found OID part
if !givenOid.Equals(node.Oid) {
e.OidText += "." + givenOid[len(node.Oid):].String()
}

i := strings.Index(e.OidText, "::")
if i == -1 {
return e, fmt.Errorf("not found")
// Get module name
module := node.GetModule()
if module.Name != "<well-known>" {
e.MibName = module.Name
}
e.MibName = e.OidText[:i]
e.OidText = e.OidText[i+2:]

return e, nil
}

Expand Down
89 changes: 89 additions & 0 deletions internal/snmp/translate_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package snmp

import (
"testing"

"github.com/stretchr/testify/require"

"github.com/influxdata/telegraf/testutil"
)

func TestTrapLookup(t *testing.T) {
tests := []struct {
name string
oid string
expected MibEntry
}{
{
name: "Known trap OID",
oid: ".1.3.6.1.6.3.1.1.5.1",
expected: MibEntry{
MibName: "TGTEST-MIB",
OidText: "coldStart",
},
},
{
name: "Known trap value OID",
oid: ".1.3.6.1.2.1.1.3.0",
expected: MibEntry{
MibName: "TGTEST-MIB",
OidText: "sysUpTimeInstance",
},
},
{
name: "Unknown enterprise sub-OID",
oid: ".1.3.6.1.4.1.0.1.2.3",
expected: MibEntry{
MibName: "TGTEST-MIB",
OidText: "enterprises.0.1.2.3",
},
},
{
name: "Unknown MIB",
oid: ".1.2.3",
expected: MibEntry{OidText: "iso.2.3"},
},
}

// Load the MIBs
require.NoError(t, LoadMibsFromPath([]string{"testdata/mibs"}, testutil.Logger{}))

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Run the actual test
actual, err := TrapLookup(tt.oid)
require.NoError(t, err)
require.Equal(t, tt.expected, actual)
})
}
}

func TestTrapLookupFail(t *testing.T) {
tests := []struct {
name string
oid string
expected string
}{
{
name: "New top level OID",
oid: ".3.6.1.3.0",
expected: "Could not find node for OID 3.6.1.3.0",
},
{
name: "Malformed OID",
oid: ".1.3.dod.1.3.0",
expected: "could not convert OID .1.3.dod.1.3.0: strconv.ParseUint: parsing \"dod\": invalid syntax",
},
}

// Load the MIBs
require.NoError(t, LoadMibsFromPath([]string{"testdata/mibs"}, testutil.Logger{}))

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Run the actual test
_, err := TrapLookup(tt.oid)
require.EqualError(t, err, tt.expected)
})
}
}
94 changes: 0 additions & 94 deletions plugins/inputs/snmp_trap/snmp_trap_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package snmp_trap
import (
"fmt"
"net"
"path/filepath"
"strconv"
"strings"
"testing"
Expand Down Expand Up @@ -1312,96 +1311,3 @@ func TestReceiveTrap(t *testing.T) {
})
}
}

func TestGosmiSingleMib(t *testing.T) {
// We would prefer to specify port 0 and let the network
// stack choose an unused port for us but TrapListener
// doesn't have a way to return the autoselected port.
// Instead, we'll use an unusual port and hope it's
// unused.
const port = 12399

// Hook into the trap handler so the test knows when the
// trap has been received
received := make(chan int)
wrap := func(f gosnmp.TrapHandlerFunc) gosnmp.TrapHandlerFunc {
return func(p *gosnmp.SnmpPacket, a *net.UDPAddr) {
f(p, a)
received <- 0
}
}

fakeTime := time.Unix(456456456, 456)
now := uint32(123123123)

testDataPath, err := filepath.Abs("./testdata")
require.NoError(t, err)

trap := gosnmp.SnmpTrap{
Variables: []gosnmp.SnmpPDU{
{
Name: ".1.3.6.1.2.1.1.3.0",
Type: gosnmp.TimeTicks,
Value: now,
},
{
Name: ".1.3.6.1.6.3.1.1.4.1.0", // SNMPv2-MIB::snmpTrapOID.0
Type: gosnmp.ObjectIdentifier,
Value: ".1.3.6.1.6.3.1.1.5.1", // coldStart
},
},
}

metrics := []telegraf.Metric{
testutil.MustMetric(
"snmp_trap", // name
map[string]string{ // tags
"oid": ".1.3.6.1.6.3.1.1.5.1",
"name": "coldStart",
"mib": "SNMPv2-MIB",
"version": "2c",
"source": "127.0.0.1",
"community": "public",
},
map[string]interface{}{ // fields
"sysUpTimeInstance": now,
},
fakeTime,
),
}

// Set up the service input plugin
s := &SnmpTrap{
ServiceAddress: "udp://:" + strconv.Itoa(port),
makeHandlerWrapper: wrap,
timeFunc: func() time.Time {
return fakeTime
},
lookupFunc: snmp.TrapLookup,
Log: testutil.Logger{},
Version: "2c",
Path: []string{testDataPath},
}
require.NoError(t, s.Init())

var acc testutil.Accumulator
require.Nil(t, s.Start(&acc))
defer s.Stop()

goSNMP := newGoSNMP(gosnmp.Version2c, port)

// Send the trap
sendTrap(t, goSNMP, trap)

// Wait for trap to be received
select {
case <-received:
case <-time.After(2 * time.Second):
t.Fatal("timed out waiting for trap to be received")
}

// Verify plugin output
testutil.RequireMetricsEqual(t,
metrics, acc.GetTelegrafMetrics(),
testutil.SortMetrics())
}
40 changes: 0 additions & 40 deletions plugins/inputs/snmp_trap/testdata/test.mib

This file was deleted.

97 changes: 0 additions & 97 deletions plugins/inputs/snmp_trap/testdata/test2

This file was deleted.

0 comments on commit 84c1efb

Please sign in to comment.