diff options
Diffstat (limited to 'examples/tg19/netbox_tools/create_switch.py')
-rw-r--r-- | examples/tg19/netbox_tools/create_switch.py | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/examples/tg19/netbox_tools/create_switch.py b/examples/tg19/netbox_tools/create_switch.py new file mode 100644 index 0000000..f2cf248 --- /dev/null +++ b/examples/tg19/netbox_tools/create_switch.py @@ -0,0 +1,163 @@ +#!/usr/bin/python3 + +import pynetbox +import ipaddress +import re + +import pyargs +import argparse + +parser = argparse.ArgumentParser() +parser.add_argument('-name') +parser.add_argument('-vlanid') +parser.add_argument('-intf', nargs='+') + +args = parser.parse_args() + +nb = pynetbox.api( + 'https://netbox.infra.gathering.org', + token='<Removed>' +) + + +RING_SITE = 2 +RING_DEVICE_ID = 15 +RING_VLAN_GROUP = 1 +RING_NAME = 'r1.ring' +RING_MGMT_v4_PREFIX = 486 +RING_MGMT_V6_PREFIX_ID = 118 +RING_MGMT_V6_PREFIX = "2a06:5841:c:" + +RING_PREFIX_SUPERNET_v4 = 28 +RING_PREFIX_SUPERNET_v6 = 105 + +EDGE_DEVICE_TYPE = 5 +EDGE_DEVICE_ROLE = 11 +EDGE_VLAN_ROLE = 1 +EDGE_LAG_NAME = 'ae0' +EDGE_MGMT_INTF_NAME = 'vlan.666' +EDGE_DEVICE_PLATFORM = 3 +EDGE_UPLINKS = ['ge-0/0/47', 'ge-0/0/46'] + +sysname = args.name + +vlanid = args.vlanid +dist_interfaces = args.intf + +print('Creating VLAN {} with ID {}'.format(sysname, vlanid)) +vlan = nb.ipam.vlans.create( + name=sysname, + vid=vlanid, + status=1, + site=RING_SITE, + group=RING_VLAN_GROUP, + role=EDGE_VLAN_ROLE +) + +nb.ipam.prefixes.get(RING_PREFIX_SUPERNET_v4).available_prefixes.create({ + "prefix_length": 26, + "vlan": vlan.id, + "site": RING_SITE, + "role": EDGE_VLAN_ROLE, + "description": sysname + }) +v4_prefix = nb.ipam.prefixes.get(vlan_id=vlan.id, family=4, status=1) +print('Created Prefix {}'.format(v4_prefix)) + +nb.ipam.prefixes.create( + family = 6, + prefix = RING_MGMT_V6_PREFIX + str(vlan.vid) + "::/64", + vlan = vlan.id, + status = 1, + site = RING_SITE, + role = EDGE_VLAN_ROLE, + description = sysname +) +v6_prefix = nb.ipam.prefixes.get(vlan_id=vlan.id, family=6, status=1) +print('Created Prefix {}'.format(v6_prefix)) + +print('Creating Device {}'.format(sysname)) +switch = nb.dcim.devices.create( + name = sysname, + device_type = EDGE_DEVICE_TYPE, + device_role = EDGE_DEVICE_ROLE, + platform = EDGE_DEVICE_PLATFORM, + site = RING_SITE, + status = 1 +) + +ae_interface = nb.dcim.interfaces.get(device_id=switch.id, name=EDGE_LAG_NAME) +mgmt_interface = nb.dcim.interfaces.get(device_id=switch.id, name=EDGE_MGMT_INTF_NAME) +ring_ae_interface = nb.dcim.interfaces.create( + device = RING_DEVICE_ID, + name = "ae" + vlanid, + form_factor = 200, + description = sysname +) + +ring_irb_interface = nb.dcim.interfaces.create( + device = RING_DEVICE_ID, + name = "irb." + vlanid, + form_factor = 200, + description = sysname +) +ring_ipv4 = nb.ipam.ip_addresses.create( + interface = ring_irb_interface.id, + address = v4_prefix.available_ips.list()[1]['address'], + status = 1, + description = sysname +) +ring_ipv6 = nb.ipam.ip_addresses.create( + interface = ring_irb_interface.id, + address = v6_prefix.available_ips.list()[1]['address'], + status = 1, + description = sysname +) + +for x, uplinks in enumerate(EDGE_UPLINKS): + uplink = nb.dcim.interfaces.get(device_id=switch.id, name=uplinks) + uplink.lag = ae_interface.id + uplink.save() + intf = nb.dcim.interfaces.get(device_id=RING_DEVICE_ID, name=dist_interfaces[x-1]) + print('Creating cable {}:{} -> {}:{}'.format(RING_NAME, intf, sysname, uplink)) + nb.dcim.cables.create( + termination_a_id = intf.id, + termination_a_type = 'dcim.interface', + termination_b_id = uplink.id, + termination_b_type = 'dcim.interface', + status = True, + color = 'c0c0c0' + ) + +for x, interfaces in enumerate(dist_interfaces): + interface = nb.dcim.interfaces.get(device_id=RING_DEVICE_ID, name=interfaces) + interface.lag = ring_ae_interface.id + interface.save() + +mgmt_interface = nb.dcim.interfaces.get(device_id=switch.id, name=EDGE_MGMT_INTF_NAME) + +mgmt_v4_address = nb.ipam.prefixes.get(RING_MGMT_v4_PREFIX).available_ips.list()[0]['address'] +mgmt_v6_address = nb.ipam.prefixes.get(RING_MGMT_V6_PREFIX_ID) +ipv4 = nb.ipam.ip_addresses.create( + interface = mgmt_interface.id, + address = "{}".format(str(mgmt_v4_address)), + status = 1, + description = sysname +) + +p = re.compile('(.*)\.(.*)\.(.*)\.(.*)/(.*)') +m = p.match(mgmt_v4_address) +ipv4_last = m.group(4) +print(str(mgmt_v6_address)) +p = re.compile('(.*)::/(.*)') +m = p.match(str(mgmt_v6_address)) + +ipv6 = nb.ipam.ip_addresses.create( + interface = mgmt_interface.id, + address = "{0}::{1}/64".format(m.group(1), ipv4_last), + status = 1, + description = sysname +) +switch.primary_ip4 = ipv4.id +switch.primary_ip6 = ipv6.id +switch.save() |