blob: 0fff17b4ac7098c9346d9e0e8e98a738d4e25485 [file] [log] [blame]
Thomas Vachuska722224e2018-03-26 10:56:18 -07001#!/bin/bash
2# -----------------------------------------------------------------------------
Thomas Vachuska0d933862018-04-06 00:29:30 -07003# Creates a hierarchical access spine-leaf fabric with large number of hosts
4# using null providers.
Thomas Vachuska722224e2018-03-26 10:56:18 -07005#
6# Default setup as follows:
Thomas Vachuska0d933862018-04-06 00:29:30 -07007# 2 primary spines (or more if needed, but this is typically not the case)
8# 2 aggregating spines per access headend
9# ~3 access leaves per headend
10#   2 leaf pairs for connecting gateways and compute (services/caching/etc.)
Thomas Vachuska722224e2018-03-26 10:56:18 -070011# -----------------------------------------------------------------------------
12
13function usage {
14 echo "usage: $(basename $0) [options] [onos-ip]"
15 echo ""
16 echo "Options:"
17 echo " -s spines"
18 echo " -l spineLinks"
19 echo " -S serviceHosts"
Thomas Vachuska0d933862018-04-06 00:29:30 -070020 echo " -G gateways"
Thomas Vachuska722224e2018-03-26 10:56:18 -070021 echo " -f fieldOffices"
22 echo " -a accessLeaves"
23 echo " -A accessHosts"
24 exit 1
25}
26
27spines=2
28spineLinks=2
29serviceLeafGroups="A B"
30serviceHosts=10
31fieldOffices=3
32accessLeaves=3
33accessHosts=60
Thomas Vachuska0d933862018-04-06 00:29:30 -070034gateways=2
Thomas Vachuska722224e2018-03-26 10:56:18 -070035
36# Scan arguments for user/password or other options...
Thomas Vachuska0d933862018-04-06 00:29:30 -070037while getopts s:l:a:f:A:S:G:?h o; do
Thomas Vachuska722224e2018-03-26 10:56:18 -070038 case "$o" in
39 s) spines=$OPTARG;;
40 l) spineLinks=$OPTARG;;
41 a) accessLeaves=$OPTARG;;
42 f) fieldOffices=$OPTARG;;
43 A) accessHosts=$OPTARG;;
44 S) serviceHosts=$OPTARG;;
Thomas Vachuska0d933862018-04-06 00:29:30 -070045 G) gateways=$OPTARG;;
Thomas Vachuska722224e2018-03-26 10:56:18 -070046 *) usage $0;;
47 esac
48done
49
50spinePorts=48
51let leafPorts=serviceHosts+8 # derive service ports from service hosts
52let accessPorts=accessHosts+8 # derive access ports from access hosts
53let hagPorts=accessLeaves+8 # derive hag ports from access leaves
54
55let totalHags=fieldOffices*spines
56let totalAccess=fieldOffices*accessLeaves
57
58let OPC=$OPTIND-1
59shift $OPC
60
61# Optional ONOS node IP
62node=${1:-$OCI}
63
64# Create the script of ONOS commands first and then execute it all at once.
Thomas Vachuska0d933862018-04-06 00:29:30 -070065export CMDS="/tmp/access-onos.cmds"
66rm -f $CMDS 2>/dev/null
Thomas Vachuska722224e2018-03-26 10:56:18 -070067
68function sim {
69 echo "$@" >> $CMDS
70}
71
Thomas Vachuska722224e2018-03-26 10:56:18 -070072# Create central office spines
73for spine in $(seq 1 $spines); do
Thomas Vachuska1351e7e2018-04-19 16:24:22 -070074 sim "null-create-device switch Spine-${spine} ${spinePorts}"
Thomas Vachuska722224e2018-03-26 10:56:18 -070075done
76
77# Create 2 leaf pairs with dual links to the spines and a link between the pair
78for pair in $serviceLeafGroups; do
79 [ $pair = A ] && l1=1 || l1=3
80 [ $pair = A ] && l2=2 || l2=4
Thomas Vachuska1351e7e2018-04-19 16:24:22 -070081 sim "null-create-device switch Leaf-${pair}1 ${leafPorts}"
82 sim "null-create-device switch Leaf-${pair}2 ${leafPorts}"
Thomas Vachuska722224e2018-03-26 10:56:18 -070083 sim "null-create-link direct Leaf-${pair}1 Leaf-${pair}2"
84
85 for spine in $(seq 1 $spines); do
86 for link in $(seq 1 $spineLinks); do
87 sim "null-create-link direct Spine-${spine} Leaf-${pair}1"
88 sim "null-create-link direct Spine-${spine} Leaf-${pair}2"
89 done
90 done
91
Thomas Vachuska0d933862018-04-06 00:29:30 -070092 # Create gateways attached to each leaf group; multi-homed to each leaf in the pair
Thomas Vachuska722224e2018-03-26 10:56:18 -070093 [ $pair = A ] && pn=1 || pn=2
Thomas Vachuska0d933862018-04-06 00:29:30 -070094 for gw in $(seq 1 $gateways); do
Thomas Vachuska1351e7e2018-04-19 16:24:22 -070095 sim "null-create-host Leaf-${pair}1,Leaf-${pair}2 10.${pn}.0.${gw}"
Thomas Vachuska0d933862018-04-06 00:29:30 -070096 done
97
98 # Create hosts for each leaf group; multi-homed to each leaf in the pair
Thomas Vachuska722224e2018-03-26 10:56:18 -070099 for host in $(seq 1 $serviceHosts); do
Thomas Vachuska1351e7e2018-04-19 16:24:22 -0700100 sim "null-create-host Leaf-${pair}1,Leaf-${pair}2 10.${pn}.1.${host}"
Thomas Vachuska722224e2018-03-26 10:56:18 -0700101 done
102done
103
Thomas Vachuska722224e2018-03-26 10:56:18 -0700104# Create field offices
105for field in $(seq $fieldOffices); do
106 # Create HAG spines for each office and connect it to central office spines
107 for spine in $(seq $spines); do
Thomas Vachuska1351e7e2018-04-19 16:24:22 -0700108 sim "null-create-device switch Spine-${field}-${spine} ${hagPorts}"
Thomas Vachuska722224e2018-03-26 10:56:18 -0700109 sim "null-create-link direct Spine-${spine} Spine-${field}-${spine}"
Thomas Vachuska722224e2018-03-26 10:56:18 -0700110 done
111
112 # Create single access leafs with links to the spines
113 for access in $(seq $accessLeaves); do
Thomas Vachuska1351e7e2018-04-19 16:24:22 -0700114 sim "null-create-device switch Access-${field}-${access} ${accessPorts}"
Thomas Vachuska722224e2018-03-26 10:56:18 -0700115 for spine in $(seq 1 $spines); do
116 sim "null-create-link direct Spine-${field}-${spine} Access-${field}-${access}"
117 done
118
119 # Create hosts for each access single leaf
Thomas Vachuska1351e7e2018-04-19 16:24:22 -0700120 sim "null-create-hosts Access-${field}-${access} 10.${field}${access}.1.* $accessHosts"
Thomas Vachuska722224e2018-03-26 10:56:18 -0700121 done
122done
123
124# make sure null providers are activated and any running simulation is stopped
125onos ${node} app activate org.onosproject.null
126sleep 2
127onos ${node} null-simulation stop
128
129# wait until the masterships clear-out across the cluster
130while onos ${node} masters | grep -qv " 0 devices"; do sleep 1; done
131
132# clean-up
133onos ${node} wipe-out please
134sleep 1
135
136# start custom simulation..
137onos ${node} null-simulation start custom
138sleep 2
139
140# Add devices, links, and hosts
141cat $CMDS | onos ${node}
142