1
- package netutils
1
+ package master
2
2
3
3
import (
4
+ "encoding/binary"
4
5
"fmt"
5
6
"net"
6
7
"sync"
8
+
9
+ utilruntime "k8s.io/apimachinery/pkg/util/runtime"
7
10
)
8
11
9
12
var ErrSubnetAllocatorFull = fmt .Errorf ("No subnets available." )
@@ -23,14 +26,14 @@ type SubnetAllocator struct {
23
26
func NewSubnetAllocator (network string , hostBits uint32 , inUse []string ) (* SubnetAllocator , error ) {
24
27
_ , netIP , err := net .ParseCIDR (network )
25
28
if err != nil {
26
- return nil , fmt .Errorf ("Failed to parse network address: %q" , network )
29
+ return nil , fmt .Errorf ("failed to parse network address: %q" , network )
27
30
}
28
31
29
32
netMaskSize , _ := netIP .Mask .Size ()
30
33
if hostBits == 0 {
31
- return nil , fmt .Errorf ("Host capacity cannot be zero." )
34
+ return nil , fmt .Errorf ("host capacity cannot be zero." )
32
35
} else if hostBits > (32 - uint32 (netMaskSize )) {
33
- return nil , fmt .Errorf ("Subnet capacity cannot be larger than number of networks available." )
36
+ return nil , fmt .Errorf ("subnet capacity cannot be larger than number of networks available." )
34
37
}
35
38
subnetBits := 32 - uint32 (netMaskSize ) - hostBits
36
39
@@ -61,29 +64,41 @@ func NewSubnetAllocator(network string, hostBits uint32, inUse []string) (*Subne
61
64
rightMask = 0
62
65
}
63
66
64
- amap := make (map [string ]bool )
65
- for _ , netStr := range inUse {
66
- _ , nIp , err := net .ParseCIDR (netStr )
67
- if err != nil {
68
- fmt .Println ("Failed to parse network address: " , netStr )
69
- continue
70
- }
71
- if ! netIP .Contains (nIp .IP ) {
72
- fmt .Println ("Provided subnet doesn't belong to network: " , nIp )
73
- continue
74
- }
75
- amap [nIp .String ()] = true
76
- }
77
- return & SubnetAllocator {
67
+ sa := & SubnetAllocator {
78
68
network : netIP ,
79
69
hostBits : hostBits ,
80
70
leftShift : leftShift ,
81
71
leftMask : leftMask ,
82
72
rightShift : rightShift ,
83
73
rightMask : rightMask ,
84
74
next : 0 ,
85
- allocMap : amap ,
86
- }, nil
75
+ allocMap : make (map [string ]bool ),
76
+ }
77
+ for _ , netStr := range inUse {
78
+ _ , ipNet , err := net .ParseCIDR (netStr )
79
+ if err != nil {
80
+ utilruntime .HandleError (fmt .Errorf ("failed to parse network address: %s" , netStr ))
81
+ continue
82
+ }
83
+ if err = sa .AllocateNetwork (ipNet ); err != nil {
84
+ utilruntime .HandleError (err )
85
+ continue
86
+ }
87
+ }
88
+ return sa , nil
89
+ }
90
+
91
+ func (sna * SubnetAllocator ) AllocateNetwork (ipNet * net.IPNet ) error {
92
+ sna .mutex .Lock ()
93
+ defer sna .mutex .Unlock ()
94
+
95
+ if ! sna .network .Contains (ipNet .IP ) {
96
+ return fmt .Errorf ("provided subnet doesn't belong to network: %v" , ipNet )
97
+ }
98
+ if ! sna .allocMap [ipNet .String ()] {
99
+ sna .allocMap [ipNet .String ()] = true
100
+ }
101
+ return nil
87
102
}
88
103
89
104
func (sna * SubnetAllocator ) GetNetwork () (* net.IPNet , error ) {
@@ -120,16 +135,26 @@ func (sna *SubnetAllocator) GetNetwork() (*net.IPNet, error) {
120
135
func (sna * SubnetAllocator ) ReleaseNetwork (ipnet * net.IPNet ) error {
121
136
sna .mutex .Lock ()
122
137
defer sna .mutex .Unlock ()
138
+
123
139
if ! sna .network .Contains (ipnet .IP ) {
124
- return fmt .Errorf ("Provided subnet %v doesn't belong to the network %v." , ipnet , sna .network )
140
+ return fmt .Errorf ("provided subnet %v doesn't belong to the network %v." , ipnet , sna .network )
125
141
}
126
142
127
143
ipnetStr := ipnet .String ()
128
144
if ! sna .allocMap [ipnetStr ] {
129
- return fmt .Errorf ("Provided subnet %v is already available." , ipnet )
145
+ return fmt .Errorf ("provided subnet %v is already available." , ipnet )
146
+ } else {
147
+ sna .allocMap [ipnetStr ] = false
130
148
}
149
+ return nil
150
+ }
131
151
132
- sna .allocMap [ipnetStr ] = false
152
+ func IPToUint32 (ip net.IP ) uint32 {
153
+ return binary .BigEndian .Uint32 (ip .To4 ())
154
+ }
133
155
134
- return nil
156
+ func Uint32ToIP (u uint32 ) net.IP {
157
+ ip := make ([]byte , 4 )
158
+ binary .BigEndian .PutUint32 (ip , u )
159
+ return net .IPv4 (ip [0 ], ip [1 ], ip [2 ], ip [3 ])
135
160
}
0 commit comments