added code for setting default values for NetDev
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user