blob: ea8cfbc96578eaf7fddf923c20f7fdb23aa2ae6e [file] [log] [blame]
Thomas Vachuska0d5106a2018-04-06 00:29:30 -07001#!/bin/bash
2# -----------------------------------------------------------------------------
3# Creates a hierarchical access spine-leaf fabric with large number of hosts
4# using null providers.
5#
6# Default setup as follows:
7# 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.)
11# -----------------------------------------------------------------------------
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"
20 echo " -G gateways"
21 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
34gateways=2
35
36# Scan arguments for user/password or other options...
37while getopts s:l:a:f:A:S:G:?h o; do
38 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;;
45 G) gateways=$OPTARG;;
46 *) 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.
65export CMDS="/tmp/access-onos.cmds"
66rm -f $CMDS 2>/dev/null
67
68function sim {
69 echo "$@" >> $CMDS
70}
71
Thomas Vachuska0d5106a2018-04-06 00:29:30 -070072# Create central office spines
73for spine in $(seq 1 $spines); do
Thomas Vachuska5064e202018-04-24 10:12:41 -040074 sim "null-create-device switch Spine-${spine} ${spinePorts}"
Thomas Vachuska0d5106a2018-04-06 00:29:30 -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 Vachuska5064e202018-04-24 10:12:41 -040081 sim "null-create-device switch Leaf-${pair}1 ${leafPorts}"
82 sim "null-create-device switch Leaf-${pair}2 ${leafPorts}"
Thomas Vachuska0d5106a2018-04-06 00:29:30 -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
92 # Create gateways attached to each leaf group; multi-homed to each leaf in the pair
93 [ $pair = A ] && pn=1 || pn=2
Thomas Vachuska0d5106a2018-04-06 00:29:30 -070094 for gw in $(seq 1 $gateways); do
Thomas Vachuska5064e202018-04-24 10:12:41 -040095 sim "null-create-host Leaf-${pair}1,Leaf-${pair}2 10.${pn}.0.${gw}"
Thomas Vachuska0d5106a2018-04-06 00:29:30 -070096 done
97
98 # Create hosts for each leaf group; multi-homed to each leaf in the pair
99 [ $pair = A ] && offset=-400 || offset=400
100 for host in $(seq 1 $serviceHosts); do
Thomas Vachuska5064e202018-04-24 10:12:41 -0400101 sim "null-create-host Leaf-${pair}1,Leaf-${pair}2 10.${pn}.1.${host}"
Thomas Vachuska0d5106a2018-04-06 00:29:30 -0700102 done
103done
104
Thomas Vachuska0d5106a2018-04-06 00:29:30 -0700105# Create field offices
106for field in $(seq $fieldOffices); do
107 # Create HAG spines for each office and connect it to central office spines
108 for spine in $(seq $spines); do
Thomas Vachuska5064e202018-04-24 10:12:41 -0400109 sim "null-create-device switch Spine-${field}-${spine} ${hagPorts}"
Thomas Vachuska0d5106a2018-04-06 00:29:30 -0700110 sim "null-create-link direct Spine-${spine} Spine-${field}-${spine}"
Thomas Vachuska0d5106a2018-04-06 00:29:30 -0700111 done
112
113 # Create single access leafs with links to the spines
114 for access in $(seq $accessLeaves); do
Thomas Vachuska5064e202018-04-24 10:12:41 -0400115 sim "null-create-device switch Access-${field}-${access} ${accessPorts}"
Thomas Vachuska0d5106a2018-04-06 00:29:30 -0700116 for spine in $(seq 1 $spines); do
117 sim "null-create-link direct Spine-${field}-${spine} Access-${field}-${access}"
118 done
119
120 # Create hosts for each access single leaf
Thomas Vachuska5064e202018-04-24 10:12:41 -0400121 sim "null-create-hosts Access-${field}-${access} 10.${field}${access}.1.* $accessHosts"
Thomas Vachuska0d5106a2018-04-06 00:29:30 -0700122 done
123done
124
125# make sure null providers are activated and any running simulation is stopped
126onos ${node} app activate org.onosproject.null
127sleep 2
128onos ${node} null-simulation stop
129
130# wait until the masterships clear-out across the cluster
131while onos ${node} masters | grep -qv " 0 devices"; do sleep 1; done
132
133# clean-up
134onos ${node} wipe-out please
135sleep 1
136
137# start custom simulation..
138onos ${node} null-simulation start custom
139sleep 2
140
141# Add devices, links, and hosts
142cat $CMDS | onos ${node}
143