Files
warewulf/internal/pkg/node/fields_test.go
Jonathon Anderson a8fab3e844 Enhancements for node.Field formatting
- Complex values are now marshalled as json
- Booleans are now represented as truth values

Signed-off-by: Jonathon Anderson <janderson@ciq.com>
2025-01-19 12:55:19 -07:00

321 lines
6.6 KiB
Go

package node
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/warewulf/warewulf/internal/pkg/testenv"
)
func Test_getNestedFieldString(t *testing.T) {
var tests = map[string]struct {
nodesConf string
node string
field string
value string
jsonValue string
}{
"comment (simple)": {
nodesConf: `
nodes:
n1:
comment: n1 comment`,
node: "n1",
field: "Comment",
value: "n1 comment",
},
"kernel args (struct)": {
nodesConf: `
nodes:
n1:
kernel:
args: n1 args`,
node: "n1",
field: "Kernel.Args",
value: "n1 args",
},
"node tag (map)": {
nodesConf: `
nodes:
n1:
tags:
tag: n1 tag`,
node: "n1",
field: "Tags[tag]",
value: "n1 tag",
},
"system overlay (slice)": {
nodesConf: `
nodes:
n1:
system overlay:
- no1
- no2`,
node: "n1",
field: "SystemOverlay",
value: "no1,no2",
},
"netdev tag (map to struct)": {
nodesConf: `
nodes:
n1:
network devices:
default:
tags:
tag: n1 netdev tag`,
node: "n1",
field: "NetDevs[default].Tags[tag]",
value: "n1 netdev tag",
},
"boolean value (true)": {
nodesConf: `
nodes:
n1:
discoverable: true`,
node: "n1",
field: "Discoverable",
value: "true",
},
"boolean value (false)": {
nodesConf: `
nodes:
n1:
discoverable: false`,
node: "n1",
field: "Discoverable",
value: "false",
},
"fstab resource": {
nodesConf: `
nodes:
n1:
resources:
fstab:
- file: /home
freq: 0
mntops: defaults
passno: 0
spec: warewulf:/home
vfstype: nfs`,
node: "n1",
field: "Resources[fstab]",
jsonValue: `[{"file":"/home","freq":0,"mntops":"defaults","passno":0,"spec":"warewulf:/home","vfstype":"nfs"}]`,
},
"disk partition": {
nodesConf: `
nodes:
n1:
disks:
/dev/vda:
partitions:
rootfs:
resize: false`,
node: "n1",
field: "Disks[/dev/vda].Partitions[rootfs].Resize",
value: "false",
},
}
for name, tt := range tests {
t.Run(name, func(t *testing.T) {
env := testenv.New(t)
defer env.RemoveAll()
env.WriteFile("/etc/warewulf/nodes.conf", tt.nodesConf)
registry, regErr := New()
assert.NoError(t, regErr)
node := registry.Nodes[tt.node]
value, err := getNestedFieldString(node, tt.field)
assert.NoError(t, err)
if tt.value != "" {
assert.Equal(t, tt.value, value)
}
if tt.jsonValue != "" {
assert.JSONEq(t, tt.jsonValue, value)
}
})
}
}
func Test_listFields(t *testing.T) {
var tests = map[string]struct {
object interface{}
fields []string
}{
"node": {
object: Node{
Profile: Profile{
Tags: map[string]string{
"tag": "value",
},
NetDevs: map[string]*NetDev{
"default": {
Tags: map[string]string{
"nettag": "netvalue",
},
},
},
Resources: map[string]Resource{
"resource": "resvalue",
},
},
},
fields: []string{
"Discoverable",
"AssetKey",
"Profiles",
"Comment",
"ClusterName",
"ImageName",
"Ipxe",
"RuntimeOverlay",
"SystemOverlay",
"Kernel.Version",
"Kernel.Args",
"Ipmi.UserName",
"Ipmi.Password",
"Ipmi.Ipaddr",
"Ipmi.Gateway",
"Ipmi.Netmask",
"Ipmi.Port",
"Ipmi.Interface",
"Ipmi.EscapeChar",
"Ipmi.Write",
"Ipmi.Template",
"Init",
"Root",
"NetDevs[default].Type",
"NetDevs[default].OnBoot",
"NetDevs[default].Device",
"NetDevs[default].Hwaddr",
"NetDevs[default].Ipaddr",
"NetDevs[default].Ipaddr6",
"NetDevs[default].Prefix",
"NetDevs[default].Netmask",
"NetDevs[default].Gateway",
"NetDevs[default].MTU",
"NetDevs[default].Tags[nettag]",
"Tags[tag]",
"PrimaryNetDev",
"Resources[resource]",
},
},
"profile": {
object: Profile{
Tags: map[string]string{
"tag": "value",
},
NetDevs: map[string]*NetDev{
"default": {
Tags: map[string]string{
"nettag": "netvalue",
},
},
},
Resources: map[string]Resource{
"resource": "resvalue",
},
},
fields: []string{
"Profiles",
"Comment",
"ClusterName",
"ImageName",
"Ipxe",
"RuntimeOverlay",
"SystemOverlay",
"Kernel.Version",
"Kernel.Args",
"Ipmi.UserName",
"Ipmi.Password",
"Ipmi.Ipaddr",
"Ipmi.Gateway",
"Ipmi.Netmask",
"Ipmi.Port",
"Ipmi.Interface",
"Ipmi.EscapeChar",
"Ipmi.Write",
"Ipmi.Template",
"Init",
"Root",
"NetDevs[default].Type",
"NetDevs[default].OnBoot",
"NetDevs[default].Device",
"NetDevs[default].Hwaddr",
"NetDevs[default].Ipaddr",
"NetDevs[default].Ipaddr6",
"NetDevs[default].Prefix",
"NetDevs[default].Netmask",
"NetDevs[default].Gateway",
"NetDevs[default].MTU",
"NetDevs[default].Tags[nettag]",
"Tags[tag]",
"PrimaryNetDev",
"Resources[resource]",
},
},
}
for name, tt := range tests {
t.Run(name, func(t *testing.T) {
assert.Equal(t, tt.fields, listFields(tt.object))
})
}
}
func Test_Field(t *testing.T) {
field := new(Field)
assert.Equal(t, "", field.Field)
assert.Equal(t, "", field.Source)
assert.Equal(t, "", field.Value)
field.Field = "test"
assert.Equal(t, "test", field.Field)
field.Set("", "value1")
assert.Equal(t, "", field.Source)
assert.Equal(t, "value1", field.Value)
field.Set("", "value2")
assert.Equal(t, "", field.Source)
assert.Equal(t, "value2", field.Value)
field.Set("source3", "value3")
assert.Equal(t, "source3", field.Source)
assert.Equal(t, "value3", field.Value)
field.Set("source4", "value4")
assert.Equal(t, "source4", field.Source)
assert.Equal(t, "value4", field.Value)
field.Set("", "value5")
assert.Equal(t, "SUPERSEDED", field.Source)
assert.Equal(t, "value5", field.Value)
}
func Test_fieldMap(t *testing.T) {
fieldMap := make(fieldMap)
assert.Equal(t, 0, len(fieldMap))
fieldMap.Set("field", "", "value1")
assert.Equal(t, "", fieldMap.Source("field"))
assert.Equal(t, "value1", fieldMap.Value("field"))
fieldMap.Set("field", "", "value2")
assert.Equal(t, "", fieldMap.Source("field"))
assert.Equal(t, "value2", fieldMap.Value("field"))
fieldMap.Set("field", "source3", "value3")
assert.Equal(t, "source3", fieldMap.Source("field"))
assert.Equal(t, "value3", fieldMap.Value("field"))
fieldMap.Set("field", "source4", "value4")
assert.Equal(t, "source4", fieldMap.Source("field"))
assert.Equal(t, "value4", fieldMap.Value("field"))
fieldMap.Set("field", "", "value5")
assert.Equal(t, "SUPERSEDED", fieldMap.Source("field"))
assert.Equal(t, "value5", fieldMap.Value("field"))
}