From 80df3f7634e2b0ec240554998782708adb5acd52 Mon Sep 17 00:00:00 2001
From: Patrick Hemmer <phemmer@users.noreply.github.com>
Date: Wed, 12 Oct 2016 06:00:39 -0400
Subject: [PATCH] snmp: fix initialization of table fields in manual tables
 (#1836)

---
 CHANGELOG.md                               |  1 +
 plugins/inputs/snmp/snmp.go                | 29 ++++++++++++++--------
 plugins/inputs/snmp/snmp_mocks_generate.go |  1 +
 plugins/inputs/snmp/snmp_mocks_test.go     |  1 +
 4 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index b65c68c3..4a003461 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -59,6 +59,7 @@ continue sending logs to /var/log/telegraf/telegraf.log.
 - [#1810](https://github.com/influxdata/telegraf/issues/1810): Fix logparser common log format: numbers in ident.
 - [#1793](https://github.com/influxdata/telegraf/pull/1793): Fix JSON Serialization in OpenTSDB output.
 - [#1731](https://github.com/influxdata/telegraf/issues/1731): Fix Graphite template ordering, use most specific.
+- [#1836](https://github.com/influxdata/telegraf/pull/1836): Fix snmp table field initialization for non-automatic table.
 
 ## v1.0.1 [2016-09-26]
 
diff --git a/plugins/inputs/snmp/snmp.go b/plugins/inputs/snmp/snmp.go
index 6ee257c8..cc750e76 100644
--- a/plugins/inputs/snmp/snmp.go
+++ b/plugins/inputs/snmp/snmp.go
@@ -178,13 +178,30 @@ type Table struct {
 	initialized bool
 }
 
-// init() populates Fields if a table OID is provided.
+// init() builds & initializes the nested fields.
 func (t *Table) init() error {
 	if t.initialized {
 		return nil
 	}
+
+	if err := t.initBuild(); err != nil {
+		return err
+	}
+
+	// initialize all the nested fields
+	for i := range t.Fields {
+		if err := t.Fields[i].init(); err != nil {
+			return err
+		}
+	}
+
+	t.initialized = true
+	return nil
+}
+
+// init() populates Fields if a table OID is provided.
+func (t *Table) initBuild() error {
 	if t.Oid == "" {
-		t.initialized = true
 		return nil
 	}
 
@@ -242,14 +259,6 @@ func (t *Table) init() error {
 		t.Fields = append(t.Fields, Field{Name: col, Oid: mibPrefix + col, IsTag: isTag})
 	}
 
-	// initialize all the nested fields
-	for i := range t.Fields {
-		if err := t.Fields[i].init(); err != nil {
-			return err
-		}
-	}
-
-	t.initialized = true
 	return nil
 }
 
diff --git a/plugins/inputs/snmp/snmp_mocks_generate.go b/plugins/inputs/snmp/snmp_mocks_generate.go
index 59025798..c3c04127 100644
--- a/plugins/inputs/snmp/snmp_mocks_generate.go
+++ b/plugins/inputs/snmp/snmp_mocks_generate.go
@@ -21,6 +21,7 @@ var mockedCommands = [][]string{
 	{"snmptranslate", "-Td", "-Ob", "-m", "all", "1.0.0.1.1"},
 	{"snmptranslate", "-Td", "-Ob", "-m", "all", ".1.0.0.0.1.1"},
 	{"snmptranslate", "-Td", "-Ob", "-m", "all", ".1.0.0.0.1.1.0"},
+	{"snmptranslate", "-Td", "-Ob", "-m", "all", ".1.0.0.0.1.4"},
 	{"snmptranslate", "-Td", "-Ob", "-m", "all", ".1.2.3"},
 	{"snmptranslate", "-Td", "-Ob", ".iso.2.3"},
 	{"snmptranslate", "-Td", "-Ob", "-m", "all", ".999"},
diff --git a/plugins/inputs/snmp/snmp_mocks_test.go b/plugins/inputs/snmp/snmp_mocks_test.go
index 1c41f29e..2f67335d 100644
--- a/plugins/inputs/snmp/snmp_mocks_test.go
+++ b/plugins/inputs/snmp/snmp_mocks_test.go
@@ -67,6 +67,7 @@ var mockedCommandResults = map[string]mockedCommandResult{
 	"snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x001.0.0.1.1":                   mockedCommandResult{stdout: "TEST::hostname\nhostname OBJECT-TYPE\n  -- FROM\tTEST\n  SYNTAX\tOCTET STRING\n  MAX-ACCESS\tread-only\n  STATUS\tcurrent\n::= { iso(1) 0 testOID(0) 1 1 }\n", stderr: "", exitError: false},
 	"snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x00.1.0.0.0.1.1":                mockedCommandResult{stdout: "TEST::server\nserver OBJECT-TYPE\n  -- FROM\tTEST\n  SYNTAX\tOCTET STRING\n  MAX-ACCESS\tread-only\n  STATUS\tcurrent\n::= { iso(1) 0 testOID(0) testTable(0) testTableEntry(1) 1 }\n", stderr: "", exitError: false},
 	"snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x00.1.0.0.0.1.1.0":              mockedCommandResult{stdout: "TEST::server.0\nserver OBJECT-TYPE\n  -- FROM\tTEST\n  SYNTAX\tOCTET STRING\n  MAX-ACCESS\tread-only\n  STATUS\tcurrent\n::= { iso(1) 0 testOID(0) testTable(0) testTableEntry(1) server(1) 0 }\n", stderr: "", exitError: false},
+	"snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x00.1.0.0.0.1.4":                mockedCommandResult{stdout: "TEST::testTableEntry.4\ntestTableEntry OBJECT-TYPE\n  -- FROM\tTEST\n  MAX-ACCESS\tnot-accessible\n  STATUS\tcurrent\n  INDEX\t\t{ server }\n::= { iso(1) 0 testOID(0) testTable(0) testTableEntry(1) 4 }\n", stderr: "", exitError: false},
 	"snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x00.1.2.3":                      mockedCommandResult{stdout: "iso.2.3\niso OBJECT-TYPE\n  -- FROM\t#-1\n::= { iso(1) 2 3 }\n", stderr: "", exitError: false},
 	"snmptranslate\x00-Td\x00-Ob\x00.iso.2.3":                                 mockedCommandResult{stdout: "iso.2.3\niso OBJECT-TYPE\n  -- FROM\t#-1\n::= { iso(1) 2 3 }\n", stderr: "", exitError: false},
 	"snmptranslate\x00-Td\x00-Ob\x00-m\x00all\x00.999":                        mockedCommandResult{stdout: ".999\n [TRUNCATED]\n", stderr: "", exitError: false},
-- 
GitLab