Fixing null provider custom topo simulator

- properly deal with device mastership
- allow creation of multi-homed hosts
- made UI location parameters optional
- added a simulated fabric script

Change-Id: I8558cc06aa4c323fab898b02fba9659b202c5392
diff --git a/tools/test/topos/cfab-null b/tools/test/topos/cfab-null
new file mode 100755
index 0000000..8993d2e
--- /dev/null
+++ b/tools/test/topos/cfab-null
@@ -0,0 +1,85 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+# Creates a spine-leaf fabric with large number of hosts using null providers
+# -----------------------------------------------------------------------------
+
+# config
+node=${1:-$OCI}
+
+# Create the script of ONOS commands first and then execute it all at once.
+export CMDS="/tmp/fab-onos.cmds"
+rm $CMDS
+
+function sim {
+    echo "$@" >> $CMDS
+}
+
+sim "wipe-out please"
+
+spinePorts=48
+leafPorts=64
+accessPorts=1024
+
+# Create spines
+for spine in {1..2}; do
+    sim "null-create-device switch Spine-${spine} ${spinePorts}"
+done
+
+# Create 2 leaf pairs with dual links to the spines and a link between the pair
+for pair in A B; do
+    sim "null-create-device switch Leaf-${pair}1 ${leafPorts}"
+    sim "null-create-device switch Leaf-${pair}2 ${leafPorts}"
+    sim "null-create-link direct Leaf-${pair}1 Leaf-${pair}2"
+
+    for spine in {1..2}; do
+        for link in {1..2}; do
+            sim "null-create-link direct Spine-${spine} Leaf-${pair}1"
+            sim "null-create-link direct Spine-${spine} Leaf-${pair}2"
+        done
+    done
+
+    # Create hosts for each leaf group; multi-homed to each leaf in the pair
+    [ $pair = A ] && pn=1 || pn=2
+    for host in {1..10}; do
+        sim "null-create-host Leaf-${pair}1,Leaf-${pair}2 10.${pn}.1.${host}"
+    done
+done
+
+# Create 8 single leafs with dual links to the spines
+for access in {1..8}; do
+    sim "null-create-device switch Access-${access} ${accessPorts}"
+
+    for spine in {1..2}; do
+        for link in {1..2}; do
+            sim "null-create-link direct Spine-${spine} Access-${access}"
+        done
+    done
+
+    # Create hosts for each single leaf
+    for host in {1..25}; do
+        sim "null-create-host Access-${access} 10.0.${access}.${host}"
+    done
+done
+
+
+
+# make sure null providers are activated
+onos ${node} app activate org.onosproject.null
+
+sleep 2
+
+# start custom simulation..
+onos ${node} null-simulation start custom
+
+# Generate the recipe using the following:
+# 2 spines, can potentially be few more
+# 12 leaves in total
+#     2 leaf pair
+#     8 non-paired
+# Host per leaf up to 1K
+
+sleep 5
+
+# Add devices, links, and hosts
+cat $CMDS | onos ${node}
+