Merge --kerneloverride into --kernelversion
Signed-off-by: Jonathon Anderson <janderson@ciq.com>
This commit is contained in:
committed by
Christian Goll
parent
8f21d54243
commit
a844379bc5
@@ -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 <node|profile> <add|set> --kernelversion` to specify the desired kernel version. #1556
|
||||
- Add `wwctl <node|profile> <add|set> --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 <import|delete>` #1556
|
||||
- Remove `wwctl <node|profile> <add|set> --kerneloverride` #1556
|
||||
|
||||
### Fixed
|
||||
|
||||
|
||||
@@ -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}}
|
||||
|
||||
@@ -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}}
|
||||
|
||||
@@ -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}}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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, ",")))
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
`,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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: <nil>
|
||||
|
||||
@@ -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 }}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user