diff --git a/site/features.md b/site/features.md index 1d89b26c..906a9152 100644 --- a/site/features.md +++ b/site/features.md @@ -184,6 +184,12 @@ will work. And, more interestingly, will work too, which is talking to a container that resides on `$HOST1`. +Multiple subnet addresses can be exposed or hidden with a single +invocation: + + host2# weave expose 10.2.1.102/24 10.3.1.102/24 + host2# weave hide 10.2.1.102/24 10.3.1.102/24 + ### Service export Services running in containers on a weave network can be made diff --git a/test/500_weave_multi_cidr_test.sh b/test/500_weave_multi_cidr_test.sh index dbd42da9..c280127a 100755 --- a/test/500_weave_multi_cidr_test.sh +++ b/test/500_weave_multi_cidr_test.sh @@ -51,6 +51,17 @@ assert_zone_records() { done } +# assert_bridge_cidrs [ ...] +assert_bridge_cidrs() { + HOST=$1; shift + DEV=$1; shift + CIDRS=$@ + + BRIDGE_CIDRS=$($SSH $HOST ip addr show dev $DEV | grep -o 'inet .*' | cut -d ' ' -f 2) + + assert "echo $BRIDGE_CIDRS" "$CIDRS" +} + # Run container with three cidrs CID=$(DOCKER_HOST=tcp://$HOST1:2375 $WEAVE run 10.0.0.1/24 10.0.0.2/24 10.0.0.3/24 -t --name multicidr -h multicidr.weave.local ubuntu | cut -b 1-12) assert_container_cidrs $HOST1 $CID 10.0.0.1/24 10.0.0.2/24 10.0.0.3/24 @@ -72,4 +83,12 @@ weave_on $HOST1 start 10.0.0.1/24 10.0.0.2/24 10.0.0.3/24 $CID assert_container_cidrs $HOST1 $CID 10.0.0.1/24 10.0.0.2/24 10.0.0.3/24 assert_zone_records $HOST1 $CID multicidr.weave.local. 10.0.0.1 10.0.0.2 10.0.0.3 +# Expose some cidrs +weave_on $HOST1 expose 10.0.0.4/24 10.0.0.5/24 10.0.0.6/24 +assert_bridge_cidrs $HOST1 weave 10.0.0.4/24 10.0.0.5/24 10.0.0.6/24 + +# Hide some cidrs +weave_on $HOST1 hide 10.0.0.5/24 10.0.0.6/24 +assert_bridge_cidrs $HOST1 weave 10.0.0.4/24 + end_suite \ No newline at end of file diff --git a/weave b/weave index b3d2c4ff..fbaed1ad 100755 --- a/weave +++ b/weave @@ -715,29 +715,31 @@ case "$COMMAND" in tell_dns DELETE $CONTAINER_ID $CIDR_ARGS ;; expose) - [ $# -eq 1 ] || usage - CIDR=$1 - validate_cidr $CIDR - create_bridge --without-ethtool - if ! ip addr show dev $BRIDGE | grep -qF $CIDR - then - ip addr add dev $BRIDGE $CIDR - arp_update $BRIDGE $CIDR - add_iptables_rule nat WEAVE -o $BRIDGE ! -s $CIDR -j MASQUERADE - add_iptables_rule nat WEAVE -s $CIDR ! -o $BRIDGE -j MASQUERADE - fi + [ $# -gt 0 ] || usage + for CIDR; do + validate_cidr $CIDR + create_bridge --without-ethtool + if ! ip addr show dev $BRIDGE | grep -qF $CIDR + then + ip addr add dev $BRIDGE $CIDR + arp_update $BRIDGE $CIDR + add_iptables_rule nat WEAVE -o $BRIDGE ! -s $CIDR -j MASQUERADE + add_iptables_rule nat WEAVE -s $CIDR ! -o $BRIDGE -j MASQUERADE + fi + done ;; hide) - [ $# -eq 1 ] || usage - CIDR=$1 - validate_cidr $CIDR - create_bridge --without-ethtool - if ip addr show dev $BRIDGE | grep -qF $CIDR - then - ip addr del dev $BRIDGE $CIDR - delete_iptables_rule nat WEAVE -o $BRIDGE ! -s $CIDR -j MASQUERADE - delete_iptables_rule nat WEAVE -s $CIDR ! -o $BRIDGE -j MASQUERADE - fi + [ $# -gt 0 ] || usage + for CIDR; do + validate_cidr $CIDR + create_bridge --without-ethtool + if ip addr show dev $BRIDGE | grep -qF $CIDR + then + ip addr del dev $BRIDGE $CIDR + delete_iptables_rule nat WEAVE -o $BRIDGE ! -s $CIDR -j MASQUERADE + delete_iptables_rule nat WEAVE -s $CIDR ! -o $BRIDGE -j MASQUERADE + fi + done ;; stop) [ $# -eq 0 ] || usage