80 lines
2.4 KiB
Go
80 lines
2.4 KiB
Go
package apinode
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
"strings"
|
|
|
|
"github.com/hpcng/warewulf/internal/pkg/api/routes/wwapiv1"
|
|
"github.com/hpcng/warewulf/internal/pkg/node"
|
|
)
|
|
|
|
/*
|
|
Get the all the fields of a NodeInfo, keys are the lopt of NodeConf.
|
|
func GetFields(n interface{}) map[string]*wwapiv1.NodeField {
|
|
return getFieldsOf(n, node.NodeConf{})
|
|
}
|
|
*/
|
|
|
|
func GetFields(n interface{}) map[string]*wwapiv1.NodeField {
|
|
nodeType := reflect.TypeOf(n)
|
|
nodeVal := reflect.ValueOf(n)
|
|
fieldMap := make(map[string]*wwapiv1.NodeField)
|
|
for i := 0; i < nodeType.NumField(); i++ {
|
|
switch nodeType.Field(i).Type {
|
|
case reflect.TypeOf(node.Entry{}):
|
|
var myField wwapiv1.NodeField
|
|
entry := nodeVal.Field(i).Interface().(node.Entry)
|
|
myField.Source = entry.Source()
|
|
myField.Value = entry.Get()
|
|
myField.Print = entry.Print()
|
|
fieldMap[nodeType.Field(i).Name] = &myField
|
|
case reflect.TypeOf([]string{}):
|
|
var myField wwapiv1.NodeField
|
|
entry := nodeVal.Field(i).Interface().([]string)
|
|
if len(entry) == 0 {
|
|
myField.Value = node.NoValue
|
|
myField.Print = node.NoValue
|
|
myField.Source = node.NoValue
|
|
} else {
|
|
myField.Value = strings.Join(entry, ",")
|
|
myField.Print = strings.Join(entry, ",")
|
|
myField.Source = node.NoValue
|
|
fieldMap[nodeType.Field(i).Name] = &myField
|
|
}
|
|
case reflect.TypeOf((*node.KernelEntry)(nil)):
|
|
entry := nodeVal.Field(i).Elem().Interface().(node.KernelEntry)
|
|
kernelMap := GetFields(entry)
|
|
for key, val := range kernelMap {
|
|
fieldMap["KernelEntry:"+key] = val
|
|
}
|
|
case reflect.TypeOf((*node.IpmiEntry)(nil)):
|
|
entry := nodeVal.Field(i).Elem().Interface().(node.IpmiEntry)
|
|
kernelMap := GetFields(entry)
|
|
for key, val := range kernelMap {
|
|
fieldMap["IpmiEntry:"+key] = val
|
|
}
|
|
case reflect.TypeOf(map[string]*node.Entry(nil)):
|
|
keyMap := nodeVal.Field(i).Interface().(map[string]*node.Entry)
|
|
for key, entr := range keyMap {
|
|
var myField wwapiv1.NodeField
|
|
myField.Source = entr.Source()
|
|
myField.Value = entr.Get()
|
|
myField.Print = entr.Print()
|
|
fieldMap["key:"+key] = &myField
|
|
}
|
|
case reflect.TypeOf(map[string]*node.NetDevEntry(nil)):
|
|
netMap := nodeVal.Field(i).Interface().(map[string]*node.NetDevEntry)
|
|
for net, netdev := range netMap {
|
|
netMapEntr := GetFields(*netdev)
|
|
for key, val := range netMapEntr {
|
|
fieldMap["NetDevEntry:"+net+":"+key] = val
|
|
}
|
|
}
|
|
default:
|
|
panic(fmt.Sprintf("Can't handle: %s\n", nodeType.Field(i).Type))
|
|
}
|
|
}
|
|
return fieldMap
|
|
}
|