Skip to content

Commit 5978c27

Browse files
committed
Merge pull request #743 from aboch/ipr
Fix bug in getAddressRange() in ipam driver
2 parents 301b23e + d65ac54 commit 5978c27

3 files changed

Lines changed: 57 additions & 8 deletions

File tree

ipam/allocator.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ func (a *Allocator) parsePoolRequest(addressSpace, pool, subPool string, v6 bool
220220
return nil, nil, nil, ipamapi.ErrInvalidPool
221221
}
222222
if subPool != "" {
223-
if ipr, err = getAddressRange(subPool); err != nil {
223+
if ipr, err = getAddressRange(subPool, nw); err != nil {
224224
return nil, nil, nil, err
225225
}
226226
}
@@ -431,9 +431,6 @@ func (a *Allocator) ReleaseAddress(poolID string, address net.IP) error {
431431
aSpace.Unlock()
432432

433433
mask := p.Pool.Mask
434-
if p.Range != nil {
435-
mask = p.Range.Sub.Mask
436-
}
437434

438435
h, err := types.GetHostPartIP(address, mask)
439436
if err != nil {
@@ -471,7 +468,6 @@ func (a *Allocator) getAddress(nw *net.IPNet, bitmask *bitseq.Handle, prefAddres
471468
ordinal = ipToUint64(types.GetMinimalIP(hostPart))
472469
err = bitmask.Set(ordinal)
473470
} else {
474-
base.IP = ipr.Sub.IP
475471
ordinal, err = bitmask.SetAnyInRange(ipr.Start, ipr.End)
476472
}
477473
if err != nil {

ipam/allocator_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,59 @@ func TestRequestReleaseAddressFromSubPool(t *testing.T) {
666666
if !types.CompareIPNet(rp, ip) {
667667
t.Fatalf("Unexpected IP from subpool. Expected: %s. Got: %v.", rp, ip)
668668
}
669+
670+
// Request any addresses from subpool after explicit address request
671+
unoExp, _ := types.ParseCIDR("10.2.2.0/16")
672+
dueExp, _ := types.ParseCIDR("10.2.2.2/16")
673+
treExp, _ := types.ParseCIDR("10.2.2.1/16")
674+
if poolID, _, _, err = a.RequestPool("rosso", "10.2.0.0/16", "10.2.2.0/24", nil, false); err != nil {
675+
t.Fatal(err)
676+
}
677+
tre, _, err := a.RequestAddress(poolID, treExp.IP, nil)
678+
if err != nil {
679+
t.Fatal(err)
680+
}
681+
if !types.CompareIPNet(tre, treExp) {
682+
t.Fatalf("Unexpected address: %v", tre)
683+
}
684+
685+
uno, _, err := a.RequestAddress(poolID, nil, nil)
686+
if err != nil {
687+
t.Fatal(err)
688+
}
689+
if !types.CompareIPNet(uno, unoExp) {
690+
t.Fatalf("Unexpected address: %v", uno)
691+
}
692+
693+
due, _, err := a.RequestAddress(poolID, nil, nil)
694+
if err != nil {
695+
t.Fatal(err)
696+
}
697+
if !types.CompareIPNet(due, dueExp) {
698+
t.Fatalf("Unexpected address: %v", due)
699+
}
700+
701+
if err = a.ReleaseAddress(poolID, uno.IP); err != nil {
702+
t.Fatal(err)
703+
}
704+
uno, _, err = a.RequestAddress(poolID, nil, nil)
705+
if err != nil {
706+
t.Fatal(err)
707+
}
708+
if !types.CompareIPNet(uno, unoExp) {
709+
t.Fatalf("Unexpected address: %v", uno)
710+
}
711+
712+
if err = a.ReleaseAddress(poolID, tre.IP); err != nil {
713+
t.Fatal(err)
714+
}
715+
tre, _, err = a.RequestAddress(poolID, nil, nil)
716+
if err != nil {
717+
t.Fatal(err)
718+
}
719+
if !types.CompareIPNet(tre, treExp) {
720+
t.Fatalf("Unexpected address: %v", tre)
721+
}
669722
}
670723

671724
func TestGetAddress(t *testing.T) {

ipam/utils.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,20 @@ const (
1515
v6 = 6
1616
)
1717

18-
func getAddressRange(pool string) (*AddressRange, error) {
18+
func getAddressRange(pool string, masterNw *net.IPNet) (*AddressRange, error) {
1919
ip, nw, err := net.ParseCIDR(pool)
2020
if err != nil {
2121
return nil, ipamapi.ErrInvalidSubPool
2222
}
23-
lIP, e := types.GetHostPartIP(nw.IP, nw.Mask)
23+
lIP, e := types.GetHostPartIP(nw.IP, masterNw.Mask)
2424
if e != nil {
2525
return nil, fmt.Errorf("failed to compute range's lowest ip address: %v", e)
2626
}
2727
bIP, e := types.GetBroadcastIP(nw.IP, nw.Mask)
2828
if e != nil {
2929
return nil, fmt.Errorf("failed to compute range's broadcast ip address: %v", e)
3030
}
31-
hIP, e := types.GetHostPartIP(bIP, nw.Mask)
31+
hIP, e := types.GetHostPartIP(bIP, masterNw.Mask)
3232
if e != nil {
3333
return nil, fmt.Errorf("failed to compute range's highest ip address: %v", e)
3434
}

0 commit comments

Comments
 (0)