#!/usr/bin/env python 
'''
  Generate the partitions json file from the $OC* environment variables
  
  Usage: onos-gen-partitions [output file]
  If output file is not provided, the json is written to stdout.
'''

from os import environ
from collections import deque, OrderedDict
import re
import json
import sys

convert = lambda text: int(text) if text.isdigit() else text.lower() 
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)] 

def get_OC_vars():
  vars = []
  for var in environ:
    if re.match(r"OC[0-9]+", var):
      vars.append(var)
  return sorted(vars, key=alphanum_key)

def get_nodes(vars, port=9876):
  node = lambda k: { 'id': k, 'ip': k, 'port': port }
  return [ node(environ[v]) for v in vars ]

def generate_permutations(nodes, k):
  l = deque(nodes)
  perms = []
  for i in range(1, len(nodes)+1):
    part = {
             'name': 'p%d' % i,
             'members': list(l)[:k]
           }
    perms.append(part)
    l.rotate(-1)
  return perms

if __name__ == '__main__':
  vars = get_OC_vars()
  nodes = get_nodes(vars)
  partitions = generate_permutations([v.get('id') for v in nodes], 3)
  data = {
           'name': 'default',
           'nodes': nodes,
           'partitions': partitions 
         }
  output = json.dumps(data, indent=4)

  if len(sys.argv) == 2:
    filename = sys.argv[1]
    with open(filename, 'w') as f:
      f.write(output)
  else:
    print output
