accept a default vale for CONTROLLER_x
[sliver-openvswitch.git] / planetlab / exp-tool / Makefile
index 40e8803..d151a66 100644 (file)
@@ -38,11 +38,15 @@ opp=$(call linkpart,$(1))@$(call flip,$(call endpart,$(1)))
 # rget(x-y@2) = x
 rget=$(call get,$(call opp,$(1)))
 ###
+default=$(if $($(1)_$(2)),$($(1)_$(2)),$($(1)))
 solve=$(HOST_$(1))
 solve_ip=$(IP_$(1))
 # can be redefined in conf.mk if that's not the expected behaviour
 display?=host $(1) aka $(call solve,$(1))
 
+# log file name
+log=$(addprefix log/,$(notdir $(1)))
+
 #################### set variables after conf.mk
 ifeq "$(SSH_KEY)" ""
 SSH_KEY_OPTION ?=
@@ -57,12 +61,13 @@ SUDO ?= sudo -S
 
 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))
+CONF_NODE_IDS=$(subst HOST_,,$(filter HOST_%,$(.VARIABLES)))
 
 ####################
 all+init: init all
 init:
        @[ -d L ] || ( echo Creating tmp dir L; mkdir L)
-       @[ -d U ] || ( echo Creating tmp dir U; mkdir U)
+       @[ -d log ] || (echo Creating tmp dir log; mkdir log)
        @[ -d cache ] || ( echo Creating tmp dir cache; mkdir cache)
 .PHONY: all+init init
 
@@ -109,6 +114,10 @@ BRIDGES=$(foreach id,$(ALL_NODE_IDS),cache/bridge.$(id))
 bridges: $(BRIDGES)
 .PHONY: bridges
 
+CONTROLLERS=$(foreach id,$(ALL_NODE_IDS),cache/controller.$(id))
+controllers: $(CONTROLLERS)
+.PHONY: controllers
+
 ### node-oriented targets
 # check ssh connectivity
 cache/sshcheck.%: FORCE
@@ -125,18 +134,22 @@ cache/host.%:
        @host $(HOST_$*) | sed -n 's/^.*has address *//p' > $@
 
 cache/db.%:
-       @echo "Starting db server on $(call display,$*) - logs in $@.log"
-       @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs start-db &> $@.log && touch $@
+       @echo "Starting db server on $(call display,$*) - logs in $(call log,$@)"
+       @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs start-db &> $(call log,$@) && touch $@
 
 cache/switch.%: cache/db.%
-       @echo "Starting vswitchd on $(call display,$*) - logs in $@.log"
-       @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs start-switch &> $@.log && touch $@
+       @echo "Starting vswitchd on $(call display,$*) - logs in $(call log,$@)"
+       @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs start-switch &> $(call log,$@) && touch $@
 
 cache/bridge.%: cache/switch.%
-       @echo "Creating bridge on $(call display,$*) - logs in $@.log"
-       @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs create-bridge $(BRIDGE) $(IP_$*) > $@ 2> $@.log || { rm $@; exit 1; }
+       @echo "Creating bridge on $(call display,$*) - logs in $(call log,$@)"
+       @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs create-bridge $(BRIDGE) $(IP_$*) > $@ 2> $(call log,$@) || { rm $@; exit 1; }
        @echo Created bridge with tap $$(cat $@) on $(call display,$*)
 
+cache/controller.%: cache/bridge.%
+       @echo "Setting controller $(call default,CONTROLLER,$*) on $(call display,$*) - logs in $(call log,$@)"
+       @$(SSH) $(HOST_$*) $(SUDO) ovs-vsctl set-controller $(BRIDGE) $(call default,CONTROLLER,$*) &> $(call log,$@) || { rm $@; exit 1; }
+
 # xxx this probably needs a more thorough cleanup in cache/
 cache/stop.%: del-bridge.%
        @echo "Stopping switch & db on $(call display,$*)"
@@ -154,9 +167,7 @@ U/%: del-iface.%@1 del-iface.%@2
 
 del-bridge.%: cache/db.%
        @echo "Deleting bridge on $(call display,$*)"
