diff --git a/ipam/ring/ring.go b/ipam/ring/ring.go index 67d1188c..1d3c10b2 100644 --- a/ipam/ring/ring.go +++ b/ipam/ring/ring.go @@ -119,6 +119,8 @@ func New(start, end address.Address, peer mesh.PeerName, f OnUpdate) *Ring { } func (r *Ring) Restore(other *Ring) { + defer r.trackUpdates()() + onUpdate := r.onUpdate *r = *other r.onUpdate = onUpdate diff --git a/ipam/tracker/awsvpc.go b/ipam/tracker/awsvpc.go index 1089b615..51424379 100644 --- a/ipam/tracker/awsvpc.go +++ b/ipam/tracker/awsvpc.go @@ -21,6 +21,7 @@ package tracker import ( "fmt" "net" + "syscall" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/ec2metadata" @@ -94,14 +95,14 @@ func (t *AWSVPCTracker) HandleUpdate(prevRanges, currRanges []address.Range, loc for _, cidr := range curr { cidrStr := cidr.String() t.debugf("adding route %s to %s", cidrStr, t.instanceID) - _, err := t.createVPCRoute(cidrStr) - if err != nil { + if _, err := t.createVPCRoute(cidrStr); err != nil { return fmt.Errorf("createVPCRoutes failed: %s", err) } if local { - err = t.createHostRoute(cidrStr) - if err != nil { - return fmt.Errorf("createHostRoute failed: %s", err) + if err := t.createHostRoute(cidrStr); err != nil { + if errno, ok := err.(syscall.Errno); !(ok && errno == syscall.EEXIST) { + return fmt.Errorf("createHostRoute failed: %s", err) + } } } } @@ -110,13 +111,11 @@ func (t *AWSVPCTracker) HandleUpdate(prevRanges, currRanges []address.Range, loc for _, cidr := range prev { cidrStr := cidr.String() t.debugf("removing %s route", cidrStr) - _, err := t.deleteVPCRoute(cidrStr) - if err != nil { + if _, err := t.deleteVPCRoute(cidrStr); err != nil { return fmt.Errorf("deleteVPCRoute failed: %s", err) } if local { - err = t.deleteHostRoute(cidrStr) - if err != nil { + if err := t.deleteHostRoute(cidrStr); err != nil { return fmt.Errorf("deleteHostRoute failed: %s", err) } } diff --git a/weave b/weave index 8c712897..c232a8a5 100755 --- a/weave +++ b/weave @@ -1656,6 +1656,10 @@ launch_router() { setup_router_iface_$BRIDGE_TYPE wait_for_status $CONTAINER_NAME http_call $HTTP_ADDR populate_router + setup_awsvpc +} + +setup_awsvpc() { if [ -n "$AWSVPC" ]; then expose_ip # Set proxy_arp on the bridge, so that it could accept packets destined @@ -1956,11 +1960,14 @@ EOF attach-router) check_running $CONTAINER_NAME enforce_docker_bridge_addr_assign_type + # We cannot use detect_awsvpc here, because HTTP server might not be started + ! docker inspect -f '{{.Config.Cmd}}' $CONTAINER_NAME | grep -q -- "--awsvpc" || AWSVPC=1 create_bridge fetch_router_args setup_router_iface_$BRIDGE_TYPE wait_for_status $CONTAINER_NAME http_call $HTTP_ADDR populate_router + setup_awsvpc ;; launch-proxy) deprecation_warnings "$@"