Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/prometheus/exporter/snmp/snmp_test.go
4096 views
1
package snmp
2
3
import (
4
"testing"
5
"time"
6
7
"github.com/grafana/agent/component"
8
"github.com/grafana/agent/component/discovery"
9
"github.com/grafana/agent/pkg/river"
10
11
"github.com/prometheus/common/model"
12
snmp_config "github.com/prometheus/snmp_exporter/config"
13
"github.com/stretchr/testify/require"
14
)
15
16
func TestUnmarshalRiver(t *testing.T) {
17
riverCfg := `
18
config_file = "modules.yml"
19
target "network_switch_1" {
20
address = "192.168.1.2"
21
module = "if_mib"
22
walk_params = "public"
23
}
24
target "network_router_2" {
25
address = "192.168.1.3"
26
module = "mikrotik"
27
walk_params = "private"
28
}
29
walk_param "private" {
30
version = "2"
31
auth {
32
community = "secret"
33
}
34
}
35
walk_param "public" {
36
version = "2"
37
auth {
38
community = "public"
39
}
40
}
41
`
42
var args Arguments
43
err := river.Unmarshal([]byte(riverCfg), &args)
44
require.NoError(t, err)
45
require.Equal(t, "modules.yml", args.ConfigFile)
46
require.Equal(t, 2, len(args.Targets))
47
48
require.Contains(t, "network_switch_1", args.Targets[0].Name)
49
require.Contains(t, "192.168.1.2", args.Targets[0].Target)
50
require.Contains(t, "if_mib", args.Targets[0].Module)
51
require.Contains(t, "public", args.Targets[0].WalkParams)
52
53
require.Contains(t, "network_router_2", args.Targets[1].Name)
54
require.Contains(t, "192.168.1.3", args.Targets[1].Target)
55
require.Contains(t, "mikrotik", args.Targets[1].Module)
56
require.Contains(t, "private", args.Targets[1].WalkParams)
57
58
require.Equal(t, 2, len(args.WalkParams))
59
60
require.Contains(t, "private", args.WalkParams[0].Name)
61
require.Contains(t, "secret", args.WalkParams[0].Auth.Community)
62
63
require.Contains(t, "public", args.WalkParams[1].Name)
64
require.Contains(t, "public", args.WalkParams[1].Auth.Community)
65
}
66
67
func TestConvertConfig(t *testing.T) {
68
args := Arguments{
69
ConfigFile: "modules.yml",
70
Targets: TargetBlock{{Name: "network_switch_1", Target: "192.168.1.2", Module: "if_mib"}},
71
WalkParams: WalkParams{{Name: "public", Version: 2, Auth: Auth{Community: "public"}}},
72
}
73
74
res := args.Convert()
75
require.Equal(t, "modules.yml", res.SnmpConfigFile)
76
require.Equal(t, 1, len(res.SnmpTargets))
77
require.Equal(t, "network_switch_1", res.SnmpTargets[0].Name)
78
}
79
80
func TestConvertTargets(t *testing.T) {
81
targets := TargetBlock{{
82
Name: "network_switch_1",
83
Target: "192.168.1.2",
84
Module: "if_mib",
85
}}
86
87
res := targets.Convert()
88
require.Equal(t, 1, len(res))
89
require.Equal(t, "network_switch_1", res[0].Name)
90
require.Equal(t, "192.168.1.2", res[0].Target)
91
require.Equal(t, "if_mib", res[0].Module)
92
}
93
94
func TestConvertWalkParams(t *testing.T) {
95
walkParams := WalkParams{{
96
Name: "public",
97
Version: 2,
98
MaxRepetitions: uint32(10),
99
Retries: 3,
100
Timeout: time.Duration(5),
101
UseUnconnectedUDPSocket: true,
102
}}
103
104
res := walkParams.Convert()
105
require.Equal(t, 1, len(res))
106
require.Equal(t, 2, res["public"].Version)
107
require.Equal(t, uint32(10), res["public"].MaxRepetitions)
108
require.Equal(t, 3, res["public"].Retries)
109
require.Equal(t, time.Duration(5), res["public"].Timeout)
110
require.Equal(t, true, res["public"].UseUnconnectedUDPSocket)
111
}
112
113
func TestConvertAuth(t *testing.T) {
114
auth := Auth{
115
Community: "public",
116
SecurityLevel: "authPriv",
117
Username: "user",
118
AuthProtocol: "MD5",
119
PrivProtocol: "DES",
120
Password: "password",
121
PrivPassword: "password",
122
ContextName: "context",
123
}
124
res := auth.Convert()
125
require.Equal(t, snmp_config.Secret("public"), res.Community)
126
require.Equal(t, "authPriv", res.SecurityLevel)
127
require.Equal(t, "user", res.Username)
128
require.Equal(t, "MD5", res.AuthProtocol)
129
require.Equal(t, "DES", res.PrivProtocol)
130
require.Equal(t, snmp_config.Secret("password"), res.Password)
131
require.Equal(t, snmp_config.Secret("password"), res.PrivPassword)
132
require.Equal(t, "context", res.ContextName)
133
}
134
135
func TestBuildSNMPTargets(t *testing.T) {
136
baseArgs := Arguments{
137
ConfigFile: "modules.yml",
138
Targets: TargetBlock{{Name: "network_switch_1", Target: "192.168.1.2", Module: "if_mib", WalkParams: "public"}},
139
WalkParams: WalkParams{{Name: "public", Version: 2, Auth: Auth{Community: "public"}}},
140
}
141
baseTarget := discovery.Target{
142
model.SchemeLabel: "http",
143
model.MetricsPathLabel: "component/prometheus.exporter.snmp.default/metrics",
144
"instance": "prometheus.exporter.snmp.default",
145
"job": "integrations/snmp",
146
"__meta_agent_integration_name": "snmp",
147
"__meta_agent_integration_instance": "prometheus.exporter.snmp.default",
148
}
149
args := component.Arguments(baseArgs)
150
targets := buildSNMPTargets(baseTarget, args)
151
require.Equal(t, 1, len(targets))
152
require.Equal(t, "integrations/snmp/network_switch_1", targets[0]["job"])
153
require.Equal(t, "192.168.1.2", targets[0]["__param_target"])
154
require.Equal(t, "if_mib", targets[0]["__param_module"])
155
require.Equal(t, "public", targets[0]["__param_walk_params"])
156
}
157
158