Fixing tests in review of #1568

Signed-off-by: Jonathon Anderson <janderson@ciq.com>
This commit is contained in:
Jonathon Anderson
2025-01-17 00:58:12 -07:00
parent 847d11611b
commit eff1edd038
27 changed files with 90 additions and 98 deletions

View File

@@ -103,7 +103,7 @@ func CobraRunE(cmd *cobra.Command, args []string) (err error) {
} }
overlays := filteredNodes[0].SystemOverlay overlays := filteredNodes[0].SystemOverlay
overlays = append(overlays, filteredNodes[0].RuntimeOverlay...) overlays = append(overlays, filteredNodes[0].RuntimeOverlay...)
err = overlay.BuildOverlayIndir(filteredNodes[0], allNodes, overlays, path.Join(runDir, "nodeoverlay")) err = overlay.BuildOverlayIndir(filteredNodes[0], allNodes, nodeDB.Resources, overlays, path.Join(runDir, "nodeoverlay"))
if err != nil { if err != nil {
return fmt.Errorf("could not build overlay: %s", err) return fmt.Errorf("could not build overlay: %s", err)
} }

View File

@@ -480,7 +480,7 @@ nodes:
"PrimaryNetDev": "", "PrimaryNetDev": "",
"Disks": null, "Disks": null,
"FileSystems": null, "FileSystems": null,
"ResourceList": null "Resources": null
} }
] ]
`, `,
@@ -531,7 +531,7 @@ nodes:
"PrimaryNetDev": "", "PrimaryNetDev": "",
"Disks": null, "Disks": null,
"FileSystems": null, "FileSystems": null,
"ResourceList": null "Resources": null
}, },
{ {
"Discoverable": "", "Discoverable": "",
@@ -566,7 +566,7 @@ nodes:
"PrimaryNetDev": "", "PrimaryNetDev": "",
"Disks": null, "Disks": null,
"FileSystems": null, "FileSystems": null,
"ResourceList": null "Resources": null
} }
] ]
`, `,

View File

@@ -57,7 +57,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
} }
for _, node := range filteredNodes { for _, node := range filteredNodes {
return overlay.BuildOverlayIndir(node, allNodes, OverlayNames, OverlayDir) return overlay.BuildOverlayIndir(node, allNodes, nodeDB.Resources, OverlayNames, OverlayDir)
} }
} else { } else {
return errors.New("must specify a node to build overlay") return errors.New("must specify a node to build overlay")
@@ -68,9 +68,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
defer syscall.Umask(oldMask) defer syscall.Umask(oldMask)
if len(OverlayNames) > 0 { if len(OverlayNames) > 0 {
err = overlay.BuildSpecificOverlays(filteredNodes, allNodes, OverlayNames, Workers) err = overlay.BuildSpecificOverlays(filteredNodes, allNodes, nodeDB.Resources, OverlayNames, Workers)
} else { } else {
err = overlay.BuildAllOverlays(filteredNodes, allNodes, Workers) err = overlay.BuildAllOverlays(filteredNodes, allNodes, nodeDB.Resources, Workers)
} }
if err != nil { if err != nil {

View File

@@ -86,7 +86,7 @@ func CobraRunE(cmd *cobra.Command, args []string) (err error) {
} }
} }
return overlay.BuildSpecificOverlays(updateNodes, nodes, []string{overlayName}, Workers) return overlay.BuildSpecificOverlays(updateNodes, nodes, n.Resources, []string{overlayName}, Workers)
} }
return nil return nil

View File

@@ -62,7 +62,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
if err != nil { if err != nil {
return err return err
} }
tstruct, err := overlay.InitStruct(overlayName, nodeConf, allNodes) tstruct, err := overlay.InitStruct(overlayName, nodeConf, allNodes, nodeDB.Resources)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -170,7 +170,7 @@ nodes:
"PrimaryNetDev": "", "PrimaryNetDev": "",
"Disks": null, "Disks": null,
"FileSystems": null, "FileSystems": null,
"ResourceList": null "Resources": null
} }
} }
`, `,
@@ -222,7 +222,7 @@ nodes:
"PrimaryNetDev": "", "PrimaryNetDev": "",
"Disks": null, "Disks": null,
"FileSystems": null, "FileSystems": null,
"ResourceList": null "Resources": null
}, },
"test": { "test": {
"Profiles": null, "Profiles": null,
@@ -241,7 +241,7 @@ nodes:
"PrimaryNetDev": "", "PrimaryNetDev": "",
"Disks": null, "Disks": null,
"FileSystems": null, "FileSystems": null,
"ResourceList": null "Resources": null
} }
} }
`, `,

