mirror of
https://github.com/bb-Ricardo/netbox-sync.git
synced 2026-01-19 23:40:26 -06:00
fixes issues with long running jobs and closing connection errors #248
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user