Created
April 19, 2013 00:44
-
-
Save joestringer/5417344 to your computer and use it in GitHub Desktop.
Script to setup and run vandervecken
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
RFVM1IP=192.169.1.100 | |
HOSTVMIP=192.169.1.1 | |
DPPORTNET=172.31 | |
DPPORTS=2 | |
SWITCH1DPID=99 | |
STARTBVMS=0 | |
RYU_PATH=/home/vandervecken/ryu | |
RF_HOME=/home/vandervecken/RouteFlow | |
MONGODB_PORT=27017 | |
CONTROLLER_PORT=6633 | |
LXCDIR=/var/lib/lxc | |
RFVM1=$LXCDIR/rfvm1 | |
RFBR=br0 | |
RFDP=rf0 | |
RFDPID=7266767372667673 | |
RFSERVERCONFIG=/tmp/rfserverconfig.csv | |
RFISLCONFIG=/tmp/rfserverconfigisl.csv | |
DBPATH=/tmp/mongodb | |
OVSSOCK=/tmp/openvswitch-db.sock | |
VSCTL="ovs-vsctl --db=unix:$OVSSOCK" | |
export PATH=$PATH:/usr/local/bin:/usr/local/sbin | |
export PYTHONPATH=$PYTHONPATH:$RF_HOME | |
if [ "$EUID" != "0" ]; then | |
echo "You must be root to run this script." | |
exit 1 | |
fi | |
ACTION="" | |
case "$1" in | |
--pox) | |
ACTION="POX" | |
;; | |
--nox) | |
ACTION="NOX" | |
;; | |
--ryu) | |
ACTION="RYU" | |
;; | |
--reset) | |
ACTION="RESET" | |
;; | |
*) | |
echo "Invalid argument: $1" | |
echo "Options: " | |
echo " --pox: run using POX" | |
echo " --nox: run using NOX" | |
echo " --reset: stop running and clear data from previous executions" | |
exit | |
;; | |
esac | |
cd $RF_HOME | |
echo | |
echo " *=======================================*" | |
echo " | |" | |
echo " | VANDERVECKEN |" | |
echo " | |" | |
echo " *=======================================*" | |
echo | |
wait_port_listen() { | |
port=$1 | |
while ! `nc -z localhost $port` ; do | |
echo -n . | |
sleep 1 | |
done | |
} | |
echo_bold() { | |
echo -e "\033[1m${1}\033[0m" | |
} | |
kill_process_tree() { | |
top=$1 | |
pid=$2 | |
children=`ps -o pid --no-headers --ppid ${pid}` | |
for child in $children | |
do | |
kill_process_tree 0 $child | |
done | |
if [ $top -eq 0 ]; then | |
kill -9 $pid &> /dev/null | |
fi | |
} | |
start_mpls_ovs() { | |
ovsdb-server --remote=punix:$OVSSOCK \ | |
--remote=db:Open_vSwitch,managers \ | |
--private-key=db:SSL,private_key \ | |
--certificate=db:SSL,certificate \ | |
--bootstrap-ca-cert=db:SSL,ca_cert \ | |
--pidfile --detach \ | |
/usr/local/etc/openvswitch/conf.db | |
ovs-vswitchd --pidfile --detach unix:$OVSSOCK | |
} | |
start_ovs() { | |
ovsdb-server --remote=punix:$OVSSOCK \ | |
--remote=db:Open_vSwitch,manager_options \ | |
--private-key=db:SSL,private_key \ | |
--certificate=db:SSL,certificate \ | |
--bootstrap-ca-cert=db:SSL,ca_cert \ | |
--pidfile --detach | |
ovs-vswitchd --pidfile --detach unix:$OVSSOCK | |
} | |
start_sample_vms() { | |
echo_bold "-> Starting the sample network..." | |
formatted_dpid=`printf "%16.16x" $SWITCH1DPID` | |
echo_bold "-> Using DPID $formatted_dpid for switch1" | |
lxc-start -n b1 -d | |
lxc-start -n b2 -d | |
$VSCTL add-br switch1 | |
$VSCTL add-port switch1 b1.0 | |
$VSCTL add-port switch1 b2.0 | |
$VSCTL set Bridge switch1 other-config:datapath-id=$formatted_dpid | |
$VSCTL set-controller switch1 tcp:127.0.0.1:$CONTROLLER_PORT | |
$VSCTL set bridge switch1 protocols=OpenFlow10,OpenFlow12 | |
ifconfig switch1 up | |
echo_bold "---" | |
echo_bold "This test is up and running." | |
echo_bold "Try pinging host b2 from host b1:" | |
echo_bold " $ sudo lxc-console -n b1" | |
echo_bold "Login and run:" | |
echo_bold " $ ping $DPPORTNET.2.2" | |
} | |
start_rfvm1() { | |
echo_bold "-> Starting the rfvm1 virtual machine..." | |
# Configure the VM | |
cat > $RFVM1/config <<EOF | |
lxc.tty = 4 | |
lxc.pts = 1024 | |
lxc.rootfs = $RFVM1/rootfs | |
lxc.mount = $RFVM1/fstab | |
lxc.cgroup.devices.deny = a | |
# /dev/null and zero | |
lxc.cgroup.devices.allow = c 1:3 rwm | |
lxc.cgroup.devices.allow = c 1:5 rwm | |
# consoles | |
lxc.cgroup.devices.allow = c 5:1 rwm | |
lxc.cgroup.devices.allow = c 5:0 rwm | |
#lxc.cgroup.devices.allow = c 4:0 rwm | |
#lxc.cgroup.devices.allow = c 4:1 rwm | |
# /dev/{,u}random | |
lxc.cgroup.devices.allow = c 1:9 rwm | |
lxc.cgroup.devices.allow = c 1:8 rwm | |
lxc.cgroup.devices.allow = c 136:* rwm | |
lxc.cgroup.devices.allow = c 5:2 rwm | |
# rtc | |
lxc.cgroup.devices.allow = c 254:0 rwm | |
lxc.utsname = rfvm1 | |
lxc.network.type = veth | |
lxc.network.flags = up | |
lxc.network.name = eth0 | |
lxc.network.hwaddr = 12:a0:a0:a0:a0:a0 | |
lxc.network.veth.pair = rfvm1.0 | |
EOF | |
for i in `seq 1 $DPPORTS` ; do | |
cat >> $RFVM1/config<<EOF | |
lxc.network.type = veth | |
lxc.network.name = eth$i | |
lxc.network.hwaddr = 12:a1:a1:a1:a1:$i | |
lxc.network.veth.pair = rfvm1.$i | |
lxc.network.flags = up | |
EOF | |
done | |
cat > $RFVM1/rootfs/etc/network/interfaces <<EOF | |
auto lo | |
iface lo inet loopback | |
auto eth0 | |
iface eth0 inet static | |
address $RFVM1IP | |
netmask 255.255.255.0 | |
EOF | |
for i in `seq 1 $DPPORTS` ; do | |
cat >> $RFVM1/rootfs/etc/network/interfaces <<EOF | |
auto eth$i | |
iface eth$i inet static | |
address $DPPORTNET.$i.1 | |
netmask 255.255.255.0 | |
EOF | |
done | |
cat > $RFVM1/rootfs/etc/rc.local <<EOF | |
/root/run_rfclient.sh & | |
/root/start_routing.sh & | |
exit 0 | |
EOF | |
# Create the rfclient dir | |
RFCLIENTDIR=$RFVM1/rootfs/opt/rfclient | |
mkdir -p $RFCLIENTDIR | |
# Copy the rfclient executable | |
cp build/rfclient $RFCLIENTDIR/rfclient | |
cp /usr/lib/libmongoclient.a $RFVM1/rootfs/usr/lib | |
cp /usr/lib/libmongoclient.so $RFVM1/rootfs/usr/lib | |
cat > $RFVM1/rootfs/root/run_rfclient.sh <<EOF | |
#!/bin/sh | |
/opt/rfclient/rfclient 2>&1 > /var/log/rfclient.log | |
EOF | |
chmod +x $RFVM1/rootfs/root/run_rfclient.sh | |
# Update quagga | |
for i in zebra bgpd ospfd ldpd ; do | |
cp -a /usr/local/sbin/$i $RFVM1/rootfs/usr/local/sbin | |
done | |
cp -a /usr/local/lib/lib* $RFVM1/rootfs/usr/local/lib | |
cat > $RFVM1/rootfs/root/start_routing.sh<<EOF | |
mkdir -p /usr/local/var/run/ | |
chown quagga:quagga -R /usr/local/var/run /usr/local/etc | |
for i in zebra ospfd ldpd ; do | |
LOG=/var/log/\$i.log | |
cp /dev/null \$LOG | |
chown quagga:quagga \$LOG | |
/usr/local/sbin/\$i -d | |
done | |
EOF | |
chmod +x $RFVM1/rootfs/root/start_routing.sh | |
lxc-start -n rfvm1 -d | |
} | |
reset() { | |
init=$1; | |
if [ $init -eq 1 ]; then | |
echo_bold "-> Starting OVS daemons..."; | |
# Always try to start OVS | |
# start_mpls_ovs | |
start_ovs | |
else | |
echo_bold "-> Stopping child processes..."; | |
kill_process_tree 1 $$ | |
fi | |
echo_bold "-> Stopping and resetting LXC VMs..."; | |
lxc-stop -n rfvm1 &> /dev/null; | |
lxc-stop -n b1 &> /dev/null; | |
lxc-stop -n b2 &> /dev/null; | |
sudo $VSCTL del-br $RFBR &> /dev/null; | |
sudo $VSCTL del-br $RFDP &> /dev/null; | |
sudo $VSCTL del-br switch1 &> /dev/null; | |
sudo $VSCTL emer-reset &> /dev/null; | |
rm -rf $RFVM1/rootfs/var/run/network/ifstate; | |
rm -rf $LXCDIR/b1/rootfs/var/run/network/ifstate; | |
rm -rf $LXCDIR/b2/rootfs/var/run/network/ifstate; | |
echo_bold "-> Deleting data from previous runs..."; | |
rm -rf $HOME/db; | |
rm -rf $RFVM1/rootfs/opt/rfclient; | |
rm -f $RFSERVERCONFIG | |
rm -f $RFISLCONFIG | |
} | |
reset 1 | |
trap "reset 0; exit 0" INT | |
if [ "$ACTION" != "RESET" ]; then | |
echo_bold "-> Starting MongoDB..." | |
rm -rf $DBPATH | |
mkdir -p $DBPATH | |
mongod --quiet --dbpath $DBPATH --logpath /dev/null --smallfiles --oplogSize 4 --nssize 4 --noprealloc & | |
wait_port_listen $MONGODB_PORT | |
echo_bold "-> Starting the management network ($RFBR)..." | |
$VSCTL add-br $RFBR | |
$VSCTL set bridge $RFBR protocols=OpenFlow10,OpenFlow12 | |
ifconfig $RFBR up | |
ifconfig $RFBR $HOSTVMIP | |
start_rfvm1 | |
$VSCTL add-port $RFBR rfvm1.0 | |
echo_bold "-> Starting the controller ($ACTION) and RFPRoxy..." | |
case "$ACTION" in | |
POX) | |
cd pox | |
./pox.py --no-cli log.level --=DEBUG topology openflow.topology openflow.discovery rfproxy rfstats & | |
cd - &> /dev/null | |
;; | |
NOX) | |
cd build/nox/src | |
ulimit -c unlimited | |
./nox_core -i ptcp:$CONTROLLER_PORT rfproxy -v & | |
cd - &> /dev/null | |
;; | |
RYU) | |
cd $RYU_PATH | |
ryu-manager $RF_HOME/ryu/ryu/app/rfproxy.py & | |
cd - &> /dev/null | |
;; | |
esac | |
wait_port_listen $CONTROLLER_PORT | |
echo_bold "-> Starting RFServer..." | |
cp /dev/null $RFSERVERCONFIG | |
echo "vm_id,vm_port,ct_id,dp_id,dp_port" > $RFSERVERCONFIG | |
for i in `seq 1 $DPPORTS` ; do | |
echo 12A0A0A0A0A0,$i,0,99,$i >> $RFSERVERCONFIG | |
done | |
cp /dev/null $RFISLCONFIG | |
#./rfserver/rfserver.py $RFSERVERCONFIG $RFISLCONFIG & | |
./rfserver/rfserver.py $RFSERVERCONFIG & | |
echo_bold "-> Starting the control plane network ($RFDP VS)..." | |
$VSCTL add-br $RFDP | |
for i in `seq 1 $DPPORTS` ; do | |
$VSCTL add-port $RFDP rfvm1.$i | |
done | |
$VSCTL set Bridge $RFDP other-config:datapath-id=$RFDPID | |
$VSCTL set-controller $RFDP tcp:127.0.0.1:$CONTROLLER_PORT | |
$VSCTL set bridge $RFDP protocols=OpenFlow10,OpenFlow12 | |
ifconfig $RFDP up | |
if [ $STARTBVMS -eq 1 ] ; then | |
start_sample_vms | |
fi | |
echo_bold "You can stop this test by pressing Ctrl+C." | |
wait | |
fi | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment