Skip to content

Commit b33e79c

Browse files
authored
Bugfix: Inventory - Fix for 2.9 assigned objects for IP addresses (#334)
1 parent 5404678 commit b33e79c

File tree

1 file changed

+30
-5
lines changed

1 file changed

+30
-5
lines changed

plugins/inventory/nb_inventory.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -610,11 +610,19 @@ def extract_interfaces(self, host):
610610

611611
interfaces = list(interfaces_lookup[host["id"]].values())
612612

613+
before_netbox_v29 = bool(self.ipaddresses_lookup)
613614
# Attach IP Addresses to their interface
614615
for interface in interfaces:
615-
interface["ip_addresses"] = list(
616-
self.ipaddresses_lookup[interface["id"]].values()
617-
)
616+
if before_netbox_v29:
617+
interface["ip_addresses"] = list(
618+
self.ipaddresses_lookup[interface["id"]].values()
619+
)
620+
else:
621+
interface["ip_addresses"] = list(
622+
self.vm_ipaddresses_lookup[interface["id"]].values()
623+
if host["is_virtual"]
624+
else self.device_ipaddresses_lookup[interface["id"]].values()
625+
)
618626

619627
return interfaces
620628
except Exception:
@@ -918,20 +926,37 @@ def refresh_ipaddresses(self):
918926
# Construct a dictionary of lists, to allow looking up ip addresses by interface id
919927
# Note that interface ids share the same namespace for both devices and vms so this is a single dictionary
920928
self.ipaddresses_lookup = defaultdict(dict)
929+
# NetBox v2.9 and onwards
930+
self.vm_ipaddresses_lookup = defaultdict(dict)
931+
self.device_ipaddresses_lookup = defaultdict(dict)
921932

922933
for ipaddress in ipaddresses:
934+
# As of NetBox v2.9 "assigned_object_x" replaces "interface"
935+
if ipaddress.get("assigned_object_id"):
936+
interface_id = ipaddress["assigned_object_id"]
937+
ip_id = ipaddress["id"]
938+
# We need to copy the ipaddress entry to preserve the original in case caching is used.
939+
ipaddress_copy = ipaddress.copy()
940+
941+
if ipaddress["assigned_object_type"] == 'virtualization.vminterface':
942+
self.vm_ipaddresses_lookup[interface_id][ip_id] = ipaddress_copy
943+
else:
944+
self.device_ipaddresses_lookup[interface_id][ip_id] = ipaddress_copy # Remove "assigned_object_X" attributes, as that's redundant when ipaddress is added to an interface
945+
946+
del ipaddress_copy["assigned_object_id"]
947+
del ipaddress_copy["assigned_object_type"]
948+
del ipaddress_copy["assigned_object"]
949+
continue
923950

924951
if not ipaddress.get("interface"):
925952
continue
926-
927953
interface_id = ipaddress["interface"]["id"]
928954
ip_id = ipaddress["id"]
929955

930956
# We need to copy the ipaddress entry to preserve the original in case caching is used.
931957
ipaddress_copy = ipaddress.copy()
932958

933959
self.ipaddresses_lookup[interface_id][ip_id] = ipaddress_copy
934-
935960
# Remove "interface" attribute, as that's redundant when ipaddress is added to an interface
936961
del ipaddress_copy["interface"]
937962

0 commit comments

Comments
 (0)