Skip to content

Commit 5e2c0b6

Browse files
authored
Adjust cloudinit to support dhcp (#44)
* Adjust cloudinit to support dhcp * simpler * Remove duplicated test
1 parent 81ea261 commit 5e2c0b6

File tree

3 files changed

+170
-33
lines changed

3 files changed

+170
-33
lines changed

pkg/cloudinit/network.go

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,23 +30,26 @@ const (
3030
eth{{ $index }}:
3131
match:
3232
macaddress: {{ $element.MacAddress }}
33-
dhcp4: 'no'
33+
dhcp4: {{ if $element.DHCP4 }}true{{ else }}false{{ end }}
34+
dhcp6: {{ if $element.DHCP6 }}true{{ else }}false{{ end }}
35+
{{- if or (and (not $element.DHCP4) $element.IPAddress) (and (not $element.DHCP6) $element.IPV6Address) }}
3436
addresses:
35-
{{- if $element.IPAddress }}
37+
{{- if and $element.IPAddress (not $element.DHCP4) }}
3638
- {{ $element.IPAddress }}
3739
{{- end }}
38-
{{- if $element.IPV6Address }}
40+
{{- if and $element.IPV6Address (not $element.DHCP6)}}
3941
- {{ $element.IPV6Address }}
4042
{{- end }}
4143
routes:
42-
{{- if $element.Gateway }}
44+
{{- if and $element.Gateway (not $element.DHCP4) }}
4345
- to: 0.0.0.0/0
4446
via: {{ $element.Gateway }}
4547
{{- end }}
46-
{{- if $element.Gateway6 }}
48+
{{- if and $element.Gateway6 (not $element.DHCP6) }}
4749
- to: '::/0'
4850
via: {{ $element.Gateway6 }}
4951
{{- end }}
52+
{{- end }}
5053
{{- if $element.DNSServers }}
5154
nameservers:
5255
addresses:
@@ -86,18 +89,32 @@ func (r *NetworkConfig) validate() error {
8689
return ErrMissingNetworkConfigData
8790
}
8891
for _, d := range r.data.NetworkConfigData {
89-
err := validIPAddress(d.IPAddress)
90-
err6 := validIPAddress(d.IPV6Address)
91-
if err != nil && err6 != nil {
92-
return err
93-
}
94-
95-
if d.Gateway == "" && d.Gateway6 == "" {
96-
return ErrMissingGateway
92+
if !d.DHCP4 && !d.DHCP6 && len(d.IPAddress) == 0 && len(d.IPV6Address) == 0 {
93+
return ErrMissingIPAddress
9794
}
9895
if d.MacAddress == "" {
9996
return ErrMissingMacAddress
10097
}
98+
99+
if !d.DHCP4 && len(d.IPAddress) > 0 {
100+
err := validIPAddress(d.IPAddress)
101+
if err != nil {
102+
return err
103+
}
104+
if d.Gateway == "" {
105+
return ErrMissingGateway
106+
}
107+
}
108+
109+
if !d.DHCP6 && len(d.IPV6Address) > 0 {
110+
err6 := validIPAddress(d.IPV6Address)
111+
if err6 != nil {
112+
return err6
113+
}
114+
if d.Gateway6 == "" {
115+
return ErrMissingGateway
116+
}
117+
}
101118
}
102119
return nil
103120
}

pkg/cloudinit/network_test.go

Lines changed: 138 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ const (
3131
eth0:
3232
match:
3333
macaddress: 92:60:a0:5b:22:c2
34-
dhcp4: 'no'
34+
dhcp4: false
35+
dhcp6: false
3536
addresses:
3637
- 10.10.10.12/24
3738
routes:
@@ -49,7 +50,8 @@ const (
4950
eth0:
5051
match:
5152
macaddress: 92:60:a0:5b:22:c2
52-
dhcp4: 'no'
53+
dhcp4: false
54+
dhcp6: false
5355
addresses:
5456
- 10.10.10.12/24
5557
routes:
@@ -63,7 +65,8 @@ const (
6365
eth0:
6466
match:
6567
macaddress: 92:60:a0:5b:22:c2
66-
dhcp4: 'no'
68+
dhcp4: false
69+
dhcp6: false
6770
addresses:
6871
- 10.10.10.12/24
6972
routes:
@@ -76,7 +79,8 @@ const (
7679
eth1:
7780
match:
7881
macaddress: b4:87:18:bf:a3:60
79-
dhcp4: 'no'
82+
dhcp4: false
83+
dhcp6: false
8084
addresses:
8185
- 196.168.100.124/24
8286
routes:
@@ -94,7 +98,8 @@ const (
9498
eth0:
9599
match:
96100
macaddress: 92:60:a0:5b:22:c2
97-
dhcp4: 'no'
101+
dhcp4: false
102+
dhcp6: false
98103
addresses:
99104
- 10.10.10.12/24
100105
- 2001:db8::1/64
@@ -115,7 +120,8 @@ const (
115120
eth0:
116121
match:
117122
macaddress: 92:60:a0:5b:22:c2
118-
dhcp4: 'no'
123+
dhcp4: false
124+
dhcp6: false
119125
addresses:
120126
- 2001:db8::1/64
121127
routes:
@@ -125,6 +131,67 @@ const (
125131
addresses:
126132
- 8.8.8.8
127133
- 8.8.4.4`
134+
135+
expectedValidNetworkConfigDHCP = `network:
136+
version: 2
137+
renderer: networkd
138+
ethernets:
139+
eth0:
140+
match:
141+
macaddress: 92:60:a0:5b:22:c2
142+
dhcp4: true
143+
dhcp6: true
144+
nameservers:
145+
addresses:
146+
- 8.8.8.8
147+
- 8.8.4.4`
148+
149+
expectedValidNetworkConfigDHCP4 = `network:
150+
version: 2
151+
renderer: networkd
152+
ethernets:
153+
eth0:
154+
match:
155+
macaddress: 92:60:a0:5b:22:c2
156+
dhcp4: true
157+
dhcp6: false
158+
nameservers:
159+
addresses:
160+
- 8.8.8.8
161+
- 8.8.4.4`
162+
163+
expectedValidNetworkConfigDHCP6 = `network:
164+
version: 2
165+
renderer: networkd
166+
ethernets:
167+
eth0:
168+
match:
169+
macaddress: 92:60:a0:5b:22:c2
170+
dhcp4: false
171+
dhcp6: true
172+
nameservers:
173+
addresses:
174+
- 8.8.8.8
175+
- 8.8.4.4`
176+
177+
expectedValidNetworkConfigWithDHCP = `network:
178+
version: 2
179+
renderer: networkd
180+
ethernets:
181+
eth0:
182+
match:
183+
macaddress: 92:60:a0:5b:22:c2
184+
dhcp4: false
185+
dhcp6: true
186+
addresses:
187+
- 10.10.10.12/24
188+
routes:
189+
- to: 0.0.0.0/0
190+
via: 10.10.10.1
191+
nameservers:
192+
addresses:
193+
- 8.8.8.8
194+
- 8.8.4.4`
128195
)
129196

130197
func TestNetworkConfig_Render(t *testing.T) {
@@ -142,8 +209,8 @@ func TestNetworkConfig_Render(t *testing.T) {
142209
args args
143210
want want
144211
}{
145-
"ValidNetworkConfig": {
146-
reason: "render valid network-config",
212+
"ValidStaticNetworkConfig": {
213+
reason: "render valid network-config with static ip",
147214
args: args{
148215
nics: []NetworkConfigData{
149216
{
@@ -159,46 +226,47 @@ func TestNetworkConfig_Render(t *testing.T) {
159226
err: nil,
160227
},
161228
},
162-
"InvalidNetworkConfigIp": {
163-
reason: "ip address is not set",
229+
"ValidStaticNetworkConfigWithDHCP": {
230+
reason: "render valid network-config with ipv6 static ip and dhcp",
164231
args: args{
165232
nics: []NetworkConfigData{
166233
{
167234
MacAddress: "92:60:a0:5b:22:c2",
235+
DHCP6: true,
236+
IPAddress: "10.10.10.12/24",
168237
Gateway: "10.10.10.1",
169238
DNSServers: []string{"8.8.8.8", "8.8.4.4"},
170239
},
171240
},
172241
},
173242
want: want{
174-
network: "",
175-
err: ErrMissingIPAddress,
243+
network: expectedValidNetworkConfigWithDHCP,
244+
err: nil,
176245
},
177246
},
178-
"InvalidNetworkConfigMalformedIp": {
179-
reason: "malformed ip address",
247+
"InvalidNetworkConfigIp": {
248+
reason: "ip address is not set",
180249
args: args{
181250
nics: []NetworkConfigData{
182251
{
183252
MacAddress: "92:60:a0:5b:22:c2",
184-
IPAddress: "10.10.10.12",
185253
Gateway: "10.10.10.1",
186254
DNSServers: []string{"8.8.8.8", "8.8.4.4"},
187255
},
188256
},
189257
},
190258
want: want{
191259
network: "",
192-
err: ErrMalformedIPAddress,
260+
err: ErrMissingIPAddress,
193261
},
194262
},
195-
"InvalidNetworkConfigMalformedIP": {
196-
reason: "ip address malformed",
263+
"InvalidNetworkConfigMalformedIp": {
264+
reason: "malformed ip address",
197265
args: args{
198266
nics: []NetworkConfigData{
199267
{
200268
MacAddress: "92:60:a0:5b:22:c2",
201-
IPAddress: "10.10.10.115",
269+
IPAddress: "10.10.10.12",
202270
Gateway: "10.10.10.1",
203271
DNSServers: []string{"8.8.8.8", "8.8.4.4"},
204272
},
@@ -326,6 +394,57 @@ func TestNetworkConfig_Render(t *testing.T) {
326394
err: nil,
327395
},
328396
},
397+
"ValidNetworkConfigDHCP": {
398+
reason: "render valid network-config with dhcp",
399+
args: args{
400+
nics: []NetworkConfigData{
401+
{
402+
MacAddress: "92:60:a0:5b:22:c2",
403+
DHCP4: true,
404+
DHCP6: true,
405+
DNSServers: []string{"8.8.8.8", "8.8.4.4"},
406+
},
407+
},
408+
},
409+
want: want{
410+
network: expectedValidNetworkConfigDHCP,
411+
err: nil,
412+
},
413+
},
414+
"ValidNetworkConfigDHCP4": {
415+
reason: "render valid network-config with dhcp",
416+
args: args{
417+
nics: []NetworkConfigData{
418+
{
419+
MacAddress: "92:60:a0:5b:22:c2",
420+
DHCP4: true,
421+
DHCP6: false,
422+
DNSServers: []string{"8.8.8.8", "8.8.4.4"},
423+
},
424+
},
425+
},
426+
want: want{
427+
network: expectedValidNetworkConfigDHCP4,
428+
err: nil,
429+
},
430+
},
431+
"ValidNetworkConfigDHCP6": {
432+
reason: "render valid network-config with dhcp",
433+
args: args{
434+
nics: []NetworkConfigData{
435+
{
436+
MacAddress: "92:60:a0:5b:22:c2",
437+
DHCP4: false,
438+
DHCP6: true,
439+
DNSServers: []string{"8.8.8.8", "8.8.4.4"},
440+
},
441+
},
442+
},
443+
want: want{
444+
network: expectedValidNetworkConfigDHCP6,
445+
err: nil,
446+
},
447+
},
329448
}
330449

331450
for n, tc := range cases {

pkg/cloudinit/types.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,13 @@ type BaseCloudInitData struct {
2222
Hostname string
2323
InstanceID string
2424
NetworkConfigData []NetworkConfigData
25-
IPAddresses string
2625
}
2726

2827
// NetworkConfigData is used to render network-config.
2928
type NetworkConfigData struct {
3029
MacAddress string
30+
DHCP4 bool
31+
DHCP6 bool
3132
IPAddress string
3233
IPV6Address string
3334
Gateway string

0 commit comments

Comments
 (0)