View File

@@ -14,17 +14,17 @@ func CobraRunE(vars *variables) func(cmd *cobra.Command, args []string) (err err
if err != nil { if err != nil {
return fmt.Errorf("failed to load node configuration: %s", err) return fmt.Errorf("failed to load node configuration: %s", err)
} }
if ok := nodeYml.Resource[args[0]] != nil; ok { if ok := nodeYml.Resources[args[0]] != nil; ok {
return fmt.Errorf("resource %s already exists", args[0]) return fmt.Errorf("resource %s already exists", args[0])
} }
if nodeYml.Resource == nil { if nodeYml.Resources == nil {
nodeYml.Resource = make(map[string]node.RemoteRes) nodeYml.Resources = make(map[string]node.Resource)
} }
res := node.RemoteRes{} res := node.Resource{}
for key, val := range vars.tags { for key, val := range vars.tags {
res[key] = val res[key] = val
} }
nodeYml.Resource[args[0]] = res nodeYml.Resources[args[0]] = res
err = nodeYml.Persist() err = nodeYml.Persist()
return err return err
} }

View File

@@ -28,15 +28,15 @@ nodes: {}
`, `,
outDb: `nodeprofiles: {} outDb: `nodeprofiles: {}
nodes: {} nodes: {}
resource: resources:
test: test:
foo: baar foo: baar
`}} `}}
env := testenv.New(t) env := testenv.New(t)
defer env.RemoveAll(t) defer env.RemoveAll()
warewulfd.SetNoDaemon() warewulfd.SetNoDaemon()
for _, tt := range tests { for _, tt := range tests {
env.WriteFile(t, "etc/warewulf/nodes.conf", tt.inDB) env.WriteFile("etc/warewulf/nodes.conf", tt.inDB)
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
baseCmd := GetCommand() baseCmd := GetCommand()
baseCmd.SetArgs(tt.args) baseCmd.SetArgs(tt.args)
@@ -49,7 +49,7 @@ resource:
} else { } else {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, buf.String(), tt.stdout) assert.Equal(t, buf.String(), tt.stdout)
content := env.ReadFile(t, "etc/warewulf/nodes.conf") content := env.ReadFile("etc/warewulf/nodes.conf")
assert.YAMLEq(t, tt.outDb, content) assert.YAMLEq(t, tt.outDb, content)
} }
}) })

View File

@@ -5,7 +5,7 @@ import (
) )
type variables struct { type variables struct {
tags map[string]string tags map[string]string
} }
// GetRootCommand returns the root cobra.Command for the application. // GetRootCommand returns the root cobra.Command for the application.

View File

@@ -15,10 +15,10 @@ func CobraRunE(vars *variables) func(cmd *cobra.Command, args []string) (err err
return fmt.Errorf("failed to load node configuration: %s", err) return fmt.Errorf("failed to load node configuration: %s", err)
} }
for _, res := range args { for _, res := range args {
if _, ok := nodeYml.Resource[res]; !ok { if _, ok := nodeYml.Resources[res]; !ok {
return fmt.Errorf("resource %s does not exist", res) return fmt.Errorf("resource %s does not exist", res)
} }
delete(nodeYml.Resource, res) delete(nodeYml.Resources, res)
} }
return nodeYml.Persist() return nodeYml.Persist()
} }

View File

@@ -26,22 +26,22 @@ func Test_resource_set(t *testing.T) {
args: []string{"test1"}, args: []string{"test1"},
inDB: `nodeprofiles: {} inDB: `nodeprofiles: {}
nodes: {} nodes: {}
resource: resources:
test1: {} test1: {}
test2: {} test2: {}
`, `,
outDb: `nodeprofiles: {} outDb: `nodeprofiles: {}
nodes: {} nodes: {}
resource: resources:
test2: {} test2: {}
`}, `},
} }
env := testenv.New(t) env := testenv.New(t)
defer env.RemoveAll(t) defer env.RemoveAll()
warewulfd.SetNoDaemon() warewulfd.SetNoDaemon()
for _, tt := range tests { for _, tt := range tests {
env.WriteFile(t, "etc/warewulf/nodes.conf", tt.inDB) env.WriteFile("etc/warewulf/nodes.conf", tt.inDB)
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
baseCmd := GetCommand() baseCmd := GetCommand()
baseCmd.SetArgs(tt.args) baseCmd.SetArgs(tt.args)
@@ -53,8 +53,8 @@ resource:
assert.Error(t, err) assert.Error(t, err)
} else { } else {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, buf.String(), tt.stdout) assert.Equal(t, tt.stdout, buf.String())
content := env.ReadFile(t, "etc/warewulf/nodes.conf") content := env.ReadFile("etc/warewulf/nodes.conf")
assert.YAMLEq(t, tt.outDb, content) assert.YAMLEq(t, tt.outDb, content)
} }
}) })

