Move wwctl kernel list to wwctl container kernels

Signed-off-by: Jonathon Anderson <janderson@ciq.com>
This commit is contained in:
Jonathon Anderson
2024-12-04 17:45:32 -07:00
committed by Christian Goll
parent 098c288ce2
commit 6f4d33b19e
9 changed files with 59 additions and 44 deletions

View File

@@ -0,0 +1,60 @@
package kernels
import (
"strconv"
"github.com/spf13/cobra"
"github.com/warewulf/warewulf/internal/app/wwctl/table"
"github.com/warewulf/warewulf/internal/pkg/container"
"github.com/warewulf/warewulf/internal/pkg/kernel"
"github.com/warewulf/warewulf/internal/pkg/node"
)
func CobraRunE(cmd *cobra.Command, args []string) error {
nodesYaml, err := node.New()
if err != nil {
return err
}
nodes, err := nodesYaml.FindAllNodes()
if err != nil {
return err
}
kernelNodes := make(map[kernel.Kernel]int)
for _, node := range nodes {
kernel_ := kernel.FromNode(&node)
if kernel_ != nil {
kernelNodes[*kernel_]++
}
}
var sources []string
if len(args) == 0 {
if sources_, err := container.ListSources(); err == nil {
sources = sources_
} else {
return err
}
} else {
sources = args
}
t := table.New(cmd.OutOrStdout())
t.AddHeader("Container", "Kernel", "Version", "Preferred", "Nodes")
for _, source := range sources {
containerKernels := kernel.FindKernels(source)
preferredKernel := containerKernels.Preferred()
for _, kernel_ := range containerKernels {
preferred := preferredKernel != nil && preferredKernel == kernel_
preferredStr := strconv.FormatBool(preferred)
nodeCount := kernelNodes[*kernel_]
if preferred {
nodeCount = nodeCount + kernelNodes[kernel.Kernel{ContainerName: source, Path: ""}]
}
t.AddLine(table.Prep([]string{source, kernel_.Path, kernel_.Version(), preferredStr, strconv.Itoa(nodeCount)})...)
}
}
t.Print()
return nil
}

View File

