#!/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))