Add json output for ignition

Signed-off-by: Christian Goll <cgoll@suse.com>
This commit is contained in:
Christian Goll
2023-08-15 17:37:03 -06:00
committed by Jonathon Anderson
parent 45539a0d1f
commit a7df560a30
9 changed files with 242 additions and 16 deletions

View File

@@ -6,8 +6,8 @@ import (
"strconv"
"time"
"github.com/hpcng/warewulf/internal/pkg/node"
warewulfconf "github.com/hpcng/warewulf/internal/pkg/config"
"github.com/hpcng/warewulf/internal/pkg/node"
"github.com/hpcng/warewulf/internal/pkg/wwlog"
)
@@ -37,13 +37,15 @@ type TemplateStruct struct {
node.NodeConf
// backward compatiblity
Container string
ThisNode *node.NodeInfo
}
/*
Initialize an TemplateStruct with the given node.NodeInfo
*/
func InitStruct(nodeInfo node.NodeInfo) TemplateStruct {
func InitStruct(nodeInfo *node.NodeInfo) TemplateStruct {
var tstruct TemplateStruct
tstruct.ThisNode = nodeInfo
controller := warewulfconf.Get()
nodeDB, err := node.New()
if err != nil {
@@ -55,7 +57,7 @@ func InitStruct(nodeInfo node.NodeInfo) TemplateStruct {
wwlog.Error("%s", err)
os.Exit(1)
}
// init some convininence vars
// init some convenience vars
tstruct.Id = nodeInfo.Id.Get()
tstruct.Hostname = nodeInfo.Id.Get()
// Backwards compatibility for templates using "Keys"
@@ -81,17 +83,17 @@ func InitStruct(nodeInfo node.NodeInfo) TemplateStruct {
tstruct.BuildTime = dt.Format("01-02-2006 15:04:05 MST")
tstruct.BuildTimeUnix = strconv.FormatInt(dt.Unix(), 10)
tstruct.NodeConf.Tags = map[string]string{}
tstruct.NodeConf.GetFrom(nodeInfo)
tstruct.NodeConf.GetFrom(*nodeInfo)
// FIXME: Set ipCIDR address at this point, will fail with
// invalid ipv4 addr
for _, network := range tstruct.NetDevs {
for _, network := range tstruct.NodeConf.NetDevs {
ipCIDR := net.IPNet{
IP: net.ParseIP(network.Ipaddr),
Mask: net.IPMask(net.ParseIP(network.Netmask))}
network.IpCIDR = ipCIDR.String()
}
// backward compatibilty
tstruct.Container = tstruct.ContainerName
tstruct.Container = tstruct.NodeConf.ContainerName
return tstruct

View File

@@ -2,13 +2,16 @@ package overlay
import (
"bufio"
"encoding/json"
"fmt"
"os"
"path"
"strings"
"github.com/hpcng/warewulf/internal/pkg/container"
"github.com/hpcng/warewulf/internal/pkg/util"
warewulfconf "github.com/hpcng/warewulf/internal/pkg/config"
"github.com/hpcng/warewulf/internal/pkg/container"
"github.com/hpcng/warewulf/internal/pkg/node"
"github.com/hpcng/warewulf/internal/pkg/util"
"github.com/hpcng/warewulf/internal/pkg/wwlog"
)
@@ -100,3 +103,20 @@ func templateContainerFileInclude(containername string, filepath string) string
}
return strings.TrimSuffix(string(content), "\n")
}
func createIgnitionJson(node *node.NodeInfo) string {
conf, rep, err := node.GetConfig()
if len(conf.Storage.Disks) == 0 && len(conf.Storage.Filesystems) == 0 {
wwlog.Debug("no disks or filesystems present, don't create a json object")
return ""
}
if err != nil {
wwlog.Error("disk, filesystem configuration has following error: ", fmt.Sprint(err))
return fmt.Sprint(err)
}
if rep != "" {
wwlog.Warn("%s storage configuration has following non fatal problems: %s", node.Id, rep)
}
tmpYaml, _ := json.Marshal(&conf)
return string(tmpYaml)
}

View File

@@ -245,7 +245,7 @@ func BuildOverlayIndir(nodeInfo node.NodeInfo, overlayNames []string, outputDir
wwlog.Debug("Created directory in overlay: %s", location)
} else if filepath.Ext(location) == ".ww" {
tstruct := InitStruct(nodeInfo)
tstruct := InitStruct(&nodeInfo)
tstruct.BuildSource = path.Join(overlaySourceDir, location)
wwlog.Verbose("Evaluating overlay template file: %s", location)
destFile := strings.TrimSuffix(location, ".ww")
@@ -266,7 +266,7 @@ func BuildOverlayIndir(nodeInfo node.NodeInfo, overlayNames []string, outputDir
line := fileScanner.Text()
filenameFromTemplate := reg.FindAllStringSubmatch(line, -1)
if len(filenameFromTemplate) != 0 {
wwlog.Debug("Found multifile comment, new filename %s", filenameFromTemplate[0][1])
wwlog.Debug("Found multiple comment, new filename %s", filenameFromTemplate[0][1])
if foundFileComment {
err = CarefulWriteBuffer(path.Join(outputDir, destFileName),
fileBuffer, backupFile, info.Mode())
@@ -384,6 +384,14 @@ func RenderTemplateFile(fileName string, data TemplateStruct) (
"inc": func(i int) int { return i + 1 },
"dec": func(i int) int { return i - 1 },
"file": func(str string) string { return fmt.Sprintf("{{ /* file \"%s\" */ }}", str) },
"IgnitionJson": func() string {
str := createIgnitionJson(data.ThisNode)
if str != "" {
return str
}
writeFile = false
return ""
},
"abort": func() string {
wwlog.Debug("abort file called in %s", fileName)
writeFile = false
@@ -397,6 +405,12 @@ func RenderTemplateFile(fileName string, data TemplateStruct) (
"split": func(s string, d string) []string {
return strings.Split(s, d)
},
"tr": func(source, old, new string) string {
return strings.Replace(source, old, new, -1)
},
"replace": func(source, old, new string) string {
return strings.Replace(source, old, new, -1)
},
// }).ParseGlob(path.Join(OverlayDir, destFile+".ww*"))
}).ParseGlob(fileName)
if err != nil {