mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-27 19:08:38 -06:00
Add ability to update initializers based on management-api exports
This commit is contained in:
parent
40ddf9a12f
commit
7121d2e2d0
156
scripts/management-api-to-initializers
Executable file
156
scripts/management-api-to-initializers
Executable file
@ -0,0 +1,156 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import os
|
||||||
|
import csv
|
||||||
|
import sys
|
||||||
|
import yaml
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
here = Path(__file__).parent
|
||||||
|
|
||||||
|
def sku_parser(uri):
|
||||||
|
resource = uri.lower().replace('.vio.sh', '').replace('-', '.')
|
||||||
|
|
||||||
|
data = {
|
||||||
|
'market': None,
|
||||||
|
'site': None,
|
||||||
|
'cluster': None,
|
||||||
|
'rack': None,
|
||||||
|
'locker': None,
|
||||||
|
}
|
||||||
|
|
||||||
|
parts = resource.split('.')
|
||||||
|
parts.reverse()
|
||||||
|
|
||||||
|
data.update(dict(zip(data.keys(), parts)))
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
def sku_builder(*, market=None, site=None, cluster=None, rack=None, locker=None, base='vio.ke', sep='.'):
|
||||||
|
uri = base or ''
|
||||||
|
|
||||||
|
if not market:
|
||||||
|
return uri
|
||||||
|
|
||||||
|
uri = f'{market}{sep}{uri}'
|
||||||
|
|
||||||
|
if uri.endswith(sep):
|
||||||
|
uri = uri[:-1]
|
||||||
|
|
||||||
|
if not site:
|
||||||
|
return uri
|
||||||
|
|
||||||
|
uri = f'{site}{sep}{uri}'
|
||||||
|
|
||||||
|
if not cluster:
|
||||||
|
return uri
|
||||||
|
|
||||||
|
uri = f'{cluster}{sep}{uri}'
|
||||||
|
|
||||||
|
if not rack:
|
||||||
|
return uri
|
||||||
|
|
||||||
|
uri = f'{rack}{sep}{uri}'
|
||||||
|
|
||||||
|
if not locker:
|
||||||
|
return uri
|
||||||
|
|
||||||
|
return f'{locker}{sep}{uri}'
|
||||||
|
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description='Managemenet API csv export to initializer yaml')
|
||||||
|
parser.add_argument(
|
||||||
|
'lockers',
|
||||||
|
type=argparse.FileType('r'),
|
||||||
|
metavar='export.csv',
|
||||||
|
help='lockers csv export'
|
||||||
|
)
|
||||||
|
|
||||||
|
lockers = []
|
||||||
|
racks = {}
|
||||||
|
rack_groups = {}
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
data = [r for r in csv.reader(args.lockers)]
|
||||||
|
header = data.pop(0)
|
||||||
|
locker_data = [dict(zip(header, r)) for r in data]
|
||||||
|
|
||||||
|
lockers = []
|
||||||
|
|
||||||
|
rack_roles = {
|
||||||
|
'f': 'Facility',
|
||||||
|
'a': 'Customer',
|
||||||
|
'b': 'Utility',
|
||||||
|
}
|
||||||
|
|
||||||
|
for locker in locker_data:
|
||||||
|
rack_group = locker['name'].rsplit(' ', 1)[0]
|
||||||
|
uri = sku_parser(locker['sku'])
|
||||||
|
|
||||||
|
if 'r' in uri['rack']:
|
||||||
|
continue
|
||||||
|
|
||||||
|
zone_id = locker['zone_id']
|
||||||
|
|
||||||
|
if 'w' in uri['rack']:
|
||||||
|
rack_name = '{} {}'.format(rack_group, 'Facility' if locker['locker_id'].lower() == 'f' else 'Zone {}'.format(locker['locker_id'][-1]))
|
||||||
|
|
||||||
|
if not rack_group in rack_groups:
|
||||||
|
rack_uri = uri.copy()
|
||||||
|
del rack_uri['locker']
|
||||||
|
rack_groups[rack_group] = {
|
||||||
|
'name': rack_group,
|
||||||
|
'site': locker['site_location'],
|
||||||
|
'slug': sku_builder(sep='-', base='', **rack_uri).lower(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if not rack_name in racks:
|
||||||
|
rack_uri = uri.copy()
|
||||||
|
rack_uri['locker'] = locker['locker_id'][-1]
|
||||||
|
racks[rack_name] = {
|
||||||
|
'name': rack_name,
|
||||||
|
'group': rack_group,
|
||||||
|
'role': rack_roles.get(locker['locker_id'][-1].lower()),
|
||||||
|
'type': '4-post cabinet',
|
||||||
|
'u_height': '36',
|
||||||
|
'width': '19',
|
||||||
|
'site': locker['site_location'],
|
||||||
|
'facility_id': sku_builder(base='', **rack_uri).lower(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if 'f' == uri['locker']:
|
||||||
|
continue
|
||||||
|
|
||||||
|
l = {
|
||||||
|
'name': locker['name'],
|
||||||
|
'face': 'Front',
|
||||||
|
'device_type': '9U Locker',
|
||||||
|
'rack': rack_name,
|
||||||
|
'position': 1 if not zone_id.isnumeric() else 9 * (int(zone_id) - 1) + 1,
|
||||||
|
'site': locker['site_location'],
|
||||||
|
'device_role': 'Customer Network Locker' if locker['locker_id'][-1] == 'B' else 'Customer Compute Locker',
|
||||||
|
'custom_fields': {
|
||||||
|
'sf_id': locker['id'],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if locker['account']:
|
||||||
|
l['tenant'] = locker['account']
|
||||||
|
|
||||||
|
lockers.append(l)
|
||||||
|
|
||||||
|
initializers_dir = here.parent / 'docker' / 'initializers'
|
||||||
|
|
||||||
|
with open(initializers_dir / 'devices.yml', 'w+') as f:
|
||||||
|
f.write(yaml.dump(lockers, default_flow_style=False))
|
||||||
|
|
||||||
|
with open(initializers_dir / 'racks.yml', 'w+') as f:
|
||||||
|
f.write(yaml.dump(list(racks.values()), default_flow_style=False))
|
||||||
|
|
||||||
|
with open(initializers_dir / 'rack_groups.yml', 'w+') as f:
|
||||||
|
f.write(yaml.dump(list(rack_groups.values()), default_flow_style=False))
|
||||||
|
|
||||||
|
#args.output.write(yaml.dump(output, default_flow_style=False))
|
Loading…
Reference in New Issue
Block a user