diff --git a/pkg/ipam/ip.go b/pkg/ipam/ip.go index 6f3f63831e4..491e3e159ad 100644 --- a/pkg/ipam/ip.go +++ b/pkg/ipam/ip.go @@ -147,27 +147,56 @@ func convertExcludeIps(excludeIps []string) IPRangeList { func splitRange(a, b *IPRange) IPRangeList { if b.End.LessThan(a.Start) || b.Start.GreaterThan(a.End) { + // bs----be----as----ae or as----ae----bs----be + // a is aready splited with b + return IPRangeList{a} } if (a.Start.Equal(b.Start) || a.Start.GreaterThan(b.Start)) && (a.End.Equal(b.End) || a.End.LessThan(b.End)) { + // as(bs)---- or bs----as---- + // ae(be) or ae----be + // a is the same as b + // a in b + return nil } if (a.Start.Equal(b.Start) || a.Start.GreaterThan(b.Start)) && a.End.GreaterThan(b.End) { + // as(bs)---- or bs----as---- + // be----ae + // as(bs)----be----ae + // bs----as----be----ae + // get be----ae + ipr := IPRange{Start: b.End.Add(1), End: a.End} return IPRangeList{&ipr} } if (a.End.Equal(b.End) || a.End.LessThan(b.End)) && a.Start.LessThan(b.Start) { + // -----ae(be) or ----ae----be + // -----as----bs + // -----as----bs-----ae(be) + // -----as----bs-----ae----be + // get as----bs + ipr := IPRange{Start: a.Start, End: b.Start.Add(-1)} return IPRangeList{&ipr} } ipr1 := IPRange{Start: a.Start, End: b.Start.Add(-1)} ipr2 := IPRange{Start: b.End.Add(1), End: a.End} - return IPRangeList{&ipr1, &ipr2} + results := IPRangeList{} + if !ipr1.Start.GreaterThan(ipr1.End) { + // start <= end + results = append(results, &ipr1) + } + if !ipr2.Start.GreaterThan(ipr2.End) { + // start <= end + results = append(results, &ipr2) + } + return results } diff --git a/pkg/ipam/subnet.go b/pkg/ipam/subnet.go index 546212b377a..a7367ff3c82 100644 --- a/pkg/ipam/subnet.go +++ b/pkg/ipam/subnet.go @@ -220,10 +220,13 @@ func (subnet *Subnet) getV4RandomAddress(podName, nicName string, mac string, sk var ip IP var idx int for i, ipr := range subnet.V4FreeIPList { + klog.Infof("allocate pod %s v4 ip in the range of start: %s, end: %s", podName, ipr.Start, ipr.End) for next := ipr.Start; !next.GreaterThan(ipr.End); next = next.Add(1) { if !util.ContainsString(skippedAddrs, string(next)) { ip = next break + } else { + klog.Infof("v4 ip %s is in skipped addrs %+v", skippedAddrs) } } if ip != "" { @@ -282,10 +285,13 @@ func (subnet *Subnet) getV6RandomAddress(podName, nicName string, mac string, sk var ip IP var idx int for i, ipr := range subnet.V6FreeIPList { + klog.Infof("allocate pod %s v6 ip in the range of start: %s, end: %s", podName, ipr.Start, ipr.End) for next := ipr.Start; !next.GreaterThan(ipr.End); next = next.Add(1) { if !util.ContainsString(skippedAddrs, string(next)) { ip = next break + } else { + klog.Infof("v6 ip %s is in skipped addrs %+v", skippedAddrs) } } if ip != "" {