View File

@@ -28,7 +28,7 @@ test2
`, `,
inDB: `nodeprofiles: {} inDB: `nodeprofiles: {}
nodes: {} nodes: {}
resource: resources:
test1: {} test1: {}
test2: {} test2: {}
`, `,
@@ -43,17 +43,17 @@ test foo baar
`, `,
inDB: `nodeprofiles: {} inDB: `nodeprofiles: {}
nodes: {} nodes: {}
resource: resources:
test: test:
foo: baar foo: baar
`, `,
}, },
} }
env := testenv.New(t) env := testenv.New(t)
defer env.RemoveAll(t) defer env.RemoveAll()
warewulfd.SetNoDaemon() warewulfd.SetNoDaemon()
for _, tt := range tests { for _, tt := range tests {
env.WriteFile(t, "etc/warewulf/nodes.conf", tt.inDB) env.WriteFile("etc/warewulf/nodes.conf", tt.inDB)
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
baseCmd := GetCommand() baseCmd := GetCommand()
baseCmd.SetArgs(tt.args) baseCmd.SetArgs(tt.args)
@@ -66,7 +66,7 @@ resource:
assert.Error(t, err) assert.Error(t, err)
} else { } else {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, buf.String(), tt.stdout) assert.Equal(t, tt.stdout, buf.String())
} }
}) })

View File

@@ -14,11 +14,11 @@ func CobraRunE(vars *variables) func(cmd *cobra.Command, args []string) (err err
if err != nil { if err != nil {
return fmt.Errorf("failed to load node configuration: %s", err) return fmt.Errorf("failed to load node configuration: %s", err)
} }
if ok := nodeYml.Resource[args[0]] != nil; ok { if ok := nodeYml.Resources[args[0]] != nil; ok {
if nodeYml.Resource == nil { if nodeYml.Resources == nil {
nodeYml.Resource = make(map[string]node.RemoteRes) nodeYml.Resources = make(map[string]node.Resource)
} }
res := nodeYml.Resource[args[0]] res := nodeYml.Resources[args[0]]
for key, val := range vars.tags { for key, val := range vars.tags {
res[key] = val res[key] = val
} }

View File

@@ -26,13 +26,13 @@ func Test_resource_set(t *testing.T) {
stdout: "", stdout: "",
inDB: `nodeprofiles: {} inDB: `nodeprofiles: {}
nodes: {} nodes: {}
resource: resources:
test: test:
foo: baar foo: baar
`, `,
outDb: `nodeprofiles: {} outDb: `nodeprofiles: {}
nodes: {} nodes: {}
resource: resources:
test: test:
foo: test foo: test
`}, `},
@@ -43,17 +43,17 @@ resource:
stdout: "", stdout: "",
inDB: `nodeprofiles: {} inDB: `nodeprofiles: {}
nodes: {} nodes: {}
resource: resources:
test: test:
foo: baar foo: baar
`, `,
outDb: ``}, outDb: ``},
} }
env := testenv.New(t) env := testenv.New(t)
defer env.RemoveAll(t) defer env.RemoveAll()
warewulfd.SetNoDaemon() warewulfd.SetNoDaemon()
for _, tt := range tests { for _, tt := range tests {
env.WriteFile(t, "etc/warewulf/nodes.conf", tt.inDB) env.WriteFile("etc/warewulf/nodes.conf", tt.inDB)
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
baseCmd := GetCommand() baseCmd := GetCommand()
baseCmd.SetArgs(tt.args) baseCmd.SetArgs(tt.args)
@@ -65,8 +65,8 @@ resource:
assert.Error(t, err) assert.Error(t, err)
} else { } else {
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, buf.String(), tt.stdout) assert.Equal(t, tt.stdout, buf.String())
content := env.ReadFile(t, "etc/warewulf/nodes.conf") content := env.ReadFile("etc/warewulf/nodes.conf")
assert.YAMLEq(t, tt.outDb, content) assert.YAMLEq(t, tt.outDb, content)
} }
}) })

