Files
warewulf/overlays/NetworkManager/internal/networkmanager_test.go
Jonathon Anderson 3a1e581f93 Better handling for missing NetDev.Device
- Closes: #1777

Overlays:
- ifcfg
- NetworkManager

Signed-off-by: Jonathon Anderson <janderson@ciq.com>
2025-02-24 22:27:36 -07:00

410 lines
8.6 KiB
Go

package networkmanager
import (
"bytes"
"testing"
"github.com/stretchr/testify/assert"
"github.com/warewulf/warewulf/internal/app/wwctl/overlay/show"
"github.com/warewulf/warewulf/internal/pkg/testenv"
"github.com/warewulf/warewulf/internal/pkg/wwlog"
)
func Test_networkmanagerOverlay(t *testing.T) {
tests := map[string]struct {
nodes_conf string
args []string
log string
}{
"NetworkManager:ww4-unmanaged.ww": {
nodes_conf: `
nodes:
node1:
network devices:
default:
device: wwnet0
onboot: true
hwaddr: e6:92:39:49:7b:03
ipaddr: 192.168.3.21
netmask: 255.255.255.0
gateway: 192.168.3.1
secondary:
device: wwnet1
onboot: true
hwaddr: 9a:77:29:73:14:f1
ipaddr: 192.168.3.22
netmask: 255.255.255.0
gateway: 192.168.3.1
tags:
DNS1: 8.8.8.8
DNS2: 8.8.4.4
DNSSEARCH: "example.com;example.net;"
`,
args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/conf.d/ww4-unmanaged.ww"},
log: `backupFile: true
writeFile: true
Filename: warewulf-unmanaged.conf
# This file is autogenerated by warewulf
[main]
plugins=keyfile
[keyfile]
unmanaged-devices=except:mac:e6:92:39:49:7b:03,except:interface-name:wwnet0,except:mac:9a:77:29:73:14:f1,except:interface-name:wwnet1
`,
},
"NetworkManager:ww4-managed.ww": {
nodes_conf: `
nodes:
node1:
network devices:
default:
device: wwnet0
onboot: true
hwaddr: e6:92:39:49:7b:03
ipaddr: 192.168.3.21
netmask: 255.255.255.0
gateway: 192.168.3.1
secondary:
device: wwnet1
onboot: true
hwaddr: 9a:77:29:73:14:f1
ipaddr: 192.168.3.22
netmask: 255.255.255.0
gateway: 192.168.3.1
tags:
DNS1: 8.8.8.8
DNS2: 8.8.4.4
DNSSEARCH: "example.com;example.net;"
`,
args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/system-connections/ww4-managed.ww"},
log: `backupFile: true
writeFile: true
Filename: warewulf-default.conf
# This file is autogenerated by warewulf
[connection]
id=default
interface-name=wwnet0
type=ethernet
autoconnect=true
[ethernet]
mac-address=e6:92:39:49:7b:03
[ipv4]
method=manual
address=192.168.3.21/24
gateway=192.168.3.1
[ipv6]
addr-gen-mode=stable-privacy
method=ignore
never-default=true
backupFile: true
writeFile: true
Filename: warewulf-secondary.conf
# This file is autogenerated by warewulf
[connection]
id=secondary
interface-name=wwnet1
type=ethernet
autoconnect=true
[ethernet]
mac-address=9a:77:29:73:14:f1
[ipv4]
method=manual
address=192.168.3.22/24
gateway=192.168.3.1
dns=8.8.8.8;8.8.4.4;
dns-search=example.com;example.net;
[ipv6]
addr-gen-mode=stable-privacy
method=ignore
never-default=true
`,
},
"NetworkManager:ww4-managed.ww without device": {
nodes_conf: `
nodes:
node1:
network devices:
default:
onboot: true
hwaddr: e6:92:39:49:7b:03
ipaddr: 192.168.3.21
netmask: 255.255.255.0
gateway: 192.168.3.1
secondary:
onboot: true
hwaddr: 9a:77:29:73:14:f1
ipaddr: 192.168.3.22
netmask: 255.255.255.0
gateway: 192.168.3.1
tags:
DNS1: 8.8.8.8
DNS2: 8.8.4.4
DNSSEARCH: "example.com;example.net;"
`,
args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/system-connections/ww4-managed.ww"},
log: `backupFile: true
writeFile: true
Filename: warewulf-default.conf
# This file is autogenerated by warewulf
[connection]
id=default
type=ethernet
autoconnect=true
[ethernet]
mac-address=e6:92:39:49:7b:03
[ipv4]
method=manual
address=192.168.3.21/24
gateway=192.168.3.1
[ipv6]
addr-gen-mode=stable-privacy
method=ignore
never-default=true
backupFile: true
writeFile: true
Filename: warewulf-secondary.conf
# This file is autogenerated by warewulf
[connection]
id=secondary
type=ethernet
autoconnect=true
[ethernet]
mac-address=9a:77:29:73:14:f1
[ipv4]
method=manual
address=192.168.3.22/24
gateway=192.168.3.1
dns=8.8.8.8;8.8.4.4;
dns-search=example.com;example.net;
[ipv6]
addr-gen-mode=stable-privacy
method=ignore
never-default=true
`,
},
"NetworkManager:ww4-unmanaged.ww with empty mac address": {
nodes_conf: `
nodes:
node1:
network devices:
default:
device: wwnet0
onboot: true
hwaddr:
ipaddr: 192.168.3.21
netmask: 255.255.255.0
gateway: 192.168.3.1
secondary:
device: wwnet1
onboot: true
hwaddr: 9a:77:29:73:14:f1
ipaddr: 192.168.3.22
netmask: 255.255.255.0
gateway: 192.168.3.1
tags:
DNS1: 8.8.8.8
DNS2: 8.8.4.4
`,
args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/conf.d/ww4-unmanaged.ww"},
log: `backupFile: true
writeFile: true
Filename: warewulf-unmanaged.conf
# This file is autogenerated by warewulf
[main]
plugins=keyfile
[keyfile]
unmanaged-devices=except:interface-name:wwnet0,except:mac:9a:77:29:73:14:f1,except:interface-name:wwnet1
`,
},
"NetworkManager:ww4-managed.ww with vlan": {
nodes_conf: `
nodes:
node1:
primary network: untagged
network devices:
untagged:
onboot: true
device: eth0
tagged:
onboot: true
type: vlan
device: eth0.902
tags:
vlan_id: 902
parent_device: eth0
route1: "192.168.1.0/24,192.168.2.254"
`,
args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/system-connections/ww4-managed.ww"},
log: `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
[ethernet]
[ipv4]
method=manual
route1=192.168.1.0/24,192.168.2.254
[ipv6]
addr-gen-mode=stable-privacy
method=ignore
never-default=true
[vlan]
interface-name=eth0.902
parent=eth0
id=902
backupFile: true
writeFile: true
Filename: warewulf-untagged.conf
# This file is autogenerated by warewulf
[connection]
id=untagged
interface-name=eth0
type=ethernet
autoconnect=true
[ethernet]
[ipv4]
method=manual
[ipv6]
addr-gen-mode=stable-privacy
method=ignore
never-default=true
`,
},
"NetworkManager:ww4-managed.ww with bond": {
nodes_conf: `
nodes:
node1:
network devices:
bond0:
type: Bond
device: bond0
ipaddr: 192.168.3.110
netmask: 255.255.255.0
en1:
device: en1
hwaddr: e6:92:39:49:7b:03
tags:
master: bond0
en2:
device: en2
hwaddr: 9a:77:29:73:14:f1
tags:
master: bond0
`,
args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/system-connections/ww4-managed.ww"},
log: `backupFile: true
writeFile: true
Filename: warewulf-bond0.conf
# This file is autogenerated by warewulf
[connection]
id=bond0
interface-name=bond0
type=bond
autoconnect=true
[bond]
downdelay=0
miimon=100
mode=balance-rr
xmit_hash_policy=layer2+3
updelay=0
[ethernet]
[ipv4]
method=manual
address=192.168.3.110/24
[ipv6]
addr-gen-mode=stable-privacy
method=ignore
never-default=true
backupFile: true
writeFile: true
Filename: warewulf-en1.conf
# This file is autogenerated by warewulf
[connection]
id=en1
interface-name=en1
type=ethernet
master=bond0
slave-type=bond
autoconnect=true
[ethernet]
mac-address=e6:92:39:49:7b:03
[ipv4]
method=disabled
[ipv6]
method=disabled
backupFile: true
writeFile: true
Filename: warewulf-en2.conf
# This file is autogenerated by warewulf
[connection]
id=en2
interface-name=en2
type=ethernet
master=bond0
slave-type=bond
autoconnect=true
[ethernet]
mac-address=9a:77:29:73:14:f1
[ipv4]
method=disabled
[ipv6]
method=disabled
`,
},
}
env := testenv.New(t)
defer env.RemoveAll()
env.ImportFile("var/lib/warewulf/overlays/NetworkManager/rootfs/etc/NetworkManager/conf.d/ww4-unmanaged.ww", "../rootfs/etc/NetworkManager/conf.d/ww4-unmanaged.ww")
env.ImportFile("var/lib/warewulf/overlays/NetworkManager/rootfs/etc/NetworkManager/system-connections/ww4-managed.ww", "../rootfs/etc/NetworkManager/system-connections/ww4-managed.ww")
for name, tt := range tests {
t.Run(name, func(t *testing.T) {
env.WriteFile("etc/warewulf/nodes.conf", tt.nodes_conf)
cmd := show.GetCommand()
cmd.SetArgs(tt.args)
stdout := bytes.NewBufferString("")
stderr := bytes.NewBufferString("")
logbuf := bytes.NewBufferString("")
cmd.SetOut(stdout)
cmd.SetErr(stderr)
wwlog.SetLogWriter(logbuf)
err := cmd.Execute()
assert.NoError(t, err)
assert.Empty(t, stdout.String())
assert.Empty(t, stderr.String())
assert.Equal(t, tt.log, logbuf.String())
})
}
}