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

Commit 490fff6

Browse files
fix: fix issue with onetime walk not running (#168)
* fix: fix issue with onetime walk not running * fix: fix unit tests * fix: add fix for profile matching onetime IF-MIB walk
1 parent f8ddd79 commit 490fff6

File tree

4 files changed

+46
-24
lines changed

4 files changed

+46
-24
lines changed

splunk_connect_for_snmp_poller/manager/poller.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -123,35 +123,39 @@ def __check_inventory(self):
123123
continue
124124
inventory_entry_keys.add(entry_key)
125125
ir_host = return_database_id(ir.host)
126-
if ir_host not in inventory_hosts:
127-
self.add_enricher_to_a_host(
128-
new_enricher, profiles, copy.deepcopy(ir), True
129-
)
130-
inventory_hosts.add(return_database_id(ir_host))
126+
inventory_hosts.add(ir_host)
131127
inventory_hosts_with_snmp_data[ir_host] = copy.deepcopy(ir)
132128
if ir.profile == DYNAMIC_PROFILE:
133129
self.delete_all_entries_per_host(ir.host)
134130
self.add_device_for_profile_matching(ir)
131+
self.check_if_new_host_was_added(entry_key, ir, new_enricher)
135132
else:
136133
logger.debug(
137134
"[-] server_config['profiles']: %s",
138135
self._server_config["profiles"],
139136
)
140137
if entry_key not in self._jobs_map:
138+
self.check_if_new_host_was_added(entry_key, ir, new_enricher)
141139
self.process_new_job(entry_key, ir, profiles)
142140
else:
143141
self.update_schedule_for_changed_conf(entry_key, ir, profiles)
144142

145143
if server_config_modified:
146144
if new_enricher != self._old_enricher:
147-
self.run_enricher_check(
148-
new_enricher, profiles, inventory_hosts_with_snmp_data
145+
self.run_enricher_changed_check(
146+
new_enricher, inventory_hosts_with_snmp_data
149147
)
150148
self.clean_job_inventory(inventory_entry_keys, inventory_hosts)
151149

152-
def run_enricher_check(
153-
self, new_enricher, profiles, inventory_hosts_with_snmp_data
154-
):
150+
def check_if_new_host_was_added(self, host_key, inventory_record, new_enricher):
151+
ir_host = return_database_id(host_key)
152+
if self._old_enricher != {}:
153+
logger.info(f"New host: {ir_host}")
154+
self.__add_enricher_to_a_host(
155+
new_enricher, copy.deepcopy(inventory_record), True
156+
)
157+
158+
def run_enricher_changed_check(self, new_enricher, inventory_hosts_with_snmp_data):
155159
logger.info(
156160
f"Previous enricher: {self._old_enricher} \n New enricher: {new_enricher}"
157161
)
@@ -161,19 +165,19 @@ def run_enricher_check(
161165
self._old_enricher = {}
162166
return
163167
for inventory_host in inventory_hosts_with_snmp_data.keys():
164-
self.add_enricher_to_a_host(
165-
new_enricher, profiles, inventory_hosts_with_snmp_data[inventory_host]
168+
self.__add_enricher_to_a_host(
169+
new_enricher, inventory_hosts_with_snmp_data[inventory_host]
166170
)
167171
self._old_enricher = new_enricher
168172

169-
def add_enricher_to_a_host(self, current_enricher, profiles, ir, new_host=False):
173+
def __add_enricher_to_a_host(self, current_enricher, ir, new_host=False):
174+
logger.info("Add enricher to a host")
170175
old_enricher = {} if new_host else self._old_enricher
171176
if current_enricher != {}:
172177
update_enricher_config(
173178
old_enricher,
174179
current_enricher,
175180
self._mongo,
176-
profiles,
177181
ir,
178182
self._server_config,
179183
self.__get_splunk_indexes(),

splunk_connect_for_snmp_poller/manager/poller_utilities.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ def _extract_sys_uptime_instance(
163163

164164

165165
def _walk_info(mongo_collection, host, current_sys_up_time):
166-
host_already_walked = mongo_collection.contains_host(host) != 0
166+
host_already_walked = mongo_collection.first_time_walked_was_initiated(host) != 0
167+
logger.info(f"host_already_walked: {host_already_walked}")
167168
should_do_walk = not host_already_walked
168169
if host_already_walked:
169170
previous_sys_up_time = mongo_collection.real_time_data_for(host)
@@ -275,6 +276,10 @@ def automatic_realtime_task(
275276
host_already_walked,
276277
sys_up_time,
277278
)
279+
if should_do_walk:
280+
mongo_collection.update_walked_host(
281+
db_host_id, {"walked_first_time": True}
282+
)
278283
except Exception:
279284
logger.exception("Error during automatic_realtime_task")
280285

@@ -283,15 +288,14 @@ def update_enricher_config(
283288
old_enricher,
284289
new_enricher,
285290
mongo,
286-
profiles,
287291
inventory_host,
288292
server_config,
289293
splunk_indexes,
290294
):
291295
run_ifmib_walk = is_ifmib_different(old_enricher, new_enricher)
292296
if run_ifmib_walk:
293297
_update_enricher_config_with_ifmib(
294-
profiles, inventory_host, server_config, splunk_indexes
298+
inventory_host, server_config, splunk_indexes
295299
)
296300
else:
297301
_update_enricher_config_for_additional_varbinds(
@@ -304,17 +308,17 @@ def update_enricher_config(
304308

305309

306310
def _update_enricher_config_with_ifmib(
307-
profiles,
308311
inventory_host,
309312
server_config,
310313
splunk_indexes,
311314
):
312315
inventory_host.profile = OidConstant.IF_MIB
313-
snmp_polling.delay(
314-
inventory_host.to_json(),
316+
schedule.every().second.do(
317+
onetime_task,
318+
inventory_host,
315319
server_config,
316320
splunk_indexes,
317-
profiles,
321+
None,
318322
)
319323

320324

splunk_connect_for_snmp_poller/mongo.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,14 @@ def is_connected(self):
108108
def contains_host(self, host):
109109
return self._walked_hosts.find({"_id": host}).count()
110110

111+
def first_time_walked_was_initiated(self, host):
112+
return self._walked_hosts.find({"_id": host, "walked_first_time": True}).count()
113+
111114
def add_host(self, host):
112-
self._walked_hosts.insert_one({"_id": host})
115+
try:
116+
self._walked_hosts.insert_one({"_id": host})
117+
except: # noqa: E722
118+
logger.info(f"Id {host} already exists in MongoDB")
113119

114120
def get_all_unwalked_hosts(self):
115121
return list(self._unwalked_hosts.find({}))
@@ -136,6 +142,14 @@ def delete_host(self, host):
136142
def clear(self):
137143
self._walked_hosts.remove()
138144

145+
def update_walked_host(self, host, element):
146+
self._walked_hosts.find_one_and_update(
147+
{"_id": host},
148+
{"$set": element},
149+
return_document=ReturnDocument.AFTER,
150+
upsert=True,
151+
)
152+
139153
def real_time_data_for(self, host):
140154
full_collection = self._walked_hosts.find_one({"_id": host})
141155
if (

tests/test_poller.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323

2424
class TestPollerUtilities(TestCase):
25-
def test_run_enricher_check_when_enricher_is_deleted(self):
25+
def test_run_enricher_changed_check_when_enricher_is_deleted(self):
2626
server_config = {"mongo": ""}
2727
with patch(
2828
"splunk_connect_for_snmp_poller.mongo.WalkedHostsRepository.__init__"
@@ -42,5 +42,5 @@ def test_run_enricher_check_when_enricher_is_deleted(self):
4242
with patch(
4343
"splunk_connect_for_snmp_poller.mongo.WalkedHostsRepository.delete_all_static_data"
4444
):
45-
obj.run_enricher_check({}, [], {"127.0.0.1:161": MagicMock()})
45+
obj.run_enricher_changed_check({}, {"127.0.0.1:161": MagicMock()})
4646
self.assertEqual(obj._old_enricher, {})

0 commit comments

Comments
 (0)