#!/bin/bash
# -----------------------------------------------------------------------------
# Creates a hierarchical access spine-leaf fabric with large number of hosts
# using null providers.
#
# Default setup as follows:
#   2 primary spines (or more if needed, but this is typically not the case)
#   2 aggregating spines per access headend
#   ~3 access leaves per headend
#   2 leaf pairs for connecting gateways and compute (services/caching/etc.)
# -----------------------------------------------------------------------------

function usage {
    echo "usage: $(basename $0) [options] [onos-ip]"
    echo ""
    echo "Options:"
    echo "  -s spines"
    echo "  -l spineLinks"
    echo "  -S serviceHosts"
    echo "  -G gateways"
    echo "  -f fieldOffices"
    echo "  -a accessLeaves"
    echo "  -A accessHosts"
    exit 1
}

spines=2
spineLinks=2
serviceLeafGroups="A B"
serviceHosts=10
fieldOffices=3
accessLeaves=3
accessHosts=60
gateways=2

# Scan arguments for user/password or other options...
while getopts s:l:a:f:A:S:G:?h o; do
    case "$o" in
        s) spines=$OPTARG;;
        l) spineLinks=$OPTARG;;
        a) accessLeaves=$OPTARG;;
        f) fieldOffices=$OPTARG;;
        A) accessHosts=$OPTARG;;
        S) serviceHosts=$OPTARG;;
        G) gateways=$OPTARG;;
        *) usage $0;;
    esac
done

spinePorts=48
let leafPorts=serviceHosts+8     # derive service ports from service hosts
let accessPorts=accessHosts+8    # derive access ports from access hosts
let hagPorts=accessLeaves+8      # derive hag ports from access leaves

let totalHags=fieldOffices*spines
let totalAccess=fieldOffices*accessLeaves

let OPC=$OPTIND-1
shift $OPC

# Optional ONOS node IP
node=${1:-$OCI}

# Create the script of ONOS commands first and then execute it all at once.
export CMDS="/tmp/access-onos.cmds"
rm -f $CMDS 2>/dev/null

function sim {
    echo "$@" >> $CMDS
}

# Create central office spines
for spine in $(seq 1 $spines); 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 $serviceLeafGroups; do
    [ $pair = A ] && l1=1 || l1=3
    [ $pair = A ] && l2=2 || l2=4
    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 $(seq 1 $spines); do
        for link in $(seq 1 $spineLinks); do
            sim "null-create-link direct Spine-${spine} Leaf-${pair}1"
            sim "null-create-link direct Spine-${spine} Leaf-${pair}2"
        done
    done

    # Create gateways attached to each leaf group; multi-homed to each leaf in the pair
    [ $pair = A ] && pn=1 || pn=2
    for gw in $(seq 1 $gateways); do
        sim "null-create-host Leaf-${pair}1,Leaf-${pair}2 10.${pn}.0.${gw}"
    done

    # Create hosts for each leaf group; multi-homed to each leaf in the pair
    [ $pair = A ] && offset=-400 || offset=400
    for host in $(seq 1 $serviceHosts); do
        sim "null-create-host Leaf-${pair}1,Leaf-${pair}2 10.${pn}.1.${host}"
    done
done

# Create field offices
for field in $(seq $fieldOffices); do
    # Create HAG spines for each office and connect it to central office spines
    for spine in $(seq $spines); do
        sim "null-create-device switch Spine-${field}-${spine} ${hagPorts}"
        sim "null-create-link direct Spine-${spine} Spine-${field}-${spine}"
    done

    # Create single access leafs with links to the spines
    for access in $(seq $accessLeaves); do
        sim "null-create-device switch Access-${field}-${access} ${accessPorts}"
        for spine in $(seq 1 $spines); do
            sim "null-create-link direct Spine-${field}-${spine} Access-${field}-${access}"
        done

        # Create hosts for each access single leaf
        sim "null-create-hosts Access-${field}-${access} 10.${field}${access}.1.* $accessHosts"
    done
done

# make sure null providers are activated and any running simulation is stopped
onos ${node} app activate org.onosproject.null
sleep 2
onos ${node} null-simulation stop

# wait until the masterships clear-out across the cluster
while onos ${node} masters | grep -qv " 0 devices"; do sleep 1; done

# clean-up
onos ${node} wipe-out please
sleep 1

# start custom simulation..
onos ${node} null-simulation start custom
sleep 2

# Add devices, links, and hosts
cat $CMDS | onos ${node}

