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

@@ -4,6 +4,7 @@ import (
"bytes"
"strings"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/warewulf/warewulf/internal/pkg/api/routes/wwapiv1"
@@ -12,7 +13,7 @@ import (
"github.com/warewulf/warewulf/internal/pkg/wwlog"
)
func Test_List_Args(t *testing.T) {
func Test_List(t *testing.T) {
tests := []struct {
name string
args []string
@@ -60,30 +61,14 @@ nodes:
buf := new(bytes.Buffer)
baseCmd := GetCommand()
baseCmd.SetArgs(tt.args)
stdoutR, stdoutW, _ := os.Pipe()
os.Stdout = stdoutW
wwlog.SetLogWriter(os.Stdout)
baseCmd.SetOut(os.Stdout)
baseCmd.SetErr(os.Stdout)
baseCmd.SetOut(nil)
baseCmd.SetErr(nil)
wwlog.SetLogWriter(buf)
err := baseCmd.Execute()
if tt.fail {
assert.Error(t, err)
} else {
assert.NoError(t, err)
}
stdoutC := make(chan string)
go func() {
var buf bytes.Buffer
_, _ = io.Copy(&buf, stdoutR)
stdoutC <- buf.String()
}()
stdoutW.Close()
stdout := <-stdoutC
assert.Equal(t, tt.output, stdout)
assert.Equal(t,
strings.ReplaceAll(strings.TrimSpace(tt.output), " ", ""),
strings.ReplaceAll(strings.TrimSpace(stdout), " ", ""))
assert.NoError(t, err)
assert.Contains(t,
strings.Join(strings.Fields(buf.String()), ""),
strings.Join(strings.Fields(tt.stdout), ""))
})
}
}

View File

@@ -2,6 +2,7 @@ package rename
import (
"bytes"
"os"
"path"
"testing"
@@ -10,7 +11,6 @@ import (
"github.com/warewulf/warewulf/internal/pkg/testenv"
"github.com/warewulf/warewulf/internal/pkg/warewulfd"
"github.com/warewulf/warewulf/internal/pkg/wwlog"
"github.com/warewulf/warewulf/internal/pkg/wwlog"
)
func Test_Rename(t *testing.T) {

View File

@@ -5,7 +5,6 @@ import (
"strings"
"github.com/olekukonko/tablewriter"
"github.com/warewulf/warewulf/internal/pkg/wwlog"
)
type PrintHelper struct {

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

View File

@@ -7,7 +7,6 @@ import (
"strings"
"syscall"
"github.com/pkg/errors"
"github.com/spf13/cobra"
warewulfconf "github.com/warewulf/warewulf/internal/pkg/config"
"github.com/warewulf/warewulf/internal/pkg/hostlist"
@@ -20,12 +19,12 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
controller := warewulfconf.Get()
nodeDB, err := node.New()
if err != nil {
return errors.Wrap(err, "couldn't open node configuration")
return fmt.Errorf("couldn't open node configuration: %s", err)
}
db, err := nodeDB.FindAllNodes()
if err != nil {
return errors.Wrap(err, "could not get node list")
return fmt.Errorf("could not get node list: %s", err)
}
if len(args) > 0 {

View File

@@ -25,34 +25,27 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
overlaySourceDir = overlay.OverlaySourceDir(overlayName)
if !util.IsDir(overlaySourceDir) {
err := errors.New("Overlay does not exist")
wwlog.Error("%s: %s", err, overlayName)
err := errors.New("overlay does not exist")
return err
}
overlayFile := path.Join(overlaySourceDir, fileName)
if !util.IsFile(overlayFile) {
err := errors.New("File does not exist within overlay")
wwlog.Error("%s: %s:%s", err, overlayName, fileName)
err := errors.New("file does not exist within overlay")
return err
}
if NodeName == "" {
f, err := os.ReadFile(overlayFile)
if err != nil {
wwlog.Error("Could not read file: %s", err)
return err
}
wwlog.Output("%s", string(f))
} else {
if !util.IsFile(overlayFile) {
err := errors.New("Not a file")
wwlog.Error("%s: %s:%s", err, overlayName, fileName)
return err
err := errors.New("Not a file")
wwlog.Error("%s: %s:%s", err, overlayName, fileName)
err := errors.New("not a file")
return err
}
if filepath.Ext(overlayFile) != ".ww" {