Merge --kerneloverride into --kernelversion

Signed-off-by: Jonathon Anderson <janderson@ciq.com>
This commit is contained in:
Jonathon Anderson
2024-12-04 15:42:28 -07:00
committed by Christian Goll
parent 8f21d54243
commit a844379bc5
21 changed files with 130 additions and 189 deletions

View File

@@ -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)
}
}
}

View File

@@ -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)
}

View File

@@ -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:

View File

@@ -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)
}

View File

@@ -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)
}

View File

@@ -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)
}

View File

@@ -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, ",")))
}

View File

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

View File

@@ -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)

View File

@@ -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 {

View File

@@ -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
}

View File

@@ -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
`,
},
}

View File

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

View File

@@ -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()