diff options
Diffstat (limited to 'tools/netbox/scripts/create-switch/create-switch-tg251.py')
-rw-r--r-- | tools/netbox/scripts/create-switch/create-switch-tg251.py | 158 |
1 files changed, 0 insertions, 158 deletions
diff --git a/tools/netbox/scripts/create-switch/create-switch-tg251.py b/tools/netbox/scripts/create-switch/create-switch-tg251.py deleted file mode 100644 index 2c163d1..0000000 --- a/tools/netbox/scripts/create-switch/create-switch-tg251.py +++ /dev/null @@ -1,158 +0,0 @@ -from extras.scripts import * -from django.core.exceptions import ValidationError - -from dcim.models import Device, DeviceType, Location, DeviceRole, Site, Interface -from dcim.choices import InterfaceModeChoices, InterfaceTypeChoices - -from ipam.models import VLANGroup, VLAN, Role, Prefix, IPAddress -from ipam.choices import PrefixStatusChoices - - -DEFAULT_SITE = Site.objects.get(name='Vikingskipet') -DEFAULT_DEVICE_TYPE = DeviceType.objects.get(model='EX2200-48T-4G') -DEFAULT_DEVICE_ROLE = DeviceRole.objects.get(slug='access-switch') -DEFAULT_TG_DNS_SUFFIX = "tg25.tg.no" - -# VLAN Group to allocate VLANs from -FABRIC_VLAN_GROUP = VLANGroup.objects.get(slug='client-vlans') - -# Vlan role for fabric clients -FABRIC_CLIENTS_ROLE = Role.objects.get(slug='clients') - -# Client networks allocated from here -FABRIC_V4_CLIENTS_PREFIX = Prefix.objects.get(prefix='10.25.0.0/16') -FABRIC_V6_CLIENTS_PREFIX = Prefix.objects.get(prefix='2a06:5844:e::/48') - -# Switch mgmt allocates from here -FABRIC_V4_JUNIPER_MGMT_PREFIX = Prefix.objects.get(prefix='185.110.149.0/25') -FABRIC_V6_JUNIPER_MGMT_PREFIX = Prefix.objects.get(prefix='2a06:5841:f::/64') - -UPLINK_PORTS = { - 'EX2200-48T-4G': ["ge-0/0/45", "ge-0/0/46", "ge-0/0/47", "ge-0/0/48"], -} - -def generatePrefix(prefix, length): - firstPrefix = prefix.get_first_available_prefix() - out = list(firstPrefix.subnet(length, count=1))[0] - return out - -class CreateSwitch(Script): - class Meta: - name = "Create Switch" - description = "Provision a new switch" - commit_default = True - field_order = ['site_name', 'switch_count', 'switch_model'] - fieldsets = "" - scheduling_enabled = False - - switch_name = StringVar( - description = "Switch name. Remember, e = access switch, d = distro switch", - required = True, - default = "e1.test" # default during development - ) - device_type = ObjectVar( - description = "Device model", - model = DeviceType, - default = DEFAULT_DEVICE_TYPE.id, - ) - device_role = ObjectVar( - description = "Device role", - model = DeviceRole, - default = DEFAULT_DEVICE_ROLE.id, - ) - location = ObjectVar( - model = Location, - required = True, - default = Location.objects.get(name="Ringen") # Default during development - ) - - def run(self, data, commit): - if not data['switch_name'].startswith("e") and not data['switch_name'].startswith("d"): - raise ValidationError("Switch name must start whit e or d") - - switch = Device( - name = data['switch_name'], - device_type = data['device_type'], - location = data['location'], - role = data['device_role'], - site = DEFAULT_SITE - ) - switch.save() - self.log_info("Created switch") - - mgmt_interface_name = "irb" - if switch.device_type.model == "EX2200-48T-4G": - mgmt_interface_name = "vlan" - - mgmt_vlan_interface = Interface.objects.create( - device=switch, - name=f"{mgmt_interface_name}.{FABRIC_V4_JUNIPER_MGMT_PREFIX.vlan.id}", - description = f'X: Mgmt', - type=InterfaceTypeChoices.TYPE_VIRTUAL, - mode=InterfaceModeChoices.MODE_TAGGED, - ) - - v4_mgmt_addr = IPAddress.objects.create( - address=FABRIC_V4_JUNIPER_MGMT_PREFIX.get_first_available_ip(), - dns_name=f"{switch.name}.{DEFAULT_TG_DNS_SUFFIX}" - - ) - v6_mgmt_addr = IPAddress.objects.create( - address=FABRIC_V6_JUNIPER_MGMT_PREFIX.get_first_available_ip(), - dns_name=f"{switch.name}.{DEFAULT_TG_DNS_SUFFIX}" - ) - - mgmt_vlan_interface.ip_addresses.add(v4_mgmt_addr) - mgmt_vlan_interface.ip_addresses.add(v6_mgmt_addr) - switch.primary_ip4 = v4_mgmt_addr - switch.primary_ip6 = v6_mgmt_addr - switch.save() - self.log_info("Allocated and assigned mgmt addresses on switch") - - vid = FABRIC_VLAN_GROUP.get_next_available_vid() - vlan = VLAN.objects.create( - name = switch.name, - group = FABRIC_VLAN_GROUP, - role = FABRIC_CLIENTS_ROLE, - vid = vid - ) - vlan.save() - self.log_info("Created VLAN") - - interfaces = list(Interface.objects.filter(device=switch, type=InterfaceTypeChoices.TYPE_1GE_FIXED)) - if len(interfaces) == 0: - self.log_error(f"no interfaces found") - - for interface in interfaces: - if interface.name in UPLINK_PORTS.get(switch.device_type.model, []): - continue - interface.mode = 'access' - interface.untagged_vlan = vlan - interface.description = "C: Clients" - interface.save() - - self.log_info("Configured traffic vlan on all client ports") - - v6_prefix = Prefix.objects.create( - prefix = generatePrefix(FABRIC_V6_CLIENTS_PREFIX, 64), - status = PrefixStatusChoices.STATUS_ACTIVE, - role = FABRIC_CLIENTS_ROLE, - vlan = vlan - ) - - v4_prefix = Prefix.objects.create( - prefix = generatePrefix(FABRIC_V4_CLIENTS_PREFIX, 26), - status = PrefixStatusChoices.STATUS_ACTIVE, - role = FABRIC_CLIENTS_ROLE, - vlan = vlan - ) - self.log_info("Allocated traffic prefixes") - - self.log_success(f"β
Script completed successfully.") - self.log_success(f"π Switch: <a href=\"{switch.get_absolute_url()}\">{switch}</a>") - self.log_success(f"π v6 Prefix: <a href=\"{v6_prefix.get_absolute_url()}\">{v6_prefix}</a>") - self.log_success(f"π v4 Prefix: <a href=\"{v4_prefix.get_absolute_url()}\">{v4_prefix}</a>") - self.log_success(f"π VLAN: <a href=\"{vlan.get_absolute_url()}\">{vlan}</a>") - self.log_success(f"β οΈ <strong>οΈFabric config must be deployed before switch can be fapped.</strong>") - -script = CreateSwitch |