Skip to content
This repository was archived by the owner on Dec 17, 2021. It is now read-only.

Commit 0d3d111

Browse files
feat: aggregate 'is_metric' and 'return_multimetric' parameters to one -> 'data_format'
1 parent 7071f33 commit 0d3d111

File tree

3 files changed

+51
-50
lines changed

3 files changed

+51
-50
lines changed

splunk_connect_for_snmp_mib_server/mib_server.py

Lines changed: 12 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,17 @@
2424

2525

2626
class MibServer:
27+
2728
def __init__(self, args, server_config):
2829
self._args = args
2930
self._server_config = server_config
3031
self._translator = Translator(server_config)
3132
self._flask_app = self.build_flask_app()
33+
self.data_format = {
34+
"METRIC": self._translator.format_metric_data,
35+
"TEXT": self._translator.format_text_event,
36+
"MULTIMETRIC": self._translator.format_multimetric_data
37+
}
3238

3339
def build_flask_app(self):
3440
app = Flask(__name__)
@@ -51,46 +57,19 @@ def autoindex(path="."):
5157
def translator():
5258
logger.debug(request.json)
5359
var_binds = request.json.get("var_binds")
54-
metric = request.args.get("metric")
55-
return_multimetric = request.args.get("return_multimetric")
60+
data_format = request.args.get("data_format")
5661
logger.debug(f"type of var_binds: {type(var_binds)}")
5762
logger.debug(f"var_binds: {var_binds}")
58-
logger.debug(f"return_multimetric: {return_multimetric}")
59-
logger.debug(f"type of metric: {str(metric)} -- metric: {metric}")
60-
if metric == "True":
61-
# if metric is true, var_binds has just one element
62-
var_bind = var_binds[0]
63-
result = json.dumps(self._translator.format_metric_data(var_bind))
63+
logger.debug(f"requested data format: {str(data_format)} ")
64+
if data_format in self.data_format:
65+
method = self.data_format.get(data_format)
66+
result = method(var_binds)
6467
else:
65-
# when 'return_multimetric' variable is set up as 'True', mib server should return both metric and
66-
# non-metric representation of the result
67-
if return_multimetric == "True":
68-
return self._return_multimetric_data(var_binds)
69-
else:
70-
result = self._translator.format_trap_event(var_binds)
68+
result = self._translator.format_text_event(var_binds)
7169
return result
7270

7371
return app
7472

75-
def _return_multimetric_data(self, varbinds: list) -> dict:
76-
"""
77-
If field 'return_multimetric' was set to 'True', mib_server returns dictionary containing metric structure,
78-
non-metric structure and metric name. For example:
79-
80-
{'metric_name': 'sc4snmp.IF-MIB.ifDescr_1',
81-
'metric': '{"metric_name": "sc4snmp.IF-MIB.ifDescr_1", "_value": "lo", "metric_type": "OctetString"}',
82-
'non_metric': 'oid-type1="ObjectIdentity" value1-type="OctetString" 1.3.6.1.2.1.2.2.1.2.1="lo"
83-
value1="lo" IF-MIB::ifDescr.1="lo" '}
84-
85-
:param varbinds: list of varbinds
86-
:return: dictionary of the above structure
87-
"""
88-
result_dict = self._translator.format_metric_data(varbinds[0])
89-
result_string = self._translator.format_trap_event(varbinds)
90-
result = {'metric_name': result_dict['metric_name'], 'metric': json.dumps(result_dict),
91-
'non_metric': result_string}
92-
return result
93-
9473
def run_mib_server(self):
9574
# poetry run fails when debug=True
9675
self._flask_app.run(host="0.0.0.0", port=self._args.port)

splunk_connect_for_snmp_mib_server/translator.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,7 @@ def get_custom_translation_table(self):
271271
return translation_table
272272

273273
# Format and translate the trap events
274-
def format_trap_event(self, var_binds):
274+
def format_text_event(self, var_binds: list):
275275
trap_event_string = ""
276276
offset = 0
277277

@@ -346,11 +346,12 @@ def format_trap_event(self, var_binds):
346346
return trap_event_string
347347

348348
# Format and translate the metric data
349-
def format_metric_data(self, var_bind):
349+
def format_metric_data(self, var_bind: list, index=0):
350350
"""
351351
format one varBind object into metric format
352352
@param var_bind: single varBind object
353353
"""
354+
var_bind = var_bind[index]
354355
metric_data = {}
355356

