Add support for VLANs and static routes #1257
- NetworkManager - wicked - ifcfg - debian.network_interfaces Signed-off-by: Jonathon Anderson <janderson@ciq.com>
This commit is contained in:
@@ -20,6 +20,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||||||
- Add `wwctl clean` to remove OCI cache and overlays from deleted nodes
|
- Add `wwctl clean` to remove OCI cache and overlays from deleted nodes
|
||||||
- Add `wwctl container import --platform`. #1381
|
- Add `wwctl container import --platform`. #1381
|
||||||
- Read environment variables from `/etc/default/warewulfd` #725
|
- Read environment variables from `/etc/default/warewulfd` #725
|
||||||
|
- Add support for VLANs to NetworkManager, wicked, ifcfg, debian.network_interfaces overlays. #1257
|
||||||
|
- Add support for static routes to NetworkManager, wicked, ifcfg, debian.network_interfaces overlays. #1257
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
|||||||
@@ -13,66 +13,44 @@ import (
|
|||||||
func Test_networkmanagerOverlay(t *testing.T) {
|
func Test_networkmanagerOverlay(t *testing.T) {
|
||||||
env := testenv.New(t)
|
env := testenv.New(t)
|
||||||
defer env.RemoveAll(t)
|
defer env.RemoveAll(t)
|
||||||
env.ImportFile(t, "etc/warewulf/nodes.conf", "nodes.conf")
|
|
||||||
env.ImportFile(t, "var/lib/warewulf/overlays/NetworkManager/rootfs/etc/NetworkManager/conf.d/ww4-unmanaged.ww", "../rootfs/etc/NetworkManager/conf.d/ww4-unmanaged.ww")
|
env.ImportFile(t, "var/lib/warewulf/overlays/NetworkManager/rootfs/etc/NetworkManager/conf.d/ww4-unmanaged.ww", "../rootfs/etc/NetworkManager/conf.d/ww4-unmanaged.ww")
|
||||||
env.ImportFile(t, "var/lib/warewulf/overlays/NetworkManager/rootfs/etc/NetworkManager/system-connections/ww4-managed.ww", "../rootfs/etc/NetworkManager/system-connections/ww4-managed.ww")
|
env.ImportFile(t, "var/lib/warewulf/overlays/NetworkManager/rootfs/etc/NetworkManager/system-connections/ww4-managed.ww", "../rootfs/etc/NetworkManager/system-connections/ww4-managed.ww")
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
args []string
|
nodes_conf string
|
||||||
log string
|
args []string
|
||||||
|
log string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "NetworkManager:ww4-unmanaged.ww",
|
name: "NetworkManager:ww4-unmanaged.ww",
|
||||||
args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/conf.d/ww4-unmanaged.ww"},
|
nodes_conf: "nodes.conf",
|
||||||
log: networkmanager_unmanaged,
|
args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/conf.d/ww4-unmanaged.ww"},
|
||||||
|
log: networkmanager_unmanaged,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "NetworkManager:ww4-managed.ww",
|
name: "NetworkManager:ww4-managed.ww",
|
||||||
args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/system-connections/ww4-managed.ww"},
|
nodes_conf: "nodes.conf",
|
||||||
log: networkmanager_managed,
|
args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/system-connections/ww4-managed.ww"},
|
||||||
},
|
log: networkmanager_managed,
|
||||||
}
|
},
|
||||||
|
{
|
||||||
for _, tt := range tests {
|
name: "NetworkManager:ww4-unmanaged.ww with empty mac address",
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
nodes_conf: "nodes_empty_mac.conf",
|
||||||
cmd := show.GetCommand()
|
args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/conf.d/ww4-unmanaged.ww"},
|
||||||
cmd.SetArgs(tt.args)
|
log: networkmanager_unmanaged_with_empty_mac,
|
||||||
stdout := bytes.NewBufferString("")
|
},
|
||||||
stderr := bytes.NewBufferString("")
|
{
|
||||||
logbuf := bytes.NewBufferString("")
|
name: "NetworkManager:ww4-managed.ww with vlan",
|
||||||
cmd.SetOut(stdout)
|
nodes_conf: "nodes.conf-vlan",
|
||||||
cmd.SetErr(stderr)
|
args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/system-connections/ww4-managed.ww"},
|
||||||
wwlog.SetLogWriter(logbuf)
|
log: networkmanager_managed_with_vlan,
|
||||||
err := cmd.Execute()
|
|
||||||
assert.NoError(t, err)
|
|
||||||
assert.Empty(t, stdout.String())
|
|
||||||
assert.Empty(t, stderr.String())
|
|
||||||
assert.Equal(t, tt.log, logbuf.String())
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Test_unmanaged_networkmanagerOverlay_with_empty_mac(t *testing.T) {
|
|
||||||
env := testenv.New(t)
|
|
||||||
defer env.RemoveAll(t)
|
|
||||||
env.ImportFile(t, "etc/warewulf/nodes.conf", "nodes_empty_mac.conf")
|
|
||||||
env.ImportFile(t, "var/lib/warewulf/overlays/NetworkManager/rootfs/etc/NetworkManager/conf.d/ww4-unmanaged.ww", "../rootfs/etc/NetworkManager/conf.d/ww4-unmanaged.ww")
|
|
||||||
|
|
||||||
tests := []struct {
|
|
||||||
name string
|
|
||||||
args []string
|
|
||||||
log string
|
|
||||||
}{
|
|
||||||
{
|
|
||||||
name: "NetworkManager:ww4-unmanaged.ww",
|
|
||||||
args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/conf.d/ww4-unmanaged.ww"},
|
|
||||||
log: networkmanager_unmanaged_with_empty_mac,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
env.ImportFile(t, "etc/warewulf/nodes.conf", tt.nodes_conf)
|
||||||
cmd := show.GetCommand()
|
cmd := show.GetCommand()
|
||||||
cmd.SetArgs(tt.args)
|
cmd.SetArgs(tt.args)
|
||||||
stdout := bytes.NewBufferString("")
|
stdout := bytes.NewBufferString("")
|
||||||
@@ -94,6 +72,7 @@ const networkmanager_unmanaged_with_empty_mac string = `backupFile: true
|
|||||||
writeFile: true
|
writeFile: true
|
||||||
Filename: warewulf-unmanaged.conf
|
Filename: warewulf-unmanaged.conf
|
||||||
# This file is autogenerated by warewulf
|
# This file is autogenerated by warewulf
|
||||||
|
|
||||||
[main]
|
[main]
|
||||||
plugins=keyfile
|
plugins=keyfile
|
||||||
|
|
||||||
@@ -105,6 +84,7 @@ const networkmanager_unmanaged string = `backupFile: true
|
|||||||
writeFile: true
|
writeFile: true
|
||||||
Filename: warewulf-unmanaged.conf
|
Filename: warewulf-unmanaged.conf
|
||||||
# This file is autogenerated by warewulf
|
# This file is autogenerated by warewulf
|
||||||
|
|
||||||
[main]
|
[main]
|
||||||
plugins=keyfile
|
plugins=keyfile
|
||||||
|
|
||||||
@@ -116,14 +96,16 @@ const networkmanager_managed string = `backupFile: true
|
|||||||
writeFile: true
|
writeFile: true
|
||||||
Filename: warewulf-default.conf
|
Filename: warewulf-default.conf
|
||||||
# This file is autogenerated by warewulf
|
# This file is autogenerated by warewulf
|
||||||
|
|
||||||
[connection]
|
[connection]
|
||||||
id=default
|
id=default
|
||||||
interface-name=wwnet0
|
interface-name=wwnet0
|
||||||
type=ethernet
|
type=ethernet
|
||||||
autoconnect=true
|
autoconnect=true
|
||||||
|
|
||||||
[ethernet]
|
[ethernet]
|
||||||
mac-address=e6:92:39:49:7b:03
|
mac-address=e6:92:39:49:7b:03
|
||||||
# bond
|
|
||||||
[ipv4]
|
[ipv4]
|
||||||
address=192.168.3.21/24
|
address=192.168.3.21/24
|
||||||
gateway=192.168.3.1
|
gateway=192.168.3.1
|
||||||
@@ -137,14 +119,16 @@ backupFile: true
|
|||||||
writeFile: true
|
writeFile: true
|
||||||
Filename: warewulf-secondary.conf
|
Filename: warewulf-secondary.conf
|
||||||
# This file is autogenerated by warewulf
|
# This file is autogenerated by warewulf
|
||||||
|
|
||||||
[connection]
|
[connection]
|
||||||
id=secondary
|
id=secondary
|
||||||
interface-name=wwnet1
|
interface-name=wwnet1
|
||||||
type=ethernet
|
type=ethernet
|
||||||
autoconnect=true
|
autoconnect=true
|
||||||
|
|
||||||
[ethernet]
|
[ethernet]
|
||||||
mac-address=9a:77:29:73:14:f1
|
mac-address=9a:77:29:73:14:f1
|
||||||
# bond
|
|
||||||
[ipv4]
|
[ipv4]
|
||||||
address=192.168.3.22/24
|
address=192.168.3.22/24
|
||||||
gateway=192.168.3.1
|
gateway=192.168.3.1
|
||||||
@@ -156,3 +140,49 @@ addr-gen-mode=stable-privacy
|
|||||||
method=ignore
|
method=ignore
|
||||||
never-default=true
|
never-default=true
|
||||||
`
|
`
|
||||||
|
|
||||||
|
const networkmanager_managed_with_vlan string = `backupFile: true
|
||||||
|
writeFile: true
|
||||||
|
Filename: warewulf-tagged.conf
|
||||||
|
# This file is autogenerated by warewulf
|
||||||
|
|
||||||
|
[connection]
|
||||||
|
id=tagged
|
||||||
|
interface-name=eth0.902
|
||||||
|
type=vlan
|
||||||
|
autoconnect=true
|
||||||
|
|
||||||
|
[ipv4]
|
||||||
|
address=<nil>
|
||||||
|
method=manual
|
||||||
|
route1=192.168.1.0/24,192.168.2.254
|
||||||
|
|
||||||
|
[vlan]
|
||||||
|
interface-name=eth0.902
|
||||||
|
parent=eth0
|
||||||
|
id=902
|
||||||
|
|
||||||
|
[ipv6]
|
||||||
|
addr-gen-mode=stable-privacy
|
||||||
|
method=ignore
|
||||||
|
never-default=true
|
||||||
|
backupFile: true
|
||||||
|
writeFile: true
|
||||||
|
Filename: warewulf-untagged.conf
|
||||||
|
# This file is autogenerated by warewulf
|
||||||
|
|
||||||
|
[connection]
|
||||||
|
id=untagged
|
||||||
|
interface-name=eth0
|
||||||
|
type=ethernet
|
||||||
|
autoconnect=true
|
||||||
|
|
||||||
|
[ipv4]
|
||||||
|
address=<nil>
|
||||||
|
method=manual
|
||||||
|
|
||||||
|
[ipv6]
|
||||||
|
addr-gen-mode=stable-privacy
|
||||||
|
method=ignore
|
||||||
|
never-default=true
|
||||||
|
`
|
||||||
|
|||||||
13
overlays/NetworkManager/internal/nodes.conf-vlan
Normal file
13
overlays/NetworkManager/internal/nodes.conf-vlan
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
nodes:
|
||||||
|
node1:
|
||||||
|
primary network: untagged
|
||||||
|
network devices:
|
||||||
|
untagged:
|
||||||
|
device: eth0
|
||||||
|
tagged:
|
||||||
|
type: vlan
|
||||||
|
device: eth0.902
|
||||||
|
tags:
|
||||||
|
vlan_id: 902
|
||||||
|
parent_device: eth0
|
||||||
|
route1: "192.168.1.0/24,192.168.2.254"
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{{- $filename := print "warewulf-unmanaged.conf" }}
|
{{- $filename := print "warewulf-unmanaged.conf" }}
|
||||||
{{- file $filename }}
|
{{- file $filename }}
|
||||||
# This file is autogenerated by warewulf
|
# This file is autogenerated by warewulf
|
||||||
|
|
||||||
[main]
|
[main]
|
||||||
plugins=keyfile
|
plugins=keyfile
|
||||||
|
|
||||||
|
|||||||
@@ -2,78 +2,84 @@
|
|||||||
{{- $filename := print "warewulf-" $connection_id ".conf" }}
|
{{- $filename := print "warewulf-" $connection_id ".conf" }}
|
||||||
{{- file $filename }}
|
{{- file $filename }}
|
||||||
# This file is autogenerated by warewulf
|
# This file is autogenerated by warewulf
|
||||||
|
|
||||||
[connection]
|
[connection]
|
||||||
id={{ $connection_id }}
|
id={{ $connection_id }}
|
||||||
interface-name={{ $netdev.Device }}
|
interface-name={{ $netdev.Device }}
|
||||||
{{ if eq $netdev.Type "bond-slave" -}}
|
{{- if eq $netdev.Type "bond-slave" }}
|
||||||
slave-type=bond
|
slave-type=bond
|
||||||
{{- $conn := split "_" $connection_id }}
|
{{- $conn := split "_" $connection_id }}
|
||||||
{{- $master := $conn._0 }}
|
{{- $master := $conn._0 }}
|
||||||
master={{ $master }}
|
master={{ $master }}
|
||||||
type=ethernet
|
type=ethernet
|
||||||
{{ else -}}
|
{{- else }}
|
||||||
type={{if $netdev.Type}}{{ $netdev.Type }}{{ else }}ethernet{{end}}
|
type={{if $netdev.Type}}{{ $netdev.Type }}{{ else }}ethernet{{end}}
|
||||||
{{ if or $netdev.OnBoot (eq $netdev.OnBoot nil) -}}
|
{{- if or $netdev.OnBoot (eq $netdev.OnBoot nil) }}
|
||||||
autoconnect=true
|
autoconnect=true
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
{{ if $netdev.Hwaddr -}}
|
{{- if $netdev.Hwaddr }}
|
||||||
{{ if or (eq $netdev.Type "ethernet") (not $netdev.Type ) -}}
|
{{- if or (eq $netdev.Type "ethernet") (not $netdev.Type ) }}
|
||||||
|
|
||||||
[ethernet]
|
[ethernet]
|
||||||
mac-address={{ $netdev.Hwaddr }}
|
mac-address={{ $netdev.Hwaddr }}
|
||||||
{{ if $netdev.MTU -}}
|
{{- if $netdev.MTU }}
|
||||||
mtu={{ $netdev.MTU }}
|
mtu={{ $netdev.MTU }}
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
|
{{- if eq $netdev.Type "bond" }}
|
||||||
|
|
||||||
# bond
|
|
||||||
{{ if eq $netdev.Type "bond" -}}
|
|
||||||
[ethernet]
|
|
||||||
{{ if $netdev.MTU -}}
|
|
||||||
mtu={{ $netdev.MTU }}
|
|
||||||
{{ end -}}
|
|
||||||
[bond]
|
[bond]
|
||||||
downdelay=0
|
downdelay=0
|
||||||
miimon=100
|
miimon=100
|
||||||
mode=802.3ad
|
mode=802.3ad
|
||||||
xmit_hash_policy=layer2+3
|
xmit_hash_policy=layer2+3
|
||||||
updelay=0
|
updelay=0
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
|
{{- if eq $netdev.Type "infiniband" }}
|
||||||
|
|
||||||
{{ if eq $netdev.Type "infiniband" -}}
|
|
||||||
[infiniband]
|
[infiniband]
|
||||||
transport-mode=datagram
|
transport-mode=datagram
|
||||||
{{ if $netdev.MTU -}}
|
{{- if $netdev.MTU }}
|
||||||
mtu={{ $netdev.MTU }}
|
mtu={{ $netdev.MTU }}
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
|
{{- if ne $netdev.Type "bond-slave" }}
|
||||||
|
|
||||||
{{ if and ($netdev.IpCIDR) (ne $netdev.Type "bond-slave") -}}
|
|
||||||
[ipv4]
|
[ipv4]
|
||||||
|
{{- if not (eq $netdev.IpCIDR nil) }}
|
||||||
address={{ $netdev.IpCIDR }}
|
address={{ $netdev.IpCIDR }}
|
||||||
{{ if $netdev.Gateway -}}
|
{{- end }}
|
||||||
|
{{- if $netdev.Gateway }}
|
||||||
gateway={{ $netdev.Gateway }}
|
gateway={{ $netdev.Gateway }}
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
method=manual
|
method=manual
|
||||||
{{- $dns := "" }}
|
{{- $dns := "" }}
|
||||||
{{range $tk, $tv := $netdev.Tags -}}
|
{{- range $tk, $tv := $netdev.Tags }}
|
||||||
{{ $prefix := substr 0 3 $tk -}}
|
{{- if eq (substr 0 3 $tk) "DNS" }}
|
||||||
{{ if eq $prefix "DNS" -}}
|
{{- $dns = print $dns $tv ";" }}
|
||||||
{{ $dns = print $dns $tv ";" -}}
|
{{- else if eq (substr 0 5 $tk) "route" }}
|
||||||
{{ end -}}
|
{{$tk}}={{$tv}}
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
{{ if ne $dns "" -}}
|
{{- end }}
|
||||||
|
{{- if ne $dns "" }}
|
||||||
dns={{$dns}}
|
dns={{$dns}}
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
|
{{- if eq $netdev.Type "vlan" }}
|
||||||
|
|
||||||
|
[vlan]
|
||||||
|
interface-name={{ $netdev.Device }}
|
||||||
|
parent={{ $netdev.Tags.parent_device }}
|
||||||
|
id={{ $netdev.Tags.vlan_id }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
{{/* always autoconfigure ipv6 */}}
|
|
||||||
[ipv6]
|
[ipv6]
|
||||||
addr-gen-mode=stable-privacy
|
addr-gen-mode=stable-privacy
|
||||||
method=ignore
|
method=ignore
|
||||||
never-default=true
|
never-default=true
|
||||||
{{ if $netdev.Ipaddr6 -}}
|
{{ if $netdev.Ipaddr6 -}}
|
||||||
ipaddr="{{ $netdev.Ipaddr6 }}"
|
ipaddr="{{ $netdev.Ipaddr6 }}"
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
{{ end -}}
|
{{- end -}}
|
||||||
|
|||||||
@@ -13,23 +13,25 @@ import (
|
|||||||
func Test_wickedOverlay(t *testing.T) {
|
func Test_wickedOverlay(t *testing.T) {
|
||||||
env := testenv.New(t)
|
env := testenv.New(t)
|
||||||
defer env.RemoveAll(t)
|
defer env.RemoveAll(t)
|
||||||
env.ImportFile(t, "etc/warewulf/nodes.conf", "nodes.conf")
|
|
||||||
env.ImportFile(t, "var/lib/warewulf/overlays/debian.interfaces/rootfs/etc/network/interfaces.d/default.ww", "../rootfs/etc/network/interfaces.d/default.ww")
|
env.ImportFile(t, "var/lib/warewulf/overlays/debian.interfaces/rootfs/etc/network/interfaces.d/default.ww", "../rootfs/etc/network/interfaces.d/default.ww")
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
args []string
|
nodes_conf string
|
||||||
log string
|
args []string
|
||||||
|
log string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "debian.interfaces",
|
name: "debian.interfaces",
|
||||||
args: []string{"--render", "node1", "debian.interfaces", "etc/network/interfaces.d/default.ww"},
|
nodes_conf: "nodes.conf",
|
||||||
log: debian_interfaces,
|
args: []string{"--render", "node1", "debian.interfaces", "etc/network/interfaces.d/default.ww"},
|
||||||
|
log: debian_interfaces,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
env.ImportFile(t, "etc/warewulf/nodes.conf", tt.nodes_conf)
|
||||||
cmd := show.GetCommand()
|
cmd := show.GetCommand()
|
||||||
cmd.SetArgs(tt.args)
|
cmd.SetArgs(tt.args)
|
||||||
stdout := bytes.NewBufferString("")
|
stdout := bytes.NewBufferString("")
|
||||||
@@ -69,5 +71,5 @@ iface wwnet1 inet static
|
|||||||
netmask 255.255.255.0
|
netmask 255.255.255.0
|
||||||
gateway 192.168.3.1
|
gateway 192.168.3.1
|
||||||
mtu 9000
|
mtu 9000
|
||||||
up ifmetric wwnet1 30
|
up ip route add 192.168.1.0/24 via 192.168.3.254 dev wwnet1
|
||||||
`
|
`
|
||||||
|
|||||||
@@ -15,3 +15,5 @@ nodes:
|
|||||||
netmask: 255.255.255.0
|
netmask: 255.255.255.0
|
||||||
gateway: 192.168.3.1
|
gateway: 192.168.3.1
|
||||||
mtu: 9000
|
mtu: 9000
|
||||||
|
tags:
|
||||||
|
route1: "192.168.1.0/24,192.168.3.254"
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
{{range $devname, $netdev := .ThisNode.NetDevs -}}
|
{{- range $devname, $netdev := .ThisNode.NetDevs }}
|
||||||
{{- $filename := print $devname }}
|
{{- file $devname }}
|
||||||
{{- file $filename }}
|
|
||||||
# This file is autogenerated by warewulf
|
# This file is autogenerated by warewulf
|
||||||
{{ if or $netdev.OnBoot (eq $netdev.OnBoot nil) -}}
|
{{- if or $netdev.OnBoot (eq $netdev.OnBoot nil) }}
|
||||||
auto {{$netdev.Device}}
|
auto {{ $netdev.Device }}
|
||||||
|
{{- end }}
|
||||||
|
allow-hotplug {{ $netdev.Device }}
|
||||||
|
iface {{ $netdev.Device }} inet static
|
||||||
|
address {{ $netdev.Ipaddr }}
|
||||||
|
netmask {{ $netdev.Netmask }}
|
||||||
|
{{ if $netdev.Gateway }}gateway {{ $netdev.Gateway }}{{ end }}
|
||||||
|
{{ if $netdev.MTU }}mtu {{ $netdev.MTU }}{{ end }}
|
||||||
|
{{- range $tk, $tv := $netdev.Tags }}
|
||||||
|
{{- if eq (substr 0 5 $tk) "route" }}
|
||||||
|
up ip route add {{ index (splitList "," $tv) 0 }} via {{ index (splitList "," $tv) 1 }} dev {{ $netdev.Device }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
allow-hotplug {{$netdev.Device}}
|
|
||||||
iface {{$netdev.Device}} inet static
|
|
||||||
address {{$netdev.Ipaddr}}
|
|
||||||
netmask {{$netdev.Netmask}}
|
|
||||||
{{ if $netdev.Gateway }}gateway {{$netdev.Gateway}}{{- end}}
|
|
||||||
{{ if $netdev.MTU }}mtu {{$netdev.MTU}}{{- end}}
|
|
||||||
up ifmetric {{$netdev.Device}} 30
|
|
||||||
{{- end}}
|
|
||||||
|
|||||||
@@ -13,29 +13,45 @@ import (
|
|||||||
func Test_ifcfgOverlay(t *testing.T) {
|
func Test_ifcfgOverlay(t *testing.T) {
|
||||||
env := testenv.New(t)
|
env := testenv.New(t)
|
||||||
defer env.RemoveAll(t)
|
defer env.RemoveAll(t)
|
||||||
env.ImportFile(t, "etc/warewulf/nodes.conf", "nodes.conf")
|
|
||||||
env.ImportFile(t, "var/lib/warewulf/overlays/ifcfg/rootfs/etc/sysconfig/network-scripts/ifcfg.ww", "../rootfs/etc/sysconfig/network-scripts/ifcfg.ww")
|
env.ImportFile(t, "var/lib/warewulf/overlays/ifcfg/rootfs/etc/sysconfig/network-scripts/ifcfg.ww", "../rootfs/etc/sysconfig/network-scripts/ifcfg.ww")
|
||||||
|
env.ImportFile(t, "var/lib/warewulf/overlays/ifcfg/rootfs/etc/sysconfig/network-scripts/route.ww", "../rootfs/etc/sysconfig/network-scripts/route.ww")
|
||||||
env.ImportFile(t, "var/lib/warewulf/overlays/ifcfg/rootfs/etc/sysconfig/network.ww", "../rootfs/etc/sysconfig/network.ww")
|
env.ImportFile(t, "var/lib/warewulf/overlays/ifcfg/rootfs/etc/sysconfig/network.ww", "../rootfs/etc/sysconfig/network.ww")
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
args []string
|
nodes_conf string
|
||||||
log string
|
args []string
|
||||||
|
log string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "ifcfg:ifcfg.ww",
|
name: "ifcfg:ifcfg.ww",
|
||||||
args: []string{"--render", "node1", "ifcfg", "etc/sysconfig/network-scripts/ifcfg.ww"},
|
nodes_conf: "nodes.conf",
|
||||||
log: ifcfg,
|
args: []string{"--render", "node1", "ifcfg", "etc/sysconfig/network-scripts/ifcfg.ww"},
|
||||||
|
log: ifcfg,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "ifcfg:network.ww",
|
name: "ifcfg:network.ww",
|
||||||
args: []string{"--render", "node1", "ifcfg", "etc/sysconfig/network.ww"},
|
nodes_conf: "nodes.conf",
|
||||||
log: ifcfg_network,
|
args: []string{"--render", "node1", "ifcfg", "etc/sysconfig/network.ww"},
|
||||||
|
log: ifcfg_network,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ifcfg:ifcfg.ww (vlan)",
|
||||||
|
nodes_conf: "nodes.conf-vlan",
|
||||||
|
args: []string{"--render", "node1", "ifcfg", "etc/sysconfig/network-scripts/ifcfg.ww"},
|
||||||
|
log: ifcfg_vlan,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ifcfg:route.ww",
|
||||||
|
nodes_conf: "nodes.conf-vlan",
|
||||||
|
args: []string{"--render", "node1", "ifcfg", "etc/sysconfig/network-scripts/route.ww"},
|
||||||
|
log: ifcfg_routes,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
env.ImportFile(t, "etc/warewulf/nodes.conf", tt.nodes_conf)
|
||||||
cmd := show.GetCommand()
|
cmd := show.GetCommand()
|
||||||
cmd.SetArgs(tt.args)
|
cmd.SetArgs(tt.args)
|
||||||
stdout := bytes.NewBufferString("")
|
stdout := bytes.NewBufferString("")
|
||||||
@@ -57,6 +73,7 @@ const ifcfg string = `backupFile: true
|
|||||||
writeFile: true
|
writeFile: true
|
||||||
Filename: ifcfg-default.conf
|
Filename: ifcfg-default.conf
|
||||||
# This file is autogenerated by warewulf
|
# This file is autogenerated by warewulf
|
||||||
|
|
||||||
TYPE=ethernet
|
TYPE=ethernet
|
||||||
DEVICE=wwnet0
|
DEVICE=wwnet0
|
||||||
NAME=default
|
NAME=default
|
||||||
@@ -75,6 +92,7 @@ backupFile: true
|
|||||||
writeFile: true
|
writeFile: true
|
||||||
Filename: ifcfg-secondary.conf
|
Filename: ifcfg-secondary.conf
|
||||||
# This file is autogenerated by warewulf
|
# This file is autogenerated by warewulf
|
||||||
|
|
||||||
TYPE=ethernet
|
TYPE=ethernet
|
||||||
DEVICE=wwnet1
|
DEVICE=wwnet1
|
||||||
NAME=secondary
|
NAME=secondary
|
||||||
@@ -99,3 +117,46 @@ Filename: etc/sysconfig/network
|
|||||||
NETWORKING=yes
|
NETWORKING=yes
|
||||||
HOSTNAME=node1
|
HOSTNAME=node1
|
||||||
`
|
`
|
||||||
|
|
||||||
|
const ifcfg_vlan string = `backupFile: true
|
||||||
|
writeFile: true
|
||||||
|
Filename: ifcfg-tagged.conf
|
||||||
|
# This file is autogenerated by warewulf
|
||||||
|
|
||||||
|
VLAN=yes
|
||||||
|
DEVICE=eth0.902
|
||||||
|
NAME=tagged
|
||||||
|
BOOTPROTO=static
|
||||||
|
DEVTIMEOUT=10
|
||||||
|
ONBOOT=true
|
||||||
|
IPV6INIT=yes
|
||||||
|
IPV6_AUTOCONF=yes
|
||||||
|
IPV6_DEFROUTE=yes
|
||||||
|
IPV6_FAILURE_FATAL=no
|
||||||
|
backupFile: true
|
||||||
|
writeFile: true
|
||||||
|
Filename: ifcfg-untagged.conf
|
||||||
|
# This file is autogenerated by warewulf
|
||||||
|
|
||||||
|
TYPE=ethernet
|
||||||
|
DEVICE=eth0
|
||||||
|
NAME=untagged
|
||||||
|
BOOTPROTO=static
|
||||||
|
DEVTIMEOUT=10
|
||||||
|
ONBOOT=true
|
||||||
|
IPV6INIT=yes
|
||||||
|
IPV6_AUTOCONF=yes
|
||||||
|
IPV6_DEFROUTE=yes
|
||||||
|
IPV6_FAILURE_FATAL=no
|
||||||
|
`
|
||||||
|
|
||||||
|
const ifcfg_routes string = `backupFile: true
|
||||||
|
writeFile: true
|
||||||
|
Filename: route-tagged.conf
|
||||||
|
# This file is autogenerated by warewulf
|
||||||
|
192.168.1.0/24 via 192.168.2.254
|
||||||
|
backupFile: true
|
||||||
|
writeFile: true
|
||||||
|
Filename: route-untagged.conf
|
||||||
|
# This file is autogenerated by warewulf
|
||||||
|
`
|
||||||
|
|||||||
11
overlays/ifcfg/internal/nodes.conf-vlan
Normal file
11
overlays/ifcfg/internal/nodes.conf-vlan
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
nodes:
|
||||||
|
node1:
|
||||||
|
primary network: untagged
|
||||||
|
network devices:
|
||||||
|
untagged:
|
||||||
|
device: eth0
|
||||||
|
tagged:
|
||||||
|
type: vlan
|
||||||
|
device: eth0.902
|
||||||
|
tags:
|
||||||
|
route1: "192.168.1.0/24,192.168.2.254"
|
||||||
@@ -1,41 +1,45 @@
|
|||||||
{{range $devname, $netdev := .NetDevs -}}
|
{{- range $devname, $netdev := .NetDevs }}
|
||||||
{{- $filename := print "ifcfg-" $devname ".conf" }}
|
{{- $filename := print "ifcfg-" $devname ".conf" }}
|
||||||
{{- file $filename }}
|
{{- file $filename }}
|
||||||
# This file is autogenerated by warewulf
|
# This file is autogenerated by warewulf
|
||||||
{{ if $netdev.Type -}}
|
|
||||||
TYPE={{ $netdev.Type }}
|
{{ if eq $netdev.Type "vlan" -}}
|
||||||
{{ else -}}
|
VLAN=yes
|
||||||
TYPE=ethernet
|
{{- else -}}
|
||||||
{{ end -}}
|
TYPE={{ default "ethernet" $netdev.Type }}
|
||||||
|
{{- end }}
|
||||||
DEVICE={{ $netdev.Device }}
|
DEVICE={{ $netdev.Device }}
|
||||||
NAME={{ $devname }}
|
NAME={{ $devname }}
|
||||||
{{ if $netdev.MTU -}}
|
{{- if $netdev.MTU }}
|
||||||
MTU={{ $netdev.MTU }}
|
MTU={{ $netdev.MTU }}
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
BOOTPROTO=static
|
BOOTPROTO=static
|
||||||
DEVTIMEOUT=10
|
DEVTIMEOUT=10
|
||||||
|
{{- if $netdev.Ipaddr }}
|
||||||
IPADDR={{ $netdev.Ipaddr }}
|
IPADDR={{ $netdev.Ipaddr }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if $netdev.Netmask }}
|
||||||
NETMASK={{ $netdev.Netmask }}
|
NETMASK={{ $netdev.Netmask }}
|
||||||
{{ if $netdev.Gateway -}}
|
{{- end }}
|
||||||
|
{{- if $netdev.Gateway }}
|
||||||
GATEWAY={{ $netdev.Gateway }}
|
GATEWAY={{ $netdev.Gateway }}
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
{{ if $netdev.Hwaddr -}}
|
{{- if $netdev.Hwaddr }}
|
||||||
HWADDR={{ $netdev.Hwaddr }}
|
HWADDR={{ $netdev.Hwaddr }}
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
{{ if or $netdev.OnBoot (eq $netdev.OnBoot nil) -}}
|
{{ if or $netdev.OnBoot (eq $netdev.OnBoot nil) -}}
|
||||||
ONBOOT=true
|
ONBOOT=true
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
IPV6INIT=yes
|
IPV6INIT=yes
|
||||||
IPV6_AUTOCONF=yes
|
IPV6_AUTOCONF=yes
|
||||||
IPV6_DEFROUTE=yes
|
IPV6_DEFROUTE=yes
|
||||||
IPV6_FAILURE_FATAL=no
|
IPV6_FAILURE_FATAL=no
|
||||||
{{ if $netdev.Ipaddr6 -}}
|
{{- if $netdev.Ipaddr6 }}
|
||||||
IPV6ADDR="{{ $netdev.Ipaddr6 }}"
|
IPV6ADDR="{{ $netdev.Ipaddr6 }}"
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
{{range $tk, $tv := $netdev.Tags -}}
|
{{- range $tk, $tv := $netdev.Tags }}
|
||||||
{{ $prefix := substr 0 3 $tk -}}
|
{{- if eq (substr 0 3 $tk) "DNS" }}
|
||||||
{{ if eq $prefix "DNS" -}}
|
|
||||||
{{ $tk }}={{ $tv }}
|
{{ $tk }}={{ $tv }}
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
|
|||||||
10
overlays/ifcfg/rootfs/etc/sysconfig/network-scripts/route.ww
Normal file
10
overlays/ifcfg/rootfs/etc/sysconfig/network-scripts/route.ww
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{{- range $devname, $netdev := .NetDevs }}
|
||||||
|
{{- $filename := print "route-" $devname ".conf" }}
|
||||||
|
{{- file $filename }}
|
||||||
|
# This file is autogenerated by warewulf
|
||||||
|
{{- range $tk, $tv := $netdev.Tags }}
|
||||||
|
{{- if eq (substr 0 5 $tk) "route" }}
|
||||||
|
{{ index (splitList "," $tv) 0 }} via {{ index (splitList "," $tv) 1 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
{{ end -}}
|
||||||
13
overlays/wicked/internal/nodes.conf-vlan
Normal file
13
overlays/wicked/internal/nodes.conf-vlan
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
nodes:
|
||||||
|
node1:
|
||||||
|
primary network: untagged
|
||||||
|
network devices:
|
||||||
|
untagged:
|
||||||
|
device: eth0
|
||||||
|
tagged:
|
||||||
|
type: vlan
|
||||||
|
device: eth0.902
|
||||||
|
tags:
|
||||||
|
vlan_id: 902
|
||||||
|
parent_device: eth0
|
||||||
|
route1: "192.168.1.0/24,192.168.2.254"
|
||||||
@@ -13,23 +13,31 @@ import (
|
|||||||
func Test_wickedOverlay(t *testing.T) {
|
func Test_wickedOverlay(t *testing.T) {
|
||||||
env := testenv.New(t)
|
env := testenv.New(t)
|
||||||
defer env.RemoveAll(t)
|
defer env.RemoveAll(t)
|
||||||
env.ImportFile(t, "etc/warewulf/nodes.conf", "nodes.conf")
|
|
||||||
env.ImportFile(t, "var/lib/warewulf/overlays/wicked/rootfs/etc/wicked/ifconfig/ifcfg.xml.ww", "../rootfs/etc/wicked/ifconfig/ifcfg.xml.ww")
|
env.ImportFile(t, "var/lib/warewulf/overlays/wicked/rootfs/etc/wicked/ifconfig/ifcfg.xml.ww", "../rootfs/etc/wicked/ifconfig/ifcfg.xml.ww")
|
||||||
|
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
args []string
|
nodes_conf string
|
||||||
log string
|
args []string
|
||||||
|
log string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "wicked",
|
name: "wicked",
|
||||||
args: []string{"--render", "node1", "wicked", "etc/wicked/ifconfig/ifcfg.xml.ww"},
|
nodes_conf: "nodes.conf",
|
||||||
log: wicked,
|
args: []string{"--render", "node1", "wicked", "etc/wicked/ifconfig/ifcfg.xml.ww"},
|
||||||
|
log: wicked,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "wicked-vlans",
|
||||||
|
nodes_conf: "nodes.conf-vlan",
|
||||||
|
args: []string{"--render", "node1", "wicked", "etc/wicked/ifconfig/ifcfg.xml.ww"},
|
||||||
|
log: wicked_vlans,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
env.ImportFile(t, "etc/warewulf/nodes.conf", tt.nodes_conf)
|
||||||
cmd := show.GetCommand()
|
cmd := show.GetCommand()
|
||||||
cmd.SetArgs(tt.args)
|
cmd.SetArgs(tt.args)
|
||||||
stdout := bytes.NewBufferString("")
|
stdout := bytes.NewBufferString("")
|
||||||
@@ -69,12 +77,12 @@ This file is autogenerated by warewulf
|
|||||||
<address>
|
<address>
|
||||||
<local>192.168.3.21/24</local>
|
<local>192.168.3.21/24</local>
|
||||||
</address>
|
</address>
|
||||||
<route>
|
<route>
|
||||||
<nexthop>
|
<nexthop>
|
||||||
<gateway>192.168.3.1</gateway>
|
<gateway>192.168.3.1</gateway>
|
||||||
</nexthop>
|
</nexthop>
|
||||||
</route>
|
</route>
|
||||||
</ipv4:static>
|
</ipv4:static>
|
||||||
<ipv6>
|
<ipv6>
|
||||||
<enabled>true</enabled>
|
<enabled>true</enabled>
|
||||||
<privacy>prefer-public</privacy>
|
<privacy>prefer-public</privacy>
|
||||||
@@ -103,12 +111,83 @@ This file is autogenerated by warewulf
|
|||||||
<address>
|
<address>
|
||||||
<local>192.168.3.22/24</local>
|
<local>192.168.3.22/24</local>
|
||||||
</address>
|
</address>
|
||||||
<route>
|
<route>
|
||||||
<nexthop>
|
<nexthop>
|
||||||
<gateway>192.168.3.1</gateway>
|
<gateway>192.168.3.1</gateway>
|
||||||
</nexthop>
|
</nexthop>
|
||||||
</route>
|
</route>
|
||||||
</ipv4:static>
|
</ipv4:static>
|
||||||
|
<ipv6>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
<privacy>prefer-public</privacy>
|
||||||
|
<accept-redirects>false</accept-redirects>
|
||||||
|
</ipv6>
|
||||||
|
</interface>
|
||||||
|
`
|
||||||
|
|
||||||
|
const wicked_vlans string = `backupFile: true
|
||||||
|
writeFile: true
|
||||||
|
Filename: ifcfg-tagged.xml
|
||||||
|
<!--
|
||||||
|
This file is autogenerated by warewulf
|
||||||
|
-->
|
||||||
|
<interface origin="static generated warewulf config">
|
||||||
|
<name>eth0.902</name>
|
||||||
|
<link-type>vlan</link-type>
|
||||||
|
<vlan>
|
||||||
|
<device>eth0</device>
|
||||||
|
<tag>902</tag>
|
||||||
|
<protocol>ieee802-1Q</protocol>
|
||||||
|
</vlan>
|
||||||
|
<control>
|
||||||
|
<mode>boot</mode>
|
||||||
|
</control>
|
||||||
|
<firewall/>
|
||||||
|
<link/>
|
||||||
|
<ipv4>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
<arp-verify>true</arp-verify>
|
||||||
|
</ipv4>
|
||||||
|
<ipv4:static>
|
||||||
|
<address>
|
||||||
|
<local><nil></local>
|
||||||
|
</address>
|
||||||
|
<route>
|
||||||
|
<destination>192.168.1.0/24</destination>
|
||||||
|
<nexthop>
|
||||||
|
<gateway>192.168.2.254</gateway>
|
||||||
|
</nexthop>
|
||||||
|
</route>
|
||||||
|
</ipv4:static>
|
||||||
|
<ipv6>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
<privacy>prefer-public</privacy>
|
||||||
|
<accept-redirects>false</accept-redirects>
|
||||||
|
</ipv6>
|
||||||
|
</interface>
|
||||||
|
backupFile: true
|
||||||
|
writeFile: true
|
||||||
|
Filename: ifcfg-untagged.xml
|
||||||
|
<!--
|
||||||
|
This file is autogenerated by warewulf
|
||||||
|
-->
|
||||||
|
<interface origin="static generated warewulf config">
|
||||||
|
<name>eth0</name>
|
||||||
|
<link-type>ethernet</link-type>
|
||||||
|
<control>
|
||||||
|
<mode>boot</mode>
|
||||||
|
</control>
|
||||||
|
<firewall/>
|
||||||
|
<link/>
|
||||||
|
<ipv4>
|
||||||
|
<enabled>true</enabled>
|
||||||
|
<arp-verify>true</arp-verify>
|
||||||
|
</ipv4>
|
||||||
|
<ipv4:static>
|
||||||
|
<address>
|
||||||
|
<local><nil></local>
|
||||||
|
</address>
|
||||||
|
</ipv4:static>
|
||||||
<ipv6>
|
<ipv6>
|
||||||
<enabled>true</enabled>
|
<enabled>true</enabled>
|
||||||
<privacy>prefer-public</privacy>
|
<privacy>prefer-public</privacy>
|
||||||
|
|||||||
@@ -1,28 +1,22 @@
|
|||||||
{{ $NetDevs := .NetDevs -}}{{/* FIX: 1413 */ -}}
|
{{- $NetDevs := .NetDevs }}
|
||||||
{{range $devname, $netdev := .ThisNode.NetDevs -}}
|
{{- range $devname, $netdev := .ThisNode.NetDevs }}
|
||||||
{{- $filename := print "ifcfg-" $devname ".xml" }}
|
{{- file (print "ifcfg-" $devname ".xml") }}
|
||||||
{{- file $filename }}
|
|
||||||
<!--
|
<!--
|
||||||
This file is autogenerated by warewulf
|
This file is autogenerated by warewulf
|
||||||
-->
|
-->
|
||||||
<interface origin="static generated warewulf config">
|
<interface origin="static generated warewulf config">
|
||||||
<name>{{$netdev.Device}}</name>
|
<name>{{ $netdev.Device }}</name>
|
||||||
{{ if $netdev.Type -}}
|
<link-type>{{ default "ethernet" $netdev.Type }}</link-type>
|
||||||
{{ if eq $netdev.Type "vlan" -}}
|
{{- if eq $netdev.Type "vlan" }}
|
||||||
<vlan>
|
<vlan>
|
||||||
<device> {{ $netdev.Tags.parent_device }} </device>
|
<device>{{ $netdev.Tags.parent_device }}</device>
|
||||||
<tag> {{ $netdev.Tags.vlan_id }} </tag>
|
<tag>{{ $netdev.Tags.vlan_id }}</tag>
|
||||||
<protocol>ieee802-1Q</protocol>
|
<protocol>ieee802-1Q</protocol>
|
||||||
</vlan>
|
</vlan>
|
||||||
{{ else -}}
|
{{- end }}
|
||||||
<link-type>{{ $netdev.Type }}</link-type>
|
{{- if $netdev.MTU }}
|
||||||
{{ else -}}
|
|
||||||
<link-type>ethernet</link-type>
|
|
||||||
{{ end -}}
|
|
||||||
{{ end -}}
|
|
||||||
{{ if $netdev.MTU -}}
|
|
||||||
<mtu>{{ $netdev.MTU }}</mtu>
|
<mtu>{{ $netdev.MTU }}</mtu>
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
<control>
|
<control>
|
||||||
<mode>{{ if or $netdev.OnBoot (eq $netdev.OnBoot nil) }}boot{{ else }}manual{{end}}</mode>
|
<mode>{{ if or $netdev.OnBoot (eq $netdev.OnBoot nil) }}boot{{ else }}manual{{end}}</mode>
|
||||||
</control>
|
</control>
|
||||||
@@ -36,25 +30,35 @@ This file is autogenerated by warewulf
|
|||||||
<address>
|
<address>
|
||||||
<local>{{$netdev.IpCIDR}}</local>
|
<local>{{$netdev.IpCIDR}}</local>
|
||||||
</address>
|
</address>
|
||||||
{{ if $netdev.Gateway -}}
|
{{- if $netdev.Gateway }}
|
||||||
<route>
|
<route>
|
||||||
<nexthop>
|
<nexthop>
|
||||||
<gateway>{{$netdev.Gateway}}</gateway>
|
<gateway>{{$netdev.Gateway}}</gateway>
|
||||||
</nexthop>
|
</nexthop>
|
||||||
</route>
|
</route>
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
|
{{- range $tk, $tv := $netdev.Tags }}
|
||||||
|
{{- if eq (substr 0 5 $tk) "route" }}
|
||||||
|
<route>
|
||||||
|
<destination>{{ index (splitList "," $tv) 0 }}</destination>
|
||||||
|
<nexthop>
|
||||||
|
<gateway>{{ index (splitList "," $tv) 1 }}</gateway>
|
||||||
|
</nexthop>
|
||||||
|
</route>
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
</ipv4:static>
|
</ipv4:static>
|
||||||
<ipv6>
|
<ipv6>
|
||||||
<enabled>true</enabled>
|
<enabled>true</enabled>
|
||||||
<privacy>prefer-public</privacy>
|
<privacy>prefer-public</privacy>
|
||||||
<accept-redirects>false</accept-redirects>
|
<accept-redirects>false</accept-redirects>
|
||||||
</ipv6>
|
</ipv6>
|
||||||
{{ if $netdev.Ipaddr6 -}}
|
{{- if $netdev.Ipaddr6 }}
|
||||||
<ipv6:static>
|
<ipv6:static>
|
||||||
<address>
|
<address>
|
||||||
<local>{{ $netdev.Ipaddr6 }}</local>
|
<local>{{ $netdev.Ipaddr6 }}</local>
|
||||||
</address>
|
</address>
|
||||||
</ipv6:static>
|
</ipv6:static>
|
||||||
{{ end -}}
|
{{- end }}
|
||||||
</interface>
|
</interface>
|
||||||
{{ end -}}
|
{{ end -}}
|
||||||
|
|||||||
Reference in New Issue
Block a user