Import Sonar uninventoried MAC addresses as devices

This commit is contained in:
Jack Henry committed 2026-06-03 09:42:49 -07:00
1 parent 6699621300
commit eff689742d
2 files changed
+166 -2

No files matched your search

+45
View File
@@ -70,6 +70,10 @@ def sonarAccountIpAssignmentDeviceNodeId(account_id):
return f"sonar:account-ip-assignments:{account_id}"
def sonarUninventoriedMacAddressDeviceNodeId(uninventoried_mac_address_id):
return f"sonar:uninventoried-mac-address:{uninventoried_mac_address_id}"
def sonarSession():
global _SONAR_SESSION
if _SONAR_SESSION is None:
@@ -480,6 +484,25 @@ def buildAccountDevices(account):
'source': 'account_ip_assignments',
})
for uninventoried_mac_address in account.get('uninventoried_mac_addresses', {}).get('entities', []):
mac_address = (uninventoried_mac_address.get('mac_address') or '').strip()
uninventoried_mac_address_ips = [
ip['subnet']
for ip in uninventoried_mac_address.get('ip_assignments', {}).get('entities', [])
if ip.get('subnet') and ip['subnet'] not in known_ip_subnets
]
if not uninventoried_mac_address_ips:
continue
known_ip_subnets.update(uninventoried_mac_address_ips)
devices.append({
'id': sonarUninventoriedMacAddressDeviceNodeId(uninventoried_mac_address['id']),
'raw_id': uninventoried_mac_address['id'],
'name': f"Uninventoried MAC Address: {mac_address}" if mac_address else "Uninventoried MAC Address",
'ips': uninventoried_mac_address_ips,
'mac': mac_address,
'source': 'uninventoried_mac_addresses',
})
return devices
@@ -629,6 +652,17 @@ def getAccounts(sonar_active_status_ids):
}
}
}
uninventoried_mac_addresses {
entities {
id
mac_address
ip_assignments {
entities {
subnet
}
}
}
}
child_accounts {
entities {
id
@@ -694,6 +728,17 @@ def getAccounts(sonar_active_status_ids):
}
}
}
uninventoried_mac_addresses {
entities {
id
mac_address
ip_assignments {
entities {
subnet
}
}
}
}
all_account_services: account_services {
entities {
service(enabled: true) {
+121 -2
View File
@@ -62,8 +62,8 @@ def inventory_item(item_id, name, ips=None, mac=""):
}
def sonar_account(address_items=None, radius_accounts=None, account_ips=None):
return {
def sonar_account(address_items=None, radius_accounts=None, account_ips=None, uninventoried_mac_addresses=None):
account = {
"id": 1,
"name": "Account 1",
"ip_assignments": {
@@ -82,7 +82,9 @@ def sonar_account(address_items=None, radius_accounts=None, account_ips=None):
},
"radius_accounts": {"entities": radius_accounts or []},
"all_account_services": {"entities": []},
"uninventoried_mac_addresses": {"entities": uninventoried_mac_addresses or []},
}
return account
def radius_account(radius_id, ips):
@@ -94,6 +96,16 @@ def radius_account(radius_id, ips):
}
def uninventoried_mac_address(mac_id, mac_address, ips=None):
return {
"id": mac_id,
"mac_address": mac_address,
"ip_assignments": {
"entities": [{"subnet": subnet} for subnet in (ips or [])]
},
}
class TestIntegrationSonarDevices(unittest.TestCase):
def setUp(self):
integrationSonar.sonar_recurring_service_rates = lambda: []
@@ -213,6 +225,113 @@ class TestIntegrationSonarDevices(unittest.TestCase):
self.assertEqual(devices[2]["id"], "sonar:account-ip-assignments:1")
self.assertEqual(devices[2]["ips"], ["100.64.9.92"])
def test_uninventoried_mac_device_emits_with_stable_id_and_label(self):
devices = integrationSonar.buildAccountDevices(
sonar_account(
uninventoried_mac_addresses=[
uninventoried_mac_address(555, "AA:BB:CC:DD:EE:55", ips=["100.64.12.12/32"]),
]
)
)
self.assertEqual(len(devices), 1)
self.assertEqual(devices[0]["id"], "sonar:uninventoried-mac-address:555")
self.assertEqual(devices[0]["raw_id"], 555)
self.assertEqual(devices[0]["name"], "Uninventoried MAC Address: AA:BB:CC:DD:EE:55")
self.assertEqual(devices[0]["ips"], ["100.64.12.12/32"])
self.assertEqual(devices[0]["mac"], "AA:BB:CC:DD:EE:55")
self.assertEqual(devices[0]["source"], "uninventoried_mac_addresses")
def test_uninventoried_mac_ips_are_deduped_against_inventory_radius_and_account_ips(self):
devices = integrationSonar.buildAccountDevices(
sonar_account(
address_items=[
inventory_item(42, "ONU", ips=["100.64.13.13/32"], mac="AA:BB:CC:DD:EE:42"),
],
radius_accounts=[
radius_account(43, ["100.64.13.14/32"]),
],
account_ips=["100.64.13.15"],
uninventoried_mac_addresses=[
uninventoried_mac_address(444, "AA:BB:CC:DD:EE:44", ips=[
"100.64.13.13/32",
"100.64.13.14/32",
"100.64.13.15",
"100.64.13.16",
]),
],
)
)
self.assertEqual([d["id"] for d in devices], [
"sonar:device:42",
"sonar:radius-account:43",
"sonar:account-ip-assignments:1",
"sonar:uninventoried-mac-address:444",
])
self.assertEqual(devices[3]["ips"], ["100.64.13.16"])
def test_uninventoried_mac_device_is_skipped_when_all_ips_are_duplicates(self):
devices = integrationSonar.buildAccountDevices(
sonar_account(
address_items=[
inventory_item(42, "ONU", ips=["100.64.14.14/32"], mac="AA:BB:CC:DD:EE:42"),
],
uninventoried_mac_addresses=[
uninventoried_mac_address(666, "AA:BB:CC:DD:EE:66", ips=["100.64.14.14/32"]),
],
)
)
self.assertEqual([d["id"] for d in devices], ["sonar:device:42"])
def test_uninventoried_mac_device_is_skipped_when_it_has_no_ip_assignments(self):
devices = integrationSonar.buildAccountDevices(
sonar_account(
address_items=[
inventory_item(42, "ONU", ips=["100.64.15.15/32"], mac="AA:BB:CC:DD:EE:42"),
],
uninventoried_mac_addresses=[
uninventoried_mac_address(777, "AA:BB:CC:DD:EE:77", ips=[]),
],
)
)
self.assertEqual([d["id"] for d in devices], ["sonar:device:42"])
def test_uninventoried_mac_devices_emit_after_account_level_ip_devices(self):
devices = integrationSonar.buildAccountDevices(
sonar_account(
account_ips=["100.64.16.16"],
uninventoried_mac_addresses=[
uninventoried_mac_address(888, "AA:BB:CC:DD:EE:88", ips=["100.64.16.17"]),
],
)
)
self.assertEqual([d["id"] for d in devices], [
"sonar:account-ip-assignments:1",
"sonar:uninventoried-mac-address:888",
])
def test_uninventoried_mac_label_falls_back_when_mac_is_blank(self):
devices = integrationSonar.buildAccountDevices(
sonar_account(
uninventoried_mac_addresses=[
uninventoried_mac_address(999, " ", ips=["100.64.17.17"]),
]
)
)
self.assertEqual(len(devices), 1)
self.assertEqual(devices[0]["name"], "Uninventoried MAC Address")
self.assertEqual(devices[0]["mac"], "")
def test_account_with_no_uninventoried_mac_addresses_emits_no_extra_device(self):
devices = integrationSonar.buildAccountDevices(sonar_account())
self.assertEqual(devices, [])
def test_inventory_mac_devices_are_preserved_when_radius_supplies_ips(self):
devices = integrationSonar.buildAccountDevices(
sonar_account(