From 3c01728aa5f8e3d2d86fb5e7893df34df66cc0b5 Mon Sep 17 00:00:00 2001 From: MatthewHink Date: Thu, 7 Apr 2022 16:32:26 -0400 Subject: [PATCH 1/5] Fix 365. Nil checks around pointers in nodes.conf. --- internal/pkg/node/constructors.go | 66 +++++++++++++++++++------------ 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index 906e4ed3..2b991867 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -67,6 +67,10 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { 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 +87,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 != nil { if node.Kernel.Override != "" { - n.Kernel.Override.Set(node.Kernel.Override) - } else if node.Kernel.Version != "" { - n.Kernel.Override.Set(node.Kernel.Version) + 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 +189,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 { From 49bb9a40f0af5007e66c478098c2e006eee50858 Mon Sep 17 00:00:00 2001 From: Christian Goll Date: Fri, 8 Apr 2022 13:41:27 +0200 Subject: [PATCH 2/5] reserve memory ofr kernel and ipmi entry --- internal/pkg/node/constructors.go | 4 +++- internal/pkg/node/methods.go | 10 ++++++++++ internal/pkg/node/modifiers.go | 31 ++++++++++++++++++++----------- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index 2b991867..26ec2cce 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -62,6 +62,8 @@ 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") @@ -110,7 +112,7 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { n.Discoverable.Set(node.Discoverable) if node.Kernel != nil { - if node.Kernel.Override != "" { + if node.Kernel.Override != "" { n.Kernel.Override.Set(node.Kernel.Override) } else if node.Kernel.Version != "" { n.Kernel.Override.Set(node.Kernel.Version) diff --git a/internal/pkg/node/methods.go b/internal/pkg/node/methods.go index 9b2dde52..1c3e4607 100644 --- a/internal/pkg/node/methods.go +++ b/internal/pkg/node/methods.go @@ -209,6 +209,16 @@ func (ent *Entry) GetRealSlice() []string { return ent.value } +/* +true if the entry has set a real value, else false. +*/ +func (ent *Entry) GotReal() bool { + if len(ent.value) == 0 { + return false + } + return true +} + /********** * * 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() From 197c663a979eb09b262fa093213940432596e75b Mon Sep 17 00:00:00 2001 From: Christian Goll Date: Fri, 8 Apr 2022 15:01:14 +0200 Subject: [PATCH 3/5] memory for Ipmi and Kernel Entry FindAllProfiles --- internal/pkg/node/constructors.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index 26ec2cce..be8c2910 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -289,7 +289,8 @@ 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) From ae2b1ce2ae1d49ded94d2e3f909465c9e57f392c Mon Sep 17 00:00:00 2001 From: Christian Goll Date: Fri, 8 Apr 2022 15:06:40 +0200 Subject: [PATCH 4/5] check for nil vaule of Kernel and Impi --- internal/pkg/node/constructors.go | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index be8c2910..3c2f68e8 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -297,26 +297,29 @@ func (config *nodeYaml) FindAllProfiles() ([]NodeInfo, error) { 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 From fa052a0f57bb7029dbde2a65844794aa09df29e6 Mon Sep 17 00:00:00 2001 From: Christian Goll Date: Fri, 8 Apr 2022 15:15:16 +0200 Subject: [PATCH 5/5] simplified GotReal --- internal/pkg/node/methods.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/internal/pkg/node/methods.go b/internal/pkg/node/methods.go index 1c3e4607..b9a2ebca 100644 --- a/internal/pkg/node/methods.go +++ b/internal/pkg/node/methods.go @@ -213,10 +213,7 @@ func (ent *Entry) GetRealSlice() []string { true if the entry has set a real value, else false. */ func (ent *Entry) GotReal() bool { - if len(ent.value) == 0 { - return false - } - return true + return len(ent.value) != 0 } /**********