Merge branch 'master' of ssh://git.onelab.eu/git/sliver-openvswitch
authorGiuseppe Lettieri <g.lettieri@iet.unipi.it>
Tue, 11 Sep 2012 13:36:45 +0000 (15:36 +0200)
committerGiuseppe Lettieri <g.lettieri@iet.unipi.it>
Tue, 11 Sep 2012 13:36:45 +0000 (15:36 +0200)
Conflicts:
planetlab/exp-tool/Makefile
planetlab/scripts/sliver-ovs

planetlab/exp-tool/Makefile
planetlab/exp-tool/README
planetlab/exp-tool/conf.mk.example
planetlab/exp-tool/links.example [deleted file]
planetlab/scripts/sliver-ovs

index 8049182..ae27008 100644 (file)
@@ -1,29 +1,40 @@
-include conf.mk
+# see README
+# conf.mk is expected to define
+# HOST_<id> and IP_<id> for all nodes involved, as well as 
+# LINKS as a list of <node_id>-<node_id> 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 @@ else
 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 @@ 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 @@ 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 @@ stop:$(foreach id,$(ALL_NODE_IDS),cache/stop.$(id))
 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 @@ 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 @@ cache/stop.%: del-bridge.%
        @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs stop && rm cache/switch.% cache/db.%
 
 ### link-oriented targets
+# L/<nodeid>-<node_id>
 L/%: cache/link.%@1 cache/link.%@2
        @touch $@
        @echo "Created link $*"
@@ -139,65 +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) 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 @@ start.$(1): cache/start.$(1) FORCE
 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)
index 5d5c357..641aca2 100644 (file)
@@ -90,14 +90,11 @@ HOST_3=planetlab2.ics.forth.gr
 IP_3=10.0.9.3/24
 HOST_4=planetlab2.urv.cat
 IP_4=10.0.9.4/24
-----------
-
-And a 'links' file containing the following lines:
 
-----------
-1-2
-2-3
-2-4
+LINKS :=
+LINKS += 1-2
+LINKS += 2-3
+LINKS += 2-4
 ----------
 
 NOTE. In this example we have chosen to use numbers (1,2,3,4) as ids
@@ -140,10 +137,12 @@ of the topology by typing:
 
 $ make graph.ps
 
+#### BEG WARNING xxx this feature is broken now that LINKS are defined in the same conf.mk file
 Or we can save the current state in the 'links' file (so that we can
 recreate it later):
 
 $ ls L > links
+#### END WARNING xxx this feature is broken now that LINKS are defined in the same conf.mk file
 
 
 * Command reference
index 5c4d895..f4d9a86 100644 (file)
@@ -1,21 +1,35 @@
+# the slice that you're using
 SLICE=inri_sl1
 
-# f12-32
+# optionnally, the related ssh (private) key to use
+SSH_KEY=key_user.rsa
+
+# optionally, you can change the way nodes are displayed
+display="$(call solve,$(1))"
+
+#################### the nodes to use
 HOST_SENDER=vnode09.pl.sophia.inria.fr
-# f12-64
 HOST_MUX=vnode02.pl.sophia.inria.fr
-# f14-32
 HOST_END1=vnode10.pl.sophia.inria.fr
-# f14-64
 HOST_END2=vnode07.pl.sophia.inria.fr
 
+# and their related IP and netmask
+# not that all these MUST fall in the vsys_vnet tag as granted by your planetlab operator
+# (in this example it is 10.0.100.0/24)
+
 IP_SENDER=10.0.100.1/24
 IP_MUX=10.0.100.2/24
 IP_END1=10.0.100.3/24
 IP_END2=10.0.100.4/24
 
-# the ssh key to use; optional
-SSH_KEY=key_user.rsa
+#################### the links to create
+LINKS :=
+# add one from SENDER to MUX
+LINKS += SENDER-MUX 
+# one from MUX to each of the 2 receivers
+LINKS += MUX-END1
+LINKS += MUX-END2
+
+####################
+
 
-# how to display nodes in messages
-display="$(call solve,$(1))"
diff --git a/planetlab/exp-tool/links.example b/planetlab/exp-tool/links.example
deleted file mode 100644 (file)
index b8ae16d..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SENDER-MUX
-MUX-END1
-MUX-END2
index dabb016..87f173e 100755 (executable)
@@ -11,7 +11,7 @@ DB_CONF_FILE=/etc/openvswitch/conf.db
 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
 ##
@@ -115,16 +115,9 @@ function start_db () {
        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 "" "$@"
 
@@ -144,10 +137,17 @@ function start_switch () {
     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')