updated to include fabric IP allocation for compute node configuration
diff --git a/ip-allocator/storage.go b/ip-allocator/storage.go
index 26be353..ac5ce6d 100644
--- a/ip-allocator/storage.go
+++ b/ip-allocator/storage.go
@@ -1,7 +1,14 @@
package main
+import (
+ "math"
+ "net"
+ "strconv"
+ "strings"
+)
+
type Storage interface {
- Init(start string, count uint) error
+ Init(networkIn string, skip int) error
Get(mac string) (string, error)
GetAll() map[string]string
Put(mac, ip string) error
@@ -16,17 +23,38 @@
readIdx, writeIdx, size uint
}
-func (s *MemoryStorage) Init(start string, count uint) error {
- ip, err := ParseIP(start)
+func (s *MemoryStorage) Init(networkIn string, skip int) error {
+ _, network, err := net.ParseCIDR(networkIn)
if err != nil {
return err
}
+ start, _, err := net.ParseCIDR(network.String())
+ if err != nil {
+ return err
+ }
+
+ parts := strings.Split(network.String(), "/")
+ ip, err := ParseIP(start.String())
+ if err != nil {
+ return err
+ }
+ bits, err := strconv.Atoi(parts[1])
+ if err != nil {
+ return err
+ }
+ hostCount := int(math.Pow(2, float64(32-bits))) - skip
s.readIdx = 0
s.writeIdx = 0
- s.size = count
+ s.size = uint(hostCount)
s.allocated = make(map[string]IPv4)
- s.available = make([]IPv4, count)
- for i := uint(0); i < count; i += 1 {
+ s.available = make([]IPv4, hostCount)
+ for i := 0; i < skip; i += 1 {
+ ip, err = ip.Next()
+ if err != nil {
+ return err
+ }
+ }
+ for i := 0; i < hostCount; i += 1 {
s.available[i] = ip
ip, err = ip.Next()
if err != nil {