-       @if [ -f cache/bridge.$* ]; then \
-               $(SSH) $(HOST_$*) $(SUDO) sliver-ovs del-bridge $(BRIDGE);\
-        fi
+       @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs del-bridge $(BRIDGE);
        @rm -f cache/bridge.$* \
              cache/iface.$*$(SEP)*@1 cache/iface.*$(SEP)$*@2 \
              cache/link.$*$(SEP)*@?  cache/link.*$(SEP)$*@?  \
@@ -164,12 +175,12 @@ del-bridge.%: cache/db.%
 
 del-switch.%: del-bridge.%
        @echo "Shutting down switch on $(call display,$*)"
-       @[ -f cache/switch.$* ] && $(SSH) $(HOST_$*) $(SUDO) sliver-ovs stop-switch
-       @rm -f cache/switch.$*
+       @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs stop-switch
+       @rm -f cache/switch.$* 
 
 del-db.%:
        @echo "Shutting down db on $(call display,$*)"
-       @[ -f cache/db.$* ] && $(SSH) $(HOST_$*) $(SUDO) sliver-ovs stop-db
+       @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs stop-db
        @rm -f cache/db.$*
 
 del-links: $(addprefix U/,$(notdir $(filter-out %.log,$(wildcard L/*))))
@@ -182,6 +193,30 @@ shutdown: del-switchs del-dbs
 
 .PHONY: del-links del-switchs del-dbs shutdown
 
+
+### snapshots
+remote-snapshot: remote-snapshot-ips remote-snapshot-links
+       @true
+
+remote-snapshot-ips: $(addprefix cache/rsnap.ip.,$(CONF_NODE_IDS))
+       @cat /dev/null $^
+
+remote-snapshot-links: $(addprefix cache/rsnap.links.,$(CONF_NODE_IDS))
+       @sort -u /dev/null $^
+
+.PHONY: remote-snapshot remote-snapshot-ips remote-snapshot-links
+
+cache/rsnap.ip.%: 
+       @$(SSH) $(HOST_$*) $(SUDO) ovs-vsctl -- \
+               get interface $(BRIDGE) options:local_ip options:local_netmask |\
+               sed -n 's|"||g;1h;2{G;s|\(.*\)\n\(.*\)|IP_$* = \2/\1|p}' > $@ || \
+        { rm $@; exit 1; }
+
+cache/rsnap.links.%: 
+       @$(SSH) $(HOST_$*) $(SUDO) ovs-vsctl list-ifaces $(BRIDGE) | \
+        sed -n 's/^L/LINKS += /p' > $@ || \
+        { rm $@; exit 1; }
+
 .SECONDEXPANSION:
 
 del-iface.%: cache/db.$$(call get,%)
@@ -197,9 +232,9 @@ del-iface.%: cache/db.$$(call get,%)
 #nodeid=$(call get,%)
 #bridgefile=cache/bridge.$(nodeid)
 cache/iface.%: cache/bridge.$$(call get,%)
-       @echo "Creating interface for link $(call linkpart,$(*F)) on $(call display,$(call get,$(*F))) - logs in $@.log"
+       @echo "Creating interface for link $(call linkpart,$(*F)) on $(call display,$(call get,$(*F))) - logs in $(call log,$@)"
        @$(SSH) $(call solve,$(call get,$(*F))) $(SUDO) sliver-ovs create-port $(BRIDGE) \
-               L$(call linkpart,$(*F)) > $@ 2> $@.log || { rm $@; exit 1; }
+               L$(call linkpart,$(*F)) > $@ 2> $(call log,$@) || { rm $@; exit 1; }
 
 
 # linkid=$(call linkpart,%)
@@ -207,10 +242,10 @@ cache/iface.%: cache/bridge.$$(call get,%)
 # iface1=cache/iface.%
 # iface2=cache/iface.$(call opp,%)
 cache/link.%: cache/host.$$(call rget,%) cache/iface.% cache/iface.$$(call opp,%)
-       @echo "Setting port number of link $(call linkpart,$(*F)) on $(call display,$(call get,$(*F))) - logs in $@.log"
+       @echo "Setting port number of link $(call linkpart,$(*F)) on $(call display,$(call get,$(*F))) - logs in $(call 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 \
+                       $$(cat cache/iface.$(call opp,$(*F))) 2> $(call log,$@) \
         && touch $@
 
 ####################