netbox-scripts/interfaces.py

46 lines
1.9 KiB
Python
Raw Normal View History

2025-01-13 10:10:38 +00:00
from dcim.models import Device, Interface
from extras.models import CustomField
from extras.scripts import *
class CreateMLAGScript(Script):
class Meta:
name = 'Create MLAG'
description = 'Create and configure a new MLAG on paired Cumulus leaf switches'
scheduling_enabled = False
switch = ObjectVar(model=Device, query_params={'role': 'switch'},
description='One of the peer switches')
iface = ObjectVar(label='Interface', model=Interface, query_params={'device_id': '$switch'},
description='Switch interface (same for both switches)')
bond_name = StringVar(label='MLAG name', regex='[0-9a-z-]', max_length=15)
mode = ChoiceVar(choices=CustomField.objects.get(name='bond_mode').choices, required=False)
def run(self, data, commit):
switch = data['switch']
iface_name = data['iface'].name
bond_name = data['bond_name']
mode = data['mode']
peer_name = switch.local_context_data.get('peer')
if not peer_name:
raise AbortScript(f'Switch {switch} has no peer defined in local context')
for device in (switch, Device.objects.get(name=peer_name)):
bridge = device.interfaces.get(name='bridge')
iface = device.interfaces.get(name=iface_name)
bond_iface, new = Interface.objects.get_or_create(device=device, name=bond_name, type='lag', bridge=bridge)
if new:
self.log_info(f'created new bond {bond_iface} on {device}')
if mode:
bond_iface.custom_field_data['bond_mode'] = mode
self.log_info(f'setting mode for bond {bond_iface} to {mode}')
bond_iface.full_clean()
bond_iface.save()
iface.enabled = True
2025-01-13 10:10:38 +00:00
iface.lag = bond_iface
self.log_info(f'setting {bond_iface} as LAG for interface {iface}')
iface.full_clean()
iface.save()