From 0e7afe466dc1f138f7ca8934f070b9760f518f49 Mon Sep 17 00:00:00 2001 From: kr3ator <48438188+kr3ator@users.noreply.github.com> Date: Fri, 8 Apr 2022 18:25:52 +0200 Subject: [PATCH] feat: Add support for bridge, lag, parent --- initializers/dcim_interfaces.yml | 9 ++++++ startup_scripts/210_dcim_interfaces.py | 38 +++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/initializers/dcim_interfaces.yml b/initializers/dcim_interfaces.yml index 4030530..4db416f 100644 --- a/initializers/dcim_interfaces.yml +++ b/initializers/dcim_interfaces.yml @@ -8,6 +8,15 @@ ## ## Examples: +# - device: server01 +# name: ath0 +# type: 1000base-t +# lag: ae0 +# bridge: br0 +# - device: server01 +# name: ath1 +# type: 1000base-t +# parent: ath0 # - device: server01 # enabled: true # type: virtual diff --git a/startup_scripts/210_dcim_interfaces.py b/startup_scripts/210_dcim_interfaces.py index b217f3b..6e57e73 100644 --- a/startup_scripts/210_dcim_interfaces.py +++ b/startup_scripts/210_dcim_interfaces.py @@ -15,10 +15,17 @@ if interfaces is None: match_params = ["device", "name"] required_assocs = {"device": (Device, "name")} +related_assocs = { + "bridge": (Interface, "name"), + "lag": (Interface, "name"), + "parent": (Interface, "name"), +} for params in interfaces: custom_field_data = pop_custom_fields(params) + related_interfaces = {k: params.pop(k, None) for k in related_assocs} + for assoc, details in required_assocs.items(): model, field = details query = {field: params.pop(assoc)} @@ -29,6 +36,35 @@ for params in interfaces: interface, created = Interface.objects.get_or_create(**matching_params, defaults=defaults) if created: - print("🧷 Created interface", interface.name, interface.device.name) + print(f"🧷 Created interface {interface} on {interface.device}") set_custom_fields_values(interface, custom_field_data) + + for related_field, related_value in related_interfaces.items(): + if not related_value: + continue + + r_model, r_field = related_assocs[related_field] + + if related_field == "parent" and not interface.parent_id: + query = {r_field: related_value, "device": interface.device} + try: + related_obj = r_model.objects.get(**query) + except Interface.DoesNotExist: + print(f"⚠️ Could not find parent interface with: {query} for interface {interface}") + raise + + interface.parent_id = related_obj.id + interface.save() + print( + f"🧷 Attached interface {interface} on {interface.device} " + f"to parent {related_obj}" + ) + else: + query = {r_field: related_value, "device": interface.device, "type": related_field} + related_obj, rel_obj_created = r_model.objects.get_or_create(**query) + + if rel_obj_created: + setattr(interface, f"{related_field}_id", related_obj.id) + interface.save() + print(f"🧷 Created {related_field} interface {interface} on {interface.device}")