|
15 | 15 |
|
16 | 16 | match_params = ["device", "name"]
|
17 | 17 | required_assocs = {"device": (Device, "name")}
|
| 18 | +related_assocs = { |
| 19 | + "bridge": (Interface, "name"), |
| 20 | + "lag": (Interface, "name"), |
| 21 | + "parent": (Interface, "name"), |
| 22 | +} |
18 | 23 |
|
19 | 24 | for params in interfaces:
|
20 | 25 | custom_field_data = pop_custom_fields(params)
|
21 | 26 |
|
| 27 | + related_interfaces = {k: params.pop(k, None) for k in related_assocs} |
| 28 | + |
22 | 29 | for assoc, details in required_assocs.items():
|
23 | 30 | model, field = details
|
24 | 31 | query = {field: params.pop(assoc)}
|
|
29 | 36 | interface, created = Interface.objects.get_or_create(**matching_params, defaults=defaults)
|
30 | 37 |
|
31 | 38 | if created:
|
32 |
| - print("🧷 Created interface", interface.name, interface.device.name) |
| 39 | + print(f"🧷 Created interface {interface} on {interface.device}") |
33 | 40 |
|
34 | 41 | 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