CORD-536 updated to support the setting of repo via vars
Change-Id: I84988b634967d8be2e5a9f3a79352be5efa9c0c0
diff --git a/ip-allocator/storage.go b/ip-allocator/storage.go
index 3fc3e99..0832558 100644
--- a/ip-allocator/storage.go
+++ b/ip-allocator/storage.go
@@ -14,6 +14,7 @@
package main
import (
+ "bytes"
"math"
"net"
"strconv"
@@ -21,7 +22,7 @@
)
type Storage interface {
- Init(networkIn string, skip int) error
+ Init(networkIn string, low string, high string) error
Get(mac string) (string, error)
GetAll() map[string]string
Put(mac, ip string) error
@@ -36,7 +37,25 @@
readIdx, writeIdx, size uint
}
-func (s *MemoryStorage) Init(networkIn string, skip int) error {
+func inIPRange(from net.IP, to net.IP, test net.IP) bool {
+ if from == nil || to == nil || test == nil {
+ return false
+ }
+
+ from16 := from.To16()
+ to16 := to.To16()
+ test16 := test.To16()
+ if from16 == nil || to16 == nil || test16 == nil {
+ return false
+ }
+
+ if bytes.Compare(test16, from16) >= 0 && bytes.Compare(test16, to16) <= 0 {
+ return true
+ }
+ return false
+}
+
+func (s *MemoryStorage) Init(networkIn string, low string, high string) error {
_, network, err := net.ParseCIDR(networkIn)
if err != nil {
return err
@@ -55,25 +74,24 @@
if err != nil {
return err
}
- hostCount := int(math.Pow(2, float64(32-bits))) - skip
+ hostCount := int(math.Pow(2, float64(32-bits)))
s.readIdx = 0
s.writeIdx = 0
s.size = uint(hostCount)
s.allocated = make(map[string]IPv4)
- s.available = make([]IPv4, hostCount)
- for i := 0; i < skip; i += 1 {
- ip, err = ip.Next()
- if err != nil {
- return err
- }
- }
+ s.available = make([]IPv4, 0, hostCount)
+ ipLow := net.ParseIP(low)
+ ipHigh := net.ParseIP(high)
for i := 0; i < hostCount; i += 1 {
- s.available[i] = ip
+ if inIPRange(ipLow, ipHigh, net.ParseIP(ip.String())) {
+ s.available = append(s.available, ip)
+ }
ip, err = ip.Next()
if err != nil {
return err
}
}
+ log.Debugf("AVAILABLE: %+v\n", s.available)
return nil
}