mirror of
https://github.com/opennetworkinglab/onos.git
synced 2025-10-18 10:51:04 +02:00
[ONOS-5287] onos-gen-partitions configure partition-size
- Add new '-s partition_size' argument to allow selecting the size of the partitions in a cluster - Add new -n' argument to allow selecting the number of partitions in a cluster - Use argparse to parse arguments - Removed unused imports Change-Id: Ie8ff4a9ef78bea023b32a4cf1c108ede478a8ba0
This commit is contained in:
parent
0455d70199
commit
9eb23c186f
@ -1,16 +1,35 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
"""
|
"""
|
||||||
Generate the partitions json file from the $OC* environment variables
|
usage: onos-gen-partitions [-h] [-s PARTITION_SIZE] [-n NUM_PARTITIONS]
|
||||||
|
[filename] [node_ip [node_ip ...]]
|
||||||
|
|
||||||
Usage: onos-gen-partitions [output file] [node_ip ...]
|
Generate the partitions json file given a list of IPs or from the $OC*
|
||||||
If output file is not provided, the json is written to stdout.
|
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 arguemnts are only processed
|
||||||
|
after the filename argument.
|
||||||
|
|
||||||
|
optional arguments:
|
||||||
|
-h, --help show this help message and exit
|
||||||
|
-s PARTITION_SIZE, --partition-size PARTITION_SIZE
|
||||||
|
Number of nodes per partition. Note that partition
|
||||||
|
sizes smaller than 3 are not fault tolerant. Defaults
|
||||||
|
to 3.
|
||||||
|
-n NUM_PARTITIONS, --num-partitions NUM_PARTITIONS
|
||||||
|
Number of partitions. Defaults to the number of nodes
|
||||||
|
in the cluster.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from os import environ
|
from os import environ
|
||||||
from collections import deque, OrderedDict
|
from collections import deque
|
||||||
|
import argparse
|
||||||
import re
|
import re
|
||||||
import json
|
import json
|
||||||
import sys
|
|
||||||
import hashlib
|
import hashlib
|
||||||
|
|
||||||
convert = lambda text: int(text) if text.isdigit() else text.lower()
|
convert = lambda text: int(text) if text.isdigit() else text.lower()
|
||||||
@ -29,10 +48,10 @@ def get_nodes(ips=None, port=9876):
|
|||||||
ips = [ environ[v] for v in get_OC_vars() ]
|
ips = [ environ[v] for v in get_OC_vars() ]
|
||||||
return [ node(v) for v in ips ]
|
return [ node(v) for v in ips ]
|
||||||
|
|
||||||
def generate_partitions(nodes, k):
|
def generate_partitions(nodes, k, n):
|
||||||
l = deque(nodes)
|
l = deque(nodes)
|
||||||
perms = []
|
perms = []
|
||||||
for i in range(1, len(nodes)+1):
|
for i in range(1, n+1):
|
||||||
part = {
|
part = {
|
||||||
'id': i,
|
'id': i,
|
||||||
'members': list(l)[:k]
|
'members': list(l)[:k]
|
||||||
@ -42,8 +61,33 @@ def generate_partitions(nodes, k):
|
|||||||
return perms
|
return perms
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
nodes = get_nodes(sys.argv[2:])
|
parser = argparse.ArgumentParser(
|
||||||
partitions = generate_partitions([v.get('id') for v in nodes], 3)
|
description="Generate the partitions json file given a list of IPs or from the $OC* environment variables.")
|
||||||
|
parser.add_argument(
|
||||||
|
'-s', '--partition-size', type=int, default=3,
|
||||||
|
help="Number of nodes per partition. Note that partition sizes smaller than 3 are not fault tolerant. Defaults to 3." )
|
||||||
|
parser.add_argument(
|
||||||
|
'-n', '--num-partitions', type=int,
|
||||||
|
help="Number of partitions. Defaults to the number of nodes in the cluster." )
|
||||||
|
# TODO: make filename and nodes independent. This will break backwards compatibility with existing usage.
|
||||||
|
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', metavar='node_ip', type=str, nargs='*',
|
||||||
|
help='IP Address(es) of the node(s) in the cluster. If no IPs are given, ' +
|
||||||
|
'will use the $OC* environment variables. NOTE: these arguemnts' +
|
||||||
|
' are only processed after the filename argument.')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
filename = args.filename
|
||||||
|
partition_size = args.partition_size
|
||||||
|
nodes = get_nodes(args.nodes)
|
||||||
|
num_partitions = args.num_partitions
|
||||||
|
if not num_partitions:
|
||||||
|
num_partitions = len(nodes)
|
||||||
|
|
||||||
|
partitions = generate_partitions([v.get('id') for v in nodes], partition_size, num_partitions)
|
||||||
m = hashlib.sha256()
|
m = hashlib.sha256()
|
||||||
for node in nodes:
|
for node in nodes:
|
||||||
m.update(node['ip'])
|
m.update(node['ip'])
|
||||||
@ -55,8 +99,7 @@ if __name__ == '__main__':
|
|||||||
}
|
}
|
||||||
output = json.dumps(data, indent=4)
|
output = json.dumps(data, indent=4)
|
||||||
|
|
||||||
if len(sys.argv) >= 2 and sys.argv[1] != '-':
|
if filename:
|
||||||
filename = sys.argv[1]
|
|
||||||
with open(filename, 'w') as f:
|
with open(filename, 'w') as f:
|
||||||
f.write(output)
|
f.write(output)
|
||||||
else:
|
else:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user