Skip to content

Instantly share code, notes, and snippets.

@joestringer
Created April 19, 2013 00:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save joestringer/5417344 to your computer and use it in GitHub Desktop.
Save joestringer/5417344 to your computer and use it in GitHub Desktop.
Script to setup and run vandervecken
#!/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