diff --git a/tools/test/bin/onos-gen-default-cluster b/tools/test/bin/onos-gen-default-cluster
new file mode 100755
index 0000000..e557eda
--- /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
