blob: ea657a805225ac00c8f0ba8bdfee3e20b4e52d6c [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
Thomas Vachuska6f6b662f2018-05-07 15:01:06 -070077gwIps=""
78
Thomas Vachuska722224e2018-03-26 10:56:18 -070079# Create 2 leaf pairs with dual links to the spines and a link between the pair
80for pair in $serviceLeafGroups; do
81 [ $pair = A ] && l1=1 || l1=3
82 [ $pair = A ] && l2=2 || l2=4
Thomas Vachuska1351e7e2018-04-19 16:24:22 -070083 sim "null-create-device switch Leaf-${pair}1 ${leafPorts}"
84 sim "null-create-device switch Leaf-${pair}2 ${leafPorts}"
Thomas Vachuska722224e2018-03-26 10:56:18 -070085 sim "null-create-link direct Leaf-${pair}1 Leaf-${pair}2"
86
87 for spine in $(seq 1 $spines); do
88 for link in $(seq 1 $spineLinks); do
89 sim "null-create-link direct Spine-${spine} Leaf-${pair}1"
90 sim "null-create-link direct Spine-${spine} Leaf-${pair}2"
91 done
92 done
93
Thomas Vachuska0d933862018-04-06 00:29:30 -070094 # Create gateways attached to each leaf group; multi-homed to each leaf in the pair
Thomas Vachuska722224e2018-03-26 10:56:18 -070095 [ $pair = A ] && pn=1 || pn=2
Thomas Vachuska0d933862018-04-06 00:29:30 -070096 for gw in $(seq 1 $gateways); do
Thomas Vachuska1351e7e2018-04-19 16:24:22 -070097 sim "null-create-host Leaf-${pair}1,Leaf-${pair}2 10.${pn}.0.${gw}"
Thomas Vachuska6f6b662f2018-05-07 15:01:06 -070098 gwIps="${gwIps}|10.${pn}.0.${gw}"
Thomas Vachuska0d933862018-04-06 00:29:30 -070099 done
100
101 # Create hosts for each leaf group; multi-homed to each leaf in the pair
Thomas Vachuska722224e2018-03-26 10:56:18 -0700102 for host in $(seq 1 $serviceHosts); do
Thomas Vachuska1351e7e2018-04-19 16:24:22 -0700103 sim "null-create-host Leaf-${pair}1,Leaf-${pair}2 10.${pn}.1.${host}"
Thomas Vachuska722224e2018-03-26 10:56:18 -0700104 done
105done
106
Thomas Vachuska722224e2018-03-26 10:56:18 -0700107# Create field offices
108for field in $(seq $fieldOffices); do
109 # Create HAG spines for each office and connect it to central office spines
110 for spine in $(seq $spines); do
Thomas Vachuska1351e7e2018-04-19 16:24:22 -0700111 sim "null-create-device switch Spine-${field}-${spine} ${hagPorts}"
Thomas Vachuska722224e2018-03-26 10:56:18 -0700112 sim "null-create-link direct Spine-${spine} Spine-${field}-${spine}"
Thomas Vachuska722224e2018-03-26 10:56:18 -0700113 done
114
115 # Create single access leafs with links to the spines
116 for access in $(seq $accessLeaves); do
Thomas Vachuska1351e7e2018-04-19 16:24:22 -0700117 sim "null-create-device switch Access-${field}-${access} ${accessPorts}"
Thomas Vachuska722224e2018-03-26 10:56:18 -0700118 for spine in $(seq 1 $spines); do
119 sim "null-create-link direct Spine-${field}-${spine} Access-${field}-${access}"
120 done
121
122 # Create hosts for each access single leaf
Thomas Vachuska1351e7e2018-04-19 16:24:22 -0700123 sim "null-create-hosts Access-${field}-${access} 10.${field}${access}.1.* $accessHosts"
Thomas Vachuska722224e2018-03-26 10:56:18 -0700124 done
125done
126
127# make sure null providers are activated and any running simulation is stopped
128onos ${node} app activate org.onosproject.null
129sleep 2
130onos ${node} null-simulation stop
131
132# wait until the masterships clear-out across the cluster
133while onos ${node} masters | grep -qv " 0 devices"; do sleep 1; done
134
135# clean-up
136onos ${node} wipe-out please
137sleep 1
138
139# start custom simulation..
140onos ${node} null-simulation start custom
141sleep 2
142
143# Add devices, links, and hosts
144cat $CMDS | onos ${node}
145
Thomas Vachuska6f6b662f2018-05-07 15:01:06 -0700146# After the network is created, add network config to assign roles to gateway IPs.
147cfg=""
148for gw in $(onos ${node} hosts | egrep "${gwIps/|/}" | cut -d, -f1 | cut -d= -f2); do
149 cfg="${cfg}, \"$gw\": { \"basic\": { \"uiType\" : \"router\", \"roles\": [ \"gateway\" ]}}"
150done
151echo "{ \"hosts\": { ${cfg/,/} }}" > $CMDS
152
153onos-netcfg ${node} $CMDS
154