diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index 906e4ed3..3c2f68e8 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -62,11 +62,17 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { wwlog.Printf(wwlog.DEBUG, "In node loop: %s\n", nodename) n.NetDevs = make(map[string]*NetDevEntry) n.Tags = make(map[string]*Entry) + n.Kernel = new(KernelEntry) + n.Ipmi = new(IpmiEntry) n.SystemOverlay.SetDefault("wwinit") n.RuntimeOverlay.SetDefault("generic") n.Ipxe.SetDefault("default") n.Init.SetDefault("/sbin/init") n.Root.SetDefault("initramfs") + + if n.Kernel == nil { + n.Kernel = &KernelEntry{} + } n.Kernel.Args.SetDefault("quiet crashkernel=no vga=791") fullname := strings.SplitN(nodename, ".", 2) @@ -83,28 +89,34 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { n.Id.Set(nodename) n.Comment.Set(node.Comment) n.ContainerName.Set(node.ContainerName) - n.Kernel.Args.Set(node.Kernel.Args) + if node.Kernel != nil { + n.Kernel.Args.Set(node.Kernel.Args) + } n.ClusterName.Set(node.ClusterName) n.Ipxe.Set(node.Ipxe) n.Init.Set(node.Init) - n.Ipmi.Ipaddr.Set(node.Ipmi.Ipaddr) - n.Ipmi.Netmask.Set(node.Ipmi.Netmask) - n.Ipmi.Port.Set(node.Ipmi.Port) - n.Ipmi.Gateway.Set(node.Ipmi.Gateway) - n.Ipmi.UserName.Set(node.Ipmi.UserName) - n.Ipmi.Password.Set(node.Ipmi.Password) - n.Ipmi.Interface.Set(node.Ipmi.Interface) - n.Ipmi.Write.SetB(node.Ipmi.Write) + if node.Ipmi != nil { + n.Ipmi.Ipaddr.Set(node.Ipmi.Ipaddr) + n.Ipmi.Netmask.Set(node.Ipmi.Netmask) + n.Ipmi.Port.Set(node.Ipmi.Port) + n.Ipmi.Gateway.Set(node.Ipmi.Gateway) + n.Ipmi.UserName.Set(node.Ipmi.UserName) + n.Ipmi.Password.Set(node.Ipmi.Password) + n.Ipmi.Interface.Set(node.Ipmi.Interface) + n.Ipmi.Write.SetB(node.Ipmi.Write) + } n.SystemOverlay.SetSlice(node.SystemOverlay) n.RuntimeOverlay.SetSlice(node.RuntimeOverlay) n.Root.Set(node.Root) n.AssetKey.Set(node.AssetKey) n.Discoverable.Set(node.Discoverable) - if node.Kernel.Override != "" { - n.Kernel.Override.Set(node.Kernel.Override) - } else if node.Kernel.Version != "" { - n.Kernel.Override.Set(node.Kernel.Version) + if node.Kernel != nil { + if node.Kernel.Override != "" { + n.Kernel.Override.Set(node.Kernel.Override) + } else if node.Kernel.Version != "" { + n.Kernel.Override.Set(node.Kernel.Version) + } } for devname, netdev := range node.NetDevs { @@ -179,27 +191,33 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { n.Comment.SetAlt(config.NodeProfiles[p].Comment, p) n.ClusterName.SetAlt(config.NodeProfiles[p].ClusterName, p) n.ContainerName.SetAlt(config.NodeProfiles[p].ContainerName, p) - n.Kernel.Args.SetAlt(config.NodeProfiles[p].Kernel.Args, p) + if config.NodeProfiles[p].Kernel != nil { + n.Kernel.Args.SetAlt(config.NodeProfiles[p].Kernel.Args, p) + } n.Ipxe.SetAlt(config.NodeProfiles[p].Ipxe, p) n.Init.SetAlt(config.NodeProfiles[p].Init, p) - n.Ipmi.Ipaddr.SetAlt(config.NodeProfiles[p].Ipmi.Ipaddr, p) - n.Ipmi.Netmask.SetAlt(config.NodeProfiles[p].Ipmi.Netmask, p) - n.Ipmi.Port.SetAlt(config.NodeProfiles[p].Ipmi.Port, p) - n.Ipmi.Gateway.SetAlt(config.NodeProfiles[p].Ipmi.Gateway, p) - n.Ipmi.UserName.SetAlt(config.NodeProfiles[p].Ipmi.UserName, p) - n.Ipmi.Password.SetAlt(config.NodeProfiles[p].Ipmi.Password, p) - n.Ipmi.Interface.SetAlt(config.NodeProfiles[p].Ipmi.Interface, p) - n.Ipmi.Write.SetB(config.NodeProfiles[p].Ipmi.Write) + if config.NodeProfiles[p].Ipmi != nil { + n.Ipmi.Ipaddr.SetAlt(config.NodeProfiles[p].Ipmi.Ipaddr, p) + n.Ipmi.Netmask.SetAlt(config.NodeProfiles[p].Ipmi.Netmask, p) + n.Ipmi.Port.SetAlt(config.NodeProfiles[p].Ipmi.Port, p) + n.Ipmi.Gateway.SetAlt(config.NodeProfiles[p].Ipmi.Gateway, p) + n.Ipmi.UserName.SetAlt(config.NodeProfiles[p].Ipmi.UserName, p) + n.Ipmi.Password.SetAlt(config.NodeProfiles[p].Ipmi.Password, p) + n.Ipmi.Interface.SetAlt(config.NodeProfiles[p].Ipmi.Interface, p) + n.Ipmi.Write.SetB(config.NodeProfiles[p].Ipmi.Write) + } n.SystemOverlay.SetAltSlice(config.NodeProfiles[p].SystemOverlay, p) n.RuntimeOverlay.SetAltSlice(config.NodeProfiles[p].RuntimeOverlay, p) n.Root.SetAlt(config.NodeProfiles[p].Root, p) n.AssetKey.SetAlt(config.NodeProfiles[p].AssetKey, p) n.Discoverable.SetAlt(config.NodeProfiles[p].Discoverable, p) - if config.NodeProfiles[p].Kernel.Override != "" { - n.Kernel.Override.SetAlt(config.NodeProfiles[p].Kernel.Override, p) - } else if config.NodeProfiles[p].Kernel.Version != "" { - n.Kernel.Override.SetAlt(config.NodeProfiles[p].Kernel.Version, p) + if config.NodeProfiles[p].Kernel != nil { + if config.NodeProfiles[p].Kernel.Override != "" { + n.Kernel.Override.SetAlt(config.NodeProfiles[p].Kernel.Override, p) + } else if config.NodeProfiles[p].Kernel.Version != "" { + n.Kernel.Override.SetAlt(config.NodeProfiles[p].Kernel.Version, p) + } } for devname, netdev := range config.NodeProfiles[p].NetDevs { @@ -271,33 +289,37 @@ func (config *nodeYaml) FindAllProfiles() ([]NodeInfo, error) { var p NodeInfo p.NetDevs = make(map[string]*NetDevEntry) p.Tags = make(map[string]*Entry) - + p.Kernel = new(KernelEntry) + p.Ipmi = new(IpmiEntry) p.Id.Set(name) p.Comment.Set(profile.Comment) p.ClusterName.Set(profile.ClusterName) p.ContainerName.Set(profile.ContainerName) p.Ipxe.Set(profile.Ipxe) p.Init.Set(profile.Init) - p.Kernel.Args.Set(profile.Kernel.Args) - p.Ipmi.Netmask.Set(profile.Ipmi.Netmask) - p.Ipmi.Port.Set(profile.Ipmi.Port) - p.Ipmi.Gateway.Set(profile.Ipmi.Gateway) - p.Ipmi.UserName.Set(profile.Ipmi.UserName) - p.Ipmi.Password.Set(profile.Ipmi.Password) - p.Ipmi.Interface.Set(profile.Ipmi.Interface) - p.Ipmi.Write.SetB(profile.Ipmi.Write) + if profile.Kernel != nil { + p.Kernel.Args.Set(profile.Kernel.Args) + if profile.Kernel.Override != "" { + p.Kernel.Override.Set(profile.Kernel.Override) + } else if profile.Kernel.Version != "" { + p.Kernel.Override.Set(profile.Kernel.Version) + } + } + if profile.Ipmi != nil { + p.Ipmi.Netmask.Set(profile.Ipmi.Netmask) + p.Ipmi.Port.Set(profile.Ipmi.Port) + p.Ipmi.Gateway.Set(profile.Ipmi.Gateway) + p.Ipmi.UserName.Set(profile.Ipmi.UserName) + p.Ipmi.Password.Set(profile.Ipmi.Password) + p.Ipmi.Interface.Set(profile.Ipmi.Interface) + p.Ipmi.Write.SetB(profile.Ipmi.Write) + } p.RuntimeOverlay.SetSlice(profile.RuntimeOverlay) p.SystemOverlay.SetSlice(profile.SystemOverlay) p.Root.Set(profile.Root) p.AssetKey.Set(profile.AssetKey) p.Discoverable.Set(profile.Discoverable) - if profile.Kernel.Override != "" { - p.Kernel.Override.Set(profile.Kernel.Override) - } else if profile.Kernel.Version != "" { - p.Kernel.Override.Set(profile.Kernel.Version) - } - for devname, netdev := range profile.NetDevs { if _, ok := p.NetDevs[devname]; !ok { var netdev NetDevEntry diff --git a/internal/pkg/node/methods.go b/internal/pkg/node/methods.go index 9b2dde52..b9a2ebca 100644 --- a/internal/pkg/node/methods.go +++ b/internal/pkg/node/methods.go @@ -209,6 +209,13 @@ func (ent *Entry) GetRealSlice() []string { return ent.value } +/* +true if the entry has set a real value, else false. +*/ +func (ent *Entry) GotReal() bool { + return len(ent.value) != 0 +} + /********** * * Misc diff --git a/internal/pkg/node/modifiers.go b/internal/pkg/node/modifiers.go index 7f48f8f6..9420e696 100644 --- a/internal/pkg/node/modifiers.go +++ b/internal/pkg/node/modifiers.go @@ -28,10 +28,11 @@ func (config *nodeYaml) AddNode(nodeID string) (NodeInfo, error) { config.Nodes[nodeID] = &node config.Nodes[nodeID].Profiles = []string{"default"} config.Nodes[nodeID].NetDevs = make(map[string]*NetDevs) - n.Id.Set(nodeID) n.Profiles = []string{"default"} n.NetDevs = make(map[string]*NetDevEntry) + n.Ipmi = new(IpmiEntry) + n.Kernel = new(KernelEntry) return n, nil } @@ -60,16 +61,24 @@ func (config *nodeYaml) NodeUpdate(node NodeInfo) error { config.Nodes[nodeID].ClusterName = node.ClusterName.GetReal() config.Nodes[nodeID].Ipxe = node.Ipxe.GetReal() config.Nodes[nodeID].Init = node.Init.GetReal() - config.Nodes[nodeID].Kernel.Override = node.Kernel.Override.GetReal() - config.Nodes[nodeID].Kernel.Args = node.Kernel.Args.GetReal() - config.Nodes[nodeID].Ipmi.Ipaddr = node.Ipmi.Ipaddr.GetReal() - config.Nodes[nodeID].Ipmi.Netmask = node.Ipmi.Netmask.GetReal() - config.Nodes[nodeID].Ipmi.Port = node.Ipmi.Port.GetReal() - config.Nodes[nodeID].Ipmi.Gateway = node.Ipmi.Gateway.GetReal() - config.Nodes[nodeID].Ipmi.UserName = node.Ipmi.UserName.GetReal() - config.Nodes[nodeID].Ipmi.Password = node.Ipmi.Password.GetReal() - config.Nodes[nodeID].Ipmi.Interface = node.Ipmi.Interface.GetReal() - config.Nodes[nodeID].Ipmi.Write = node.Ipmi.Write.GetB() + if node.Kernel.Override.GotReal() || node.Kernel.Args.GotReal() { + config.Nodes[nodeID].Kernel = new(KernelConf) + config.Nodes[nodeID].Kernel.Override = node.Kernel.Override.GetReal() + config.Nodes[nodeID].Kernel.Args = node.Kernel.Args.GetReal() + } + if node.Ipmi.Ipaddr.GotReal() || node.Ipmi.Netmask.GotReal() || + node.Ipmi.Port.GotReal() || node.Ipmi.Gateway.GotReal() || node.Ipmi.UserName.GotReal() || + node.Ipmi.Password.GotReal() || node.Ipmi.Interface.GotReal() || node.Ipmi.Write.GotReal() { + config.Nodes[nodeID].Ipmi = new(IpmiConf) + config.Nodes[nodeID].Ipmi.Ipaddr = node.Ipmi.Ipaddr.GetReal() + config.Nodes[nodeID].Ipmi.Netmask = node.Ipmi.Netmask.GetReal() + config.Nodes[nodeID].Ipmi.Port = node.Ipmi.Port.GetReal() + config.Nodes[nodeID].Ipmi.Gateway = node.Ipmi.Gateway.GetReal() + config.Nodes[nodeID].Ipmi.UserName = node.Ipmi.UserName.GetReal() + config.Nodes[nodeID].Ipmi.Password = node.Ipmi.Password.GetReal() + config.Nodes[nodeID].Ipmi.Interface = node.Ipmi.Interface.GetReal() + config.Nodes[nodeID].Ipmi.Write = node.Ipmi.Write.GetB() + } config.Nodes[nodeID].RuntimeOverlay = node.RuntimeOverlay.GetRealSlice() config.Nodes[nodeID].SystemOverlay = node.SystemOverlay.GetRealSlice() config.Nodes[nodeID].Root = node.Root.GetReal()