updated test for yaml/v3

Signed-off-by: Christian Goll <cgoll@suse.com>
This commit is contained in:
Christian Goll
2023-12-20 15:37:06 +01:00
committed by Jonathon Anderson
parent 9ba1aa8d63
commit 342236b9b9
18 changed files with 433 additions and 304 deletions

View File

@@ -1,8 +1,6 @@
package node
import (
"bytes"
"encoding/gob"
"net"
"reflect"
"regexp"
@@ -10,7 +8,6 @@ import (
"strings"
"github.com/warewulf/warewulf/internal/pkg/util"
"github.com/warewulf/warewulf/internal/pkg/wwtype"
)
type sortByName []NodeConf
@@ -134,51 +131,92 @@ func (info *ProfileConf) Flatten() {
recursiveFlatten(info)
}
// abstract flatten
func recursiveFlatten(strct interface{}) {
confType := reflect.TypeOf(strct)
confVal := reflect.ValueOf(strct)
for j := 0; j < confType.Elem().NumField(); j++ {
if confVal.Elem().Field(j).Type().Kind() == reflect.Ptr && !confVal.Elem().Field(j).IsNil() {
// iterate now over the ptr fields
setToNil := true
nestedType := reflect.TypeOf(confVal.Elem().Field(j).Interface())
nestedVal := reflect.ValueOf(confVal.Elem().Field(j).Interface())
for i := 0; i < nestedType.Elem().NumField(); i++ {
// wwlog.Debug("checking %s", nestedType.Elem().Field(i).Type.String())
if nestedType.Elem().Field(i).Type.Kind() == reflect.String &&
nestedVal.Elem().Field(i).Interface().(string) != "" &&
nestedVal.Elem().Field(i).Interface().(string) != undef {
setToNil = false
} else if nestedType.Elem().Field(i).Type == reflect.TypeOf([]string{}) &&
len(nestedVal.Elem().Field(i).Interface().([]string)) != 0 {
setToNil = false
} else if nestedType.Elem().Field(i).Type == reflect.TypeOf(map[string]string{}) &&
len(nestedVal.Elem().Field(i).Interface().(map[string]string)) != 0 {
setToNil = false
} else if nestedType.Elem().Field(i).Type == reflect.TypeOf(net.IP{}) {
val := nestedVal.Elem().Field(i).Interface().(net.IP)
if len(val) != 0 && !val.IsUnspecified() {
setToNil = false
}
} else if nestedType.Elem().Field(i).Type == reflect.TypeOf(wwtype.WWbool{}) {
val := nestedVal.Elem().Field(i).Interface().(wwtype.WWbool)
if !val.IsZero() {
setToNil = false
}
}
}
if setToNil {
confVal.Elem().Field(j).Set(reflect.Zero(confVal.Elem().Field(j).Type()))
}
} else if confType.Elem().Field(j).Anonymous {
recursiveFlatten(confVal.Elem().Field(j).Addr().Interface())
} else if confType.Elem().Field(j).IsExported() && confType.Elem().Field(j).Type.Kind() == reflect.String {
if confVal.Elem().Field(j).Interface().(string) == undef {
confVal.Elem().Field(j).SetString("")
func recursiveFlatten(obj interface{}) (hasContent bool) {
valObj := reflect.ValueOf(obj)
typeObj := reflect.TypeOf(obj)
hasContent = false
if valObj.IsNil() {
return
}
for i := 0; i < typeObj.Elem().NumField(); i++ {
if valObj.Elem().Field(i).IsValid() {
if !typeObj.Elem().Field(i).IsExported() {
continue
}
}
switch typeObj.Elem().Field(i).Type.Kind() {
case reflect.Map:
mapIter := valObj.Elem().Field(i).MapRange()
for mapIter.Next() {
if mapIter.Value().Kind() == reflect.String {
if mapIter.Value().String() != "" {
// fmt.Println("map")
hasContent = true
}
} else {
ret := recursiveFlatten(mapIter.Value().Interface())
hasContent = ret || hasContent
}
}
case reflect.Ptr:
if valObj.Elem().Field(i).Addr().IsValid() {
ret := recursiveFlatten((valObj.Elem().Field(i).Interface()))
if !ret {
valObj.Elem().Field(i).Set(reflect.Zero(valObj.Elem().Field(i).Type()))
}
hasContent = ret || hasContent
}
case reflect.Struct:
ret := recursiveFlatten((valObj.Elem().Field(i).Addr().Interface()))
hasContent = ret || hasContent
case reflect.Slice:
if typeObj.Elem().Field(i).Type == reflect.TypeOf([]string{}) {
del := false
for _, elem := range (valObj.Elem().Field(i).Interface()).([]string) {
if strings.EqualFold(elem, undef) {
del = true
}
}
if del {
valObj.Elem().Field(i).SetLen(0)
}
}
if valObj.Elem().Field(i).Len() > 0 {
hasContent = true
}
case reflect.String:
if strings.EqualFold(valObj.Elem().Field(i).String(), undef) {
valObj.Elem().Field(i).SetString("")
}
if valObj.Elem().Field(i).String() != "" {
hasContent = true
}
case reflect.Bool:
val := valObj.Elem().Field(i).Interface().(bool)
hasContent = hasContent || val
default:
switch valObj.Elem().Field(i).Type() {
case reflect.TypeOf(net.IP{}):
val := valObj.Elem().Field(i).Interface().(net.IP)
if len(val) != 0 && !val.IsUnspecified() {
hasContent = true
}
case reflect.TypeOf(net.IPMask{}):
val := valObj.Elem().Field(i).Interface().(net.IPMask)
if len(val) != 0 {
// fmt.Println("Mask")
hasContent = true
}
default:
}
}
if !hasContent {
valObj.Elem().Field(i).Set(reflect.Zero(valObj.Elem().Field(i).Type()))
}
}
return
}
/*
@@ -308,38 +346,3 @@ func cleanList(list []string) (ret []string) {
}
return ret
}
// Clone (deep copy) a node via gob
func (src *NodeConf) Clone() (dst NodeConf, err error) {
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
dec := gob.NewDecoder(&buf)
err = enc.Encode(src)
if err != nil {
return
}
err = dec.Decode(&dst)
if err != nil {
return
}
dst.id = src.id
dst.valid = src.valid
return
}
// Clone (deep copy) a node via gob
func (src ProfileConf) Clone() (dst ProfileConf, err error) {
var buf bytes.Buffer
enc := gob.NewEncoder(&buf)
dec := gob.NewDecoder(&buf)
err = enc.Encode(src)
if err != nil {
return
}
err = dec.Decode(&dst)
if err != nil {
return
}
dst.id = src.id
return
}