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

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

if __name__ == '__main__':
  nodes = get_nodes(sys.argv[2:])
  partitions = generate_partitions_HA([v.get('id') for v in nodes], 3)
  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
