diff --git a/ipam/tracker/awsvpc.go b/ipam/tracker/awsvpc.go index fdd4f313c0..0e9d1e5ded 100644 --- a/ipam/tracker/awsvpc.go +++ b/ipam/tracker/awsvpc.go @@ -84,7 +84,7 @@ func NewAWSVPCTracker(bridgeName string) (*AWSVPCTracker, error) { func (t *AWSVPCTracker) HandleUpdate(prevRanges, currRanges []address.Range, local bool) error { t.debugf("replacing %q by %q; local(%t)", prevRanges, currRanges, local) - prev, curr := RemoveCommon(address.NewCIDRs(Merge(prevRanges)), address.NewCIDRs(Merge(currRanges))) + prev, curr := address.RemoveCommon(address.NewCIDRs(address.Merge(prevRanges)), address.NewCIDRs(address.Merge(currRanges))) // It might make sense to do the removal first and then add entries // because of the 50 routes limit. However, in such case a container might diff --git a/ipam/tracker/helpers_test.go b/ipam/tracker/helpers_test.go deleted file mode 100644 index dce74eecd7..0000000000 --- a/ipam/tracker/helpers_test.go +++ /dev/null @@ -1,52 +0,0 @@ -package tracker - -import ( - "testing" - - "github.com/stretchr/testify/require" - - "github.com/weaveworks/weave/net/address" -) - -var ( - r0to127 = cidr("10.0.0.0", "10.0.0.127") - r128to255 = cidr("10.0.0.128", "10.0.0.255") - r0to255 = cidr("10.0.0.0", "10.0.0.255") - r1dot0to255 = cidr("10.0.1.0", "10.0.1.255") - r2dot0to255 = cidr("10.0.2.0", "10.0.2.255") -) - -func TestRemoveCommon(t *testing.T) { - a := []address.CIDR{r0to127, r1dot0to255} - b := []address.CIDR{r1dot0to255, r2dot0to255} - newA, newB := RemoveCommon(a, b) - require.Equal(t, []address.CIDR{r0to127}, newA) - require.Equal(t, []address.CIDR{r2dot0to255}, newB) -} - -func TestMerge(t *testing.T) { - ranges := []address.Range{ - r0to127.Range(), - r128to255.Range(), - r2dot0to255.Range(), - } - require.Equal(t, []address.Range{r0to255.Range(), r2dot0to255.Range()}, Merge(ranges)) -} - -// Helper - -// TODO(mp) DRY with helpers of other tests. - -func ip(s string) address.Address { - addr, _ := address.ParseIP(s) - return addr -} - -// [start; end] -func cidr(start, end string) address.CIDR { - c := address.Range{Start: ip(start), End: ip(end) + 1}.CIDRs() - if len(c) != 1 { - panic("invalid cidr") - } - return c[0] -} diff --git a/ipam/tracker/helpers.go b/net/address/helpers.go similarity index 78% rename from ipam/tracker/helpers.go rename to net/address/helpers.go index b882300725..920e90874a 100644 --- a/ipam/tracker/helpers.go +++ b/net/address/helpers.go @@ -1,13 +1,9 @@ -package tracker - -import ( - "github.com/weaveworks/weave/net/address" -) +package address // Merge merges adjacent range entries. // The given slice has to be sorted in increasing order. -func Merge(r []address.Range) []address.Range { - var merged []address.Range +func Merge(r []Range) []Range { + var merged []Range for i := range r { if prev := len(merged) - 1; prev >= 0 && merged[prev].End == r[i].Start { @@ -22,7 +18,7 @@ func Merge(r []address.Range) []address.Range { // RemoveCommon filters out CIDR ranges which are contained in both a and b slices. // Both slices have to be sorted in increasing order. -func RemoveCommon(a, b []address.CIDR) (newA, newB []address.CIDR) { +func RemoveCommon(a, b []CIDR) (newA, newB []CIDR) { i, j := 0, 0 for i < len(a) && j < len(b) { diff --git a/net/address/helpers_test.go b/net/address/helpers_test.go new file mode 100644 index 0000000000..2ebd2d317e --- /dev/null +++ b/net/address/helpers_test.go @@ -0,0 +1,43 @@ +package address + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +var ( + r0to127 = cidr2("10.0.0.0", "10.0.0.127") + r128to255 = cidr2("10.0.0.128", "10.0.0.255") + r0to255 = cidr2("10.0.0.0", "10.0.0.255") + r1dot0to255 = cidr2("10.0.1.0", "10.0.1.255") + r2dot0to255 = cidr2("10.0.2.0", "10.0.2.255") +) + +func TestRemoveCommon(t *testing.T) { + a := []CIDR{r0to127, r1dot0to255} + b := []CIDR{r1dot0to255, r2dot0to255} + newA, newB := RemoveCommon(a, b) + require.Equal(t, []CIDR{r0to127}, newA) + require.Equal(t, []CIDR{r2dot0to255}, newB) +} + +func TestMerge(t *testing.T) { + ranges := []Range{ + r0to127.Range(), + r128to255.Range(), + r2dot0to255.Range(), + } + require.Equal(t, []Range{r0to255.Range(), r2dot0to255.Range()}, Merge(ranges)) +} + +// Helper + +// [start; end] +func cidr2(start, end string) CIDR { + c := Range{Start: ip(start), End: ip(end) + 1}.CIDRs() + if len(c) != 1 { + panic("invalid cidr") + } + return c[0] +} diff --git a/net/bridge.go b/net/bridge.go index 0ac6fdea51..bcad3a3186 100644 --- a/net/bridge.go +++ b/net/bridge.go @@ -15,7 +15,6 @@ import ( "github.com/weaveworks/weave/common" "github.com/weaveworks/weave/common/chains" "github.com/weaveworks/weave/common/odp" - "github.com/weaveworks/weave/ipam/tracker" "github.com/weaveworks/weave/net/address" "github.com/weaveworks/weave/net/ipset" ) @@ -606,9 +605,9 @@ func (t *NoMasqLocalTracker) HandleUpdate(prevRanges, currRanges []address.Range return nil } - prev, curr := tracker.RemoveCommon( - address.NewCIDRs(tracker.Merge(prevRanges)), - address.NewCIDRs(tracker.Merge(currRanges))) + prev, curr := address.RemoveCommon( + address.NewCIDRs(address.Merge(prevRanges)), + address.NewCIDRs(address.Merge(currRanges))) for _, cidr := range curr { if err := t.ips.AddEntry(t.owner, NoMasqLocalIpset, cidr.String(), ""); err != nil {