瀏覽代碼

Update code for new test cases

Docker-DCO-1.1-Signed-off-by: Michael Crosby <michael@crosbymichael.com> (github: crosbymichael)
Michael Crosby 11 年之前
父節點
當前提交
9d11db0f8c
共有 2 個文件被更改,包括 17 次插入24 次删除
  1. 14 21
      networkdriver/ipallocator/allocator.go
  2. 3 3
      networkdriver/ipallocator/allocator_test.go

+ 14 - 21
networkdriver/ipallocator/allocator.go

@@ -19,7 +19,7 @@ var (
 	ErrNetworkAlreadyAllocated        = errors.New("requested network overlaps with existing network")
 	ErrNetworkAlreadyRegisterd        = errors.New("requested network is already registered")
 	ErrNetworkOverlapsWithNameservers = errors.New("requested network overlaps with nameserver")
-	ErrNoAvailableIps                 = errors.New("no available ips on network")
+	ErrNoAvailableIPs                 = errors.New("no available ip addresses on network")
 	ErrIPAlreadyAllocated             = errors.New("ip already allocated")
 
 	lock         = sync.Mutex{}
@@ -100,11 +100,11 @@ func getNextIp(network *net.IPNet) (*net.IP, error) {
 		ownIP     = ipToInt(&network.IP)
 		available = availableIPS[n]
 		allocated = allocatedIPs[n]
-
-		first, _ = networkRange(network)
-		base     = ipToInt(&first)
-
-		pos = int32(available.Pop())
+		first, _  = networkRange(network)
+		base      = ipToInt(&first)
+		size      = int(networkSize(network.Mask))
+		max       = int32(size - 2) // size -1 for the broadcast address, -1 for the gateway address
+		pos       = int32(available.Pop())
 	)
 
 	// We pop and push the position not the ip
@@ -115,29 +115,22 @@ func getNextIp(network *net.IPNet) (*net.IP, error) {
 		return ip, nil
 	}
 
-	var (
-		size = int(networkSize(network.Mask))
-		max  = int32(size - 2) // size -1 for the broadcast address, -1 for the gateway address
-	)
-
-	if pos = int32(allocated.PullBack()); pos == 0 {
-		pos = 1
-	}
-
+	pos = int32(allocated.PullBack())
 	for i := int32(0); i < max; i++ {
-		next := int32(base + pos)
 		pos = pos%max + 1
+		next := int32(base + pos)
 
 		if next == ownIP {
 			continue
 		}
 
-		ip := intToIP(next)
-		allocated.Push(int(pos))
-
-		return ip, nil
+		if !allocated.Exists(int(pos)) {
+			ip := intToIP(next)
+			allocated.Push(int(pos))
+			return ip, nil
+		}
 	}
-	return nil, ErrNoAvailableIps
+	return nil, ErrNoAvailableIPs
 }
 
 func registerIP(network *net.IPNet, ip *net.IP) error {

+ 3 - 3
networkdriver/ipallocator/allocator_test.go

@@ -386,9 +386,9 @@ func TestIPAllocator(t *testing.T) {
 	// 2(u) - 3(u) - 4(u) - 5(u) - 6(u)
 	//                       ↑
 
-	assertIPEquals(t, &expectedIPs[3], newIPs[0])
-	assertIPEquals(t, &expectedIPs[4], newIPs[1])
-	assertIPEquals(t, &expectedIPs[2], newIPs[2])
+	assertIPEquals(t, &expectedIPs[2], newIPs[0])
+	assertIPEquals(t, &expectedIPs[3], newIPs[1])
+	assertIPEquals(t, &expectedIPs[4], newIPs[2])
 
 	_, err = RequestIP(network, nil)
 	if err == nil {