Rendering overlay templates requires fetching and populating / merging all other nodes, because overlay templates have access to all cluster node info. This was previously being done for each template render, but is not being done once for each render operation and re-used for each template render. Signed-off-by: Jonathon Anderson <janderson@ciq.com>
57 lines
1.2 KiB
Go
57 lines
1.2 KiB
Go
package configure
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path"
|
|
|
|
"github.com/warewulf/warewulf/internal/pkg/node"
|
|
"github.com/warewulf/warewulf/internal/pkg/overlay"
|
|
"github.com/warewulf/warewulf/internal/pkg/util"
|
|
)
|
|
|
|
/*
|
|
Creates '/etc/hosts' from the host template.
|
|
*/
|
|
func Hostfile() (err error) {
|
|
overlay_ := overlay.GetOverlay("host")
|
|
hostTemplate := path.Join(overlay_.Rootfs(), "/etc/hosts.ww")
|
|
if !(util.IsFile(hostTemplate)) {
|
|
return fmt.Errorf("'the overlay template '/etc/hosts.ww' does not exists in 'host' overlay")
|
|
}
|
|
|
|
var allNodes []node.Node
|
|
if nodeDB, err := node.New(); err != nil {
|
|
return err
|
|
} else {
|
|
allNodes, err = nodeDB.FindAllNodes()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
hostname, _ := os.Hostname()
|
|
tstruct, err := overlay.InitStruct(overlay_.Name(), node.NewNode(hostname), allNodes)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
buffer, backupFile, writeFile, err := overlay.RenderTemplateFile(
|
|
hostTemplate,
|
|
tstruct)
|
|
if err != nil {
|
|
return
|
|
}
|
|
info, err := os.Stat(hostTemplate)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
if writeFile {
|
|
err = overlay.CarefulWriteBuffer("/etc/hosts", buffer, backupFile, info.Mode())
|
|
if err != nil {
|
|
return fmt.Errorf("could not write file from template: %w", err)
|
|
}
|
|
}
|
|
return
|
|
}
|