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

@@ -0,0 +1,127 @@
package node
import (
"fmt"
"sort"
types_3_4 "github.com/coreos/ignition/v2/config/v3_2/types"
"github.com/coreos/vcontext/path"
"github.com/hpcng/warewulf/internal/pkg/wwlog"
)
/*
Create a ignition struct class for ignition
*/
func (node *NodeInfo) GetStorage() (stor types_3_4.Storage, err error, rep string) {
var fileSystems []types_3_4.Filesystem
for fsdevice, fs := range node.FileSystems {
var mountOptions []types_3_4.MountOption
for _, opt := range fs.MountOptions.GetSlice() {
mountOptions = append(mountOptions, types_3_4.MountOption(opt))
}
var fsOption []types_3_4.FilesystemOption
for _, opt := range fs.Options.GetSlice() {
fsOption = append(fsOption, types_3_4.FilesystemOption(opt))
}
wipe := fs.WipeFileSystem.GetB()
myFs := types_3_4.Filesystem{
Device: fsdevice,
Path: fs.Path.GetPointer(),
WipeFilesystem: &wipe,
}
if fs.Format.Get() != "" {
myFs.Format = fs.Format.GetPointer()
}
if fs.Label.Get() != "" {
myFs.Label = fs.Label.GetPointer()
}
if fs.MountOptions.Get() != "" {
myFs.MountOptions = mountOptions
}
if fs.Options.Get() != "" {
myFs.Options = fsOption
}
if fs.Options.Get() != "" {
myFs.UUID = fs.Uuid.GetPointer()
}
wwlog.Debug("created file system struct: %v", myFs)
fileSystems = append(fileSystems, myFs)
}
var disks []types_3_4.Disk
for diskDev, disk := range node.Disks {
var partitions []types_3_4.Partition
for partlabel, part := range disk.Partitions {
resize := part.Resize.GetB()
shouldExist := part.ShouldExist.GetB()
wipe := part.WipePartitionEntry.GetB()
label := partlabel
myPart := types_3_4.Partition{
Label: &label,
Number: part.Number.GetInt(),
ShouldExist: &shouldExist,
WipePartitionEntry: &wipe,
}
if part.Guid.Get() != "" {
myPart.GUID = part.Guid.GetPointer()
}
if part.Resize.Get() != "" {
myPart.Resize = &resize
}
if part.SizeMiB.Get() != "" {
myPart.SizeMiB = part.SizeMiB.GetIntPtr()
}
if part.StartMiB.Get() != "" {
myPart.StartMiB = part.StartMiB.GetIntPtr()
}
if part.TypeGuid.Get() != "" {
myPart.TypeGUID = part.TypeGuid.GetPointer()
}
partitions = append(partitions, myPart)
}
sort.SliceStable(partitions, func(i int, j int) bool {
if partitions[i].Number == partitions[j].Number {
if partitions[i].SizeMiB != nil && partitions[j].SizeMiB == nil {
return true
}
if partitions[j].SizeMiB != nil && partitions[i].SizeMiB == nil {
return false
}
return *partitions[i].SizeMiB < *partitions[j].SizeMiB
}
return partitions[i].Number < partitions[j].Number
})
wipe := disk.WipeTable.GetB()
disks = append(disks, types_3_4.Disk{
Device: diskDev,
Partitions: partitions,
WipeTable: &wipe,
})
}
stor = types_3_4.Storage{
Disks: disks,
Filesystems: fileSystems,
}
report := stor.Validate(path.ContextPath{})
if report.IsFatal() {
err = fmt.Errorf(report.String())
}
rep = report.String()
return
}
type MyIgnition struct {
Version string `json:"version"`
}
type SimpleIgnitionConfig struct {
Ignition MyIgnition `json:"ignition"`
Storage types_3_4.Storage `json:"storage"`
}
/*
Get a simple config which can be marshalled to json
*/
func (node *NodeInfo) GetConfig() (conf SimpleIgnitionConfig, rep string, err error) {
conf.Storage, err, rep = node.GetStorage()
conf.Ignition.Version = "3.1.0"
return
}

View File

@@ -5,6 +5,7 @@ import (
"reflect"
"regexp"
"sort"
"strconv"
"strings"
"github.com/hpcng/warewulf/internal/pkg/util"
@@ -281,6 +282,37 @@ func (ent *Entry) GotReal() bool {
return len(ent.value) != 0
}
/*
Get a pointer to the value
*/
func (ent *Entry) GetPointer() *string {
ret := ent.Get()
return &ret
}
/*
Try to get a int of a value, 0 if value can't be parsed!
*/
func (ent *Entry) GetInt() int {
var ret int
if len(ent.value) != 0 {
ret, _ = strconv.Atoi(ent.value[0])
} else if len(ent.altvalue) != 0 {
ret, _ = strconv.Atoi(ent.altvalue[0])
} else if len(ent.def) != 0 {
ret, _ = strconv.Atoi(ent.def[0])
}
return ret
}
/*
Ptr to int
*/
func (ent *Entry) GetIntPtr() *int {
ret := ent.GetInt()
return &ret
}
/**********
*
* Misc