From 7121d2e2d0e9a30975ea751a5214e84ad8c021d3 Mon Sep 17 00:00:00 2001 From: Marco Ceppi Date: Mon, 25 Nov 2019 17:05:49 -0500 Subject: [PATCH] Add ability to update initializers based on management-api exports --- scripts/management-api-to-initializers | 156 +++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100755 scripts/management-api-to-initializers diff --git a/scripts/management-api-to-initializers b/scripts/management-api-to-initializers new file mode 100755 index 000000000..3a840ae03 --- /dev/null +++ b/scripts/management-api-to-initializers @@ -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))