356357
oid = var_bind["oid"]
@@ -382,3 +383,22 @@ def format_metric_data(self, var_bind):
382383
metric_data["custom_metric_name"] = custom_translated_oid
383384
logger.debug(f"metric_data: {json.dumps(metric_data)}")
384385
return metric_data
386+
387+
def format_multimetric_data(self, varbinds: list) -> dict:
388+
"""
389+
If field 'return_multimetric' was set to 'True', mib_server returns dictionary containing metric structure,
390+
non-metric structure and metric name. For example:
391+
392+
{'metric_name': 'sc4snmp.IF-MIB.ifDescr_1',
393+
'metric': '{"metric_name": "sc4snmp.IF-MIB.ifDescr_1", "_value": "lo", "metric_type": "OctetString"}',
394+
'non_metric': 'oid-type1="ObjectIdentity" value1-type="OctetString" 1.3.6.1.2.1.2.2.1.2.1="lo"
395+
value1="lo" IF-MIB::ifDescr.1="lo" '}
396+
397+
:param varbinds: list of varbinds
398+
:return: dictionary of the above structure
399+
"""
400+
result_dict = self.format_metric_data(varbinds)
401+
result_string = self.format_text_event(varbinds)
402+
result = {'metric_name': result_dict['metric_name'], 'metric': json.dumps(result_dict),
403+
'non_metric': result_string}
404+
return result

tests/test_translator.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ def test_format_trap(self):
111111
},
112112
]
113113

114-
translated_var_binds = self.my_translator.format_trap_event(
114+
translated_var_binds = self.my_translator.format_text_event(
115115
input_var_binds_list
116116
)
117117
assert len(translated_var_binds) > 0
@@ -135,7 +135,7 @@ def test_format_trap_non_existing_oid(self):
135135
},
136136
]
137137

138-
translated_var_binds = self.my_translator.format_trap_event(
138+
translated_var_binds = self.my_translator.format_text_event(
139139
input_var_binds_list
140140
)
141141

@@ -186,38 +186,40 @@ def test_format_trap_invalid_input(self):
186186
},
187187
]
188188

189-
translated_var_binds = self.my_translator.format_trap_event(
189+
translated_var_binds = self.my_translator.format_text_event(
190190
input_var_binds_invalids
191191
)
192192
assert len(translated_var_binds) == 0
193193

194194
@mongomock.patch()
195195
def test_format_metric(self):
196-
input_var_binds = {
196+
input_var_binds = [{
197197
"oid": "1.3.6.1.2.1.1.3.0",
198198
"val": "123",
199199
"val_type": "TimeTicks",
200-
}
200+
}]
201201
translated_dict = self.my_translator.format_metric_data(input_var_binds)
202202
for required_key in ["metric_name", "_value", "metric_type"]:
203203
assert required_key in translated_dict
204204
assert translated_dict["metric_name"] == "sc4snmp.SNMPv2-MIB.sysUpTime_0"
205-
assert translated_dict["_value"] == input_var_binds["val"]
206-
assert translated_dict["metric_type"] == input_var_binds["val_type"]
205+
input_var_bind = input_var_binds[0]
206+
assert translated_dict["_value"] == input_var_bind["val"]
207+
assert translated_dict["metric_type"] == input_var_bind["val_type"]
207208

208209
@mongomock.patch()
209210
def test_format_non_existing_metric(self):
210-
input_var_binds = {
211+
input_var_binds = [{
211212
"oid": "1.3.6666.16666.26666.16666.1.3.0",
212213
"val": "123",
213214
"val_type": "TimeTicks",
214-
}
215+
}]
215216
translated_dict = self.my_translator.format_metric_data(input_var_binds)
216217
for required_key in ["metric_name", "_value", "metric_type"]:
217218
assert required_key in translated_dict
218-
assert translated_dict["_value"] == input_var_binds["val"]
219-
assert translated_dict["metric_type"] == input_var_binds["val_type"]
220-
untranslated_oid = input_var_binds["oid"].replace(".", "_")
219+
input_var_bind = input_var_binds[0]
220+
assert translated_dict["_value"] == input_var_bind["val"]
221+
assert translated_dict["metric_type"] == input_var_bind["val_type"]
222+
untranslated_oid = input_var_bind["oid"].replace(".", "_")
221223
assert translated_dict["metric_name"] == f"sc4snmp.{untranslated_oid}"
222224

223225
@mongomock.patch()
@@ -277,11 +279,11 @@ def test_translate_all_snmp_simulator_data_types(self):
277279
and len(value_types) == len(expected_translations)
278280
)
279281
for index in range(0, len(oids)):
280-
input_var_binds_colons = {
282+
input_var_binds_colons = [{
281283
"oid": oids[index],
282284
"val": str_values[index],
283285
"val_type": value_types[index],
284-
}
286+
}]
285287
translated_metrics = self.my_translator.format_metric_data(
286288
input_var_binds_colons
287289
)
@@ -308,6 +310,6 @@ def test_more_mib_files(self):
308310

309311
for i in range(0, len(input_var_binds)):
310312
translated_dict = self.my_translator.format_metric_data(
311-
input_var_binds[i]
313+
input_var_binds, i
312314
)
313315
assert translated_dict["metric_name"] == expected_values[i]

0 commit comments

Comments
 (0)