diff --git a/ipam/allocator.go b/ipam/allocator.go index b7aaae1c..fc93bd67 100644 --- a/ipam/allocator.go +++ b/ipam/allocator.go @@ -971,6 +971,7 @@ func (alloc *Allocator) syncOwned(ids map[string]struct{}) { for _, cidr := range cidrs { alloc.space.Free(cidr.Addr) } + alloc.debugf("Deleting old entry %s: %v", ident, cidrs) delete(alloc.owned, ident) changed = true } diff --git a/test/370_persist_ipam_2_test.sh b/test/370_persist_ipam_2_test.sh index d4bc5ef3..4f8909f5 100755 --- a/test/370_persist_ipam_2_test.sh +++ b/test/370_persist_ipam_2_test.sh @@ -13,22 +13,36 @@ launch_router_with_db() { launch_router_with_db $HOST1 $HOST2 launch_router_with_db $HOST2 $HOST1 +EXPOSE=$(weave_on $HOST1 expose) start_container $HOST1 --name=c1 C1=$(container_ip $HOST1 c1) start_container $HOST2 --name=c2 assert_raises "exec_on $HOST2 c2 $PING $C1" +start_container $HOST2 --name=c3a +C3a=$(container_ip $HOST2 c3a) stop_weave_on $HOST1 stop_weave_on $HOST2 +# Stop one container while weave is down; the address should be freed on launch +docker_on $HOST2 rm -f c3a + # Start just HOST2; if nothing persisted it would form its own ring launch_router_with_db $HOST2 start_container $HOST2 --name=c3 C3=$(container_ip $HOST2 c3) assert_raises "[ $C3 != $C1 ]" +assert_raises "[ $C3 = $C3a ]" # Restart HOST1 and see if it remembers to connect to HOST2 launch_router_with_db $HOST1 assert_raises "exec_on $HOST2 c2 $PING $C1" +# Restart the router without going through the reclaim procedure on launch +docker_on $HOST1 restart weave +# Check that weave:expose address hasn't been lost +start_container $HOST1 --name=c4 +C4=$(container_ip $HOST1 c4) +assert_raises "[ $C4 != $EXPOSE ]" + end_suite