From a844379bc50787ab318dc4aecca0709e1e82604f Mon Sep 17 00:00:00 2001 From: Jonathon Anderson Date: Wed, 4 Dec 2024 15:42:28 -0700 Subject: [PATCH] Merge --kerneloverride into --kernelversion Signed-off-by: Jonathon Anderson --- CHANGELOG.md | 4 +- etc/grub/grub.cfg.ww | 8 +- etc/ipxe/default.ipxe | 4 +- etc/ipxe/dracut.ipxe | 4 +- internal/app/wwctl/completions/completions.go | 43 +------- internal/app/wwctl/node/add/root.go | 3 - internal/app/wwctl/node/list/main_test.go | 12 +-- internal/app/wwctl/node/set/root.go | 3 - internal/app/wwctl/profile/add/root.go | 3 - internal/app/wwctl/profile/set/root.go | 3 - internal/pkg/api/node/list.go | 4 +- internal/pkg/kernel/kernel.go | 9 +- internal/pkg/kernel/kernel_test.go | 33 ++++--- internal/pkg/node/datastructure.go | 5 +- internal/pkg/upgrade/node.go | 44 ++++----- internal/pkg/upgrade/node_test.go | 10 +- internal/pkg/warewulfd/provision.go | 98 +++++++++---------- internal/pkg/warewulfd/provision_test.go | 6 +- overlays/debug/internal/debug_test.go | 5 +- .../rootfs/warewulf/template-variables.md.ww | 3 +- userdocs/contents/kernel.rst | 15 +-- 21 files changed, 130 insertions(+), 189 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 484d20b5..b94a55eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,7 +26,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Better handling of InfiniBand udev net naming. #1227 - use templating mechanism for power commands. #1004 - Document "known issues." -- Add `wwctl --kernelversion` to specify the desired kernel version. #1556 +- Add `wwctl --kernelversion` to specify the desired kernel version or path. #1556 ### Changed @@ -74,6 +74,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Bump github.com/golang/glog from 1.2.0 to 1.2.3 #1527 - Bump github.com/opencontainers/runc from 1.1.12 to 1.1.14 - Repurpose Kernel.Override to specify the path to the desired kernel within the container. #1556 +- Merge Kernel.Override into Kernel.Version to specify the desired kernel version or path. #1556 - Repurpose `wwctl kernel list` to list discovered kernels from containers. #1556 ### Removed @@ -84,6 +85,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Remove `wwctl overlay build --host` #1419 - Remove `wwctl overlay build --nodes` #1419 - Remove `wwctl kernel ` #1556 +- Remove `wwctl --kerneloverride` #1556 ### Fixed diff --git a/etc/grub/grub.cfg.ww b/etc/grub/grub.cfg.ww index 2a38c87e..ae6c39f3 100644 --- a/etc/grub/grub.cfg.ww +++ b/etc/grub/grub.cfg.ww @@ -18,8 +18,8 @@ set default={{ or .Tags.GrubMenuEntry "ww4" }} set timeout=5 menuentry "Network boot node: {{.Id}}" --id ww4 { - {{if .KernelOverride }} - echo "Kernel: {{.KernelOverride}}" + {{if .KernelVersion }} + echo "Kernel: {{.KernelVersion}}" {{else}} echo "Kernel: {{.ContainerName}} (container default)" {{end}} @@ -44,8 +44,8 @@ menuentry "Network boot node with dracut: {{.Id}}" --id dracut { wwinit_uri="http://{{.Ipaddr}}:{{.Port}}/provision/${net_default_mac}" - {{if .KernelOverride }} - echo "Kernel: {{.KernelOverride}}" + {{if .KernelVersion }} + echo "Kernel: {{.KernelVersion}}" {{else}} echo "Kernel: {{.ContainerName}} (container default)" {{end}} diff --git a/etc/ipxe/default.ipxe b/etc/ipxe/default.ipxe index 8133ea7f..9d3eb608 100644 --- a/etc/ipxe/default.ipxe +++ b/etc/ipxe/default.ipxe @@ -5,8 +5,8 @@ echo =========================================================================== echo Warewulf v4 now booting: {{.Fqdn}} ({{.Hwaddr}}) echo echo Container: {{.ContainerName}} -{{if .KernelOverride }} -echo Kernel: {{.KernelOverride}} +{{if .KernelVersion }} +echo Kernel: {{.KernelVersion}} {{else}} echo Kernel: {{.ContainerName}} (container default) {{end}} diff --git a/etc/ipxe/dracut.ipxe b/etc/ipxe/dracut.ipxe index a0af0714..2f8d3f0a 100644 --- a/etc/ipxe/dracut.ipxe +++ b/etc/ipxe/dracut.ipxe @@ -5,8 +5,8 @@ echo =========================================================================== echo Warewulf v4 now booting via dracut: {{.Fqdn}} ({{.Hwaddr}}) echo echo Container: {{.ContainerName}} -{{if .KernelOverride }} -echo Kernel: {{.KernelOverride}} +{{if .KernelVersion }} +echo Kernel: {{.KernelVersion}} {{else}} echo Kernel: {{.ContainerName}} (container default) {{end}} diff --git a/internal/app/wwctl/completions/completions.go b/internal/app/wwctl/completions/completions.go index 56f2d092..a609388f 100644 --- a/internal/app/wwctl/completions/completions.go +++ b/internal/app/wwctl/completions/completions.go @@ -8,26 +8,6 @@ import ( "github.com/warewulf/warewulf/internal/pkg/node" ) -func NodeKernelOverride(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - var kernelPaths []string - registry, err := node.New() - if err != nil { - return kernelPaths, cobra.ShellCompDirectiveNoFileComp - } - nodes := hostlist.Expand(args) - for _, id := range nodes { - if node_, err := registry.GetNode(id); err != nil { - continue - } else if node_.ContainerName != "" { - kernels := kernel.FindKernels(node_.ContainerName) - for _, kernel_ := range kernels { - kernelPaths = append(kernelPaths, kernel_.Path) - } - } - } - return kernelPaths, cobra.ShellCompDirectiveNoFileComp -} - func NodeKernelVersion(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { var kernelVersions []string registry, err := node.New() @@ -41,32 +21,13 @@ func NodeKernelVersion(cmd *cobra.Command, args []string, toComplete string) ([] } else if node_.ContainerName != "" { kernels := kernel.FindKernels(node_.ContainerName) for _, kernel_ := range kernels { - kernelVersions = append(kernelVersions, kernel_.Version()) + kernelVersions = append(kernelVersions, kernel_.Version(), kernel_.Path) } } } return kernelVersions, cobra.ShellCompDirectiveNoFileComp } -func ProfileKernelOverride(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - var kernelPaths []string - registry, err := node.New() - if err != nil { - return kernelPaths, cobra.ShellCompDirectiveNoFileComp - } - for _, id := range args { - if profile, err := registry.GetProfile(id); err != nil { - continue - } else if profile.ContainerName != "" { - kernels := kernel.FindKernels(profile.ContainerName) - for _, kernel_ := range kernels { - kernelPaths = append(kernelPaths, kernel_.Path) - } - } - } - return kernelPaths, cobra.ShellCompDirectiveNoFileComp -} - func ProfileKernelVersion(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { var kernelVersions []string registry, err := node.New() @@ -79,7 +40,7 @@ func ProfileKernelVersion(cmd *cobra.Command, args []string, toComplete string) } else if profile.ContainerName != "" { kernels := kernel.FindKernels(profile.ContainerName) for _, kernel_ := range kernels { - kernelVersions = append(kernelVersions, kernel_.Version()) + kernelVersions = append(kernelVersions, kernel_.Version(), kernel_.Path) } } } diff --git a/internal/app/wwctl/node/add/root.go b/internal/app/wwctl/node/add/root.go index 154a0f0b..543dfc80 100644 --- a/internal/app/wwctl/node/add/root.go +++ b/internal/app/wwctl/node/add/root.go @@ -38,9 +38,6 @@ func GetCommand() *cobra.Command { }); err != nil { log.Println(err) } - if err := baseCmd.RegisterFlagCompletionFunc("kerneloverride", completions.NodeKernelOverride); err != nil { - log.Println(err) - } if err := baseCmd.RegisterFlagCompletionFunc("kernelversion", completions.NodeKernelVersion); err != nil { log.Println(err) } diff --git a/internal/app/wwctl/node/list/main_test.go b/internal/app/wwctl/node/list/main_test.go index 4ff9c86a..9200a68d 100644 --- a/internal/app/wwctl/node/list/main_test.go +++ b/internal/app/wwctl/node/list/main_test.go @@ -274,9 +274,9 @@ nodes: args: []string{"-l"}, wantErr: false, stdout: ` -NODE NAME KERNEL OVERRIDE CONTAINER OVERLAYS (S/R) ---------- --------------- --------- -------------- -n01 -- -- /rop1,rop2 +NODE NAME KERNEL VERSION CONTAINER OVERLAYS (S/R) +--------- -------------- --------- -------------- +n01 -- -- /rop1,rop2 `, inDb: `nodeprofiles: p1: @@ -294,9 +294,9 @@ nodes: args: []string{"-l"}, wantErr: false, stdout: ` -NODE NAME KERNEL OVERRIDE CONTAINER OVERLAYS (S/R) ---------- --------------- --------- -------------- -n01 -- -- sop1/nop1,~rop1,rop1,rop2 +NODE NAME KERNEL VERSION CONTAINER OVERLAYS (S/R) +--------- -------------- --------- -------------- +n01 -- -- sop1/nop1,~rop1,rop1,rop2 `, inDb: `nodeprofiles: p1: diff --git a/internal/app/wwctl/node/set/root.go b/internal/app/wwctl/node/set/root.go index 2c0fda76..89e1a42c 100644 --- a/internal/app/wwctl/node/set/root.go +++ b/internal/app/wwctl/node/set/root.go @@ -54,9 +54,6 @@ func GetCommand() *cobra.Command { }); err != nil { log.Println(err) } - if err := baseCmd.RegisterFlagCompletionFunc("kerneloverride", completions.NodeKernelOverride); err != nil { - log.Println(err) - } if err := baseCmd.RegisterFlagCompletionFunc("kernelversion", completions.NodeKernelVersion); err != nil { log.Println(err) } diff --git a/internal/app/wwctl/profile/add/root.go b/internal/app/wwctl/profile/add/root.go index 8fc9b85f..795905b3 100644 --- a/internal/app/wwctl/profile/add/root.go +++ b/internal/app/wwctl/profile/add/root.go @@ -37,9 +37,6 @@ func GetCommand() *cobra.Command { }); err != nil { log.Println(err) } - if err := baseCmd.RegisterFlagCompletionFunc("kerneloverride", completions.ProfileKernelOverride); err != nil { - log.Println(err) - } if err := baseCmd.RegisterFlagCompletionFunc("kernelversion", completions.ProfileKernelVersion); err != nil { log.Println(err) } diff --git a/internal/app/wwctl/profile/set/root.go b/internal/app/wwctl/profile/set/root.go index 5af46b89..5224d8ee 100644 --- a/internal/app/wwctl/profile/set/root.go +++ b/internal/app/wwctl/profile/set/root.go @@ -59,9 +59,6 @@ func GetCommand() *cobra.Command { }); err != nil { log.Println(err) } - if err := baseCmd.RegisterFlagCompletionFunc("kerneloverride", completions.ProfileKernelOverride); err != nil { - log.Println(err) - } if err := baseCmd.RegisterFlagCompletionFunc("kernelversion", completions.ProfileKernelVersion); err != nil { log.Println(err) } diff --git a/internal/pkg/api/node/list.go b/internal/pkg/api/node/list.go index ebff47e4..3d733754 100644 --- a/internal/pkg/api/node/list.go +++ b/internal/pkg/api/node/list.go @@ -73,11 +73,11 @@ func NodeList(nodeGet *wwapiv1.GetNodeList) (nodeList wwapiv1.NodeList, err erro } } else if nodeGet.Type == wwapiv1.GetNodeList_Long { nodeList.Output = append(nodeList.Output, - fmt.Sprintf("%s:=:%s:=:%s:=:%s", "NODE NAME", "KERNEL OVERRIDE", "CONTAINER", "OVERLAYS (S/R)")) + fmt.Sprintf("%s:=:%s:=:%s:=:%s", "NODE NAME", "KERNEL VERSION", "CONTAINER", "OVERLAYS (S/R)")) for _, n := range node.FilterNodeListByName(nodes, nodeGet.Nodes) { nodeList.Output = append(nodeList.Output, fmt.Sprintf("%s:=:%s:=:%s:=:%s", n.Id(), - n.Kernel.Override, + n.Kernel.Version, n.ContainerName, strings.Join(n.SystemOverlay, ",")+"/"+strings.Join(n.RuntimeOverlay, ","))) } diff --git a/internal/pkg/kernel/kernel.go b/internal/pkg/kernel/kernel.go index 0cff27bc..038b5304 100644 --- a/internal/pkg/kernel/kernel.go +++ b/internal/pkg/kernel/kernel.go @@ -75,10 +75,13 @@ func FromNode(node *node.Node) *Kernel { wwlog.Debug("FromNode(%v)", node) if node.ContainerName == "" { return nil - } else if node.Kernel.Override != "" { - return &Kernel{ContainerName: node.ContainerName, Path: filepath.Join("/", node.Kernel.Override)} } else if node.Kernel.Version != "" { - return FindKernels(node.ContainerName).Version(node.Kernel.Version) + kernel := &Kernel{ContainerName: node.ContainerName, Path: filepath.Join("/", node.Kernel.Version)} + if util.IsFile(kernel.FullPath()) { + return kernel + } else { + return FindKernels(node.ContainerName).Version(node.Kernel.Version) + } } else { return FindKernels(node.ContainerName).Preferred() } diff --git a/internal/pkg/kernel/kernel_test.go b/internal/pkg/kernel/kernel_test.go index 5008df95..a6f0e607 100644 --- a/internal/pkg/kernel/kernel_test.go +++ b/internal/pkg/kernel/kernel_test.go @@ -111,9 +111,9 @@ func Test_FindKernel(t *testing.T) { func Test_FromNode(t *testing.T) { tests := map[string]struct { - files []string - override string - path string + files []string + version string + path string }{ "default": { files: []string{ @@ -121,22 +121,31 @@ func Test_FromNode(t *testing.T) { "/boot/vmlinuz-5.14.0-427.24.1.el9_4.x86_64", "/boot/vmlinuz-4.14.0-427.18.1.el8_4.x86_64", }, - override: "", - path: "/boot/vmlinuz-5.14.0-427.24.1.el9_4.x86_64", + version: "", + path: "/boot/vmlinuz-5.14.0-427.24.1.el9_4.x86_64", }, - "override": { + "path": { files: []string{ "/boot/vmlinuz-5.14.0-427.18.1.el9_4.x86_64", "/boot/vmlinuz-5.14.0-427.24.1.el9_4.x86_64", "/boot/vmlinuz-4.14.0-427.18.1.el8_4.x86_64", }, - override: "/boot/vmlinuz-4.14.0-427.18.1.el8_4.x86_64", - path: "/boot/vmlinuz-4.14.0-427.18.1.el8_4.x86_64", + version: "/boot/vmlinuz-4.14.0-427.18.1.el8_4.x86_64", + path: "/boot/vmlinuz-4.14.0-427.18.1.el8_4.x86_64", + }, + "version": { + files: []string{ + "/boot/vmlinuz-5.14.0-427.18.1.el9_4.x86_64", + "/boot/vmlinuz-5.14.0-427.24.1.el9_4.x86_64", + "/boot/vmlinuz-4.14.0-427.18.1.el8_4.x86_64", + }, + version: "4.14.0-427.18.1", + path: "/boot/vmlinuz-4.14.0-427.18.1.el8_4.x86_64", }, "none": { - files: []string{}, - override: "", - path: "", + files: []string{}, + version: "", + path: "", }, } for name, tt := range tests { @@ -149,7 +158,7 @@ func Test_FromNode(t *testing.T) { } node := node.EmptyNode() node.ContainerName = "testcontainer" - node.Kernel.Override = tt.override + node.Kernel.Version = tt.version kernel := FromNode(&node) if tt.path == "" { assert.Nil(t, kernel) diff --git a/internal/pkg/node/datastructure.go b/internal/pkg/node/datastructure.go index e518ea04..e3a08bb6 100644 --- a/internal/pkg/node/datastructure.go +++ b/internal/pkg/node/datastructure.go @@ -70,9 +70,8 @@ type IpmiConf struct { } type KernelConf struct { - Version string `yaml:"version,omitempty" lopt:"kernelversion" comment:"Set kernel version" json:"version,omitempty"` - Override string `yaml:"override,omitempty" lopt:"kerneloverride" sopt:"K" comment:"Set kernel override path" json:"override,omitempty"` - Args string `yaml:"args,omitempty" lopt:"kernelargs" sopt:"A" comment:"Set kernel arguments" json:"args,omitempty"` + Version string `yaml:"version,omitempty" lopt:"kernelversion" comment:"Set kernel version" json:"version,omitempty"` + Args string `yaml:"args,omitempty" lopt:"kernelargs" sopt:"A" comment:"Set kernel arguments" json:"args,omitempty"` } type NetDev struct { diff --git a/internal/pkg/upgrade/node.go b/internal/pkg/upgrade/node.go index aaea858a..a8fdb7d1 100644 --- a/internal/pkg/upgrade/node.go +++ b/internal/pkg/upgrade/node.go @@ -165,16 +165,12 @@ func (this *Node) Upgrade(addDefaults bool, replaceOverlays bool) (upgraded *nod if this.Kernel != nil { upgraded.Kernel = this.Kernel.Upgrade(this.ContainerName) } else { - upgraded.Kernel = new(node.KernelConf) - } - if upgraded.Kernel.Args == "" { - upgraded.Kernel.Args = this.KernelArgs - } - if upgraded.Kernel.Override == "" { - upgraded.Kernel.Override = this.KernelOverride - } - if upgraded.Kernel.Version == "" { - upgraded.Kernel.Version = this.KernelVersion + inlineKernel := &KernelConf{ + Args: this.KernelArgs, + Version: this.KernelVersion, + Override: this.KernelOverride, + } + upgraded.Kernel = inlineKernel.Upgrade(this.ContainerName) } if this.Keys != nil { for key, value := range this.Keys { @@ -358,16 +354,12 @@ func (this *Profile) Upgrade(addDefaults bool, replaceOverlays bool) (upgraded * if this.Kernel != nil { upgraded.Kernel = this.Kernel.Upgrade(this.ContainerName) } else { - upgraded.Kernel = new(node.KernelConf) - } - if upgraded.Kernel.Args == "" { - upgraded.Kernel.Args = this.KernelArgs - } - if upgraded.Kernel.Override == "" { - upgraded.Kernel.Override = this.KernelOverride - } - if upgraded.Kernel.Version == "" { - upgraded.Kernel.Version = this.KernelVersion + inlineKernel := &KernelConf{ + Args: this.KernelArgs, + Version: this.KernelVersion, + Override: this.KernelOverride, + } + upgraded.Kernel = inlineKernel.Upgrade(this.ContainerName) } if this.Keys != nil { for key, value := range this.Keys { @@ -500,14 +492,14 @@ func (this *KernelConf) Upgrade(containerName string) (upgraded *node.KernelConf for _, kernel_ := range kernels { wwlog.Debug("checking if kernel '%v' version '%v' from container '%v' matches override '%v'", kernel_, kernel_.Version(), containerName, this.Override) if kernel_.Version() == version.String() { - upgraded.Override = kernel_.Path - wwlog.Info("kernel override %v -> %v (container %v)", this.Override, upgraded.Override, containerName) + upgraded.Version = kernel_.Path + wwlog.Info("kernel override %v -> version %v (container %v)", this.Override, upgraded.Version, containerName) } } } else if util.IsFile((&kernel.Kernel{ContainerName: containerName, Path: this.Override}).FullPath()) { - upgraded.Override = this.Override + upgraded.Version = this.Override } - if upgraded.Override == "" { + if upgraded.Version == "" { containerDisplay := "unknown" if containerName != "" { containerDisplay = containerName @@ -515,7 +507,9 @@ func (this *KernelConf) Upgrade(containerName string) (upgraded *node.KernelConf wwlog.Warn("unable to resolve kernel override %v (container %v)", this.Override, containerDisplay) } } - upgraded.Version = this.Version + if upgraded.Version == "" { + upgraded.Version = this.Version + } return } diff --git a/internal/pkg/upgrade/node_test.go b/internal/pkg/upgrade/node_test.go index 8630834d..cb4bd486 100644 --- a/internal/pkg/upgrade/node_test.go +++ b/internal/pkg/upgrade/node_test.go @@ -244,13 +244,11 @@ nodeprofiles: default: kernel: version: "2.6" - override: rockylinux-9 args: quiet nodes: n1: kernel: version: "2.6" - override: rockylinux-9 args: quiet `, }, @@ -711,12 +709,12 @@ nodeprofiles: default: container name: mycontainer kernel: - override: /boot/vmlinuz-1.2.3 + version: /boot/vmlinuz-1.2.3 nodes: n1: container name: mycontainer kernel: - override: /boot/vmlinuz-1.2.3 + version: /boot/vmlinuz-1.2.3 `, }, { @@ -744,12 +742,12 @@ nodeprofiles: default: container name: mycontainer kernel: - override: /boot/vmlinuz-1.2.3 + version: /boot/vmlinuz-1.2.3 nodes: n1: container name: mycontainer kernel: - override: /boot/vmlinuz-1.2.3 + version: /boot/vmlinuz-1.2.3 `, }, } diff --git a/internal/pkg/warewulfd/provision.go b/internal/pkg/warewulfd/provision.go index db5ce823..5f520af3 100644 --- a/internal/pkg/warewulfd/provision.go +++ b/internal/pkg/warewulfd/provision.go @@ -22,20 +22,20 @@ import ( ) type templateVars struct { - Message string - WaitTime string - Hostname string - Fqdn string - Id string - Cluster string - ContainerName string - Hwaddr string - Ipaddr string - Port string - KernelArgs string - KernelOverride string - Tags map[string]string - NetDevs map[string]*node.NetDev + Message string + WaitTime string + Hostname string + Fqdn string + Id string + Cluster string + ContainerName string + Hwaddr string + Ipaddr string + Port string + KernelArgs string + KernelVersion string + Tags map[string]string + NetDevs map[string]*node.NetDev } func ProvisionSend(w http.ResponseWriter, req *http.Request) { @@ -99,18 +99,18 @@ func ProvisionSend(w http.ResponseWriter, req *http.Request) { } else if rinfo.stage == "ipxe" { stage_file = path.Join(conf.Paths.Sysconfdir, "warewulf/ipxe/"+remoteNode.Ipxe+".ipxe") tmpl_data = &templateVars{ - Id: remoteNode.Id(), - Cluster: remoteNode.ClusterName, - Fqdn: remoteNode.Id(), - Ipaddr: conf.Ipaddr, - Port: strconv.Itoa(conf.Warewulf.Port), - Hostname: remoteNode.Id(), - Hwaddr: rinfo.hwaddr, - ContainerName: remoteNode.ContainerName, - KernelArgs: remoteNode.Kernel.Args, - KernelOverride: remoteNode.Kernel.Override, - NetDevs: remoteNode.NetDevs, - Tags: remoteNode.Tags} + Id: remoteNode.Id(), + Cluster: remoteNode.ClusterName, + Fqdn: remoteNode.Id(), + Ipaddr: conf.Ipaddr, + Port: strconv.Itoa(conf.Warewulf.Port), + Hostname: remoteNode.Id(), + Hwaddr: rinfo.hwaddr, + ContainerName: remoteNode.ContainerName, + KernelArgs: remoteNode.Kernel.Args, + KernelVersion: remoteNode.Kernel.Version, + NetDevs: remoteNode.NetDevs, + Tags: remoteNode.Tags} } else if rinfo.stage == "kernel" { kernel_ := kernel.FromNode(&remoteNode) if kernel_ == nil { @@ -175,18 +175,18 @@ func ProvisionSend(w http.ResponseWriter, req *http.Request) { case "grub.cfg": stage_file = path.Join(conf.Paths.Sysconfdir, "warewulf/grub/grub.cfg.ww") tmpl_data = &templateVars{ - Id: remoteNode.Id(), - Cluster: remoteNode.ClusterName, - Fqdn: remoteNode.Id(), - Ipaddr: conf.Ipaddr, - Port: strconv.Itoa(conf.Warewulf.Port), - Hostname: remoteNode.Id(), - Hwaddr: rinfo.hwaddr, - ContainerName: remoteNode.ContainerName, - KernelArgs: remoteNode.Kernel.Args, - KernelOverride: remoteNode.Kernel.Override, - NetDevs: remoteNode.NetDevs, - Tags: remoteNode.Tags} + Id: remoteNode.Id(), + Cluster: remoteNode.ClusterName, + Fqdn: remoteNode.Id(), + Ipaddr: conf.Ipaddr, + Port: strconv.Itoa(conf.Warewulf.Port), + Hostname: remoteNode.Id(), + Hwaddr: rinfo.hwaddr, + ContainerName: remoteNode.ContainerName, + KernelArgs: remoteNode.Kernel.Args, + KernelVersion: remoteNode.Kernel.Version, + NetDevs: remoteNode.NetDevs, + Tags: remoteNode.Tags} if stage_file == "" { wwlog.Error("could't find grub.cfg template for %s", containerName) w.WriteHeader(http.StatusNotFound) @@ -215,22 +215,18 @@ func ProvisionSend(w http.ResponseWriter, req *http.Request) { wwlog.Warn("No conainer set for node %s", remoteNode.Id()) } } else if rinfo.stage == "initramfs" { - kver := remoteNode.Kernel.Version - if kver == "" || remoteNode.Kernel.Override != "" { - kernel_ := kernel.FromNode(&remoteNode) - if kernel_ != nil { - kver = kernel_.Version() - } - } - if kver != "" { - initramfs := container.FindInitramfs(remoteNode.ContainerName, kver) - if initramfs == nil { - wwlog.Error("No initramfs found for kernel %s in container %s", kver, remoteNode.ContainerName) + if kernel_ := kernel.FromNode(&remoteNode); kernel_ != nil { + if kver := kernel_.Version(); kver != "" { + if initramfs := container.FindInitramfs(remoteNode.ContainerName, kver); initramfs != nil { + stage_file = initramfs.FullPath() + } else { + wwlog.Error("No initramfs found for kernel %s in container %s", kver, remoteNode.ContainerName) + } } else { - stage_file = initramfs.FullPath() + wwlog.Error("No initramfs found: unable to determine kernel version for node %s", remoteNode.Id()) } } else { - wwlog.Error("No initramfs found: unable to determine kernel version for node %s", remoteNode.Id()) + wwlog.Error("No initramfs found: unable to find kernel for node %s", remoteNode.Id()) } } diff --git a/internal/pkg/warewulfd/provision_test.go b/internal/pkg/warewulfd/provision_test.go index 9c679aa7..a8867e7b 100644 --- a/internal/pkg/warewulfd/provision_test.go +++ b/internal/pkg/warewulfd/provision_test.go @@ -31,7 +31,7 @@ var provisionSendTests = []struct { {"find grub", "/efiboot/grub.efi", "", 200, "10.10.10.10:9873"}, {"find grub", "/efiboot/grub.efi", "", 404, "10.10.10.11:9873"}, {"find initramfs", "/provision/00:00:00:ff:ff:ff?stage=initramfs", "", 200, "10.10.10.10:9873"}, - {"ipxe test with NetDevs and KernelOverrides", "/provision/00:00:00:00:00:ff?stage=ipxe", "1.1.1 ifname=net:00:00:00:00:00:ff ", 200, "10.10.10.12:9873"}, + {"ipxe test with NetDevs and KernelVersion", "/provision/00:00:00:00:00:ff?stage=ipxe", "1.1.1 ifname=net:00:00:00:00:00:ff ", 200, "10.10.10.12:9873"}, {"find grub.cfg", "/efiboot/grub.cfg", "dracut", 200, "10.10.10.11:9873"}, } @@ -63,7 +63,7 @@ nodes: device: net ipxe template: test kernel: - override: 1.1.1`) + version: 1.1.1`) // create a arp file as for grub we look up the ip address through the arp cache env.WriteFile(t, "/var/tmp/arpcache", `IP address HW type Flags HW address Mask Device @@ -79,7 +79,7 @@ nodes: env.CreateFile(t, "/var/lib/warewulf/chroots/suse/rootfs/usr/lib64/efi/shim.efi") env.CreateFile(t, "/var/lib/warewulf/chroots/suse/rootfs/usr/share/efi/x86_64/grub.efi") env.CreateFile(t, "/var/lib/warewulf/chroots/suse/rootfs/boot/initramfs-1.1.0.img") - env.WriteFile(t, "/etc/warewulf/ipxe/test.ipxe", "{{.KernelOverride}}{{range $devname, $netdev := .NetDevs}}{{if and $netdev.Hwaddr $netdev.Device}} ifname={{$netdev.Device}}:{{$netdev.Hwaddr}} {{end}}{{end}}") + env.WriteFile(t, "/etc/warewulf/ipxe/test.ipxe", "{{.KernelVersion}}{{range $devname, $netdev := .NetDevs}}{{if and $netdev.Hwaddr $netdev.Device}} ifname={{$netdev.Device}}:{{$netdev.Hwaddr}} {{end}}{{end}}") env.WriteFile(t, "/etc/warewulf/grub/grub.cfg.ww", "{{ .Tags.GrubMenuEntry }}") dbErr := LoadNodeDB() diff --git a/overlays/debug/internal/debug_test.go b/overlays/debug/internal/debug_test.go index 046bb48b..f7a90688 100644 --- a/overlays/debug/internal/debug_test.go +++ b/overlays/debug/internal/debug_test.go @@ -87,7 +87,6 @@ data from other structures. - Tags: - Kernel: - Version: - - Override: - Args: quiet crashkernel=no vga=791 net.naming-scheme=v238 - Ipmi: - UserName: user @@ -198,7 +197,7 @@ data from other structures. - Profiles: [default] - Tags: - Kernel - - Override: + - Version: - Args: quiet crashkernel=no vga=791 net.naming-scheme=v238 - Ipmi: - Ipaddr: 192.168.4.21 @@ -253,7 +252,7 @@ data from other structures. - Profiles: [default] - Tags: - Kernel - - Override: + - Version: - Args: quiet crashkernel=no vga=791 net.naming-scheme=v238 - Ipmi: - Ipaddr: diff --git a/overlays/debug/rootfs/warewulf/template-variables.md.ww b/overlays/debug/rootfs/warewulf/template-variables.md.ww index 92fb14d6..2f1d4b81 100644 --- a/overlays/debug/rootfs/warewulf/template-variables.md.ww +++ b/overlays/debug/rootfs/warewulf/template-variables.md.ww @@ -29,7 +29,6 @@ data from other structures. - Tags: {{ range $key, $value := .Tags }}{{ $key }}={{ $value }} {{ end }} - Kernel: - Version: {{ .Kernel.Version }} - - Override: {{ .Kernel.Override }} - Args: {{ .Kernel.Args }} - Ipmi: - UserName: {{ .Ipmi.UserName }} @@ -139,7 +138,7 @@ data from other structures. - Profiles: {{ $node.Profiles }} - Tags: {{ range $key, $value := $node.Tags }}{{ $key }}={{ $value }} {{ end }} - Kernel - - Override: {{ $node.Kernel.Override }} + - Version: {{ $node.Kernel.Version }} - Args: {{ $node.Kernel.Args }} - Ipmi: - Ipaddr: {{ $node.Ipmi.Ipaddr }} diff --git a/userdocs/contents/kernel.rst b/userdocs/contents/kernel.rst index 46a4b47f..2545b875 100644 --- a/userdocs/contents/kernel.rst +++ b/userdocs/contents/kernel.rst @@ -22,20 +22,13 @@ You can see what kernels are available in imported containers by using the rocky-9.3 /lib/modules/5.14.0-362.13.1.el9_3.aarch64/vmlinuz 5.14.0-362.13.1 true 0 rockylinux-9-custom /lib/modules/5.14.0-427.40.1.el9_4.aarch64/vmlinuz 5.14.0-427.40.1 true 0 -Kernel Version and Override -=========================== +Kernel Version +============== If a container includes multiple kernels, the desired kernel may be selected by -specifying the desired version or an explicit override. - -``--kernelversion`` specifies the desired kernel version. +specifying the desired version or an explicit path. .. code-block:: console # wwctl node set n1 --kernelversion=4.18.0-372.13.1 - -``--kerneloverride`` specifies the full path to the desired kernel. - -.. code-block:: console - - # wwctl node set n1 --kerneloverride=/boot/vmlinuz-4.18.0-372.13.1.el8_6.x86_64 + # wwctl node set n1 --kernelversion=/boot/vmlinuz-4.18.0-372.13.1.el8_6.x86_64