Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Change-Id: Id16c36929c70ee3a5c42a8f9c490adafd4a40008
- Loading branch information
1 parent
072e791
commit 45932c7
Showing
2 changed files
with
101 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
#!/usr/bin/env python | ||
""" | ||
usage: onos-gen-default-cluster [-h] [-s PARTITION_SIZE] [-n NUM_PARTITIONS] | ||
[filename] [node_ip [node_ip ...]] | ||
Generate the partitions json file given a list of IPs or from the $OCC* | ||
environment variables. | ||
positional arguments: | ||
filename File to write output to. If none is provided, output | ||
is written to stdout. | ||
node_ip IP Address(es) of the node(s) in the cluster. If no | ||
IPs are given, will use the $OC* environment | ||
variables. NOTE: these arguments are only processed | ||
after the filename argument. | ||
optional arguments: | ||
-h, --help show this help message and exit | ||
""" | ||
|
||
from os import environ | ||
import argparse | ||
import re | ||
import json | ||
|
||
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_vars_by_type(type): | ||
vars = [] | ||
for var in environ: | ||
if re.match(r"{}[0-9]+".format(type), var): | ||
vars.append(var) | ||
return sorted(vars, key=alphanum_key) | ||
|
||
|
||
def get_vars(): | ||
vars = get_vars_by_type('OCC') | ||
if len(vars) == 0: | ||
vars = get_vars_by_type('OC') | ||
return vars | ||
|
||
|
||
def get_nodes(ips=None, default_port=9876): | ||
node = lambda id, ip, port: {'id': id, 'ip': ip, 'port': port} | ||
result = [] | ||
if not ips: | ||
ips = [environ[v] for v in get_vars()] | ||
i = 1 | ||
for ip_string in ips: | ||
address_tuple = ip_string.split(":") | ||
if len(address_tuple) == 3: | ||
id = address_tuple[0] | ||
ip = address_tuple[1] | ||
port = int(address_tuple[2]) | ||
else: | ||
i += 1 | ||
ip = ip_string | ||
id = ip | ||
port = default_port | ||
result.append(node(id, ip, port)) | ||
return result | ||
|
||
|
||
if __name__ == '__main__': | ||
parser = argparse.ArgumentParser( | ||
description="Generate the partitions json file given a list of IPs or from environment variables.") | ||
|
||
parser.add_argument( | ||
'filename', metavar='filename', type=str, nargs='?', | ||
help='File to write output to. If none is provided, output is written to stdout.') | ||
|
||
parser.add_argument( | ||
'--nodes', '-n', metavar='node_ip', type=str, nargs='+', | ||
help='IP Address(es) of the storage nodes. If no IPs are given, ' + | ||
'will use the $OCC* or $OC* environment variables. NOTE: these arguments' + | ||
' are only processed after the filename argument.') | ||
|
||
args = parser.parse_args() | ||
filename = args.filename | ||
nodes = get_nodes(args.nodes) | ||
|
||
data = { | ||
'name': 'onos', | ||
'controller': nodes | ||
} | ||
output = json.dumps(data, indent=4) | ||
|
||
if filename: | ||
with open(filename, 'w') as f: | ||
f.write(output) | ||
else: | ||
print output |