From 0613a066539b9ad9edce8ff4921428967562cd39 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 5 Jun 2015 17:11:28 +0100 Subject: [PATCH] IPAM: handle multiple CIDRs in weave script --- weave | 57 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/weave b/weave index f96e25e4..af4fcfe1 100755 --- a/weave +++ b/weave @@ -33,14 +33,14 @@ usage() { echo "weave launch-proxy [-D ] [-H
] [--with-dns] [--with-ipam]" echo "weave connect [--replace] [ ...]" echo "weave forget ..." - echo "weave run [--with-dns] [ ...] ..." - echo "weave start [ ...] " - echo "weave attach [ ...] " - echo "weave detach [ ...] " + echo "weave run [--with-dns] [[--subnet] ...] ..." + echo "weave start [[--subnet] ...] " + echo "weave attach [[--subnet] ...] " + echo "weave detach [[--subnet] ...] " echo "weave dns-add [ ...] [-h ]" echo "weave dns-remove [ ...] [-h ]" - echo "weave expose [ ...] [-h ]" - echo "weave hide [ ...]" + echo "weave expose [[--subnet] ...] [-h ]" + echo "weave hide [[--subnet] ...]" echo "weave ps [ ...]" echo "weave status" echo "weave proxy-env" @@ -105,7 +105,7 @@ validate_cidr() { collect_cidr_args() { CIDR_ARGS="" CIDR_COUNT=0 - while is_cidr "$1" ; do + while is_cidr "$1" || [ "$1" = "--subnet" ] ; do CIDR_ARGS="$CIDR_ARGS $1" CIDR_COUNT=$((CIDR_COUNT + 1)) shift 1 @@ -751,13 +751,35 @@ ipam_claim() { done } -# If we don't already have any CIDRs passed from the command-line, get -# one from IPAM. $1 is the full container id. -get_ipam_cidr() { - if [ -n "$CIDR_ARGS" ] ; then +# Pass all CIDRs to IPAM so that network addresses can be interpreted +# as subnets to allocate within. $1 is the full container id; following +# args are previously parsed CIDR_ARGS. +ipam_cidrs() { + CONTAINER_ID="$1" + shift 1 + if [ $# -gt 0 ] ; then + CIDR_ARGS="" + while [ $# -gt 0 ] ; do + if [ $# -gt 1 -a "$1" = "--subnet" ] ; then + shift 1 + # (assuming weave is now listening to /ip URLs all the time) + CIDR=$(http_call $CONTAINER_NAME $HTTP_PORT POST /ip/$CONTAINER_ID/$1) + CIDR_COUNT=$((CIDR_COUNT - 1)) + else + CIDR=$1 + fi + CIDR_ARGS="$CIDR_ARGS $CIDR" + shift 1 + done return 0 fi - CIDR_ARGS="$(http_call $CONTAINER_NAME $HTTP_PORT POST /ip/$1)" + # If no addresses passed in, get one in the default subnet + CIDR_ARGS="$(http_call $CONTAINER_NAME $HTTP_PORT POST /ip/$CONTAINER_ID)" + if [ "$CIDR_ARGS" = "No subnet specified" ] ; then + echo "No IP address supplied (use the -iprange and -defaultsubnet options on 'weave launch' to enable IP address allocation)" >&2 + return 1 + fi + # todo: do we still have to handle this error? Considering above assumption? if [ "$CIDR_ARGS" = "404 page not found" ] ; then echo "No IP address supplied (use the -iprange option on 'weave launch' to enable IP address allocation)" >&2 return 1 @@ -1031,7 +1053,7 @@ case "$COMMAND" in shift $CIDR_COUNT CONTAINER=$(docker run $DNS_ARGS -d "$@") create_bridge - get_ipam_cidr $CONTAINER + ipam_cidrs $CONTAINER $CIDR_ARGS with_container_netns_or_die $CONTAINER attach $CIDR_ARGS when_dns_running with_container_fqdn $CONTAINER put_dns_fqdn $CIDR_ARGS echo $CONTAINER @@ -1051,7 +1073,7 @@ case "$COMMAND" in RES=$(docker start $1) CONTAINER=$(container_id $1) create_bridge - get_ipam_cidr $CONTAINER + ipam_cidrs $CONTAINER $CIDR_ARGS with_container_netns_or_die $CONTAINER attach $CIDR_ARGS when_dns_running with_container_fqdn $CONTAINER put_dns_fqdn $CIDR_ARGS echo $RES @@ -1062,7 +1084,7 @@ case "$COMMAND" in [ $# -eq 1 ] || usage CONTAINER=$(container_id $1) create_bridge - get_ipam_cidr $CONTAINER + ipam_cidrs $CONTAINER $CIDR_ARGS with_container_netns $CONTAINER attach $CIDR_ARGS >/dev/null when_dns_running with_container_fqdn $CONTAINER put_dns_fqdn $CIDR_ARGS ;; @@ -1071,6 +1093,7 @@ case "$COMMAND" in shift $CIDR_COUNT [ $# -eq 1 ] || usage CONTAINER=$(container_id $1) + ipam_cidrs $CONTAINER $CIDR_ARGS with_container_netns $CONTAINER detach $CIDR_ARGS >/dev/null when_dns_running with_container_fqdn $CONTAINER delete_dns_fqdn $CIDR_ARGS ;; @@ -1101,7 +1124,7 @@ case "$COMMAND" in expose) collect_cidr_args "$@" shift $CIDR_COUNT - get_ipam_cidr weave:expose + ipam_cidrs weave:expose $CIDR_ARGS if [ $# -eq 0 ] ; then FQDN="" else @@ -1124,7 +1147,7 @@ case "$COMMAND" in hide) collect_cidr_args "$@" shift $CIDR_COUNT - get_ipam_cidr weave:expose + ipam_cidrs weave:expose $CIDR_ARGS create_bridge --without-ethtool for CIDR in $CIDR_ARGS ; do if ip addr show dev $BRIDGE | grep -qF $CIDR ; then