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