host-local: make allocation idempotent to multiple requests with same id
Signed-off-by: Bruce Ma <brucema19901024@gmail.com>
This commit is contained in:
parent
7f8ea631e5
commit
e8771b36a2
@ -40,7 +40,7 @@ func NewIPAllocator(s *RangeSet, store backend.Store, id int) *IPAllocator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get alocates an IP
|
// Get allocates an IP
|
||||||
func (a *IPAllocator) Get(id string, ifname string, requestedIP net.IP) (*current.IPConfig, error) {
|
func (a *IPAllocator) Get(id string, ifname string, requestedIP net.IP) (*current.IPConfig, error) {
|
||||||
a.store.Lock()
|
a.store.Lock()
|
||||||
defer a.store.Unlock()
|
defer a.store.Unlock()
|
||||||
@ -73,24 +73,39 @@ func (a *IPAllocator) Get(id string, ifname string, requestedIP net.IP) (*curren
|
|||||||
gw = r.Gateway
|
gw = r.Gateway
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
iter, err := a.GetIter()
|
// try to get existing IPs which have been allocated to this id
|
||||||
if err != nil {
|
existIPs := a.store.GetByID(id, ifname)
|
||||||
return nil, err
|
for _, existIP := range existIPs {
|
||||||
}
|
// check whether the existing IP belong to this range set
|
||||||
for {
|
if r, err := a.rangeset.RangeFor(existIP); err == nil {
|
||||||
reservedIP, gw = iter.Next()
|
reservedIP = &net.IPNet{IP: existIP, Mask: r.Subnet.Mask}
|
||||||
if reservedIP == nil {
|
gw = r.Gateway
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
reserved, err := a.store.Reserve(id, ifname, reservedIP.IP, a.rangeID)
|
// if no existing IP was found, try to reserve a new one
|
||||||
|
if reservedIP == nil {
|
||||||
|
iter, err := a.GetIter()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
for {
|
||||||
|
reservedIP, gw = iter.Next()
|
||||||
|
if reservedIP == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
if reserved {
|
reserved, err := a.store.Reserve(id, ifname, reservedIP.IP, a.rangeID)
|
||||||
break
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if reserved {
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user