From da26fa30614b19cf5bdeae775e2fc9ba36765d18 Mon Sep 17 00:00:00 2001 From: Jonathon Anderson Date: Tue, 11 Feb 2025 20:17:40 -0700 Subject: [PATCH] Added support for a DNSSEARCH netdev tag in network configuration overlays - Closes: #1256 Signed-off-by: Jonathon Anderson --- CHANGELOG.md | 1 + .../internal/networkmanager_test.go | 214 ++++++++++++------ overlays/NetworkManager/internal/nodes.conf | 20 -- .../NetworkManager/internal/nodes.conf-vlan | 15 -- .../internal/nodes_empty_mac.conf | 20 -- .../system-connections/ww4-managed.ww | 5 +- overlays/ifcfg/internal/ifcfg_test.go | 195 ++++++++++------ overlays/ifcfg/internal/nodes.conf | 21 -- overlays/ifcfg/internal/nodes.conf-vlan | 13 -- .../etc/sysconfig/network-scripts/ifcfg.ww | 5 +- overlays/resolv/internal/nodes.conf | 1 + overlays/resolv/internal/resolv_test.go | 17 +- overlays/resolv/rootfs/etc/resolv.conf.ww | 16 +- userdocs/contents/overlays.rst | 15 ++ 14 files changed, 314 insertions(+), 244 deletions(-) delete mode 100644 overlays/NetworkManager/internal/nodes.conf delete mode 100644 overlays/NetworkManager/internal/nodes.conf-vlan delete mode 100644 overlays/NetworkManager/internal/nodes_empty_mac.conf delete mode 100644 overlays/ifcfg/internal/nodes.conf delete mode 100644 overlays/ifcfg/internal/nodes.conf-vlan diff --git a/CHANGELOG.md b/CHANGELOG.md index 9c61077b..ac3688eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Added default value for `warewulf.conf:dhcp.template`. #1725 - Added `UniqueField` template function. #829 - Added `wwctl image build --syncuser`. #1321 +- Added support for a DNSSEARCH netdev tag in network configuration overlays. #1256 ### Changed diff --git a/overlays/NetworkManager/internal/networkmanager_test.go b/overlays/NetworkManager/internal/networkmanager_test.go index f21a2158..ff2217c9 100644 --- a/overlays/NetworkManager/internal/networkmanager_test.go +++ b/overlays/NetworkManager/internal/networkmanager_test.go @@ -11,76 +11,37 @@ import ( ) func Test_networkmanagerOverlay(t *testing.T) { - 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") - - tests := []struct { - name string + tests := map[string]struct { nodes_conf string args []string log string }{ - { - name: "NetworkManager:ww4-unmanaged.ww", - nodes_conf: "nodes.conf", - args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/conf.d/ww4-unmanaged.ww"}, - log: networkmanager_unmanaged, - }, - { - name: "NetworkManager:ww4-managed.ww", - nodes_conf: "nodes.conf", - args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/system-connections/ww4-managed.ww"}, - log: networkmanager_managed, - }, - { - name: "NetworkManager:ww4-unmanaged.ww with empty mac address", - nodes_conf: "nodes_empty_mac.conf", - args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/conf.d/ww4-unmanaged.ww"}, - log: networkmanager_unmanaged_with_empty_mac, - }, - { - name: "NetworkManager:ww4-managed.ww with vlan", - nodes_conf: "nodes.conf-vlan", - args: []string{"--render", "node1", "NetworkManager", "etc/NetworkManager/system-connections/ww4-managed.ww"}, - log: networkmanager_managed_with_vlan, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - env.ImportFile("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()) - }) - } -} - -const networkmanager_unmanaged_with_empty_mac string = `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, -` - -const networkmanager_unmanaged string = `backupFile: true + "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 @@ -90,9 +51,34 @@ 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, -` - -const networkmanager_managed string = `backupFile: true +`, + }, + "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 @@ -131,14 +117,70 @@ 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 -const networkmanager_managed_with_vlan string = `backupFile: true +[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 @@ -180,4 +222,32 @@ method=manual addr-gen-mode=stable-privacy method=ignore never-default=true -` +`, + }, + } + + 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()) + }) + } +} diff --git a/overlays/NetworkManager/internal/nodes.conf b/overlays/NetworkManager/internal/nodes.conf deleted file mode 100644 index 33a7b4d2..00000000 --- a/overlays/NetworkManager/internal/nodes.conf +++ /dev/null @@ -1,20 +0,0 @@ -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 diff --git a/overlays/NetworkManager/internal/nodes.conf-vlan b/overlays/NetworkManager/internal/nodes.conf-vlan deleted file mode 100644 index 71338a9a..00000000 --- a/overlays/NetworkManager/internal/nodes.conf-vlan +++ /dev/null @@ -1,15 +0,0 @@ -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" diff --git a/overlays/NetworkManager/internal/nodes_empty_mac.conf b/overlays/NetworkManager/internal/nodes_empty_mac.conf deleted file mode 100644 index b1aa5217..00000000 --- a/overlays/NetworkManager/internal/nodes_empty_mac.conf +++ /dev/null @@ -1,20 +0,0 @@ -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 diff --git a/overlays/NetworkManager/rootfs/etc/NetworkManager/system-connections/ww4-managed.ww b/overlays/NetworkManager/rootfs/etc/NetworkManager/system-connections/ww4-managed.ww index e1f8dc51..6daee3a2 100644 --- a/overlays/NetworkManager/rootfs/etc/NetworkManager/system-connections/ww4-managed.ww +++ b/overlays/NetworkManager/rootfs/etc/NetworkManager/system-connections/ww4-managed.ww @@ -50,7 +50,7 @@ gateway={{ $netdev.Gateway }} {{- end }} {{- $dns := "" }} {{- range $tk, $tv := $netdev.Tags }} -{{- if eq (substr 0 3 $tk) "DNS" }} +{{- if regexMatch "^DNS[0-9]*$" $tk }} {{- $dns = print $dns $tv ";" }} {{- else if eq (substr 0 5 $tk) "route" }} {{$tk}}={{$tv}} @@ -59,6 +59,9 @@ gateway={{ $netdev.Gateway }} {{- if $dns }} dns={{$dns}} {{- end }} +{{- if $netdev.Tags.DNSSEARCH }} +dns-search={{ join ";" (without (regexSplit "[ ;]+" $netdev.Tags.DNSSEARCH -1) "") }}; +{{- end }} {{- end }} {{- if eq $netdev.Type "vlan" }} diff --git a/overlays/ifcfg/internal/ifcfg_test.go b/overlays/ifcfg/internal/ifcfg_test.go index cd77cc9a..c7e8e94b 100644 --- a/overlays/ifcfg/internal/ifcfg_test.go +++ b/overlays/ifcfg/internal/ifcfg_test.go @@ -11,65 +11,39 @@ import ( ) func Test_ifcfgOverlay(t *testing.T) { - 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") - - tests := []struct { - name string + tests := map[string]struct { nodes_conf string args []string log string }{ - { - name: "ifcfg:ifcfg.ww", - nodes_conf: "nodes.conf", - args: []string{"--render", "node1", "ifcfg", "etc/sysconfig/network-scripts/ifcfg.ww"}, - log: ifcfg, - }, - { - name: "ifcfg:network.ww", - nodes_conf: "nodes.conf", - 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 { - t.Run(tt.name, func(t *testing.T) { - env.ImportFile("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()) - }) - } -} - -const ifcfg string = `backupFile: true + "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 @@ -89,6 +63,7 @@ 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 @@ -108,16 +83,61 @@ IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no DNS1=8.8.8.8 DNS2=8.8.4.4 -` - -const ifcfg_network string = `backupFile: true +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 -` - -const ifcfg_vlan string = `backupFile: true +`, + }, + "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 @@ -146,9 +166,26 @@ IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no -` - -const ifcfg_routes string = `backupFile: true +`, + }, + "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 @@ -159,4 +196,32 @@ backupFile: true writeFile: true Filename: route-untagged.conf # This file is autogenerated by warewulf -` +`, + }, + } + + 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()) + }) + } +} diff --git a/overlays/ifcfg/internal/nodes.conf b/overlays/ifcfg/internal/nodes.conf deleted file mode 100644 index bfc08d69..00000000 --- a/overlays/ifcfg/internal/nodes.conf +++ /dev/null @@ -1,21 +0,0 @@ -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 - 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 diff --git a/overlays/ifcfg/internal/nodes.conf-vlan b/overlays/ifcfg/internal/nodes.conf-vlan deleted file mode 100644 index 1345481e..00000000 --- a/overlays/ifcfg/internal/nodes.conf-vlan +++ /dev/null @@ -1,13 +0,0 @@ -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" diff --git a/overlays/ifcfg/rootfs/etc/sysconfig/network-scripts/ifcfg.ww b/overlays/ifcfg/rootfs/etc/sysconfig/network-scripts/ifcfg.ww index 53206e73..a4849cac 100644 --- a/overlays/ifcfg/rootfs/etc/sysconfig/network-scripts/ifcfg.ww +++ b/overlays/ifcfg/rootfs/etc/sysconfig/network-scripts/ifcfg.ww @@ -39,8 +39,11 @@ IPV6_FAILURE_FATAL=no IPV6ADDR="{{ $netdev.Ipaddr6 }}" {{- end }} {{- range $tk, $tv := $netdev.Tags }} -{{- if eq (substr 0 3 $tk) "DNS" }} +{{- if regexMatch "^DNS[0-9]*$" $tk }} {{ $tk }}={{ $tv }} {{- end }} {{- end }} +{{- if $netdev.Tags.DNSSEARCH }} +DOMAIN="{{ join " " (without (regexSplit "[ ;]+" $netdev.Tags.DNSSEARCH -1) "") }}" +{{- end }} {{- end }} diff --git a/overlays/resolv/internal/nodes.conf b/overlays/resolv/internal/nodes.conf index 0ce2a9d7..c6610921 100644 --- a/overlays/resolv/internal/nodes.conf +++ b/overlays/resolv/internal/nodes.conf @@ -5,3 +5,4 @@ nodes: tags: DNS1: 8.8.8.8 DNS2: 8.8.4.4 + DNSSEARCH: "example.com example.net" diff --git a/overlays/resolv/internal/resolv_test.go b/overlays/resolv/internal/resolv_test.go index e6999a23..a492ed0a 100644 --- a/overlays/resolv/internal/resolv_test.go +++ b/overlays/resolv/internal/resolv_test.go @@ -24,7 +24,14 @@ func Test_resolvOverlay(t *testing.T) { { name: "/etc/resolv.conf", args: []string{"--render", "node1", "resolv", "etc/resolv.conf.ww"}, - log: resolv_conf, + log: `backupFile: true +writeFile: true +Filename: etc/resolv.conf +# This file is autogenerated by warewulf +nameserver 8.8.8.8 +nameserver 8.8.4.4 +search example.com example.net +`, }, } @@ -46,11 +53,3 @@ func Test_resolvOverlay(t *testing.T) { }) } } - -const resolv_conf string = `backupFile: true -writeFile: true -Filename: etc/resolv.conf -# This file is autogenerated by warewulf -nameserver 8.8.8.8 -nameserver 8.8.4.4 -` diff --git a/overlays/resolv/rootfs/etc/resolv.conf.ww b/overlays/resolv/rootfs/etc/resolv.conf.ww index 3fa1946a..256e5694 100644 --- a/overlays/resolv/rootfs/etc/resolv.conf.ww +++ b/overlays/resolv/rootfs/etc/resolv.conf.ww @@ -1,9 +1,11 @@ # This file is autogenerated by warewulf -{{range $devname, $netdev := .NetDevs -}} -{{range $tk, $tv := $netdev.Tags -}} -{{ $prefix := substr 0 3 $tk -}} -{{ if eq $prefix "DNS" -}} +{{- range $devname, $netdev := .NetDevs }} +{{- range $tk, $tv := $netdev.Tags }} +{{- if regexMatch "^DNS[0-9]*$" $tk }} nameserver {{ $tv }} -{{ end -}} -{{ end -}} -{{ end -}} +{{- end }} +{{- end }} +{{- if $netdev.Tags.DNSSEARCH }} +search {{ join " " (without (regexSplit "[ ;]+" $netdev.Tags.DNSSEARCH -1) "") }} +{{- end }} +{{- end }} diff --git a/userdocs/contents/overlays.rst b/userdocs/contents/overlays.rst index 5b465258..ff13d4ea 100644 --- a/userdocs/contents/overlays.rst +++ b/userdocs/contents/overlays.rst @@ -110,6 +110,21 @@ configured network interfaces, typically based on a known MAC address. - systemd.netname - udev.netname +Several of the network configuration overlays support netdev tags to further +customize the interface: + +- **``DNS[0-9]*``:** one or more DNS servers +- **``DNSSEARCH``:** domain search path +- **``MASTER``:** the master for a bond interface + +NetworkManager +^^^^^^^^^^^^^^ + +- **``parent_device``:** the parent device of a vlan interface +- **``vlan_id``:** the vlan id for a vlan interface +- **``downdelay``, ``updelay``, ``miimon``, ``mode``, ``xmit_hash_policy``:** + bond device settings + Basics ------