Skip to content

Commit

Permalink
Merge pull request #122 from nicklesimba/exclude-range-backport-4.13
Browse files Browse the repository at this point in the history
OCPBUGS-11322: respect requested allocation range when exluding ranges [Backport 4.13]
  • Loading branch information
openshift-merge-robot committed Apr 10, 2023
2 parents f65e20c + 0b2c417 commit 6ce7404
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 4 deletions.
2 changes: 1 addition & 1 deletion pkg/allocate/allocate.go
Expand Up @@ -210,7 +210,7 @@ func IterateForAssignment(ipnet net.IPNet, rangeStart net.IP, rangeEnd net.IP, r
var assignedip net.IP
performedassignment := false
endip := IPAddOffset(lastip, uint64(1))
for i := firstip; !i.Equal(endip); i = IPAddOffset(i, uint64(1)) {
for i := firstip; ipnet.Contains(i) && !i.Equal(endip); i = IPAddOffset(i, uint64(1)) {
// if already reserved, skip it
if reserved[i.String()] {
continue
Expand Down
81 changes: 78 additions & 3 deletions pkg/allocate/allocate_test.go
Expand Up @@ -363,16 +363,16 @@ var _ = Describe("Allocation operations", func() {

It("can IterateForAssignment on an IPv6 address excluding a very large range", func() {

firstip, ipnet, err := net.ParseCIDR("2001:db8::/32")
firstip, ipnet, err := net.ParseCIDR("2001:db8::/30")
Expect(err).NotTo(HaveOccurred())

// figure out the range start.
calculatedrangestart := net.ParseIP(firstip.Mask(ipnet.Mask).String())

var ipres []types.IPReservation
exrange := []string{"2001:db8::0/30"}
exrange := []string{"2001:db8::0/32"}
newip, _, _ := IterateForAssignment(*ipnet, calculatedrangestart, nil, ipres, exrange, "0xdeadbeef", "")
Expect(fmt.Sprint(newip)).To(Equal("2001:dbc::"))
Expect(fmt.Sprint(newip)).To(Equal("2001:db9::"))

})

Expand All @@ -394,6 +394,81 @@ var _ = Describe("Allocation operations", func() {
Expect(fmt.Sprint(newip)).To(Equal("192.168.0.10"))
})

It("can IterateForAssignment on an IPv4 address excluding a range and respect the requested range", func() {

firstip, ipnet, err := net.ParseCIDR("192.168.0.0/29")
Expect(err).NotTo(HaveOccurred())

ipres := []types.IPReservation{
{
IP: net.ParseIP("192.168.0.4"),
PodRef: "default/pod1",
},
{
IP: net.ParseIP("192.168.0.5"),
PodRef: "default/pod1",
},
{
IP: net.ParseIP("192.168.0.6"),
PodRef: "default/pod1",
},
}
exrange := []string{"192.168.0.0/30"}
_, _, err = IterateForAssignment(*ipnet, firstip, nil, ipres, exrange, "0xdeadbeef", "")
Expect(err).To(MatchError(HavePrefix("Could not allocate IP in range")))

})
It("can IterateForAssignment on an IPv4 address excluding the last allocatable IP and respect the requested range", func() {

firstip, ipnet, err := net.ParseCIDR("192.168.0.0/29")
Expect(err).NotTo(HaveOccurred())

ipres := []types.IPReservation{
{
IP: net.ParseIP("192.168.0.1"),
PodRef: "default/pod1",
},
{
IP: net.ParseIP("192.168.0.2"),
PodRef: "default/pod1",
},
{
IP: net.ParseIP("192.168.0.3"),
PodRef: "default/pod1",
},
}
exrange := []string{"192.168.0.4/30"}
_, _, err = IterateForAssignment(*ipnet, firstip, nil, ipres, exrange, "0xdeadbeef", "")
Expect(err).To(MatchError(HavePrefix("Could not allocate IP in range")))

})

It("can IterateForAssignment on an IPv6 address excluding a range and respect the requested range", func() {

firstip, ipnet, err := net.ParseCIDR("100::2:1/125")
Expect(err).NotTo(HaveOccurred())

ipres := []types.IPReservation{
{
IP: net.ParseIP("100::2:1"),
PodRef: "default/pod1",
},
{
IP: net.ParseIP("100::2:2"),
PodRef: "default/pod1",
},
{
IP: net.ParseIP("100::2:3"),
PodRef: "default/pod1",
},
}

exrange := []string{"100::2:4/126"}
_, _, err = IterateForAssignment(*ipnet, firstip, nil, ipres, exrange, "0xdeadbeef", "")
Expect(err).To(MatchError(HavePrefix("Could not allocate IP in range")))

})

It("creates an IPv6 range properly for 96 bits network address", func() {

_, ipnet, err := net.ParseCIDR("2001:db8:abcd:0012::0/96")
Expand Down

0 comments on commit 6ce7404

Please sign in to comment.