The caching functionality of nodes.conf, and the optional persistence functionality that came with it, appears to have been preventing actually writing the configuration to disk in all cases. This change fixes the ability to write to nodes.conf. Somewhat opinionatedly, this change removes the caching functionality of nodes.conf. The tests have also been updated to use real files for i/o rather than tying into the caching system, making them more accurately test the ability of Warewulf to actually read and write its configuration. Fixes #779 Signed-off-by: Jonathon Anderson <janderson@ciq.co>
91 lines
2.2 KiB
Go
91 lines
2.2 KiB
Go
package list
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/hpcng/warewulf/internal/pkg/node"
|
|
"github.com/hpcng/warewulf/internal/pkg/warewulfconf"
|
|
"github.com/hpcng/warewulf/internal/pkg/warewulfd"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func Test_List(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
args []string
|
|
wantErr bool
|
|
stdout string
|
|
inDb string
|
|
}{
|
|
{name: "single node list",
|
|
args: []string{},
|
|
wantErr: false,
|
|
stdout: ` NODE NAME PROFILES NETWORK
|
|
n01 default
|
|
`,
|
|
inDb: `WW_INTERNAL: 43
|
|
nodeprofiles:
|
|
default: {}
|
|
nodes:
|
|
n01:
|
|
profiles:
|
|
- default
|
|
`},
|
|
}
|
|
conf_yml := `WW_INTERNAL: 0`
|
|
tempWarewulfConf, warewulfConfErr := os.CreateTemp("", "warewulf.conf-")
|
|
assert.NoError(t, warewulfConfErr)
|
|
defer os.Remove(tempWarewulfConf.Name())
|
|
_, warewulfConfErr = tempWarewulfConf.Write([]byte(conf_yml))
|
|
assert.NoError(t, warewulfConfErr)
|
|
assert.NoError(t, tempWarewulfConf.Sync())
|
|
warewulfconf.ConfigFile = tempWarewulfConf.Name()
|
|
|
|
tempNodeConf, nodesConfErr := os.CreateTemp("", "nodes.conf-")
|
|
assert.NoError(t, nodesConfErr)
|
|
defer os.Remove(tempNodeConf.Name())
|
|
node.ConfigFile = tempNodeConf.Name()
|
|
warewulfd.SetNoDaemon()
|
|
for _, tt := range tests {
|
|
var err error
|
|
_, err = tempNodeConf.Seek(0, 0)
|
|
assert.NoError(t, err)
|
|
assert.NoError(t, tempNodeConf.Truncate(0))
|
|
_, err = tempNodeConf.Write([]byte(tt.inDb))
|
|
assert.NoError(t, tempNodeConf.Sync())
|
|
t.Logf("Running test: %s\n", tt.name)
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
baseCmd := GetCommand()
|
|
baseCmd.SetArgs(tt.args)
|
|
buf := new(bytes.Buffer)
|
|
baseCmd.SetOut(buf)
|
|
baseCmd.SetErr(buf)
|
|
old := os.Stdout // keep backup of the real stdout
|
|
r, w, _ := os.Pipe()
|
|
os.Stdout = w
|
|
err = baseCmd.Execute()
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("Got unwanted error: %s", err)
|
|
t.FailNow()
|
|
}
|
|
outC := make(chan string)
|
|
go func() {
|
|
var buf bytes.Buffer
|
|
_, _ = io.Copy(&buf, r)
|
|
outC <- buf.String()
|
|
}()
|
|
// back to normal state
|
|
w.Close()
|
|
os.Stdout = old // restoring the real stdout
|
|
out := <-outC
|
|
if out != tt.stdout {
|
|
t.Errorf("Got wrong output, got:'%s'\nwant:'%s'", out, tt.stdout)
|
|
t.FailNow()
|
|
}
|
|
})
|
|
}
|
|
}
|