From 91e032d7a204053d2750fc62f0b8f22212fedd58 Mon Sep 17 00:00:00 2001 From: Christian Goll Date: Fri, 30 Sep 2022 14:55:19 +0200 Subject: [PATCH] added code for setting default values for NetDev --- internal/pkg/node/constructors.go | 45 ++++++++++++-------- internal/pkg/node/transformers.go | 68 +++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 16 deletions(-) diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index 1ea70def..8e1e125c 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -18,16 +18,22 @@ var DefaultConfig string // used as fallback if DefaultConfig can't be read var FallBackConf = ` -runtime overlay: -- generic -system overlay: -- wwinit -kernel: - args: quiet crashkernel=no vga=791 -init: /sbin/init -root: initramfs -profiles: -- default` +defaultnode: + runtime overlay: + - generic + system overlay: + - wwinit + kernel: + args: quiet crashkernel=no vga=791 + init: /sbin/init + root: initramfs + profiles: + - default + network devices: + dummy: + device: eth0 + type: ethernet + netmask: 255.255.255.0` func init() { if ConfigFile == "" { @@ -71,8 +77,7 @@ func (config *NodeYaml) FindAllNodes() ([]NodeInfo, error) { return ret, err } */ - var defConf NodeConf - readBuildin := false + var defConf map[string]*NodeConf wwlog.Verbose("Opening defaults failed %s\n", DefaultConfig) defData, err := ioutil.ReadFile(DefaultConfig) if err != nil { @@ -81,16 +86,20 @@ func (config *NodeYaml) FindAllNodes() ([]NodeInfo, error) { wwlog.Debug("Unmarshalling default config\n") err = yaml.Unmarshal(defData, &defConf) if err != nil { - readBuildin = true wwlog.Verbose("Couldn't unmarshall defaults from file :%s\n", err) - } - if readBuildin { wwlog.Verbose("Using building defaults") err = yaml.Unmarshal([]byte(FallBackConf), &defConf) if err != nil { wwlog.Warn("Could not get any defaults") } } + var defConfNet *NetDevs + if _, ok := defConf["defaultnode"]; ok { + if _, ok := defConf["defaultnode"].NetDevs["dummy"]; ok { + defConfNet = defConf["defaultnode"].NetDevs["dummy"] + } + defConf["defaultnode"].NetDevs = nil + } wwlog.Debug("Finding all nodes...\n") for nodename, node := range config.Nodes { @@ -101,7 +110,7 @@ func (config *NodeYaml) FindAllNodes() ([]NodeInfo, error) { n.Tags = make(map[string]*Entry) n.Kernel = new(KernelEntry) n.Ipmi = new(IpmiEntry) - n.SetDefFrom(&defConf) + n.SetDefFrom(defConf["defaultnode"]) fullname := strings.SplitN(nodename, ".", 2) if len(fullname) > 1 { n.ClusterName.SetDefault(fullname[1]) @@ -120,6 +129,10 @@ func (config *NodeYaml) FindAllNodes() ([]NodeInfo, error) { delete(node.Keys, keyname) } n.SetFrom(node) + // only now the netdevs start to exist so that default values can be set + for _, netdev := range n.NetDevs { + netdev.SetDefFrom(defConfNet) + } // set default/primary network is just one network exist if len(n.NetDevs) == 1 { // only way to get the key diff --git a/internal/pkg/node/transformers.go b/internal/pkg/node/transformers.go index 86177650..8ba52b68 100644 --- a/internal/pkg/node/transformers.go +++ b/internal/pkg/node/transformers.go @@ -452,3 +452,71 @@ func (info *NodeConf) Flatten() { } } } + +/* +Populates all fields of NetDevEntry with Set from the +values of NetDevs. +Actually not used, just for completeness. +*/ +func (netDev *NetDevEntry) SetFrom(netYaml *NetDevs) { + setWrap := func(entr *Entry, val string, nameArg string) { + entr.Set(val) + } + setSliceWrap := func(entr *Entry, val []string, nameArg string) { + entr.SetSlice(val) + } + netDev.setterFrom(netYaml, "", setWrap, setSliceWrap) +} + +/* +Populates all fields of NetDevEntry with SetAlt from the +values of NetDevs. The string profileName is used to +destermine from which source/NodeInfo the entry came +from. +Actually not used, just for completeness. +*/ +func (netDev *NetDevEntry) SetAltFrom(netYaml *NetDevs, profileName string) { + netDev.setterFrom(netYaml, profileName, (*Entry).SetAlt, (*Entry).SetAltSlice) +} + +/* +Populates all fields of NodeInfo with SetDefault from the +values of NodeConf. +*/ +func (netDev *NetDevEntry) SetDefFrom(netYaml *NetDevs) { + setWrap := func(entr *Entry, val string, nameArg string) { + entr.SetDefault(val) + } + setSliceWrap := func(entr *Entry, val []string, nameArg string) { + entr.SetDefaultSlice(val) + } + netDev.setterFrom(netYaml, "", setWrap, setSliceWrap) +} + +/* +Abstract function for setting a NetDevEntry from a NetDevs +*/ +func (netDev *NetDevEntry) setterFrom(netYaml *NetDevs, nameArg string, + setter func(*Entry, string, string), + setterSlice func(*Entry, []string, string)) { + netValues := reflect.ValueOf(netDev) + netInfoType := reflect.TypeOf(*netYaml) + netInfoVal := reflect.ValueOf(*netYaml) + for j := 0; j < netInfoType.NumField(); j++ { + netVal := netValues.Elem().FieldByName(netInfoType.Field(j).Name) + if netVal.IsValid() { + if netInfoVal.Field(j).Type().Kind() == reflect.String { + setter(netVal.Addr().Interface().((*Entry)), netInfoVal.Field(j).String(), nameArg) + } else if netVal.Type() == reflect.TypeOf(map[string]string{}) { + // danger zone following code is not tested + for key, val := range (netVal.Interface()).(map[string]string) { + //netTagMap := netInfoVal.Elem().Field(j).Interface().((map[string](*Entry))) + if _, ok := netInfoVal.Elem().Field(j).Interface().((map[string](*Entry)))[key]; !ok { + netInfoVal.Elem().Field(j).Interface().((map[string](*Entry)))[key] = new(Entry) + } + setter(netInfoVal.Elem().Field(j).Interface().((map[string](*Entry)))[key], val, nameArg) + } + } + } + } +}