X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=planetlab%2Fscripts%2Fsliver-ovs.in;h=edda1961b9a89b6dd19dd25ab821d5db107b1f97;hb=2b13d312fc4d6e5eb1d0e3004fa523bb0c0ba544;hp=9af130e1073da771c52b0568694c7bd7ed54529c;hpb=2a22b514cc33c0352b9b1f0f77e3b18b08e325c2;p=sliver-openvswitch.git diff --git a/planetlab/scripts/sliver-ovs.in b/planetlab/scripts/sliver-ovs.in index 9af130e10..edda1961b 100755 --- a/planetlab/scripts/sliver-ovs.in +++ b/planetlab/scripts/sliver-ovs.in @@ -29,7 +29,7 @@ function error { function get_params { params=$1; shift err_msg="$COMMAND $SUBCOMMAND $(echo $params | perl -pe 's/\S+/<$&>/g')" - for p in $(echo $params); do + for p in $params; do [[ -z "$@" ]] && error "$err_msg" pname=$(echo -n $p|perl -pe 's/\W/_/g') eval $pname="$1"; shift @@ -67,10 +67,10 @@ function wait_server () { } function wait_device () { - tapname=$1; shift - timeout=$1; shift + local tapname=$1; shift + local timeout=$1; shift - expire=$(($(date +%s) + $timeout)) + local expire=$(($(date +%s) + $timeout)) while ! ip link show up | egrep -q "^[0-9]+: +$tapname:"; do echo "Waiting for $tapname to come UP...$(($expire - $(date +%s)))s left" >&2 @@ -100,10 +100,10 @@ function start_db () { if [ ! -f "$RUN_DIR/ovsdb-server.pid" ]; then ovsdb-server $DB_CONF_FILE \ --remote=punix:$DB_SOCKET \ - --remote=db:Open_vSwitch,manager_options \ - --private-key=db:SSL,private_key \ - --certificate=db:SSL,certificate \ - --bootstrap-ca-cert=db:SSL,ca_cert \ + --remote=db:Open_vSwitch,Open_vSwitch,manager_options \ + --private-key=db:Open_vSwitch,SSL,private_key \ + --certificate=db:Open_vSwitch,SSL,certificate \ + --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \ --pidfile \ --log-file=$DB_LOG \ --detach >& /dev/null @@ -157,42 +157,75 @@ function stop () { #################### create functions function create_bridge () { - get_params "bridge IP/PREFIX" "$@" + get_params "bridge IP/PREFIX" "$1" "$2" + shift; shift; IP=${IP_PREFIX%/*} PREFIX=${IP_PREFIX#*/} - # ensure ovs-vswitchd is running - is_switch_running || { echo "ovs-vswitchd not running" >&2 ; exit 1 ; } + W= + if ! is_switch_running; then + # we can create the bridge even if ovs-vswitchd is not running, + # but we need a running ovsdb-server + is_db_running || { echo "ovsdb-server not running" >&2; exit 1; } + W="--no-wait" + fi + set -e - ovs-vsctl --db=unix:$DB_SOCKET -- --may-exist add-br "$bridge" \ + ovs-vsctl --db=unix:$DB_SOCKET $W -- --may-exist add-br "$bridge" \ -- set bridge "$bridge" datapath_type=planetlab \ - -- set interface "$bridge" options:local_ip="$IP" option:local_netmask="$PREFIX" - ovs-appctl netdev-pltap/get-tapname "$bridge" + -- set interface "$bridge" options:local_ip="$IP" option:local_netmask="$PREFIX" \ + -- "$@" + + # check that the bridge has actually been created + if [ -z "$W" ]; then + local tap=$(ovs-appctl netdev-pltap/get-tapname "$bridge") + wait_device $tap 10 + fi } function create_port () { get_params "bridge port" "$@" + + W= + if ! is_switch_running; then + # we can create the port even if ovs-vswitchd is not running, + # but we need a running ovsdb-server + is_db_running || { echo "ovsdb-server not running" >&2; exit 1; } + W="--no-wait" + fi - # ensure ovs-vswitchd is running - is_switch_running || { echo "ovs-vswitchd not running" >&2 ; exit 1 ; } + set -e + ovs-vsctl --db=unix:$DB_SOCKET $W -- --may-exist add-port "$bridge" "$port" \ + -- set interface "$port" type=tunnel +} + +function get_local_endpoint () { + + get_params "local_port" "$@" + + is_switch_running || { echo "ovs-vswitchd not running" >&2; exit 1; } set -e - ovs-vsctl --db=unix:$DB_SOCKET -- --may-exist add-port "$bridge" "$port" -- set interface "$port" type=tunnel - ovs-appctl --target=ovs-vswitchd netdev-tunnel/get-port "$port" + ovs-appctl --target=ovs-vswitchd netdev-tunnel/get-port "$local_port" } function set_remote_endpoint () { get_params "local_port remote_ip remote_UDP_port" "$@" - # ensure ovs-vswitchd is running - is_switch_running || { echo "ovs-vswitchd not running" >&2 ; exit 1 ; } + W= + if ! is_switch_running; then + # we can store the info even if ovs-vswitchd is not running, + # but we need a running ovsdb-server + is_db_running || { echo "ovsdb-server not running" >&2; exit 1; } + W="--no-wait" + fi set -e - ovs-vsctl --db=unix:$DB_SOCKET set interface $local_port \ + ovs-vsctl --db=unix:$DB_SOCKET $W set interface $local_port \ options:remote_ip=$remote_ip \ options:remote_port=$remote_UDP_port } @@ -259,6 +292,35 @@ function show () { ovs-vsctl --db=unix:$DB_SOCKET show } +function get_local_ip () { + + get_params "bridge" "$@" + + set -e + ovs-vsctl --db=unix:$DB_SOCKET br-exists "$bridge" || return + local ip=$(ovs-vsctl get interface "$bridge" options:local_ip) + local netmask=$(ovs-vsctl get interface "$bridge" options:local_netmask) + eval echo $ip/$netmask +} + +function get_local_links () { + + get_params "bridge" "$@" + + set -e + ovs-vsctl --db=unix:$DB_SOCKET br-exists "$bridge" || return + ovs-vsctl --db=unix:$DB_SOCKET list-ifaces "$bridge" +} + +function get_mac () { + + get_params "bridge" "$@" + + set -e + local tap=$(ovs-appctl netdev-pltap/get-tapname "$bridge") + ifconfig "$tap" | awk '/HWaddr/ { print $5 }' +} + ### for demos - connect to an ndnmap deployment to visualize links bandwidth # this expects 3 arguments # an interface name, L- based on your ids in conf.mk @@ -267,12 +329,12 @@ function show () { # this one-shot function writes the current statistics onto the ndnmap site # it needs to be called regularly so that ndnmap can do the bw computations # would make sense for the caller to redirect stderr onto some relevant location -function gmap_report_once () { +function gmap_probe_once () { iface=$1; shift hostname=$1; shift linkid=$1; shift - rx_bytes=$(ovs-vsctl get interface $iface statistics:rx_bytes) - tx_bytes=$(ovs-vsctl get interface $iface statistics:tx_bytes) + rx_bytes=$(ovs-appctl netdev-tunnel/get-rx-bytes $iface) + tx_bytes=$(ovs-appctl netdev-tunnel/get-tx-bytes $iface) rx_bits=$(($rx_bytes*8)) tx_bits=$(($tx_bytes*8)) now=$(date +%s).$(date +%N) @@ -283,32 +345,36 @@ function gmap_report_once () { } ### the front end, manages pid and so on -function gmap_report () { +function gmap_probe () { iface=$1; shift hostname=$1; shift linkid=$1; shift looptime=$1; shift [ -z "$looptime" ] && looptime=1 -# we'd need a means to avoid running 2 instances at the same time -# but it's kind of hard to keep track of the right pid here.. -# pidfile=/var/run/openvswitch/gmap-$iface.pid -# if [ -f $pidfile ] ; then -# pid=$(cat $pidfile) -# [ -n "$pid" ] && kill $pid -# rm $pidfile -# fi + pid_file=/var/run/openvswitch/gmap-$iface.pid + if [ -f $pid_file ] ; then + pid=$(cat $pid_file) + [ -n "$pid" ] && kill $pid >& /dev/null + rm $pid_file + fi + # close std fds so that ssh invokations can return + exec <&- + exec >&- while true; do -# echo $$ > $pidfile - gmap_report_once $iface $hostname $linkid + gmap_probe_once $iface $hostname $linkid sleep $looptime - done + done & + # this is the pid for the background process + echo $! > $pid_file } #################### SUPPORTED_SUBCOMMANDS="start stop status start_db stop_db start_switch stop_switch create_bridge create_port del_bridge del_port -show set_remote_endpoint set_controller del_controller gmap_report" +show get_local_endpoint set_remote_endpoint +set_controller del_controller gmap_probe +get_local_ip get_local_links get_mac" function main () { message="Usage: $COMMAND ...