View File

@@ -31,7 +31,7 @@ func Hostfile() (err error) {
} }
hostname, _ := os.Hostname() hostname, _ := os.Hostname()
tstruct, err := overlay.InitStruct(overlay_.Name(), node.NewNode(hostname), allNodes) tstruct, err := overlay.InitStruct(overlay_.Name(), node.NewNode(hostname), allNodes, nil)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -188,7 +188,7 @@ Return the names of all available remote resources
*/ */
func (config *NodesYaml) ListAllResources() []string { func (config *NodesYaml) ListAllResources() []string {
var resList []string var resList []string
for name := range config.Resource { for name := range config.Resources {
resList = append(resList, name) resList = append(resList, name)
} }
sort.Strings(resList) sort.Strings(resList)
@@ -227,8 +227,8 @@ func (config *NodesYaml) FindDiscoverableNode() (Node, string, error) {
/* /*
get the given resource get the given resource
*/ */
func (config *NodesYaml) GetResource(id string) (res RemoteRes, err error) { func (config *NodesYaml) GetResource(id string) (res Resource, err error) {
if found, ok := config.Resource[id]; ok { if found, ok := config.Resources[id]; ok {
return found, nil return found, nil
} }
return res, ErrNotFound return res, ErrNotFound

View File

@@ -22,7 +22,7 @@ nodes:
network devices: network devices:
net0: net0:
device: eth0 device: eth0
resource_list: resources:
- NFSHOME - NFSHOME
test_node2: test_node2:
primary network: net1 primary network: net1
@@ -53,7 +53,7 @@ nodes:
network devices: network devices:
override: override:
device: ib1 device: ib1
resource: resources:
NFSHOME: NFSHOME:
mountpoint: /home mountpoint: /home
` `
@@ -123,8 +123,8 @@ func Test_Primary_Network(t *testing.T) {
assert.Equal(t, "profile", test_node6.NetDevs["override"].Type) assert.Equal(t, "profile", test_node6.NetDevs["override"].Type)
}) })
t.Run("resource is defined", func(t *testing.T) { t.Run("resource is defined", func(t *testing.T) {
assert.Contains(t, test_node1.ResourceList, "NFSHOME") assert.Contains(t, test_node1.Resources, "NFSHOME")
res, err := c.GetResource(test_node1.ResourceList[0]) res, err := c.GetResource(test_node1.Resources[0])
assert.NoError(t, err) assert.NoError(t, err)
assert.Contains(t, res, "mountpoint") assert.Contains(t, res, "mountpoint")
}) })

View File

@@ -15,9 +15,9 @@ const undef string = "UNDEF"
Structure of which goes to disk Structure of which goes to disk
*/ */
type NodesYaml struct { type NodesYaml struct {
NodeProfiles map[string]*Profile NodeProfiles map[string]*Profile `yaml:"nodeprofiles"`
Nodes map[string]*Node Nodes map[string]*Node `yaml:"nodes"`
Resource map[string]RemoteRes `yaml:"resource,omitempty"` Resources map[string]Resource `yaml:"resources,omitempty"`
} }
/* /*
@@ -54,7 +54,7 @@ type Profile struct {
PrimaryNetDev string `yaml:"primary network,omitempty" lopt:"primarynet" sopt:"p" comment:"Set the primary network interface"` PrimaryNetDev string `yaml:"primary network,omitempty" lopt:"primarynet" sopt:"p" comment:"Set the primary network interface"`
Disks map[string]*Disk `yaml:"disks,omitempty"` Disks map[string]*Disk `yaml:"disks,omitempty"`
FileSystems map[string]*FileSystem `yaml:"filesystems,omitempty"` FileSystems map[string]*FileSystem `yaml:"filesystems,omitempty"`
ResourceList []string `yaml:"resource_list,omitempty" lopt:"resources" comment:"Set the resources available to the node or profile"` Resources []string `yaml:"resources,omitempty" lopt:"resources" comment:"Set the resources available to the node or profile"`
} }
type IpmiConf struct { type IpmiConf struct {
@@ -127,13 +127,4 @@ type FileSystem struct {
MountOptions string `yaml:"mount_options,omitempty" comment:"any special options to be passed to the mount command"` MountOptions string `yaml:"mount_options,omitempty" comment:"any special options to be passed to the mount command"`
} }
/* type Resource map[string]string
Definition of any remote. Can be a nfs share or other FS types
*/
type RemoteRes map[string]string
// always return so that the resource isn't marshalled
// func (res RemoteRes) IsZero() bool {
// return true
// }

View File

@@ -142,6 +142,7 @@ func Test_listFields(t *testing.T) {
"NetDevs[default].Tags[nettag]", "NetDevs[default].Tags[nettag]",
"Tags[tag]", "Tags[tag]",
"PrimaryNetDev", "PrimaryNetDev",
"Resources",
}, },
}, },
"profile": { "profile": {
@@ -192,6 +193,7 @@ func Test_listFields(t *testing.T) {
"NetDevs[default].Tags[nettag]", "NetDevs[default].Tags[nettag]",
"Tags[tag]", "Tags[tag]",
"PrimaryNetDev", "PrimaryNetDev",
"Resources",
}, },
}, },
} }

