#!/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}

