From 4f99efaaf492b425feb01de727c9648e931bfda9 Mon Sep 17 00:00:00 2001 From: Martynas Pumputis Date: Thu, 10 May 2018 12:43:33 +0200 Subject: [PATCH] Export tracker.RemoveCommon and tracker.Merge It's going to be used by NoMasqLocalTracker. --- ipam/tracker/awsvpc.go | 43 +---------------- ipam/tracker/helpers.go | 46 +++++++++++++++++++ .../{awsvpc_test.go => helpers_test.go} | 4 +- 3 files changed, 49 insertions(+), 44 deletions(-) create mode 100644 ipam/tracker/helpers.go rename ipam/tracker/{awsvpc_test.go => helpers_test.go} (95%) diff --git a/ipam/tracker/awsvpc.go b/ipam/tracker/awsvpc.go index 02489b19..fdd4f313 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 := RemoveCommon(address.NewCIDRs(Merge(prevRanges)), address.NewCIDRs(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 @@ -236,47 +236,6 @@ func (t *AWSVPCTracker) infof(fmt string, args ...interface{}) { // Helpers -// 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 - - for i := range r { - if prev := len(merged) - 1; prev >= 0 && merged[prev].End == r[i].Start { - merged[prev].End = r[i].End - } else { - merged = append(merged, r[i]) - } - } - - return merged -} - -// 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) { - i, j := 0, 0 - - for i < len(a) && j < len(b) { - switch { - case a[i].Start() < b[j].Start() || a[i].End() < b[j].End(): - newA = append(newA, a[i]) - i++ - case a[i].Start() > b[j].Start() || a[i].End() > b[j].End(): - newB = append(newB, b[j]) - j++ - default: - i++ - j++ - } - - } - newA = append(newA, a[i:]...) - newB = append(newB, b[j:]...) - - return -} - func parseCIDR(cidr string) (*net.IPNet, error) { ip, ipnet, err := net.ParseCIDR(cidr) if err != nil { diff --git a/ipam/tracker/helpers.go b/ipam/tracker/helpers.go new file mode 100644 index 00000000..b8823007 --- /dev/null +++ b/ipam/tracker/helpers.go @@ -0,0 +1,46 @@ +package tracker + +import ( + "github.com/weaveworks/weave/net/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 + + for i := range r { + if prev := len(merged) - 1; prev >= 0 && merged[prev].End == r[i].Start { + merged[prev].End = r[i].End + } else { + merged = append(merged, r[i]) + } + } + + return merged +} + +// 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) { + i, j := 0, 0 + + for i < len(a) && j < len(b) { + switch { + case a[i].Start() < b[j].Start() || a[i].End() < b[j].End(): + newA = append(newA, a[i]) + i++ + case a[i].Start() > b[j].Start() || a[i].End() > b[j].End(): + newB = append(newB, b[j]) + j++ + default: + i++ + j++ + } + + } + newA = append(newA, a[i:]...) + newB = append(newB, b[j:]...) + + return +} diff --git a/ipam/tracker/awsvpc_test.go b/ipam/tracker/helpers_test.go similarity index 95% rename from ipam/tracker/awsvpc_test.go rename to ipam/tracker/helpers_test.go index b99500a1..dce74eec 100644 --- a/ipam/tracker/awsvpc_test.go +++ b/ipam/tracker/helpers_test.go @@ -19,7 +19,7 @@ var ( func TestRemoveCommon(t *testing.T) { a := []address.CIDR{r0to127, r1dot0to255} b := []address.CIDR{r1dot0to255, r2dot0to255} - newA, newB := removeCommon(a, b) + newA, newB := RemoveCommon(a, b) require.Equal(t, []address.CIDR{r0to127}, newA) require.Equal(t, []address.CIDR{r2dot0to255}, newB) } @@ -30,7 +30,7 @@ func TestMerge(t *testing.T) { r128to255.Range(), r2dot0to255.Range(), } - require.Equal(t, []address.Range{r0to255.Range(), r2dot0to255.Range()}, merge(ranges)) + require.Equal(t, []address.Range{r0to255.Range(), r2dot0to255.Range()}, Merge(ranges)) } // Helper