From: Giuseppe Lettieri Date: Tue, 11 Sep 2012 13:36:45 +0000 (+0200) Subject: Merge branch 'master' of ssh://git.onelab.eu/git/sliver-openvswitch X-Git-Tag: sliver-openvswitch-1.8.90-0~16 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=a03fa095f61bf789af770dff2616ab382327b470;hp=-c;p=sliver-openvswitch.git Merge branch 'master' of ssh://git.onelab.eu/git/sliver-openvswitch Conflicts: planetlab/exp-tool/Makefile planetlab/scripts/sliver-ovs --- a03fa095f61bf789af770dff2616ab382327b470 diff --combined planetlab/exp-tool/Makefile index 804918246,c89f197b3..ae2700866 --- a/planetlab/exp-tool/Makefile +++ b/planetlab/exp-tool/Makefile @@@ -1,29 -1,40 +1,40 @@@ - include conf.mk + # see README + # conf.mk is expected to define + # HOST_ and IP_ for all nodes involved, as well as + # LINKS as a list of - elements + # run make CONF=anotherconfig.mk if you need several configs - # proj1(x@y) = x - proj1=$(word 1,$(subst @, ,$(1))) - - # proj2(x@y) = y - proj2=$(word 2,$(subst @, ,$(1))) + CONF ?= conf.mk + include $(CONF) + # if undefined in the conf file, use single dash SEP?=- - # get(x-y@1) = x - # get(x-y@2) = y - get=$(word $(call proj2,$(1)),$(subst $(SEP), ,$(call proj1,$(1)))) + ### helper functions # flip(1) = 2 # flip(2) = 1 flip=$(if $(findstring 1,$(1)),2,1) - + # cutsep (x-y)-> x y + cutsep=$(subst $(SEP), ,$(1)) + # leftnode (x-y) -> x + leftnode=$(word 1,$(call cutsep,$(1))) + # rightnode (x-y) -> y + rightnode=$(word 2,$(call cutsep,$(1))) + # linkpart(x@y) = x + linkpart=$(word 1,$(subst @, ,$(1))) + # endpart(x@y) = y + endpart=$(word 2,$(subst @, ,$(1))) + # get(x-y@1) = x + # get(x-y@2) = y + get=$(word $(call endpart,$(1)),$(call cutsep,$(call linkpart,$(1)))) # opp(x-y@1) = x-y@2 # opp(x-y@2) = x-y@1 - opp=$(call proj1,$(1))@$(call flip,$(call proj2,$(1))) - + opp=$(call linkpart,$(1))@$(call flip,$(call endpart,$(1))) # rget(x-y@1) = y # rget(x-y@2) = x rget=$(call get,$(call opp,$(1))) - + ### solve=$(HOST_$(1)) solve_ip=$(IP_$(1)) # can be redefined in conf.mk if that's not the expected behaviour @@@ -36,13 -47,13 +47,13 @@@ els SSH_KEY_OPTION ?= -i $(SSH_KEY) endif - #SSH_OPTIONS ?= $(SSH_KEY_OPTION) -l $(SLICE) -t SSH_OPTIONS ?= $(SSH_KEY_OPTION) -l $(SLICE) SSH = ssh $(SSH_OPTIONS) SUDO ?= sudo -S - ALL_NODE_IDS=$(shell (cut -d- -f1 < links; cut -d- -f2 < links) | sort -u) + ALL_NODE_IDS=$(sort $(foreach link,$(LINKS),$(call leftnode,$(link))) $(foreach link,$(LINKS),$(call rightnode,$(link)))) + ALL_LINK_IDS=$(addsuffix @1,$(LINKS)) $(addsuffix @2,$(LINKS)) #################### all+init: init all @@@ -56,7 -67,8 +67,8 @@@ FORCE .SECONDARY: - all: $(addprefix L/,$(shell cat links)) + LINKTARGETS=$(addprefix L/,$(LINKS)) + all: $(LINKTARGETS) .PHONY: all # could also do make ++SLICE @@@ -66,15 -78,19 +78,19 @@@ shownodes @$(foreach id,$(ALL_NODE_IDS),echo $(id)=$(call display,$(id));) showips: @$(foreach id,$(ALL_NODE_IDS),echo $(id)=$(call display,$(id)) has ip/network set to $(IP_$(id));) - .PHONY: shownodes showips + showlinks: + @$(foreach link,$(LINKS), echo $(call display,$(call leftnode,$(link))) '====>' $(call display,$(call rightnode,$(link)));) + .PHONY: shownodes showips showlinks sshchecks: $(foreach id,$(ALL_NODE_IDS),cache/sshcheck.$(id)) .PHONY: sshchecks - dbs: $(foreach id,$(ALL_NODE_IDS),cache/db.$(id)) + DBS=$(foreach id,$(ALL_NODE_IDS),cache/db.$(id)) + dbs: $(DBS) .PHONY: dbs - switchs: $(foreach id,$(ALL_NODE_IDS),cache/switch.$(id)) + SWITCHS=$(foreach id,$(ALL_NODE_IDS),cache/switch.$(id)) + switchs: $(SWITCHS) .PHONY: switchs start: dbs switchs @@@ -86,6 -102,10 +102,10 @@@ stop:$(foreach id,$(ALL_NODE_IDS),cache status:$(foreach id,$(ALL_NODE_IDS),cache/status.$(id)) .PHONY: status + BRIDGES=$(foreach id,$(ALL_NODE_IDS),cache/bridge.$(id)) + bridges: $(BRIDGES) + .PHONY: bridges + ### node-oriented targets # check ssh connectivity cache/sshcheck.%: FORCE @@@ -112,6 -132,7 +132,7 @@@ cache/switch.%: cache/db. cache/bridge.%: cache/switch.% @echo "Creating bridge on $(call display,$*) - logs in $@.log" @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs create-bridge $(IP_$*) > $@ 2> $@.log || { rm $@; exit 1; } + @echo Created bridge $$(cat $@) on $(HOST_$*) # xxx this probably needs a more thorough cleanup in cache/ cache/stop.%: del-bridge.% @@@ -119,6 -140,7 +140,7 @@@ @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs stop && rm cache/switch.% cache/db.% ### link-oriented targets + # L/- L/%: cache/link.%@1 cache/link.%@2 @touch $@ @echo "Created link $*" @@@ -139,65 -161,69 +161,69 @@@ del-bridge.%: cache/db. del-switch.%: del-bridge.% @echo "Shutting down switch on $(call display,$*)" - @if [ -f cache/switch.$* ]; then \ - $(SSH) $(HOST_$*) $(SUDO) sliver-ovs stop-switch - fi + @[ -f cache/switch.$* ] && $(SSH) $(HOST_$*) $(SUDO) sliver-ovs stop-switch @rm -f cache/switch.$* del-db.%: @echo "Shutting down db on $(call display,$*)" - @if [ -f cache/db.$* ]; then \ - $(SSH) $(HOST_$*) $(SUDO) sliver-ovs stop-db - fi + @[ -f cache/db.$* ] && $(SSH) $(HOST_$*) $(SUDO) sliver-ovs stop-db @rm -f cache/db.$* - del-links: $(addprefix U/,$(notdir $(wildcard L/*))) + del-links: $(addprefix U/,$(notdir $(filter-out %.log,$(wildcard L/*)))) - del-switchs: $(addprefix del-,$(notdir $(wildcard cache/switch.*))) + del-switchs: $(addprefix del-,$(notdir $(filter-out %.log,$(wildcard cache/switch.*)))) - del-dbs: $(addprefix del-,$(notdir $(wildcard cache/db.*))) + del-dbs: $(addprefix del-,$(notdir $(filter-out %.log,$(wildcard cache/db.*)))) - shutdown: del-switches del-dbs + shutdown: del-switchs del-dbs .PHONY: del-links del-switchs del-dbs shutdown - #################### - graph.dot: - ( echo "digraph $(SLICE) {"; ls L | sed 's/$(SEP)/->/;s/$$/;/'; echo "}" ) > $@ - graph.ps: graph.dot - dot -Tps < $^ > $@ - - #################### - clean: $(addprefix del-,$(notdir $(wildcard cache/bridge.*))) - distclean: - rm -rf L U cache - - .PHONY: clean distclean - .SECONDEXPANSION: del-iface.%: cache/db.$$(call get,%) - @echo "Removing interface for link $(call proj1,$*) from $(call get,$*)" + @echo "Removing interface for link $(call linkpart,$*) from $(call get,$*)" @$(SSH) $(HOST_$(call get,$*)) \ - $(SUDO) sliver-ovs del-port L$(call proj1,$*) + $(SUDO) sliver-ovs del-port L$(call linkpart,$*) @rm -f cache/iface.$* cache/link.$* cache/link.$(call opp,$*) - + ### '%' here is leftid-rightid@{1,2} + # we retrieve % as $(*F) + #linkid=$(call linkpart,%) + #nodeid=$(call get,%) + #bridgefile=cache/bridge.$(nodeid) cache/iface.%: cache/bridge.$$(call get,%) - @echo "Creating interface for link $(call proj1,$*) on $(call get,$*)" - @$(SSH) $(HOST_$(call get,$*)) \ - $(SUDO) sliver-ovs create-port $$(cat $^) L$(call proj1,$*) > $@ \ - || { rm $@; exit 1; } - - cache/link.%: cache/host.$$(call rget,$$*) cache/iface.% cache/iface.$$(call opp,$$*) - @echo "Setting port number of link $(call proj1,$*) on $(call get,$*)" - @$(SSH) $(HOST_$(call get,$*)) \ - $(SUDO) sliver-ovs set-remote-endpoint L$(call proj1,$*) \ - $$(cat cache/host.$(call rget,$*)) \ - $$(cat cache/iface.$(call opp,$*)) \ + @echo "Creating interface for link $(call linkpart,$(*F)) on $(call display,$(call get,$(*F))) - logs in $@.log" + @$(SSH) $(call solve,$(call get,$(*F))) $(SUDO) sliver-ovs create-port $$(cat cache/bridge.$(call get,$(*F))) L$(call linkpart,$(*F)) > $@ 2> $@.log || { rm $@; exit 1; } + echo cache/bridge.$(call get,$(*F)) + echo cache/host.$(call get,$(*F)) cache/iface.$(*F) cache/iface.$(call opp,$(*F)) + + + # linkid=$(call linkpart,%) + # nodeid=$(call get,%) + # iface1=cache/iface.% + # iface2=cache/iface.$(call opp,%) + cache/link.%: cache/host.$$(call get,%) cache/iface.% cache/iface.$$(call opp,%) + @echo "Setting port number of link $(call linkpart,$(*F)) on $(call display,$(call get,$(*F))) - logs in $@.log" - @$(SSH) $(call solve,$(call get,$(*F))) $(SUDO) ovs-vsctl set interface L$(call linkpart,$(*F)) \ - options:remote_ip=$$(cat cache/host.$(call get,$(*F))) \ - options:remote_port=$$(cat cache/iface.$(call opp,$(*F))) 2> $@.log \ ++ @$(SSH) $(call solve,$(call get,$(*F))) $(SUDO) sliver-ovs set-remote-endpoint L$(call linkpart,$(*F)) \ ++ $$(cat cache/host.$(call rget,$(*F))) \ ++ $$(cat cache/iface.$(call opp,$(*F))) 2> $@.log \ && touch $@ + #################### + CLEANTARGETS=$(addprefix del-,$(notdir $(filter-out %.log,$(wildcard cache/bridge.*)))) + clean: $(CLEANTARGETS) + distclean: + rm -rf L U cache + .PHONY: clean distclean + + #################### + graph.dot: + ( echo "digraph $(SLICE) {"; ls L | sed 's/$(SEP)/->/;s/$$/;/'; echo "}" ) > $@ + graph.ps: graph.dot + dot -Tps < $^ > $@ + #################### # 'virtual' targets in that there's no real file attached define node_shortcuts @@@ -208,15 -234,19 +234,19 @@@ start.$(1): cache/start.$(1) FORC stop.$(1): cache/stop.$(1) FORCE status.$(1): cache/status.$(1) FORCE bridge.$(1): cache/bridge.$(1) FORCE + host.$(1): cache/host.$(1) FORCE # switch already depends on db, but well cache/start.$(1): cache/db.$(1) cache/switch.$(1) FORCE endef $(foreach id,$(ALL_NODE_IDS), $(eval $(call node_shortcuts,$(id)))) - #define link_shortcuts - # - #endef + define link_shortcuts + iface.%: cache/iface.% + link.%: cache/link.% + endef + + $(foreach id,$(ALL_LINK_IDS), $(eval $(call link_shortcuts,$(id)))) #################### convenience, for debugging only # make +foo : prints the value of $(foo) diff --combined planetlab/scripts/sliver-ovs index dabb01671,6a7319843..87f173e2b --- a/planetlab/scripts/sliver-ovs +++ b/planetlab/scripts/sliver-ovs @@@ -11,7 -11,7 +11,7 @@@ DB_CONF_FILE=/etc/openvswitch/conf.d DB_SCHEMA=/usr/share/openvswitch/vswitch.ovsschema DB_PID_FILE=/var/run/openvswitch/db.pid DB_LOG=/var/log/ovs-db.log - DB_CTRL_SOCKET=/var/run/openvswitch/db-ctrl.sock + DB_CTL_PATTERN='ovsdb-server.*.ctl' ## DB_SOCKET=/var/run/openvswitch/db.sock ## @@@ -30,25 -30,10 +30,25 @@@ function error exit 1 } +function get_params { + params=$1; shift + err_msg="$COMMAND $SUBCOMMAND $(echo $params | perl -pe 's/\S+/<$&>/g')" + for p in $(echo $params); do + [[ -z "$@" ]] && error "$err_msg" + pname=$(echo -n $p|perl -pe 's/\W/_/g') + eval $pname="$1"; shift + done + [[ -n "$@" ]] && error "$err_msg" +} + function is_switch_running { ovs-appctl --target=$SWITCH_SOCKET version >& /dev/null } +function is_db_running { + ovs-appctl --target=$DB_CTRL_SOCKET version >& /dev/null +} + function tapname () { IP=$1; shift echo $(ip addr show to "$IP/32" | perl -ne '/^\s*\d+:\s*([\w-]+):/ && print $1') @@@ -86,7 -71,8 +86,7 @@@ function wait_device () ######################################## startup function start_db () { - - [[ -n "$@" ]] && error "Usage: $COMMAND start-db" + get_params "" "$@" ## init conf conf_dir=$(dirname $DB_CONF_FILE) @@@ -109,27 -95,17 +109,20 @@@ --bootstrap-ca-cert=db:SSL,ca_cert \ --pidfile=$DB_PID_FILE \ --log-file=$DB_LOG \ + --unixctl=$DB_CTRL_SOCKET \ --detach >& /dev/null else echo 'ovsdb-server appears to be running already, *not* starting' fi wait_server $DB_PID_FILE ovsdb-server 30 + echo $DB_PID_FILE } - function stop_db () { - get_params "" "$@" - - pkill ovsdb-server - } - - - function start_switch () { + get_params "" "$@" - [[ -n "$@" ]] && error "Usage: $COMMAND start-switch" + # ensure ovsdb-server is running + is_db_running || { echo "ovsdb-server not running" >&2 ; exit 1 ; } if [ ! -f "$SWITCH_PID_FILE" ] ; then ovs-vswitchd \ @@@ -144,10 -120,17 +137,17 @@@ wait_server $SWITCH_PID_FILE ovs-vswitchd 30 } - function stop_switch () { - get_params "" "$@" + # first dumb stab just read "pkill ovsdb-server" and "pkill ovs-vswitchd" + # quick and dirty : we locate the control file through a search in /var/run + # caller should be requested to remember and provide this pid instead + function stop_db () { + controlfile=$(ls $RUN_DIR/$DB_CTL_PATTERN) + [ -f $controlfile ] && ovs-appctl --target=$controlfile exit + } - pkill ovs-vswitchd ; } + function stop_switch () { + ovs-appctl --target=$SWITCH_SOCKET exit || : + } function status () { pids=$(pgrep '^ovs') @@@ -167,10 -150,12 +167,10 @@@ function stop () #################### create functions function create_bridge () { - [[ -z "$@" ]] && error "Usage: ${COMMAND} create-bridge " - ip_prefix=$1; shift - [[ -n "$@" ]] && error "Usage: ${COMMAND} create-bridge " + get_params "IP/PREFIX" "$@" - IP=${ip_prefix%/*} - PREFIX=${ip_prefix#*/} + IP=${IP_PREFIX%/*} + PREFIX=${IP_PREFIX#*/} set -e # ensure ovs-vswitchd is running @@@ -189,7 -174,6 +189,7 @@@ # we're clear TAPNAME=$(pltap-ovs) + trap kill_pltap_ovs EXIT # xxx wouldn't that be safer if left-aligned ? vsysc vif_up << EOF $TAPNAME @@@ -204,10 -188,11 +204,10 @@@ EO function create_port () { - [[ -z "$@" ]] && error "$COMMAND create-port " - bridge=$1; shift - [[ -z "$@" ]] && error "$COMMAND create-port " - port=$1; shift - [[ -n "$@" ]] && error "$COMMAND create-port " + get_params "bridge port" "$@" + + # ensure ovs-vswitchd is running + is_switch_running || { echo "ovs-vswitchd not running" >&2 ; exit 1 ; } set -e if ! ovs-vsctl --db=unix:$DB_SOCKET list-ports "$bridge" | grep -q "^$port\$"; then @@@ -217,32 -202,15 +217,32 @@@ return 0 } +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 ; } + + set -e + ovs-vsctl --db=unix:$DB_SOCKET set interface $local_port \ + options:remote_ip=$remote_ip \ + options:remote_port=$remote_UDP_port + return 0 +} + #################### del functions function del_bridge () { - [[ -z "$@" ]] && error "Usage: ${COMMAND} del-bridge " - bridge_name=$1; shift - [[ -n "$@" ]] && error "Usage: ${COMMAND} del-bridge " + get_params "bridge_name" "$@" W= - is_switch_running || W="--no-wait" + if ! is_switch_running; then + # we can delete 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 if ovs-vsctl --db=unix:$DB_SOCKET br-exists "$bridge_name"; then ovs-vsctl --db=unix:$DB_SOCKET $W del-br $bridge_name @@@ -251,38 -219,21 +251,38 @@@ } function del_port () { - [[ -z "$@" ]] && error "Usage: ${COMMAND} del-port " - bridge_name=$1; shift - [[ -n "$@" ]] && error "Usage: ${COMMAND} del-port " + + get_params "port" "$@" + + W= + if ! is_switch_running; then + # we can delete 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 set -e - if ovs-vsctl --db=unix:$DB_SOCKET port-to-br "$1" >/dev/null 2>&1; then - ovs-vsctl --db=unix:$DB_SOCKET del-port "$1" + if ovs-vsctl --db=unix:$DB_SOCKET port-to-br "$port" >/dev/null 2>&1; then + ovs-vsctl --db=unix:$DB_SOCKET $W del-port "$port" fi return 0 } +function show () { + + get_params "" "$@" + + is_db_running || { echo "ovsdb-server not running" >&2; exit 1; } + + ovs-vsctl --db=unix:$DB_SOCKET show +} + #################### SUPPORTED_SUBCOMMANDS="start stop status start_db stop_db start_switch stop_switch -create_bridge create_port del_bridge del_port" +create_bridge create_port del_bridge del_port +show set_remote_endpoint" function main () { message="Usage: $COMMAND ... @@@ -290,15 -241,15 +290,15 @@@ Supported subcommands are (dash or unde $SUPPORTED_SUBCOMMANDS" [[ -z "$@" ]] && error "$message" - subcommand=$1; shift + SUBCOMMAND=$1; shift # support dashes instead of underscores - subcommand=$(echo $subcommand | sed -e s,-,_,) + SUBCOMMAND=$(echo $SUBCOMMAND | sed -e s,-,_,g) found="" - for supported in $SUPPORTED_SUBCOMMANDS; do [ "$subcommand" = "$supported" ] && found=yes; done + for supported in $SUPPORTED_SUBCOMMANDS; do [ "$SUBCOMMAND" = "$supported" ] && found=yes; done [ -z "$found" ] && error $message - $subcommand "$@" + $SUBCOMMAND "$@" } main "$@"