Skip to content

Commit ae5246f

Browse files
committed
fixes issue with properly assigned MAC addresses
1 parent 4a61095 commit ae5246f

2 files changed

Lines changed: 40 additions & 12 deletions

File tree

module/netbox/object_classes.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1454,6 +1454,7 @@ def __init__(self, *args, **kwargs):
14541454
}
14551455
super().__init__(*args, **kwargs)
14561456

1457+
14571458
class NBSiteGroup(NetBoxObject):
14581459
name = "site group"
14591460
api_path = "dcim/site-groups"
@@ -1995,11 +1996,20 @@ def get_ip_addresses(self):
19951996

19961997
result_list = list()
19971998
for ip_object in self.inventory.get_all_items(NBIPAddress):
1998-
if grab(ip_object, "data.assigned_object_id") == self:
1999+
if ip_object.data.get("assigned_object_id") == self:
19992000
result_list.append(ip_object)
20002001

20012002
return result_list
20022003

2004+
def get_mac_addresses(self):
2005+
2006+
result_list = list()
2007+
for mac_object in self.inventory.get_all_items(NBMACAddress):
2008+
if mac_object.data.get("assigned_object_id") == self:
2009+
result_list.append(mac_object)
2010+
2011+
return result_list
2012+
20032013

20042014
class NBInterface(NetBoxObject):
20052015
name = "interface"
@@ -2038,11 +2048,20 @@ def get_ip_addresses(self):
20382048

20392049
result_list = list()
20402050
for ip_object in self.inventory.get_all_items(NBIPAddress):
2041-
if grab(ip_object, "data.assigned_object_id") == self:
2051+
if ip_object.data.get("assigned_object_id") == self:
20422052
result_list.append(ip_object)
20432053

20442054
return result_list
20452055

2056+
def get_mac_addresses(self):
2057+
2058+
result_list = list()
2059+
for mac_object in self.inventory.get_all_items(NBMACAddress):
2060+
if mac_object.data.get("assigned_object_id") == self:
2061+
result_list.append(mac_object)
2062+
2063+
return result_list
2064+
20462065
def update(self, data=None, read_from_netbox=False, source=None):
20472066

20482067
# remove definition of interface type if a parent interface is set as it only supports virtual types

module/sources/common/source_base.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -322,30 +322,39 @@ def add_update_interface(self, interface_object, device_object, interface_data,
322322
interface_object.update(data=interface_data, source=self)
323323

324324
if version.parse(self.inventory.netbox_api_version) >= version.parse("4.2.0") and \
325-
interface_mac_address is not None :
326-
327-
primary_mac_address_object = grab(interface_object, "data.primary_mac_address")
325+
interface_mac_address is not None:
328326

329327
primary_mac_address_data = {
330328
"mac_address": interface_mac_address,
331329
"assigned_object_id": interface_object,
332330
"assigned_object_type": interface_class
333331
}
334332

335-
if (primary_mac_address_object is None or
336-
grab(primary_mac_address_object, "data.mac_address") != interface_mac_address):
333+
primary_mac_address_object = None
334+
# check for associated MAC addresses on existing interface
335+
if interface_object.is_new is False:
336+
current_primary_mac_address_object = grab(interface_object, "data.primary_mac_address")
337+
if grab(current_primary_mac_address_object, "data.mac_address") == interface_mac_address:
338+
primary_mac_address_object = current_primary_mac_address_object
339+
for mac_address_object in interface_object.get_mac_addresses():
340+
if (primary_mac_address_object is None and
341+
grab(mac_address_object, "data.mac_address") == interface_mac_address):
342+
primary_mac_address_object = mac_address_object
343+
if mac_address_object is not primary_mac_address_object:
344+
mac_address_object.remove_interface_association()
337345

338-
primary_mac_address_object = None
346+
# if a new interface or not matching assigned MAC address, try to find an existing unassigned mac address
347+
if primary_mac_address_object is None:
339348
for mac_address_object in self.inventory.get_all_items(NBMACAddress):
340349
if (grab(mac_address_object, "data.mac_address") == interface_mac_address and
341350
grab(mac_address_object, "data.assigned_object_id") is None):
342351
primary_mac_address_object = mac_address_object
343352
break
344353

345-
if primary_mac_address_object is None:
346-
primary_mac_address_object = self.inventory.add_object(NBMACAddress, data=primary_mac_address_data, source=self)
347-
else:
348-
primary_mac_address_object.update(data=primary_mac_address_data, source=self)
354+
# of no existing mac address could be found, create a new one
355+
if primary_mac_address_object is None:
356+
primary_mac_address_object = self.inventory.add_object(NBMACAddress, data=primary_mac_address_data,
357+
source=self)
349358
else:
350359
primary_mac_address_object.update(data=primary_mac_address_data, source=self)
351360

0 commit comments

Comments
 (0)