@@ -0,0 +1,106 @@
package kernels
import (
"bytes"
"path/filepath"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/warewulf/warewulf/internal/pkg/testenv"
"github.com/warewulf/warewulf/internal/pkg/wwlog"
)
func Test_List(t *testing.T) {
tests := map[string]struct {
files map[string][]string
args []string
stdout string
}{
"default": {
files: map[string][]string{},
args: []string{},
stdout: `
Container Kernel Version Preferred Nodes
--------- ------ ------- --------- -----
`,
},
"list": {
files: map[string][]string{
"container1": []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",
},
"container2": []string{
"/boot/vmlinuz-0-rescue-eb46964329b146e39518c625feab3ea0",
"/boot/vmlinuz-5.14.0-362.24.1.el9_3.aarch64",
"/boot/vmlinuz-5.14.0-427.31.1.el9_4.aarch64+debug",
"/boot/vmlinuz-5.14.0-284.30.1.el9_2.aarch64",
"/boot/vmlinuz-5.14.0-427.31.1.el9_4.aarch64",
},
},
args: []string{},
stdout: `
Container Kernel Version Preferred Nodes
--------- ------ ------- --------- -----
container1 /boot/vmlinuz-4.14.0-427.18.1.el8_4.x86_64 4.14.0-427.18.1 false 0
container1 /boot/vmlinuz-5.14.0-427.18.1.el9_4.x86_64 5.14.0-427.18.1 false 0
container1 /boot/vmlinuz-5.14.0-427.24.1.el9_4.x86_64 5.14.0-427.24.1 true 0
container2 /boot/vmlinuz-0-rescue-eb46964329b146e39518c625feab3ea0 -- false 0
container2 /boot/vmlinuz-5.14.0-284.30.1.el9_2.aarch64 5.14.0-284.30.1 false 0
container2 /boot/vmlinuz-5.14.0-362.24.1.el9_3.aarch64 5.14.0-362.24.1 false 0
container2 /boot/vmlinuz-5.14.0-427.31.1.el9_4.aarch64 5.14.0-427.31.1 true 0
container2 /boot/vmlinuz-5.14.0-427.31.1.el9_4.aarch64+debug 5.14.0-427.31.1 false 0
`,
},
"single container": {
files: map[string][]string{
"container1": []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",
},
"container2": []string{
"/boot/vmlinuz-0-rescue-eb46964329b146e39518c625feab3ea0",
"/boot/vmlinuz-5.14.0-362.24.1.el9_3.aarch64",
"/boot/vmlinuz-5.14.0-427.31.1.el9_4.aarch64+debug",
"/boot/vmlinuz-5.14.0-284.30.1.el9_2.aarch64",
"/boot/vmlinuz-5.14.0-427.31.1.el9_4.aarch64",
},
},
args: []string{"container2"},
stdout: `
Container Kernel Version Preferred Nodes
--------- ------ ------- --------- -----
container2 /boot/vmlinuz-0-rescue-eb46964329b146e39518c625feab3ea0 -- false 0
container2 /boot/vmlinuz-5.14.0-284.30.1.el9_2.aarch64 5.14.0-284.30.1 false 0
container2 /boot/vmlinuz-5.14.0-362.24.1.el9_3.aarch64 5.14.0-362.24.1 false 0
container2 /boot/vmlinuz-5.14.0-427.31.1.el9_4.aarch64 5.14.0-427.31.1 true 0
container2 /boot/vmlinuz-5.14.0-427.31.1.el9_4.aarch64+debug 5.14.0-427.31.1 false 0
`,
},
}
for name, tt := range tests {
t.Run(name, func(t *testing.T) {
env := testenv.New(t)
defer env.RemoveAll(t)
for container, files := range tt.files {
rootfs := filepath.Join(filepath.Join("/var/lib/warewulf/chroots", container), "rootfs")
for _, file := range files {
env.CreateFile(t, filepath.Join(rootfs, file))
}
}
buf := new(bytes.Buffer)
baseCmd := GetCommand()
baseCmd.SetArgs(tt.args)
baseCmd.SetOut(buf)
baseCmd.SetErr(buf)
wwlog.SetLogWriter(buf)
err := baseCmd.Execute()
assert.NoError(t, err)
assert.Equal(t, strings.TrimSpace(tt.stdout), strings.TrimSpace(buf.String()))
})
}
}

View File

@@ -0,0 +1,24 @@
package kernels
import (
"github.com/spf13/cobra"
"github.com/warewulf/warewulf/internal/app/wwctl/completions"
)
var (
baseCmd = &cobra.Command{
DisableFlagsInUseLine: true,
Use: "kernels [OPTIONS]",
Short: "List available container kernels",
Long: "This command lists the kernels that are available in the imported containers.",
RunE: CobraRunE,
Aliases: []string{"kernel"},
ValidArgsFunction: completions.Containers,
}
)
// GetRootCommand returns the root cobra.Command for the application.
func GetCommand() *cobra.Command {
return baseCmd
}

View File

@@ -7,6 +7,7 @@ import (
"github.com/warewulf/warewulf/internal/app/wwctl/container/delete"
"github.com/warewulf/warewulf/internal/app/wwctl/container/exec"
"github.com/warewulf/warewulf/internal/app/wwctl/container/imprt"
"github.com/warewulf/warewulf/internal/app/wwctl/container/kernels"
"github.com/warewulf/warewulf/internal/app/wwctl/container/list"
"github.com/warewulf/warewulf/internal/app/wwctl/container/rename"
"github.com/warewulf/warewulf/internal/app/wwctl/container/shell"
@@ -35,6 +36,7 @@ func init() {
baseCmd.AddCommand(syncuser.GetCommand())
baseCmd.AddCommand(copy.GetCommand())
baseCmd.AddCommand(rename.GetCommand())
baseCmd.AddCommand(kernels.GetCommand())
}
// GetRootCommand returns the root cobra.Command for the application.