single config file - LINKS get defined in conf.mk
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Tue, 11 Sep 2012 12:32:26 +0000 (14:32 +0200)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Tue, 11 Sep 2012 12:32:26 +0000 (14:32 +0200)
this breaks the feature that lets save current topology but makes
user's - esp. firtst-time user's - life much easier
also an attempt to make the Makefile less cryptic :)

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

index d25a440..5986216 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 $*"
@@ -161,43 +183,51 @@ shutdown: del-switches 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) ovs-vsctl set interface L$(call proj1,$*) \
-                       options:remote_ip=$$(cat cache/host.$(call rget,$*)) \
-                       options:remote_port=$$(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 \
         && touch $@
 
+####################
+CLEANTARGETS=$(addprefix del-,$(notdir $(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 +238,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