-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathpool_test.go
95 lines (80 loc) · 3.01 KB
/
pool_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package main
import (
"github.com/stretchr/testify/require"
"net"
"testing"
"time"
)
func TestIpAllocation(t *testing.T) {
// Pool with deliberately only 2 available IPs
pool := NewPool()
pool.Start = net.ParseIP("172.0.0.10")
pool.End = net.ParseIP("172.0.0.11")
pool.Netmask = net.ParseIP("255.255.255.0")
pool.LeaseTime = time.Duration(1) * time.Hour
mac1 := MacAddress{0, 0, 0, 0, 0, 1}
mac2 := MacAddress{0, 0, 0, 0, 0, 2}
mac3 := MacAddress{0, 0, 0, 0, 0, 3}
// Verify initial IP lease acquisition works
lease1, err := pool.GetNextLease(mac1, "host1")
require.Nil(t, err)
require.Equal(t, IpToFixedV4(net.ParseIP("172.0.0.10")), lease1.IP)
require.Equal(t, mac1, lease1.Mac)
require.Equal(t, "host1", lease1.Hostname)
require.False(t, lease1.Expired())
orig_time := lease1.Expiration
// And that when we bump it, its expiration gets bumped accordingly
lease1Fetched, ok := pool.TouchLeaseByMac(mac1)
require.True(t, ok)
require.True(t, lease1Fetched.Expiration.After(orig_time))
// And that another host is able to get the next free IP
lease2, err := pool.GetNextLease(mac2, "host2")
require.Nil(t, err)
require.Equal(t, mac2, lease2.Mac)
require.Equal(t, "host2", lease2.Hostname)
require.Equal(t, IpToFixedV4(net.ParseIP("172.0.0.11")), lease2.IP)
require.False(t, lease2.Expired())
// No free Ips for lease3 so it will fail
lease3, err := pool.GetNextLease(mac3, "host3")
require.Equal(t, ErrNoIps, err)
require.Nil(t, lease3)
// However, if we expire lease1, host3 will get its IP
lease1.Expiration = time.Now().Add(time.Duration(-1) * time.Hour)
require.True(t, lease1.Expired())
lease3, err = pool.GetNextLease(mac3, "host3")
require.Nil(t, err)
require.Equal(t, mac3, lease3.Mac)
require.Equal(t, "host3", lease3.Hostname)
require.Equal(t, IpToFixedV4(net.ParseIP("172.0.0.10")), lease3.IP)
}
// Test IP allocation with reserved mac addresses
func TestIpReservedAllocation(t *testing.T) {
pool := NewPool()
pool.Start = net.ParseIP("172.0.0.10")
pool.End = net.ParseIP("172.0.0.12")
pool.Netmask = net.ParseIP("255.255.255.0")
pool.LeaseTime = time.Duration(1) * time.Hour
mac1 := MacAddress{0, 0, 0, 0, 0, 1}
mac2 := MacAddress{0, 0, 0, 0, 0, 2}
// Bind mac2 to 172.0.0.10. Deliberately choose an IP in our range to
// verify that overlaps are ignored
err := pool.AddReservedHost(&ReservedHost{
Mac: mac2,
IP: IpToFixedV4(net.ParseIP("172.0.0.10")),
})
require.Nil(t, err)
// Verify initial IP lease acquisition chooses the IP after the reserved
lease1, err := pool.GetNextLease(mac1, "host1")
require.Nil(t, err)
require.Equal(t, IpToFixedV4(net.ParseIP("172.0.0.11")), lease1.IP)
require.Equal(t, mac1, lease1.Mac)
require.Equal(t, "host1", lease1.Hostname)
require.False(t, lease1.Expired())
// Verify custom allocation works
lease2, err := pool.GetNextLease(mac2, "host2")
require.Nil(t, err)
require.Equal(t, IpToFixedV4(net.ParseIP("172.0.0.10")), lease2.IP)
require.Equal(t, mac2, lease2.Mac)
require.Equal(t, "host2", lease2.Hostname)
require.False(t, lease2.Expired())
}