Skip to content

Commit 63813b5

Browse files
authored
fix: generate new snmp engine for every task (#1290)
* fix: generate new snmp engine for every task * test: fix unit test [run-int-tests] * chore: update changelog
1 parent 68a5e4d commit 63813b5

File tree

4 files changed

+33
-11
lines changed

4 files changed

+33
-11
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111
- Enabled AOF persistence by default for data durability
1212
- add CounterBasedGauge64 and ZeroBasedCounter64 as metrics types
1313

14-
### Fixes
14+
### Fixed
1515
- fix problem with service rendering when `traps.service.usemetallb` is set to false
16+
- fix reusing the snmp engine for snmpv3 calls
1617

1718
## [1.14.1]
1819
- update mongodb volumePermission image repository to `bitnamileagcy`

splunk_connect_for_snmp/snmp/auth.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,5 +185,7 @@ def get_auth(
185185
return get_auth_v1(ir)
186186
elif ir.version == "2c":
187187
return get_auth_v2c(ir)
188-
else:
188+
elif ir.version == "3":
189189
return get_auth_v3(logger, ir, snmp_engine)
190+
else:
191+
raise SnmpActionError(f"Wrong SNMP version {ir.version}")

splunk_connect_for_snmp/snmp/manager.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -291,9 +291,9 @@ def __init__(self, **kwargs):
291291
self.profiles_collection = ProfileCollection(self.profiles)
292292
self.profiles_collection.process_profiles()
293293
self.last_modified = time.time()
294-
self.snmpEngine = SnmpEngine()
294+
self.snmp_engine = SnmpEngine()
295295
self.already_loaded_mibs = set()
296-
self.builder = self.snmpEngine.getMibBuilder()
296+
self.builder = self.snmp_engine.getMibBuilder()
297297
self.mib_view_controller = view.MibViewController(self.builder)
298298
compiler.addMibCompiler(self.builder, sources=[MIB_SOURCES])
299299

@@ -315,6 +315,18 @@ def __init__(self, **kwargs):
315315
f"Unable to load mib map from index http error {self.mib_response.status_code}"
316316
)
317317

318+
def get_snmp_engine(self, version="", create_new=False) -> SnmpEngine:
319+
"""
320+
:returns: The new SnmpEngine with mibViewController cache attached if snmp version is 3,
321+
else it reuses already defined snmp poller.
322+
"""
323+
if version == "3" or create_new:
324+
snmp_engine = SnmpEngine()
325+
snmp_engine.cache["mibViewController"] = self.mib_view_controller
326+
return snmp_engine
327+
else:
328+
return self.snmp_engine
329+
318330
def do_work(
319331
self,
320332
ir: InventoryRecord,
@@ -335,7 +347,7 @@ def do_work(
335347
address, walk=walk, profiles=profiles
336348
)
337349

338-
auth_data = get_auth(logger, ir, self.snmpEngine)
350+
auth_data = get_auth(logger, ir, self.get_snmp_engine(ir.version))
339351
context_data = get_context_data()
340352

341353
transport = setup_transport_target(ir)
@@ -399,7 +411,11 @@ def run_get_request(
399411
error_index,
400412
varbind_table,
401413
) in getCmd(
402-
self.snmpEngine, auth_data, transport, context_data, *varbind_chunk
414+
self.get_snmp_engine(create_new=True),
415+
auth_data,
416+
transport,
417+
context_data,
418+
*varbind_chunk,
403419
):
404420
if not _any_failure_happened(
405421
error_indication,
@@ -429,7 +445,7 @@ def run_bulk_request(
429445
error_index,
430446
varbind_table,
431447
) in bulkCmd(
432-
self.snmpEngine,
448+
self.get_snmp_engine(create_new=True),
433449
auth_data,
434450
transport,
435451
context_data,

test/snmp/test_do_work.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class TestDoWork(TestCase):
3333
def test_do_work_no_work_to_do(self):
3434
poller = Poller.__new__(Poller)
3535
poller.last_modified = 1609675634
36-
poller.snmpEngine = None
36+
poller.snmp_engine = None
3737
poller.profiles_manager = MagicMock()
3838
poller.profiles_collection = MagicMock()
3939
poller.profiles_collection.process_profiles = MagicMock()
@@ -57,14 +57,15 @@ def test_do_work_no_work_to_do(self):
5757
@patch("mongolock.MongoLock.release", MagicMock())
5858
@patch("splunk_connect_for_snmp.snmp.auth.get_auth", None)
5959
@patch("splunk_connect_for_snmp.snmp.manager.get_context_data", MagicMock())
60+
@patch("splunk_connect_for_snmp.snmp.manager.Poller.get_snmp_engine", MagicMock())
6061
@patch("splunk_connect_for_snmp.snmp.manager.setup_transport_target", MagicMock())
6162
@patch("splunk_connect_for_snmp.snmp.manager.bulkCmd")
6263
@patch("splunk_connect_for_snmp.snmp.manager.getCmd")
6364
@patch("splunk_connect_for_snmp.common.collection_manager.ProfilesManager")
6465
def test_do_work_bulk(self, load_profiles, getCmd, bulkCmd):
6566
poller = Poller.__new__(Poller)
6667
poller.last_modified = 1609675634
67-
poller.snmpEngine = None
68+
poller.snmp_engine = None
6869
poller.builder = MagicMock()
6970
poller.profiles_manager = MagicMock()
7071
m_process_data = MagicMock()
@@ -93,6 +94,7 @@ def test_do_work_bulk(self, load_profiles, getCmd, bulkCmd):
9394
@patch("mongolock.MongoLock.release", MagicMock())
9495
@patch("splunk_connect_for_snmp.snmp.auth.get_auth", None)
9596
@patch("splunk_connect_for_snmp.snmp.manager.get_context_data", MagicMock())
97+
@patch("splunk_connect_for_snmp.snmp.manager.Poller.get_snmp_engine", MagicMock())
9698
@patch("splunk_connect_for_snmp.snmp.manager.setup_transport_target", MagicMock())
9799
@patch("splunk_connect_for_snmp.snmp.manager.bulkCmd")
98100
@patch("splunk_connect_for_snmp.snmp.manager.getCmd")
@@ -102,7 +104,7 @@ def test_do_work_bulk(self, load_profiles, getCmd, bulkCmd):
102104
def test_do_work_get(self, load_profiles, getCmd, bulkCmd):
103105
poller = Poller.__new__(Poller)
104106
poller.last_modified = 1609675634
105-
poller.snmpEngine = None
107+
poller.snmp_engine = None
106108
poller.builder = MagicMock()
107109
poller.process_snmp_data = MagicMock()
108110
poller.profiles_manager = MagicMock()
@@ -136,6 +138,7 @@ def test_do_work_get(self, load_profiles, getCmd, bulkCmd):
136138
@patch("mongolock.MongoLock.release", MagicMock())
137139
@patch("splunk_connect_for_snmp.snmp.auth.get_auth", None)
138140
@patch("splunk_connect_for_snmp.snmp.manager.get_context_data", MagicMock())
141+
@patch("splunk_connect_for_snmp.snmp.manager.Poller.get_snmp_engine", MagicMock())
139142
@patch("splunk_connect_for_snmp.snmp.manager.setup_transport_target", MagicMock())
140143
@patch("splunk_connect_for_snmp.snmp.manager.bulkCmd")
141144
@patch("splunk_connect_for_snmp.snmp.manager.getCmd")
@@ -145,7 +148,7 @@ def test_do_work_get(self, load_profiles, getCmd, bulkCmd):
145148
def test_do_work_errors(self, load_profiles, getCmd, bulkCmd):
146149
poller = Poller.__new__(Poller)
147150
poller.last_modified = 1609675634
148-
poller.snmpEngine = None
151+
poller.snmp_engine = None
149152
poller.builder = MagicMock()
150153
poller.process_snmp_data = MagicMock()
151154
poller.profiles_manager = MagicMock()

0 commit comments

Comments
 (0)