fixes issues with long running jobs and closing connection errors #248

This commit is contained in:
ricardo.bartels@telekom.de
2022-11-27 15:19:04 +01:00
parent ef4abd9721
commit 6541cde47e
6 changed files with 54 additions and 16 deletions

View File

@@ -124,6 +124,7 @@ def do_error_exit(log_text):
def get_relative_time(delta):
"""
https://stackoverflow.com/a/13756038
return a human readable string of a datetime object delta
Parameters
@@ -136,17 +137,20 @@ def get_relative_time(delta):
str: formatted string of time delta
"""
parts = [float(x) for x in str(delta).split(":")]
hour, minute, second = "{:1.0f}:{:1.0f}:{:1.2f}".format(*parts).split(":")
seconds = int(delta.total_seconds())
return_string = list()
if hour != "0":
return_string.append(f"{hour} hour%s" % plural(int(hour)))
if minute != "0":
return_string.append(f"{minute} minute%s" % plural(int(minute)))
periods = [
('day', 60 * 60 * 24),
('hour', 60 * 60),
('minute', 60),
('second', 1)
]
return_string.append(f"{second} seconds")
for period_name, period_seconds in periods:
if seconds >= period_seconds:
period_value, seconds = divmod(seconds, period_seconds)
return_string.append(f"{period_value} {period_name}{plural(period_value)}")
return ", ".join(return_string)

View File

@@ -234,6 +234,14 @@ class NetBoxHandler:
return session
def finish(self):
# closing NetBox connection
try:
self.session.close()
except Exception as e:
log.error(f"unable to close NetBox connection: {e}")
def get_api_version(self):
"""
Perform a basic GET request to extract NetBox API version from header

View File

@@ -211,8 +211,8 @@ class CheckRedfish(SourceBase):
# parse inventory id to int as all NetBox ids are type integer
try:
inventory_id = int(inventory_id)
except ValueError:
log.error(f"Value for meta.inventory_id '{inventory_id}' must be an integer."
except (ValueError, TypeError):
log.error(f"Value for meta.inventory_id '{inventory_id}' must be an integer. "
f"Cannot use inventory_id to match device in NetBox.")
self.device_object = self.inventory.get_by_id(NBDevice, inventory_id)

View File

@@ -37,6 +37,10 @@ class SourceBase:
inventory = None
source_tag = None
# dummy function to implement a finish call for each source
def finish(self):
pass
def map_object_interfaces_to_current_interfaces(self, device_vm_object, interface_data_dict=None):
"""
Try to match current object interfaces to discovered ones. This will be done

View File

@@ -7,7 +7,6 @@
# For a copy, see file LICENSE.txt included in this
# repository or visit: <https://opensource.org/licenses/MIT>.
import atexit
import datetime
import pprint
import re
@@ -185,6 +184,7 @@ class VMWareHandler(SourceBase):
log.info(f"Source '{name}' is currently disabled. Skipping")
return
self._sdk_instance = None
self.create_sdk_session()
if self.session is None:
@@ -412,15 +412,14 @@ class VMWareHandler(SourceBase):
try:
if self.proxy_host is not None and self.proxy_port is not None:
smart_stub = connect.SmartStubAdapter(**connection_params)
instance = vim.ServiceInstance('ServiceInstance', smart_stub)
content = instance.RetrieveContent()
self._sdk_instance = vim.ServiceInstance('ServiceInstance', smart_stub)
content = self._sdk_instance.RetrieveContent()
content.sessionManager.Login(self.username, self.password, None)
else:
instance = connect.SmartConnect(**connection_params)
self._sdk_instance = connect.SmartConnect(**connection_params)
atexit.register(connect.Disconnect, instance)
self.session = instance.RetrieveContent()
self.session = self._sdk_instance.RetrieveContent()
except vim.fault.InvalidLogin as e:
log.error(f"{def_exception_text} {e.msg}")
@@ -496,6 +495,21 @@ class VMWareHandler(SourceBase):
return True
def finish(self):
# closing tag session
if self._sdk_instance is not None:
try:
connect.Disconnect(self._sdk_instance)
except Exception as e:
log.error(f"unable to close vCenter SDK connection: {e}")
# closing SDK session
try:
del self.tag_session
except Exception as e:
log.error(f"unable to close vCenter API instance connection: {e}")
def apply(self):
"""
Main source handler method. This method is called for each source from "main" program

View File

@@ -137,6 +137,14 @@ def main():
# prune orphaned objects from NetBox
nb_handler.prune_data()
# loop over sources and patch netbox data
for source in sources:
# closing all open connections
source.finish()
# closing NetBox connection
nb_handler.finish()
# finish
log.info("Completed NetBox Sync in %s" % get_relative_time(datetime.now() - start_time))