Skip to content

Commit 0273a3c

Browse files
committed
fixup! fixup! fixup! fixup! fixup! fixup! fixup! feat: ipam timestamp
1 parent 1d2d473 commit 0273a3c

File tree

2 files changed

+25
-18
lines changed

2 files changed

+25
-18
lines changed

pkg/ipam/core/ipam.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ package ipamcore
1717
import (
1818
"fmt"
1919
"net/netip"
20-
"slices"
2120
"time"
2221
)
2322

@@ -156,7 +155,11 @@ func (ipam *Ipam) ListIPs(prefix netip.Prefix) ([]netip.Addr, error) {
156155
return nil, err
157156
}
158157
if node != nil {
159-
return slices.Clone(node.ips), nil
158+
addrs := make([]netip.Addr, len(node.ips))
159+
for i := range node.ips {
160+
addrs[i] = node.ips[i].addr
161+
}
162+
return addrs, nil
160163
}
161164
return nil, nil
162165
}

pkg/ipam/core/node.go

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ import (
2424
"time"
2525
)
2626

27+
// nodeIP represents an IP address acquired by a node.
28+
type nodeIP struct {
29+
addr netip.Addr
30+
creationTimestamp time.Time
31+
}
32+
2733
// node represents a node in the binary tree.
2834
type node struct {
2935
lastUpdate time.Time
@@ -33,7 +39,7 @@ type node struct {
3339
left *node
3440
right *node
3541

36-
ips []netip.Addr
42+
ips []nodeIP
3743
lastip netip.Addr
3844
}
3945

@@ -149,7 +155,7 @@ func listNetworks(node *node) []netip.Prefix {
149155

150156
func (n *node) isAllocatedIP(ip netip.Addr) bool {
151157
for i := range n.ips {
152-
if n.ips[i].Compare(ip) == 0 {
158+
if n.ips[i].addr.Compare(ip) == 0 {
153159
return true
154160
}
155161
}
@@ -181,7 +187,7 @@ func (n *node) ipAcquire() *netip.Addr {
181187
addr = n.prefix.Addr()
182188
}
183189
if !n.isAllocatedIP(addr) {
184-
n.ips = append(n.ips, addr)
190+
n.ips = append(n.ips, nodeIP{addr: addr, creationTimestamp: time.Now()})
185191
n.lastip = addr
186192
n.lastUpdate = time.Now()
187193
return &addr
@@ -201,31 +207,30 @@ func (n *node) allocateIPWithAddr(addr netip.Addr) *netip.Addr {
201207
}
202208

203209
for i := range n.ips {
204-
if n.ips[i].Compare(addr) == 0 {
210+
if n.ips[i].addr.Compare(addr) == 0 {
205211
return nil
206212
}
207213
}
208214

209-
n.ips = append(n.ips, addr)
215+
n.ips = append(n.ips, nodeIP{addr: addr, creationTimestamp: time.Now()})
210216
n.lastUpdate = time.Now()
211217

212-
return &n.ips[len(n.ips)-1]
218+
return &n.ips[len(n.ips)-1].addr
213219
}
214220

215221
func (n *node) ipRelease(ip netip.Addr, gracePeriod time.Duration) *netip.Addr {
216222
if !n.acquired {
217223
return nil
218224
}
219225

220-
if !n.lastUpdate.Add(gracePeriod).Before(time.Now()) {
221-
return nil
222-
}
223-
224-
for i, addr := range n.ips {
225-
if addr.Compare(ip) == 0 {
226+
for i, nodeIP := range n.ips {
227+
if !nodeIP.creationTimestamp.Add(gracePeriod).Before(time.Now()) {
228+
continue
229+
}
230+
if nodeIP.addr.Compare(ip) == 0 {
226231
n.ips = append(n.ips[:i], n.ips[i+1:]...)
227232
n.lastUpdate = time.Now()
228-
return &addr
233+
return &nodeIP.addr
229234
}
230235
}
231236
return nil
@@ -351,12 +356,11 @@ func (n *node) toGraphvizRecursive(sb *strings.Builder) {
351356
if n == nil {
352357
return
353358
}
354-
label := n.lastUpdate.Format(time.TimeOnly)
355-
label += "\\n" + n.prefix.String()
359+
label := n.prefix.String()
356360
if len(n.ips) > 0 {
357361
ipsString := []string{}
358362
for i := range n.ips {
359-
ipsString = append(ipsString, n.ips[i].String())
363+
ipsString = append(ipsString, n.ips[i].addr.String())
360364
}
361365
label += "\\n" + strings.Join(ipsString, "\\n")
362366
}

0 commit comments

Comments
 (0)