#!/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
import hashlib

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(ips=None, port=9876):
  node = lambda k: { 'id': k, 'ip': k, 'port': port }
  if not ips:
    ips = [ environ[v] for v in get_OC_vars() ]
  return [ node(v) for v in ips ]

def generate_base_partition(nodes):
  return {
            'id': 0,
            'members': nodes
         }

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

if __name__ == '__main__':
  nodes = get_nodes(sys.argv[1:])
  base_partition = generate_base_partition([v.get('id') for v in nodes])
  extended_partitions = generate_extended_partitions([v.get('id') for v in nodes], 3)
  partitions = []
  partitions.append(base_partition)
  partitions.extend(extended_partitions)
  m = hashlib.sha256()
  for node in nodes:
    m.update(node['ip'])
  name = int(m.hexdigest()[:8], base=16) # 32-bit int based on SHA256 digest
  data = {
           'name': name,
           '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
