#!/usr/bin/env python
"""
  Generate the partitions json file from the $OC* environment variables

  Usage: onos-gen-partitions [output file] [node_ip ...]
  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[2:])
  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
