fixes for split overlays
Signed-off-by: Christian Goll <cgoll@suse.com>
This commit is contained in:
committed by
Jonathon Anderson
parent
c08cd82e68
commit
0c6e7cc58a
@@ -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), ""))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -5,7 +5,6 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/olekukonko/tablewriter"
|
||||
"github.com/warewulf/warewulf/internal/pkg/wwlog"
|
||||
)
|
||||
|
||||
type PrintHelper struct {
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
|
||||
|
||||
@@ -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, ""))
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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" {
|
||||
|
||||
Reference in New Issue
Block a user