Skip to content

Commit 0e7afe4

Browse files
committed
feat: Add support for bridge, lag, parent
1 parent 5c4a1cc commit 0e7afe4

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

initializers/dcim_interfaces.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@
88
##
99
## Examples:
1010

11+
# - device: server01
12+
# name: ath0
13+
# type: 1000base-t
14+
# lag: ae0
15+
# bridge: br0
16+
# - device: server01
17+
# name: ath1
18+
# type: 1000base-t
19+
# parent: ath0
1120
# - device: server01
1221
# enabled: true
1322
# type: virtual

startup_scripts/210_dcim_interfaces.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,17 @@
1515

1616
match_params = ["device", "name"]
1717
required_assocs = {"device": (Device, "name")}
18+
related_assocs = {
19+
"bridge": (Interface, "name"),
20+
"lag": (Interface, "name"),
21+
"parent": (Interface, "name"),
22+
}
1823

1924
for params in interfaces:
2025
custom_field_data = pop_custom_fields(params)
2126

27+
related_interfaces = {k: params.pop(k, None) for k in related_assocs}
28+
2229
for assoc, details in required_assocs.items():
2330
model, field = details
2431
query = {field: params.pop(assoc)}
@@ -29,6 +36,35 @@
2936
interface, created = Interface.objects.get_or_create(**matching_params, defaults=defaults)
3037

3138
if created:
32-
print("🧷 Created interface", interface.name, interface.device.name)
39+
print(f"🧷 Created interface {interface} on {interface.device}")
3340

3441
set_custom_fields_values(interface, custom_field_data)
42+
43+
for related_field, related_value in related_interfaces.items():
44+
if not related_value:
45+
continue
46+
47+
r_model, r_field = related_assocs[related_field]
48+
49+
if related_field == "parent" and not interface.parent_id:
50+
query = {r_field: related_value, "device": interface.device}
51+
try:
52+
related_obj = r_model.objects.get(**query)
53+
except Interface.DoesNotExist:
54+
print(f"⚠️ Could not find parent interface with: {query} for interface {interface}")
55+
raise
56+
57+
interface.parent_id = related_obj.id
58+
interface.save()
59+
print(
60+
f"🧷 Attached interface {interface} on {interface.device} "
61+
f"to parent {related_obj}"
62+
)
63+
else:
64+
query = {r_field: related_value, "device": interface.device, "type": related_field}
65+
related_obj, rel_obj_created = r_model.objects.get_or_create(**query)
66+
67+
if rel_obj_created:
68+
setattr(interface, f"{related_field}_id", related_obj.id)
69+
interface.save()
70+
print(f"🧷 Created {related_field} interface {interface} on {interface.device}")

0 commit comments

Comments
 (0)