add support for rendering host tempalte

Signed-off-by: Xu Yang <xyang@ciq.com>
This commit is contained in:
Xu Yang
2024-03-25 00:55:35 -06:00
parent 122a366586
commit 2d1a39a3ee
3 changed files with 78 additions and 1 deletions

View File

@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Added https://github.com/Masterminds/sprig functions to templates #1030
- Add multiple output formats (yaml & json) support. #447
- More aliases for many wwctl commands
- Add support to render template using `host` or `$(uname -n)` as the value of `overlay show --render`. #623
### Changed

View File

@@ -64,10 +64,19 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
os.Exit(1)
}
filteredNodes := node.FilterByName(nodes, []string{NodeName})
if len(filteredNodes) != 1 {
if hostName, err := os.Hostname(); err != nil {
wwlog.Error("Could not get host name: %s", err)
} else if len(filteredNodes) == 0 && (NodeName == "host" || NodeName == hostName) {
// rendering the host template
hostNodeInfo := new(node.NodeInfo)
hostNodeInfo.Id.Set(hostName)
hostNodeInfo.ClusterName.Set(hostName)
filteredNodes = append(filteredNodes, *hostNodeInfo)
} else if len(filteredNodes) != 1 {
wwlog.Error("%v does not identify a single node", NodeName)
os.Exit(1)
}
tstruct := overlay.InitStruct(&filteredNodes[0])
tstruct.BuildSource = overlayFile
buffer, backupFile, writeFile, err := overlay.RenderTemplateFile(overlayFile, tstruct)

View File

@@ -2,6 +2,7 @@ package show
import (
"bytes"
"os"
"path"
"testing"
@@ -85,3 +86,69 @@ nodes:
assert.Contains(t, buf.String(), "noMail")
})
}
func TestShowServerTemplate(t *testing.T) {
const template = `
Id: {{.Id}}
ClusterName: {{.ClusterName}}
BuildHost: {{.BuildHost}}
`
env := testenv.New(t)
env.WriteFile(t, "etc/warewulf/nodes.conf",
`WW_INTERNAL: 45
nodeprofiles:
default:
tags:
email: admin@localhost
empty: {}
nodes:
node1:
tags:
email: admin@node1
node2: {}
node3:
profiles:
- empty
`)
env.WriteFile(t, path.Join(testenv.WWOverlaydir, "testoverlay/template.ww"), template)
defer env.RemoveAll(t)
warewulfd.SetNoDaemon()
host, err := os.Hostname()
if err != nil {
t.Fatal(err)
}
t.Run("overlay render host template using 'host' value", func(t *testing.T) {
baseCmd.SetArgs([]string{"-r", "host", "testoverlay", "template.ww"})
baseCmd := GetCommand()
buf := new(bytes.Buffer)
baseCmd.SetOut(buf)
baseCmd.SetErr(buf)
wwlog.SetLogWriter(buf)
err := baseCmd.Execute()
assert.NoError(t, err)
assert.Contains(t, buf.String(), "Id: "+host)
assert.Contains(t, buf.String(), "ClusterName: "+host)
assert.Contains(t, buf.String(), "BuildHost: "+host)
})
t.Run("overlay render host template using host domain value", func(t *testing.T) {
host, err := os.Hostname()
if err != nil {
t.Fatal(err)
}
baseCmd.SetArgs([]string{"-r", host, "testoverlay", "template.ww"})
baseCmd := GetCommand()
buf := new(bytes.Buffer)
baseCmd.SetOut(buf)
baseCmd.SetErr(buf)
wwlog.SetLogWriter(buf)
err = baseCmd.Execute()
assert.NoError(t, err)
assert.Contains(t, buf.String(), "Id: "+host)
assert.Contains(t, buf.String(), "ClusterName: "+host)
assert.Contains(t, buf.String(), "BuildHost: "+host)
})
}