Merge pull request #152 from rade/weave_script_tidy

various simplifications and tidying up in weave script
This commit is contained in:
David Wragg committed 2014-10-24 14:26:35 +01:00
commit ded7d3a991
1 file changed
+30 -46
+30 -46
View File
@@ -73,10 +73,6 @@ add_iptables_rule() {
fi
}
add_nat_rule() {
add_iptables_rule nat "$@"
}
create_bridge() {
[ ! -d /sys/class/net/$BRIDGE ] && {
ip link add name $BRIDGE type bridge
@@ -106,9 +102,9 @@ destroy_bridge() {
setup_masquerading() {
run_iptables -t nat -N WEAVE >/dev/null 2>&1 || true
add_nat_rule POSTROUTING -j WEAVE
add_nat_rule WEAVE -o $BRIDGE ! -s $1 -j MASQUERADE
add_nat_rule WEAVE -s $1 ! -o $BRIDGE -j MASQUERADE
add_iptables_rule nat POSTROUTING -j WEAVE
add_iptables_rule nat WEAVE -o $BRIDGE ! -s $1 -j MASQUERADE
add_iptables_rule nat WEAVE -s $1 ! -o $BRIDGE -j MASQUERADE
}
stop_masquerading() {
@@ -119,7 +115,7 @@ stop_masquerading() {
# the following borrows from https://github.com/jpetazzo/pipework
with_container_netns () {
CONTAINER="$2"
CONTAINER="$1"
CONTAINER_PID=$(docker inspect --format='{{ .State.Pid }}' $CONTAINER)
if [ "$CONTAINER_PID" = 0 ] ; then
@@ -144,6 +140,7 @@ with_container_netns () {
# Run the wrapped command
STATUS=0
shift 1
if ! "$@" >$IP_TMPFILE 2>&1 ; then
STATUS=1
if [ "$(docker inspect --format='{{ .State.Pid }}' $CONTAINER)" != "$CONTAINER_PID" ] ; then
@@ -158,19 +155,16 @@ with_container_netns () {
return $STATUS
}
# Attach Container-ID $1 to the weave network at CIDR address $2,
# creating a virtual ethernet device if necessary.
# Also turn off tx offload on device $3 inside the namespace.
attach() {
if ip link show $LOCAL_IFNAME >/dev/null 2>&1 ; then
# veth name already exists, so assume we set it up already;
# just add the IP address.
if ip netns exec $NETNS ip addr show dev $CONTAINER_IFNAME | grep -F $2 >/dev/null ; then
if ip netns exec $NETNS ip addr show dev $CONTAINER_IFNAME | grep -F $1 >/dev/null ; then
# address was there already
return 0
fi
if ! ip netns exec $NETNS ip addr add $2 dev $CONTAINER_IFNAME ; then
if ! ip netns exec $NETNS ip addr add $1 dev $CONTAINER_IFNAME ; then
return 1
fi
@@ -181,40 +175,35 @@ attach() {
return 1
fi
if ! ip link set $LOCAL_IFNAME master $BRIDGE ||
! ip link set $LOCAL_IFNAME up ||
! ip link set $GUEST_IFNAME netns $NETNS ; then
if ! ip link set $GUEST_IFNAME netns $NETNS ; then
# failed before we assigned the veth to the container's
# namespace - delete it
ip link del $LOCAL_IFNAME type veth || true
return 1
fi
if ! ip netns exec $NETNS ip link set $GUEST_IFNAME name $CONTAINER_IFNAME ||
! ip netns exec $NETNS ip addr add $2 dev $CONTAINER_IFNAME ||
if ! ip link set $LOCAL_IFNAME master $BRIDGE ||
! ip link set $LOCAL_IFNAME up ||
! ip netns exec $NETNS ip link set $GUEST_IFNAME name $CONTAINER_IFNAME ||
! ip netns exec $NETNS ip addr add $1 dev $CONTAINER_IFNAME ||
! ip netns exec $NETNS ip link set $CONTAINER_IFNAME up ||
! check_command_and_run ethtool ip netns exec $NETNS ethtool -K $3 tx off >/dev/null ; then
! check_command_and_run ethtool ip netns exec $NETNS ethtool -K $2 tx off >/dev/null ; then
return 1
fi
if ip netns exec $NETNS ip route show | grep '^224\.0\.0\.0/4' >/dev/null ; then
# There's a multicast route already present, leave it alone.
return 0
fi
# Route multicast packets across the weave network.
ip netns exec $NETNS ip route add 224.0.0.0/4 dev $CONTAINER_IFNAME
if ! ip netns exec $NETNS ip route show | grep '^224\.0\.0\.0/4' >/dev/null ; then
ip netns exec $NETNS ip route add 224.0.0.0/4 dev $CONTAINER_IFNAME
fi
}
# Detach Container-ID $1 at CIDR address $2 from the weave network
# removing the virtual ethernet device if there are no more addresses
detach() {
if ! ip netns exec $NETNS ip addr show dev $CONTAINER_IFNAME | grep -F $2 >/dev/null ; then
if ! ip netns exec $NETNS ip addr show dev $CONTAINER_IFNAME | grep -F $1 >/dev/null ; then
# address is not there, leave the device alone
return 0
fi
if ! ip netns exec $NETNS ip addr del $2 dev $CONTAINER_IFNAME ; then
if ! ip netns exec $NETNS ip addr del $1 dev $CONTAINER_IFNAME ; then
return 1
fi
@@ -230,7 +219,7 @@ detach() {
case "$COMMAND" in
launch)
[ $# -gt 0 ] || usage
IPADDR=$1
CIDR=$1
shift 1
case $(docker inspect --format '{{ .State.Running }} {{ .Config.Image }}' weave 2>/dev/null) in
"true $IMAGE")
@@ -251,7 +240,7 @@ case "$COMMAND" in
esac
create_bridge
stop_masquerading
setup_masquerading $IPADDR
setup_masquerading $CIDR
# We set the router name to the bridge mac since that is
# stable across re-creations of the containers.
#
@@ -263,7 +252,7 @@ case "$COMMAND" in
# additional parameters, such as resource limits, to docker
# when launching the weave container.
CONTAINER=$(docker run --privileged -d --name=weave -p 6783:6783/tcp -p 6783:6783/udp $WEAVE_DOCKER_ARGS $IMAGE -name $MACADDR "$@" | tail -n 1)
with_container_netns attach $CONTAINER $IPADDR eth0
with_container_netns $CONTAINER attach $CIDR eth0
echo $CONTAINER
;;
status)
@@ -296,48 +285,43 @@ case "$COMMAND" in
;;
run)
[ $# -gt 0 ] || usage
IPADDR=$1
CIDR=$1
shift 1
create_bridge
CONTAINER=$(docker run -d "$@" | tail -n 1)
with_container_netns attach $CONTAINER $IPADDR $CONTAINER_IFNAME
with_container_netns $CONTAINER attach $CIDR $CONTAINER_IFNAME
echo $CONTAINER
;;
start)
[ $# -gt 1 ] || usage
IPADDR=$1
create_bridge
CONTAINER=$(docker start $2)
with_container_netns attach $CONTAINER $IPADDR $CONTAINER_IFNAME
with_container_netns $CONTAINER attach $1 $CONTAINER_IFNAME
echo $CONTAINER
;;
attach)
[ $# -gt 1 ] || usage
create_bridge
with_container_netns attach $2 $1 $CONTAINER_IFNAME
with_container_netns $2 attach $1 $CONTAINER_IFNAME
;;
detach)
[ $# -gt 1 ] || usage
with_container_netns detach $2 $1
with_container_netns $2 detach $1
;;
expose)
[ $# -gt 0 ] || usage
IPADDR=$1
shift 1
create_bridge
if ! ip addr show dev $BRIDGE | grep -qF $IPADDR
if ! ip addr show dev $BRIDGE | grep -qF $1
then
ip addr add dev $BRIDGE $IPADDR
ip addr add dev $BRIDGE $1
fi
;;
hide)
[ $# -gt 0 ] || usage
IPADDR=$1
shift 1
create_bridge
if ip addr show dev $BRIDGE | grep -qF $IPADDR
if ip addr show dev $BRIDGE | grep -qF $1
then
ip addr del dev $BRIDGE $IPADDR
ip addr del dev $BRIDGE $1
fi
;;
stop)