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 [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 [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()) }) } }