func splitRange(parentRange *ip.Range, firstIP net.IP, lastIP net.IP) (before, reserved, after *ip.Range) { if !firstIP.Equal(parentRange.FirstIP) { before = ip.NewRange(parentRange.FirstIP, decrementIP4(firstIP)) } if !lastIP.Equal(parentRange.LastIP) { after = ip.NewRange(incrementIP4(lastIP), parentRange.LastIP) } reserved = ip.NewRange(firstIP, lastIP) return }
func TestParseContainerNetworkIPRanges(t *testing.T) { var tests = []struct { cps []string iprs map[string][]*ip.Range err error }{ {[]string{""}, nil, fmt.Errorf("")}, {[]string{"foo:"}, nil, fmt.Errorf("")}, {[]string{":"}, nil, fmt.Errorf("")}, {[]string{":10.10.10.10-24"}, nil, fmt.Errorf("")}, {[]string{":foo"}, nil, fmt.Errorf("")}, {[]string{"foo:10"}, nil, fmt.Errorf("")}, {[]string{"foo:10.10.10.10-9"}, nil, fmt.Errorf("")}, {[]string{"foo:10.10.10.10-10.10.10.9"}, nil, fmt.Errorf("")}, { []string{"foo:10.10.10.10-24"}, map[string][]*ip.Range{"foo": []*ip.Range{ip.NewRange(net.ParseIP("10.10.10.10"), net.ParseIP("10.10.10.24"))}}, nil}, { []string{"foo:10.10.10.10-10.10.10.24"}, map[string][]*ip.Range{"foo": []*ip.Range{ip.NewRange(net.ParseIP("10.10.10.10"), net.ParseIP("10.10.10.24"))}}, nil, }, { []string{"foo:10.10.10.10-10.10.10.24", "foo:10.10.10.100-10.10.10.105"}, map[string][]*ip.Range{ "foo": []*ip.Range{ ip.NewRange(net.ParseIP("10.10.10.10"), net.ParseIP("10.10.10.24")), ip.NewRange(net.ParseIP("10.10.10.100"), net.ParseIP("10.10.10.105")), }, }, nil, }, { []string{"foo:10.10.10.10-10.10.10.24", "bar:10.10.9.1-10.10.9.10"}, map[string][]*ip.Range{ "foo": []*ip.Range{ip.NewRange(net.ParseIP("10.10.10.10"), net.ParseIP("10.10.10.24"))}, "bar": []*ip.Range{ip.NewRange(net.ParseIP("10.10.9.1"), net.ParseIP("10.10.9.10"))}, }, nil, }, } for _, te := range tests { iprs, err := parseContainerNetworkIPRanges(te.cps) if te.err != nil { if err == nil { t.Fatalf("parseContainerNetworkIPRanges(%s) => (%v, nil) want (nil, err)", te.cps, iprs) } continue } if err != te.err || len(iprs) != len(te.iprs) { t.Fatalf("parseContainerNetworkIPRanges(%s) => (%v, %s) want (%v, %s)", te.cps, iprs, err, te.iprs, te.err) } for v, ipr := range iprs { if ipr2, ok := te.iprs[v]; !ok { t.Fatalf("parseContainerNetworkIPRanges(%s) => (%v, %s) want (%v, %s)", te.cps, iprs, err, te.iprs, te.err) } else { for _, i := range ipr { found := false for _, i2 := range ipr2 { if i.Equal(i2) { found = true break } } if !found { t.Fatalf("parseContainerNetworkIPRanges(%s) => (%v, %s) want (%v, %s)", te.cps, iprs, err, te.iprs, te.err) } } } } } }