include conf.mk
+
# proj1(x@y) = x
proj1=$(word 1,$(subst @, ,$(1)))
# proj2(x@y) = y
proj2=$(word 2,$(subst @, ,$(1)))
+SEP?=-
# get(x-y@1) = x
# get(x-y@2) = y
-get=$(word $(call proj2,$(1)),$(subst -, ,$(call proj1,$(1))))
+get=$(word $(call proj2,$(1)),$(subst $(SEP), ,$(call proj1,$(1))))
# flip(1) = 2
# flip(2) = 1
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
display?=host $(1) aka $(call solve,$(1))
SSH_KEY_OPTION ?= -i $(SSH_KEY)
endif
-SSH_OPTIONS ?= $(SSH_KEY_OPTION) -l $(SLICE)
+SSH_OPTIONS ?= $(SSH_KEY_OPTION) -l $(SLICE) -t
SSH = ssh $(SSH_OPTIONS)
+SUDO ?= sudo -S
+
ALL_NODE_IDS=$(shell (cut -d- -f1 < links; cut -d- -f2 < links) | sort -u)
####################
all: $(addprefix L/,$(shell cat links))
.PHONY: all
-nodes:
- @echo $(foreach id,$(ALL_NODE_IDS),$(call display,$(id)))
-.PHONY: nodes
+# could also do make ++SLICE
+showslice: ++SLICE FORCE
+
+shownodes:
+ @$(foreach id,$(ALL_NODE_IDS),echo $(id)=$(call display,$(id));)
+.PHONY: shownodes
sshchecks: $(foreach id,$(ALL_NODE_IDS),cache/sshcheck.$(id))
.PHONY: sshchecks
dbs: $(foreach id,$(ALL_NODE_IDS),cache/db.$(id))
.PHONY: dbs
-switchds: $(foreach id,$(ALL_NODE_IDS),cache/switchd.$(id))
-.PHONY: switchds
+switchs: $(foreach id,$(ALL_NODE_IDS),cache/switch.$(id))
+.PHONY: switchs
+
+start: dbs switchs
+.PHONY: start
+
+stop:$(foreach id,$(ALL_NODE_IDS),cache/stop.$(id))
+.PHONY: stop
+
+status:$(foreach id,$(ALL_NODE_IDS),cache/status.$(id))
+.PHONY: status
### node-oriented targets
+# check ssh connectivity
+cache/sshcheck.%: FORCE
+ @if $(SSH) $(HOST_$*) hostname 2> /dev/null; then echo "ssh on" $(call display,$*) "OK" ; \
+ else echo "ssh on" $(call display,$*) "KO !!!"; fi
+
+# should probably replace sshcheck
+cache/status.%: FORCE
+ @echo "=== DB and SWITCH processes on $(call display,$*)"
+ @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs status
+
cache/host.%:
@echo "IP lookup for $(call display,$*)"
@host $(HOST_$*) | sed -n 's/^.*has address *//p' > $@
cache/db.%:
- @echo "Starting db server on $(call display,$*)"
- @$(SSH) $(HOST_$*) sudo start_ovsdb-server > $@ \
- || { rm $@; exit 1; }
+ @echo "Starting db server on $(call display,$*) - logs in $@.log"
+ @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs start-db &> $@.log && touch $@
-cache/switchd.%: cache/db.%
- @echo "Starting vswitchd on $(call display,$*)"
- @$(SSH) $(HOST_$*) sudo start_vswitchd > $@ \
- || { rm $@; exit 1; }
+cache/switch.%: cache/db.%
+ @echo "Starting vswitchd on $(call display,$*) - logs in $@.log"
+ @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs start-switch &> $@.log && touch $@
-cache/bridge.%: cache/switchd.%
- @echo "Creating bridge on $(call display,$*)"
- @$(SSH) $(HOST_$*) sudo create_bridge $(IP_$*) > $@ \
- || { rm $@; exit 1; }
+cache/bridge.%: cache/switch.%
+ @echo "Creating bridge on $(call display,$*) - logs in $@.log"
+ @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs create-bridge $(IP_$*) > $@.log && touch $@
-cache/sshcheck.%: FORCE
- @if $(SSH) $(HOST_$*) hostname 2> /dev/null; then echo "ssh on" $(call display,$*) "OK" ; \
- else echo "ssh on" $(call display,$*) "KO !!!"; fi
+# xxx this probably needs a more thorough cleanup in cache/
+cache/stop.%: del-bridge.%
+ @echo "Stopping switch & db on $(call display,$*)"
+ @$(SSH) $(HOST_$*) $(SUDO) sliver-ovs stop && rm cache/switch.% cache/db.%
### link-oriented targets
L/%: cache/link.%@1 cache/link.%@2
del-bridge.%: cache/db.%
@echo "Deleting bridge on $(call display,$*)"
@if [ -f cache/bridge.$* ]; then \
- $(SSH) $(HOST_$*) sudo del_bridge $$(cat cache/bridge.$*);\
+ $(SSH) $(HOST_$*) $(SUDO) sliver-ovs del-bridge $$(cat cache/bridge.$*);\
fi
@rm -f cache/bridge.$* \
- cache/iface.$*-*@1 cache/iface.*-$*@2 \
- cache/link.$*-*@? cache/link.*-$*@? \
- L/$*-* L/*-$*
-
-del-switchd.%: del-bridge.%
- @echo "Shutting down switchd on $(call display,$*)"
- @if [ -f cache/switchd.$* ]; then \
- $(SSH) $(HOST_$*) sudo ovs-appctl exit;\
+ cache/iface.$*$(SEP)*@1 cache/iface.*$(SEP)$*@2 \
+ cache/link.$*$(SEP)*@? cache/link.*$(SEP)$*@? \
+ L/$*$(SEP)* L/*$(SEP)$*
+
+del-switch.%: del-bridge.%
+ @echo "Shutting down switch on $(call display,$*)"
+ @if [ -f cache/switch.$* ]; then \
+ $(SSH) $(HOST_$*) $(SUDO) ovs-appctl exit;\
fi
- @rm -f cache/switchd.$*
+ @rm -f cache/switch.$*
del-db.%:
@echo "Shutting down db on $(call display,$*)"
@if [ -f cache/db.$* ]; then \
- $(SSH) $(HOST_$*) sudo ovs-appctl --target=$(VARRUN)/ovsdb-server.$$(cat cache/db.$*).ctl exit;\
+ $(SSH) $(HOST_$*) $(SUDO) ovs-appctl --target=$(VARRUN)/ovsdb-server.$$(cat cache/db.$*).ctl exit;\
fi
@rm -f cache/db.$*
del-links: $(addprefix U/,$(notdir $(wildcard L/*)))
-del-switchds: $(addprefix del-,$(notdir $(wildcard cache/switchd.*)))
+del-switchs: $(addprefix del-,$(notdir $(wildcard cache/switch.*)))
del-dbs: $(addprefix del-,$(notdir $(wildcard cache/db.*)))
shutdown: del-switches del-dbs
-.PHONY: del-links del-switchds del-dbs shutdown
+.PHONY: del-links del-switchs del-dbs shutdown
####################
graph.dot:
- ( echo "digraph $(SLICE) {"; ls L | sed 's/-/->/;s/$$/;/'; echo "}" ) > $@
+ ( echo "digraph $(SLICE) {"; ls L | sed 's/$(SEP)/->/;s/$$/;/'; echo "}" ) > $@
graph.ps: graph.dot
dot -Tps < $^ > $@
del-iface.%: cache/db.$$(call get,%)
@echo "Removing interface for link $(call proj1,$*) from $(call get,$*)"
@$(SSH) $(HOST_$(call get,$*)) \
- sudo del_port L$(call proj1,$*)
+ $(SUDO) sliver-ovs del-port L$(call proj1,$*)
@rm -f cache/iface.$* cache/link.$* cache/link.$(call opp,$*)
cache/iface.%: cache/bridge.$$(call get,%)
@echo "Creating interface for link $(call proj1,$*) on $(call get,$*)"
@$(SSH) $(HOST_$(call get,$*)) \
- sudo create_port $$(cat $^) L$(call proj1,$*) > $@ \
+ $(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,$*) \
+ $(SUDO) ovs-vsctl set interface L$(call proj1,$*) \
options:remote_ip=$$(cat cache/host.$(call rget,$*)) \
options:remote_port=$$(cat cache/iface.$(call opp,$*)) \
&& touch $@