package ifcfg 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_ifcfgOverlay(t *testing.T) { tests := map[string]struct { nodes_conf string args []string log string }{ "ifcfg:ifcfg.ww": { nodes_conf: ` nodes: node1: network devices: default: device: wwnet0 hwaddr: e6:92:39:49:7b:03 ipaddr: 192.168.3.21 netmask: 255.255.255.0 gateway: 192.168.3.1 tags: DNS1: 1.1.1.1 DNS2: 1.0.0.1 DNSSEARCH: "example.com example.net" secondary: device: wwnet1 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.net;example.com;" `, args: []string{"--render", "node1", "ifcfg", "etc/sysconfig/network-scripts/ifcfg.ww"}, log: `backupFile: true writeFile: true Filename: ifcfg-default.conf # This file is autogenerated by warewulf TYPE=Ethernet DEVICE=wwnet0 NAME=default BOOTPROTO=static DEVTIMEOUT=10 IPADDR=192.168.3.21 NETMASK=255.255.255.0 GATEWAY=192.168.3.1 HWADDR=e6:92:39:49:7b:03 ONBOOT=true IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no DNS1=1.1.1.1 DNS2=1.0.0.1 DOMAIN="example.com example.net" backupFile: true writeFile: true Filename: ifcfg-secondary.conf # This file is autogenerated by warewulf TYPE=Ethernet DEVICE=wwnet1 NAME=secondary BOOTPROTO=static DEVTIMEOUT=10 IPADDR=192.168.3.22 NETMASK=255.255.255.0 GATEWAY=192.168.3.1 HWADDR=9a:77:29:73:14:f1 ONBOOT=true IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no DNS1=8.8.8.8 DNS2=8.8.4.4 DOMAIN="example.net example.com" `, }, "ifcfg:ifcfg.ww without device": { nodes_conf: ` nodes: node1: network devices: default: hwaddr: e6:92:39:49:7b:03 ipaddr: 192.168.3.21 netmask: 255.255.255.0 gateway: 192.168.3.1 tags: DNS1: 1.1.1.1 DNS2: 1.0.0.1 DNSSEARCH: "example.com example.net" secondary: 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.net;example.com;" `, args: []string{"--render", "node1", "ifcfg", "etc/sysconfig/network-scripts/ifcfg.ww"}, log: `backupFile: true writeFile: true Filename: ifcfg-default.conf # This file is autogenerated by warewulf TYPE=Ethernet NAME=default BOOTPROTO=static DEVTIMEOUT=10 IPADDR=192.168.3.21 NETMASK=255.255.255.0 GATEWAY=192.168.3.1 HWADDR=e6:92:39:49:7b:03 ONBOOT=true IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no DNS1=1.1.1.1 DNS2=1.0.0.1 DOMAIN="example.com example.net" backupFile: true writeFile: true Filename: ifcfg-secondary.conf # This file is autogenerated by warewulf TYPE=Ethernet NAME=secondary BOOTPROTO=static DEVTIMEOUT=10 IPADDR=192.168.3.22 NETMASK=255.255.255.0 GATEWAY=192.168.3.1 HWADDR=9a:77:29:73:14:f1 ONBOOT=true IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no DNS1=8.8.8.8 DNS2=8.8.4.4 DOMAIN="example.net example.com" `, }, "ifcfg:network.ww": { nodes_conf: ` nodes: node1: network devices: default: device: wwnet0 hwaddr: e6:92:39:49:7b:03 ipaddr: 192.168.3.21 netmask: 255.255.255.0 gateway: 192.168.3.1 tags: DNS1: 1.1.1.1 DNS2: 1.0.0.1 DNSSEARCH: "example.com example.net" secondary: device: wwnet1 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.net;example.com;" `, args: []string{"--render", "node1", "ifcfg", "etc/sysconfig/network.ww"}, log: `backupFile: true writeFile: true Filename: etc/sysconfig/network NETWORKING=yes HOSTNAME=node1 `, }, "ifcfg:ifcfg.ww (vlan)": { nodes_conf: ` nodes: node1: primary network: untagged network devices: untagged: onboot: true device: eth0 tagged: onboot: true type: vlan device: eth0.902 tags: route1: "192.168.1.0/24,192.168.2.254" `, args: []string{"--render", "node1", "ifcfg", "etc/sysconfig/network-scripts/ifcfg.ww"}, log: `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 `, }, "ifcfg:ifcfg.ww (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", "ifcfg", "etc/sysconfig/network-scripts/ifcfg.ww"}, log: `backupFile: true writeFile: true Filename: ifcfg-bond0.conf # This file is autogenerated by warewulf TYPE=Bond DEVICE=bond0 NAME=bond0 BOOTPROTO=static DEVTIMEOUT=10 IPADDR=192.168.3.110 NETMASK=255.255.255.0 ONBOOT=true IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no backupFile: true writeFile: true Filename: ifcfg-en1.conf # This file is autogenerated by warewulf TYPE=Ethernet SLAVE=yes MASTER=bond0 DEVICE=en1 NAME=en1 BOOTPROTO=static DEVTIMEOUT=10 HWADDR=e6:92:39:49:7b:03 ONBOOT=true IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no backupFile: true writeFile: true Filename: ifcfg-en2.conf # This file is autogenerated by warewulf TYPE=Ethernet SLAVE=yes MASTER=bond0 DEVICE=en2 NAME=en2 BOOTPROTO=static DEVTIMEOUT=10 HWADDR=9a:77:29:73:14:f1 ONBOOT=true IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no `, }, "ifcfg:route.ww": { nodes_conf: ` nodes: node1: primary network: untagged network devices: untagged: onboot: true device: eth0 tagged: onboot: true type: vlan device: eth0.902 tags: route1: "192.168.1.0/24,192.168.2.254" `, args: []string{"--render", "node1", "ifcfg", "etc/sysconfig/network-scripts/route.ww"}, log: `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 `, }, "ifcfg:ifcfg.ww (onBoot)": { nodes_conf: ` nodes: node1: primary network: untagged network devices: untagged: onboot: false device: eth0 tagged: onboot: true type: vlan device: eth0.902 tags: route1: "192.168.1.0/24,192.168.2.254" `, args: []string{"--render", "node1", "ifcfg", "etc/sysconfig/network-scripts/ifcfg.ww"}, log: `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=false IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no `, }, } env := testenv.New(t) defer env.RemoveAll() env.ImportFile("var/lib/warewulf/overlays/ifcfg/rootfs/etc/sysconfig/network-scripts/ifcfg.ww", "../rootfs/etc/sysconfig/network-scripts/ifcfg.ww") env.ImportFile("var/lib/warewulf/overlays/ifcfg/rootfs/etc/sysconfig/network-scripts/route.ww", "../rootfs/etc/sysconfig/network-scripts/route.ww") env.ImportFile("var/lib/warewulf/overlays/ifcfg/rootfs/etc/sysconfig/network.ww", "../rootfs/etc/sysconfig/network.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()) }) } }