View File

@@ -37,7 +37,7 @@ type TemplateStruct struct {
Tftp warewulfconf.TFTPConf Tftp warewulfconf.TFTPConf
Paths warewulfconf.BuildConfig Paths warewulfconf.BuildConfig
AllNodes []node.Node AllNodes []node.Node
Resource map[string]node.RemoteRes Resources map[string]node.Resource
node.Node node.Node
// backward compatiblity // backward compatiblity
Container string Container string
@@ -47,7 +47,7 @@ type TemplateStruct struct {
/* /*
Initialize an TemplateStruct with the given node.NodeInfo Initialize an TemplateStruct with the given node.NodeInfo
*/ */
func InitStruct(overlayName string, nodeData node.Node, allNodes []node.Node) (TemplateStruct, error) { func InitStruct(overlayName string, nodeData node.Node, allNodes []node.Node, resources map[string]node.Resource) (TemplateStruct, error) {
var tstruct TemplateStruct var tstruct TemplateStruct
tstruct.Overlay = overlayName tstruct.Overlay = overlayName
hostname, _ := os.Hostname() hostname, _ := os.Hostname()
@@ -82,7 +82,7 @@ func InitStruct(overlayName string, nodeData node.Node, allNodes []node.Node) (T
tstruct.BuildTime = dt.Format("01-02-2006 15:04:05 MST") tstruct.BuildTime = dt.Format("01-02-2006 15:04:05 MST")
tstruct.BuildTimeUnix = strconv.FormatInt(dt.Unix(), 10) tstruct.BuildTimeUnix = strconv.FormatInt(dt.Unix(), 10)
// tstruct.Node.Tags = map[string]string{} // tstruct.Node.Tags = map[string]string{}
tstruct.Resource = nodeDB.Resource tstruct.Resources = resources
var buf bytes.Buffer var buf bytes.Buffer
enc := gob.NewEncoder(&buf) enc := gob.NewEncoder(&buf)
dec := gob.NewDecoder(&buf) dec := gob.NewDecoder(&buf)

View File

@@ -101,7 +101,7 @@ func (this Overlay) IsDistributionOverlay() bool {
return path.Dir(this.Path()) == config.Get().Paths.DistributionOverlaydir() return path.Dir(this.Path()) == config.Get().Paths.DistributionOverlaydir()
} }
func BuildAllOverlays(nodes []node.Node, allNodes []node.Node, workerCount int) error { func BuildAllOverlays(nodes []node.Node, allNodes []node.Node, resources map[string]node.Resource, workerCount int) error {
nodeChan := make(chan node.Node, len(nodes)) nodeChan := make(chan node.Node, len(nodes))
errChan := make(chan error, len(nodes)*2) errChan := make(chan error, len(nodes)*2)
@@ -109,12 +109,12 @@ func BuildAllOverlays(nodes []node.Node, allNodes []node.Node, workerCount int)
worker := func() { worker := func() {
for n := range nodeChan { for n := range nodeChan {
wwlog.Info("Building system overlays for %s: [%s]", n.Id(), strings.Join(n.SystemOverlay, ", ")) wwlog.Info("Building system overlays for %s: [%s]", n.Id(), strings.Join(n.SystemOverlay, ", "))
if err := BuildOverlay(n, allNodes, "system", n.SystemOverlay); err != nil { if err := BuildOverlay(n, allNodes, resources, "system", n.SystemOverlay); err != nil {
errChan <- fmt.Errorf("could not build system overlays %v for node %s: %w", n.SystemOverlay, n.Id(), err) errChan <- fmt.Errorf("could not build system overlays %v for node %s: %w", n.SystemOverlay, n.Id(), err)
} }
wwlog.Info("Building runtime overlays for %s: [%s]", n.Id(), strings.Join(n.RuntimeOverlay, ", ")) wwlog.Info("Building runtime overlays for %s: [%s]", n.Id(), strings.Join(n.RuntimeOverlay, ", "))
if err := BuildOverlay(n, allNodes, "runtime", n.RuntimeOverlay); err != nil { if err := BuildOverlay(n, allNodes, resources, "runtime", n.RuntimeOverlay); err != nil {
errChan <- fmt.Errorf("could not build runtime overlays %v for node %s: %w", n.RuntimeOverlay, n.Id(), err) errChan <- fmt.Errorf("could not build runtime overlays %v for node %s: %w", n.RuntimeOverlay, n.Id(), err)
} }
} }
@@ -139,7 +139,7 @@ func BuildAllOverlays(nodes []node.Node, allNodes []node.Node, workerCount int)
return nil return nil
} }
func BuildSpecificOverlays(nodes []node.Node, allNodes []node.Node, overlayNames []string, workerCount int) error { func BuildSpecificOverlays(nodes []node.Node, allNodes []node.Node, resources map[string]node.Resource, overlayNames []string, workerCount int) error {
nodeChan := make(chan node.Node, len(nodes)) nodeChan := make(chan node.Node, len(nodes))
errChan := make(chan error, len(nodes)) errChan := make(chan error, len(nodes))
@@ -148,7 +148,7 @@ func BuildSpecificOverlays(nodes []node.Node, allNodes []node.Node, overlayNames
for n := range nodeChan { for n := range nodeChan {
wwlog.Info("Building overlay for %s: %v", n, overlayNames) wwlog.Info("Building overlay for %s: %v", n, overlayNames)
for _, overlayName := range overlayNames { for _, overlayName := range overlayNames {
err := BuildOverlay(n, allNodes, "", []string{overlayName}) err := BuildOverlay(n, allNodes, resources, "", []string{overlayName})
if err != nil { if err != nil {
errChan <- fmt.Errorf("could not build overlay %s for node %s: %w", overlayName, n.Id(), err) errChan <- fmt.Errorf("could not build overlay %s for node %s: %w", overlayName, n.Id(), err)
} }
@@ -199,7 +199,7 @@ func BuildHostOverlay() error {
if err != nil { if err != nil {
return err return err
} }
return BuildOverlayIndir(hostData, allNodes, []string{"host"}, "/") return BuildOverlayIndir(hostData, allNodes, registry.Resources, []string{"host"}, "/")
} }
/* /*
@@ -229,7 +229,7 @@ func FindOverlays() (overlayList []string, err error) {
/* /*
Build the given overlays for a node and create a Image for them Build the given overlays for a node and create a Image for them
*/ */
func BuildOverlay(nodeConf node.Node, allNodes []node.Node, context string, overlayNames []string) error { func BuildOverlay(nodeConf node.Node, allNodes []node.Node, resources map[string]node.Resource, context string, overlayNames []string) error {
if len(overlayNames) == 0 && context == "" { if len(overlayNames) == 0 && context == "" {
return nil return nil
} }
@@ -254,7 +254,7 @@ func BuildOverlay(nodeConf node.Node, allNodes []node.Node, context string, over
wwlog.Debug("Created temporary directory for %s: %s", name, buildDir) wwlog.Debug("Created temporary directory for %s: %s", name, buildDir)
err = BuildOverlayIndir(nodeConf, allNodes, overlayNames, buildDir) err = BuildOverlayIndir(nodeConf, allNodes, resources, overlayNames, buildDir)
if err != nil { if err != nil {
return fmt.Errorf("failed to generate files for %s: %w", name, err) return fmt.Errorf("failed to generate files for %s: %w", name, err)
} }
@@ -283,7 +283,7 @@ func init() {
} }
// Build the given overlays for a node in the given directory. // Build the given overlays for a node in the given directory.
func BuildOverlayIndir(nodeData node.Node, allNodes []node.Node, overlayNames []string, outputDir string) error { func BuildOverlayIndir(nodeData node.Node, allNodes []node.Node, resources map[string]node.Resource, overlayNames []string, outputDir string) error {
if len(overlayNames) == 0 { if len(overlayNames) == 0 {
return nil return nil
} }
@@ -332,7 +332,7 @@ func BuildOverlayIndir(nodeData node.Node, allNodes []node.Node, overlayNames []
} else if filepath.Ext(walkPath) == ".ww" { } else if filepath.Ext(walkPath) == ".ww" {
originalOutputPath := outputPath originalOutputPath := outputPath
outputPath := strings.TrimSuffix(outputPath, ".ww") outputPath := strings.TrimSuffix(outputPath, ".ww")
tstruct, err := InitStruct(overlayName, nodeData, allNodes) tstruct, err := InitStruct(overlayName, nodeData, allNodes, resources)
if err != nil { if err != nil {
return fmt.Errorf("failed to initial data for %s: %w", nodeData.Id(), err) return fmt.Errorf("failed to initial data for %s: %w", nodeData.Id(), err)
} }

View File

@@ -229,7 +229,7 @@ T3
env.MkdirAll(tt.outputDir) env.MkdirAll(tt.outputDir)
assert.NoError(t, BuildOverlayIndir(tt.node, []node.Node{tt.node}, tt.overlays, env.GetPath(tt.outputDir))) assert.NoError(t, BuildOverlayIndir(tt.node, []node.Node{tt.node}, nil, tt.overlays, env.GetPath(tt.outputDir)))
dirFiles := tt.outputDirs dirFiles := tt.outputDirs
for outputFile, _ := range tt.outputFiles { for outputFile, _ := range tt.outputFiles {
dirFiles = append(dirFiles, outputFile) dirFiles = append(dirFiles, outputFile)
@@ -400,7 +400,7 @@ func Test_BuildOverlay(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
nodeInfo := node.NewNode(tt.nodeName) nodeInfo := node.NewNode(tt.nodeName)
t.Run(tt.description, func(t *testing.T) { t.Run(tt.description, func(t *testing.T) {
err := BuildOverlay(nodeInfo, []node.Node{nodeInfo}, tt.context, tt.overlays) err := BuildOverlay(nodeInfo, []node.Node{nodeInfo}, nil, tt.context, tt.overlays)
assert.NoError(t, err) assert.NoError(t, err)
if tt.image != "" { if tt.image != "" {
image := env.GetPath(path.Join("srv/warewulf/overlays", tt.image)) image := env.GetPath(path.Join("srv/warewulf/overlays", tt.image))
@@ -523,7 +523,7 @@ func Test_BuildAllOverlays(t *testing.T) {
} }
nodes = append(nodes, nodeInfo) nodes = append(nodes, nodeInfo)
} }
err := BuildAllOverlays(nodes, nodes, runtime.NumCPU()) err := BuildAllOverlays(nodes, nodes, nil, runtime.NumCPU())
assert.NoError(t, err) assert.NoError(t, err)
if tt.createdOverlays == nil { if tt.createdOverlays == nil {
dirName := path.Join(provisionDir, "overlays") dirName := path.Join(provisionDir, "overlays")
@@ -615,7 +615,7 @@ func Test_BuildSpecificOverlays(t *testing.T) {
nodeInfo := node.NewNode(nodeName) nodeInfo := node.NewNode(nodeName)
nodes = append(nodes, nodeInfo) nodes = append(nodes, nodeInfo)
} }
err := BuildSpecificOverlays(nodes, nodes, tt.overlays, runtime.NumCPU()) err := BuildSpecificOverlays(nodes, nodes, nil, tt.overlays, runtime.NumCPU())
if !tt.succeed { if !tt.succeed {
assert.Error(t, err) assert.Error(t, err)
} else { } else {

View File

@@ -72,9 +72,9 @@ func getOverlayFile(n node.Node, context string, stage_overlays []string, autobu
return "", err return "", err
} }
if len(stage_overlays) > 0 { if len(stage_overlays) > 0 {
err = overlay.BuildSpecificOverlays([]node.Node{n}, allNodes, stage_overlays, 1) err = overlay.BuildSpecificOverlays([]node.Node{n}, allNodes, registry.Resources, stage_overlays, 1)
} else { } else {
err = overlay.BuildAllOverlays([]node.Node{n}, allNodes, 1) err = overlay.BuildAllOverlays([]node.Node{n}, allNodes, registry.Resources, 1)
} }
if err != nil { if err != nil {
wwlog.Error("Failed to build overlay: %s, %s, %s\n%s", wwlog.Error("Failed to build overlay: %s, %s, %s\n%s",

View File

@@ -1,6 +1,6 @@
nodes: nodes:
node1: node1:
resource_list: resources:
- NFSHOME - NFSHOME
disks: disks:
/dev/vda: /dev/vda:
@@ -19,7 +19,7 @@ nodes:
/dev/disk/by-partlabel/swap: /dev/disk/by-partlabel/swap:
format: swap format: swap
path: swap path: swap
resource: resources:
NFSHOME: NFSHOME:
mountpoint: /home mountpoint: /home
moptions: defaults moptions: defaults

View File

@@ -12,11 +12,11 @@ proc /proc proc defaults 0 0
{{- if $fs.MountOptions }} noauto{{range $index,$opt := $fs.MountOptions }},{{ $opt }}{{ end }} 0 0 {{- if $fs.MountOptions }} noauto{{range $index,$opt := $fs.MountOptions }},{{ $opt }}{{ end }} 0 0
{{- else }} noauto,defaults 0 0 {{- else }} noauto,defaults 0 0
{{- end }}{{ end }}{{ end }} {{- end }}{{ end }}{{ end }}
{{- $Resource := .Resource }}{{ $server := .Ipaddr}}{{/* export the needed values */}} {{- $server := .Ipaddr}}{{/* export the needed values */}}
{{- range $i,$ResName := .ResourceList }} {{- range $i,$ResName := .Node.Resources }}
{{- if eq (substr 0 3 $ResName) "NFS" }}{{ $nfs := (index $Resource $ResName)}} {{- if eq (substr 0 3 $ResName) "NFS" }}{{ $nfs := (index $.Resources $ResName)}}
# Resource: {{ $ResName }} # Resource: {{ $ResName }}
{{- if not (eq $nfs.server "controller") }}{{ $server = $nfs.server }}{{ end }} {{- if not (eq $nfs.server "controller") }}{{ $server = $nfs.server }}{{ end }}
{{ $server }}:{{ $nfs.epath}} {{ $nfs.mountpoint }} nfs {{ $nfs.moptions }} 0 0 {{ $server }}:{{ $nfs.epath}} {{ $nfs.mountpoint }} nfs {{ $nfs.moptions }} 0 0
{{- end }} {{- end }}
{{- end }} {{- end }}

View File

@@ -15,10 +15,10 @@ nodes:
device: wwnet0 device: wwnet0
hwaddr: e6:92:39:49:7b:04 hwaddr: e6:92:39:49:7b:04
ipaddr: 192.168.3.23 ipaddr: 192.168.3.23
resource: resources:
NFSHOME: NFSHOME:
mountpoint: /home mountpoint: /home
moptions: defaults moptions: defaults
eoptions: rw,sync eoptions: rw,sync
epath: /home epath: /home
server: controller server: controller

View File

@@ -1,11 +1,10 @@
{{ IncludeBlock "/etc/exports" "# Do not edit after this line" }} {{ IncludeBlock "/etc/exports" "# Do not edit after this line" }}
# This block is autogenerated by warewulf # This block is autogenerated by warewulf
{{- $Resource := .Resource }}
{{- $network := .Network }} {{- $network := .Network }}
{{- $netmask := .Netmask }} {{- $netmask := .Netmask }}
{{- range $ResName,$Res := .Resource }} {{- range $ResName,$Res := .Resources }}
{{- if eq (substr 0 3 $ResName) "NFS" }}{{ if eq $Res.server "controller" }} {{- if eq (substr 0 3 $ResName) "NFS" }}{{ if eq $Res.server "controller" }}
# Resource: {{ $ResName }} # Resource: {{ $ResName }}
{{ $Res.epath}} {{ $network }}/{{ $netmask }}({{ $Res.eoptions }}) {{ $Res.epath}} {{ $network }}/{{ $netmask }}({{ $Res.eoptions }})
{{- end }}{{ end }} {{- end }}{{ end }}
{{- end }} {{- end }}