Files
warewulf/internal/pkg/ww4test/ww4test.go
Christian Goll b5979e41d2 added general testing framework
framework creates all the necessary configuration file for warewulf
under a temporary directory. Individual warewulf.conf and nodes.conf
can be provided.

Signed-off-by: Christian Goll <cgoll@suse.com>
2023-10-11 12:07:28 +02:00

137 lines
3.9 KiB
Go

package ww4test
import (
"fmt"
"io/fs"
"os"
"path"
"testing"
"github.com/hpcng/warewulf/internal/pkg/config"
"github.com/hpcng/warewulf/internal/pkg/node"
"github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
var (
Env *WarewulfTestEnv
)
func init() {
Env = new(WarewulfTestEnv)
Env.WarewulfConf = `WW_INTERNAL: 0`
Env.DefaultsConf = `WW_INTERNAL: 43`
Env.NodesConf = `WW_INTERNAL: 43
nodeprofiles:
default: {}
nodes:
node1: {}
`
}
type ConfFile struct {
// directory in which file exists
Dir string
// filename, if empty only directory is create
FileName string
// content of file
Content string
// permissions of file, 644 for file and 755 for
// leading directory otherwise
Mode fs.FileMode
}
type WarewulfTestEnv struct {
// content of warewulf.conf
WarewulfConf string
// path to warewulf.conf
WarewulfConfFile string
// content of nodes.conf
NodesConf string
// path to nodes.conf
NodesConfFile string
// content for defaults.conf
DefaultsConf string
// tmpe dir where the files are created
BaseDir string
// additional files to be created by New(t)
WarewulfFiles []ConfFile
}
// creates the given file, if DIR is "" only the dir is created
// any error is returned
func (env *WarewulfTestEnv) CreateFile(file ConfFile) (err error) {
if env.BaseDir == "" {
return fmt.Errorf("the variable Basedir is empty, perhaps New() wasn't called")
}
var dirM fs.FileMode = file.Mode
// var fileM fs.FileMode = file.Mode
if file.Mode == 0 {
dirM = 0755
// fileM = 0644
}
err = os.MkdirAll(path.Join(env.BaseDir, file.Dir), dirM)
if err != nil {
return errors.Wrap(err, fmt.Sprintf("couldn't create dir: %s", path.Join(env.BaseDir, file.Dir)))
}
if file.FileName != "" {
f, err := os.Create(path.Join(env.BaseDir, file.Dir, file.FileName))
if err != nil {
return errors.Wrap(err, fmt.Sprintf("couldn't open file: %s", path.Join(env.BaseDir, file.Dir, file.FileName)))
}
defer f.Close()
_, err = f.WriteString(file.Content)
return err
}
return
}
/*
Creates a test environment so that warewulf functions can be tested.
nodes.conf content can be provided either via global Env.WarewulfConf.
Caller is responsible to delete the created Env.BaseDir
*/
func (env *WarewulfTestEnv) New(t *testing.T) {
tmpDir, err := os.MkdirTemp(os.TempDir(), "ww4test-*")
assert.NoError(t, err)
env.BaseDir = tmpDir
err = env.CreateFile(ConfFile{
Dir: "etc/warewulf",
FileName: "nodes.conf",
Content: env.NodesConf,
})
assert.NoError(t, err)
err = env.CreateFile(ConfFile{
Dir: "etc/warewulf",
FileName: "warewulf.conf",
Content: env.WarewulfConf,
})
assert.NoError(t, err)
err = env.CreateFile(ConfFile{
Dir: "share/warewulf",
FileName: "defaults.conf",
Content: env.WarewulfConf,
})
assert.NoError(t, err)
env.WarewulfConfFile = path.Join(env.BaseDir, "etc/warewulf/warewulf.conf")
env.NodesConfFile = path.Join(env.BaseDir, "etc/warewulf/nodes.conf")
conf := config.New()
err = conf.Read(env.WarewulfConfFile)
assert.NoError(t, err)
// init() of node has run before, so set the config path again
node.ConfigFile = env.NodesConfFile
conf.Paths.Sysconfdir = path.Join(env.BaseDir, "etc")
conf.Paths.Bindir = path.Join(env.BaseDir, "bin")
conf.Paths.Datadir = path.Join(env.BaseDir, "share")
conf.Paths.Localstatedir = path.Join(env.BaseDir, "var/local")
conf.Paths.Srvdir = path.Join(env.BaseDir, "srv")
conf.Paths.Tftpdir = path.Join(env.BaseDir, "srv/tftp")
conf.Paths.Firewallddir = path.Join(env.BaseDir, "usr/lib/firewalld/services")
conf.Paths.Systemddir = path.Join(env.BaseDir, "usr/lib/systemd/system")
conf.Paths.WWOverlaydir = path.Join(env.BaseDir, conf.Paths.Localstatedir, "warewulfoverlays")
conf.Paths.WWChrootdir = path.Join(env.BaseDir, conf.Paths.Localstatedir, "warewulf/chroots")
conf.Paths.WWProvisiondir = path.Join(env.BaseDir, conf.Paths.Srvdir, "warewulf")
conf.Paths.WWClientdir = path.Join(env.BaseDir, "warewulf")
}