Add ability to update initializers based on management-api exports

This commit is contained in:
Marco Ceppi 2019-11-25 17:05:49 -05:00
parent 40ddf9a12f
commit 7121d2e2d0

View 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))