fixes for split overlays

Signed-off-by: Christian Goll <cgoll@suse.com>
This commit is contained in:
Christian Goll
2024-10-07 12:04:28 +02:00
committed by Jonathon Anderson
parent c08cd82e68
commit 0c6e7cc58a
39 changed files with 792 additions and 415 deletions

View File

@@ -12,7 +12,6 @@ import (
"github.com/warewulf/warewulf/internal/pkg/api/routes/wwapiv1"
apiutil "github.com/warewulf/warewulf/internal/pkg/api/util"
"github.com/warewulf/warewulf/internal/pkg/node"
"github.com/warewulf/warewulf/internal/pkg/wwlog"
"gopkg.in/yaml.v3"
)

View File

@@ -18,14 +18,16 @@ import (
func Test_List(t *testing.T) {
tests := []struct {
name string
args []string
stdout string
inDb string
name string
args []string
wantErr bool
stdout string
inDb string
}{
{
name: "single node list",
args: []string{},
name: "single node list",
args: []string{},
wantErr: false,
stdout: ` NODE NAME PROFILES NETWORK
n01 [default]
`,
@@ -39,8 +41,9 @@ nodes:
`,
},
{
name: "multiple nodes list",
args: []string{},
name: "multiple nodes list",
args: []string{},
wantErr: false,
stdout: ` NODE NAME PROFILES NETWORK
n01 [default]
n02 [default]
@@ -58,8 +61,9 @@ nodes:
`,
},
{
name: "node list returns multiple nodes",
args: []string{"n01,n02"},
name: "node list returns multiple nodes",
args: []string{"n01,n02"},
wantErr: false,
stdout: ` NODE NAME PROFILES NETWORK
n01 [default]
n02 [default]
@@ -77,8 +81,9 @@ nodes:
`,
},
{
name: "node list returns multiple nodes (case 2)",
args: []string{"n01,n03"},
name: "node list returns multiple nodes (case 2)",
args: []string{"n01,n03"},
wantErr: false,
stdout: ` NODE NAME PROFILES NETWORK
n01 [default]
n03 [default]
@@ -105,8 +110,9 @@ nodes:
`,
},
{
name: "node list returns one node",
args: []string{"n01,"},
name: "node list returns one node",
args: []string{"n01,"},
wantErr: false,
stdout: ` NODE NAME PROFILES NETWORK
n01 [default]
`,
@@ -123,8 +129,9 @@ nodes:
`,
},
{
name: "node list profile with network",
args: []string{},
name: "node list profile with network",
args: []string{},
wantErr: false,
stdout: ` NODE NAME PROFILES NETWORK
n01 [default] default
`,
@@ -140,18 +147,12 @@ nodes:
- default
`},
{
name: "node list profile with comment",
args: []string{"-a"},
name: "node list profile with comment",
args: []string{"-a"},
wantErr: false,
stdout: `NODE FIELD PROFILE VALUE
n01 Id -- n01
n01 Comment default profilecomment
n01 Ipxe -- (default)
n01 RuntimeOverlay -- (hosts,ssh.authorized_keys,syncuser)
n01 SystemOverlay -- (wwinit,wwclient,fstab,hostname,ssh.host_keys,issue,resolv,udev.netname,systemd.netname,ifcfg,NetworkManager,debian.interfaces,wicked,ignition)
n01 Root -- (initramfs)
n01 Init -- (/sbin/init)
n01 Kernel.Args -- (quiet crashkernel=no vga=791 net.naming-scheme=v238)
n01 Profiles -- default
n01 Profiles default
`,
inDb: `WW_INTERNAL: 45
nodeprofiles:
@@ -163,18 +164,12 @@ nodes:
- default
`},
{
name: "node list profile with comment superseded",
args: []string{"-a"},
name: "node list profile with comment superseded",
args: []string{"-a"},
wantErr: false,
stdout: `NODE FIELD PROFILE VALUE
n01 Id -- n01
n01 Comment SUPERSEDED nodecomment
n01 Ipxe -- (default)
n01 RuntimeOverlay -- (hosts,ssh.authorized_keys,syncuser)
n01 SystemOverlay -- (wwinit,wwclient,fstab,hostname,ssh.host_keys,issue,resolv,udev.netname,systemd.netname,ifcfg,NetworkManager,debian.interfaces,wicked,ignition)
n01 Root -- (initramfs)
n01 Init -- (/sbin/init)
n01 Kernel.Args -- (quiet crashkernel=no vga=791 net.naming-scheme=v238)
n01 Profiles -- default
n01 Profiles default
`,
inDb: `WW_INTERNAL: 45
nodeprofiles:
@@ -187,8 +182,9 @@ nodes:
- default
`},
{
name: "node list profile with ipmi user",
args: []string{"-i"},
name: "node list profile with ipmi user",
args: []string{"-i"},
wantErr: false,
stdout: `NODE IPMIIPADDR IPMIPORT IPMIUSERNAME IPMIINTERFACE
n01 <nil> admin
`,
@@ -203,8 +199,9 @@ nodes:
- default
`},
{
name: "node list profile with ipmi user superseded",
args: []string{"-i"},
name: "node list profile with ipmi user superseded",
args: []string{"-i"},
wantErr: false,
stdout: `NODE IPMIIPADDR IPMIPORT IPMIUSERNAME IPMIINTERFACE
n01 <nil> user
`,
@@ -231,8 +228,9 @@ nodes:
- p1
- p2
`,
name: "multiple profiles list",
args: []string{},
name: "multiple profiles list",
args: []string{},
wantErr: false,
stdout: ` NODE NAME PROFILES NETWORK
n01 [p1 p2]
`},
@@ -247,17 +245,11 @@ nodes:
- p1
- p2
`,
name: "multiple profiles list all",
args: []string{"-a"},
name: "multiple profiles list all",
args: []string{"-a"},
wantErr: false,
stdout: `NODE FIELD PROFILE VALUE
n01 Id -- n01
n01 Ipxe -- (default)
n01 RuntimeOverlay -- (hosts,ssh.authorized_keys,syncuser)
n01 SystemOverlay -- (wwinit,wwclient,fstab,hostname,ssh.host_keys,issue,resolv,udev.netname,systemd.netname,ifcfg,NetworkManager,debian.interfaces,wicked,ignition)
n01 Root -- (initramfs)
n01 Init -- (/sbin/init)
n01 Kernel.Args -- (quiet crashkernel=no vga=791 net.naming-scheme=v238)
n01 Profiles -- p1,p2
n01 Profiles p1,p2
`},
{
inDb: `WW_INTERNAL: 45
@@ -271,10 +263,11 @@ nodes:
profiles:
- p1
`,
name: "multiple overlays list",
args: []string{"-l"},
name: "multiple overlays list",
args: []string{"-l"},
wantErr: false,
stdout: `NODE NAME KERNEL OVERRIDE CONTAINER OVERLAYS (S/R)
n01 -- -- (wwinit,wwclient,fstab,hostname,ssh.host_keys,issue,resolv,udev.netname,systemd.netname,ifcfg,NetworkManager,debian.interfaces,wicked,ignition)/rop1,rop2
n01 /rop1,rop2
`},
{
inDb: `WW_INTERNAL: 45
@@ -293,10 +286,11 @@ nodes:
- nop1
- ~rop1
`,
name: "multiple overlays list",
args: []string{"-l"},
name: "multiple overlays list",
args: []string{"-l"},
wantErr: false,
stdout: `NODE NAME KERNEL OVERRIDE CONTAINER OVERLAYS (S/R)
n01 -- -- sop1/rop2,nop1 ~{rop1}
n01 sop1/nop1,~rop1,rop1,rop2
`},
{
inDb: `WW_INTERNAL: 45
@@ -315,17 +309,11 @@ nodes:
- nop1
- ~rop1
`,
name: "multiple overlays list all",
args: []string{"-a"},
name: "multiple overlays list all",
args: []string{"-a"},
wantErr: false,
stdout: `NODE FIELD PROFILE VALUE
n01 Id -- n01
n01 Ipxe -- (default)
n01 RuntimeOverlay SUPERSEDED rop2,nop1 ~{rop1}
n01 SystemOverlay p1 sop1
n01 Root -- (initramfs)
n01 Init -- (/sbin/init)
n01 Kernel.Args -- (quiet crashkernel=no vga=791 net.naming-scheme=v238)
n01 Profiles -- p1
n01 Profiles p1
`},
{
inDb: `WW_INTERNAL: 45
@@ -341,17 +329,12 @@ nodes:
runtime overlay:
- nop1
`,
name: "multiple overlays list all",
args: []string{"-a"},
name: "multiple overlays list all",
args: []string{"-a"},
wantErr: false,
stdout: `NODE FIELD PROFILE VALUE
n01 Id -- n01
n01 Ipxe -- (default)
n01 RuntimeOverlay -- (hosts,ssh.authorized_keys,syncuser)
n01 SystemOverlay SUPERSEDED profileinit,nodeinit
n01 Root -- (initramfs)
n01 Init -- (/sbin/init)
n01 Kernel.Args -- (quiet crashkernel=no vga=791 net.naming-scheme=v238)
n01 Profiles -- p1
n01 Profiles p1
n01 RuntimeOverlay p1+nop1,rop1,rop2
`},
}
@@ -477,36 +460,15 @@ nodes:
baseCmd.SetArgs(tt.args)
baseCmd.SetOut(buf)
baseCmd.SetErr(buf)
wwlog.SetLogWriter(buf)
err := baseCmd.Execute()
assert.NoError(t, err)
for _, expected_output := range tt.output {
assert.Equal(t, expected_output, buf.String())
err = baseCmd.Execute()
if tt.wantErr {
assert.Error(t, err)
} else {
assert.NoError(t, err)
}
assert.Contains(t,
strings.Join(strings.Fields(tt.stdout), ""),
strings.Join(strings.Fields(buf.String()), ""))
})
}
}
func verifyOutput(t *testing.T, baseCmd *cobra.Command, content string) {
stdoutR, stdoutW, _ := os.Pipe()
os.Stdout = stdoutW
wwlog.SetLogWriter(os.Stdout)
baseCmd.SetOut(os.Stdout)
baseCmd.SetErr(os.Stdout)
err := baseCmd.Execute()
assert.NoError(t, err)
strip, _ := regexp.Compile("(?m)(^ *| *$)")
stdoutC := make(chan string)
go func() {
var buf bytes.Buffer
_, _ = io.Copy(&buf, stdoutR)
stdoutC <- buf.String()
}()
stdoutW.Close()
stdout := <-stdoutC
assert.NotEmpty(t, stdout, "output should not be empty")
assert.Equal(t, strip.ReplaceAllString(content, ""), strip.ReplaceAllString(stdout, ""))
}