From 45932c7a9c99470da4f946759050f7a4ceab8c4e Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 6 Nov 2018 15:28:00 +0000 Subject: [PATCH] bug 7773 fixed Change-Id: Id16c36929c70ee3a5c42a8f9c490adafd4a40008 --- tools/dev/mininet/onos.py | 9 ++- tools/test/bin/onos-gen-default-cluster | 94 +++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 2 deletions(-) create mode 100755 tools/test/bin/onos-gen-default-cluster diff --git a/tools/dev/mininet/onos.py b/tools/dev/mininet/onos.py index c656a057176..15232ac9047 100755 --- a/tools/dev/mininet/onos.py +++ b/tools/dev/mininet/onos.py @@ -127,7 +127,7 @@ def updateNodeIPs( env, nodes ): return env -tarDefaultPath = 'buck-out/gen/tools/package/onos-package/onos.tar.gz' +tarDefaultPath = "bazel-out/k8-fastbuild/bin/onos.tar.gz" def unpackONOS( destDir='/tmp', run=quietRun ): "Unpack ONOS and return its location" @@ -280,7 +280,7 @@ def genStartConfig( self, env, nodes=() ): self.cmd( 'export PATH=%s:%s:$PATH' % ( onosbin, karafbin ) ) self.cmd( 'cd', self.ONOS_HOME ) self.ucmd( 'mkdir -p config && ' - 'onos-gen-partitions config/cluster.json', + 'onos-gen-default-cluster config/cluster.json --nodes ', ' '.join( node.IP() for node in nodes ) ) def intfsDown( self ): @@ -397,6 +397,11 @@ def waitStarted( self ): ( self.IP(), self.IP(), CopycatPort ) if nodeStr in result: break + + # just break if state is active + if "state=ACTIVE" in result: + break + info( '.' ) self.sanityCheck() time.sleep( 1 ) diff --git a/tools/test/bin/onos-gen-default-cluster b/tools/test/bin/onos-gen-default-cluster new file mode 100755 index 00000000000..e557edac713 --- /dev/null +++ b/tools/test/bin/onos-gen-default-cluster @@ -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