Data format changes and updated API for NodesDB

This commit is contained in:
Gregory Kurtzer
2020-12-01 23:33:01 -08:00
parent 442fc41f1b
commit 7516cca031
5 changed files with 226 additions and 180 deletions

View File

@@ -6,7 +6,7 @@ nodeprofiles:
kernel args: crashkernel=no quiet
control:
headnode01:
localhost:
comment: This is the first control system
ipaddr: 192.168.1.1
services:

View File

@@ -41,21 +41,21 @@ func (self *nodeYaml) FindAllNodes() ([]NodeInfo, error) {
continue
}
n.Id.Set(nodename)
n.Gid.Set(groupname)
n.Cid.Set(controllername)
n.HostName.Set(node.Hostname)
n.IpmiIpaddr.Set(node.IpmiIpaddr)
n.IpmiNetmask.Set(node.IpmiNetmask)
n.DomainName.Set(node.DomainName)
n.Vnfs.Set(node.Vnfs)
n.KernelVersion.Set(node.KernelVersion)
n.KernelArgs.Set(node.KernelArgs)
n.Ipxe.Set(node.Ipxe)
n.IpmiUserName.Set(node.IpmiUserName)
n.IpmiPassword.Set(node.IpmiPassword)
n.SystemOverlay.Set(node.SystemOverlay)
n.RuntimeOverlay.Set(node.RuntimeOverlay)
n.Id.SetNode(nodename)
n.Gid.SetNode(groupname)
n.Cid.SetNode(controllername)
n.HostName.SetNode(node.Hostname)
n.IpmiIpaddr.SetNode(node.IpmiIpaddr)
n.IpmiNetmask.SetNode(node.IpmiNetmask)
n.DomainName.SetNode(node.DomainName)
n.Vnfs.SetNode(node.Vnfs)
n.KernelVersion.SetNode(node.KernelVersion)
n.KernelArgs.SetNode(node.KernelArgs)
n.Ipxe.SetNode(node.Ipxe)
n.IpmiUserName.SetNode(node.IpmiUserName)
n.IpmiPassword.SetNode(node.IpmiPassword)
n.SystemOverlay.SetNode(node.SystemOverlay)
n.RuntimeOverlay.SetNode(node.RuntimeOverlay)
n.DomainName.SetGroup(group.DomainName)
n.Vnfs.SetGroup(group.Vnfs)
@@ -98,9 +98,9 @@ func (self *nodeYaml) FindAllNodes() ([]NodeInfo, error) {
}
if n.DomainName.Defined() == true {
n.Fqdn.Set(node.Hostname + "." + n.DomainName.Get())
n.Fqdn.SetNode(node.Hostname + "." + n.DomainName.Get())
} else {
n.Fqdn.Set(node.Hostname)
n.Fqdn.SetNode(node.Hostname)
}
n.NetDevs = node.NetDevs
@@ -120,21 +120,39 @@ func (self *nodeYaml) FindAllGroups() ([]GroupInfo, error) {
for groupname, group := range controller.NodeGroups {
var g GroupInfo
g.Id = groupname
g.Cid = controllername
g.DomainName = group.DomainName
g.Comment = group.Comment
g.Vnfs = group.Vnfs
g.KernelVersion = group.KernelVersion
g.KernelArgs = group.KernelArgs
g.IpmiNetmask = group.IpmiNetmask
g.IpmiPassword = group.IpmiPassword
g.IpmiUserName = group.IpmiUserName
g.SystemOverlay = group.SystemOverlay
g.RuntimeOverlay = group.RuntimeOverlay
g.Id.SetGroup(groupname)
g.Cid.SetGroup(controllername)
g.DomainName.SetGroup(group.DomainName)
g.Comment.SetGroup(group.Comment)
g.Vnfs.SetGroup(group.Vnfs)
g.KernelVersion.SetGroup(group.KernelVersion)
g.KernelArgs.SetGroup(group.KernelArgs)
g.IpmiNetmask.SetGroup(group.IpmiNetmask)
g.IpmiPassword.SetGroup(group.IpmiPassword)
g.IpmiUserName.SetGroup(group.IpmiUserName)
g.SystemOverlay.SetGroup(group.SystemOverlay)
g.RuntimeOverlay.SetGroup(group.RuntimeOverlay)
g.Profiles = group.Profiles
for _, p := range group.Profiles {
if _, ok := self.NodeProfiles[p]; !ok {
wwlog.Printf(wwlog.WARN, "Profile not found for group '%s': %s\n", groupname, p)
continue
}
g.DomainName.SetProfile(self.NodeProfiles[p].DomainName)
g.Vnfs.SetProfile(self.NodeProfiles[p].Vnfs)
g.KernelVersion.SetProfile(self.NodeProfiles[p].KernelVersion)
g.KernelArgs.SetProfile(self.NodeProfiles[p].KernelArgs)
g.Ipxe.SetProfile(self.NodeProfiles[p].Ipxe)
g.IpmiNetmask.SetProfile(self.NodeProfiles[p].IpmiNetmask)
g.IpmiUserName.SetProfile(self.NodeProfiles[p].IpmiUserName)
g.IpmiPassword.SetProfile(self.NodeProfiles[p].IpmiPassword)
g.SystemOverlay.SetProfile(self.NodeProfiles[p].SystemOverlay)
g.RuntimeOverlay.SetProfile(self.NodeProfiles[p].RuntimeOverlay)
}
// TODO: Validate or die on all inputs
ret = append(ret, g)

View File

@@ -118,32 +118,32 @@ type NetDevs struct {
* Code internal data representations
******/
type NodeInfoEntry struct {
value string
profile string
group string
controller string
def string
type Entry struct {
Node string
Profile string
Group string
Controller string
Default string
}
type NodeInfo struct {
Id NodeInfoEntry
Gid NodeInfoEntry
Cid NodeInfoEntry
Comment NodeInfoEntry
HostName NodeInfoEntry
Fqdn NodeInfoEntry
DomainName NodeInfoEntry
Vnfs NodeInfoEntry
Ipxe NodeInfoEntry
KernelVersion NodeInfoEntry
KernelArgs NodeInfoEntry
IpmiIpaddr NodeInfoEntry
IpmiNetmask NodeInfoEntry
IpmiUserName NodeInfoEntry
IpmiPassword NodeInfoEntry
RuntimeOverlay NodeInfoEntry
SystemOverlay NodeInfoEntry
Id Entry
Gid Entry
Cid Entry
Comment Entry
HostName Entry
Fqdn Entry
DomainName Entry
Vnfs Entry
Ipxe Entry
KernelVersion Entry
KernelArgs Entry
IpmiIpaddr Entry
IpmiNetmask Entry
IpmiUserName Entry
IpmiPassword Entry
RuntimeOverlay Entry
SystemOverlay Entry
Profiles []string
GroupProfiles []string
NetDevs map[string]*NetDevs
@@ -191,19 +191,19 @@ type ControllerInfo struct {
}
type GroupInfo struct {
Id string
Cid string
Comment string
Vnfs string
Ipxe string
KernelVersion string
KernelArgs string
IpmiNetmask string
IpmiUserName string
IpmiPassword string
DomainName string
RuntimeOverlay string
SystemOverlay string
Id Entry
Cid Entry
Comment Entry
Vnfs Entry
Ipxe Entry
KernelVersion Entry
KernelArgs Entry
IpmiNetmask Entry
IpmiUserName Entry
IpmiPassword Entry
DomainName Entry
RuntimeOverlay Entry
SystemOverlay Entry
Profiles []string
}

View File

@@ -4,64 +4,64 @@ import (
"strings"
)
func (self *NodeInfoEntry) String() string {
if self.value != "" {
return self.value
func (self *Entry) Print() string {
if self.Node != "" {
return self.Node
}
if self.group != "" {
return self.group
if self.Group != "" {
return self.Group
}
if self.profile != "" {
return self.profile
if self.Profile != "" {
return self.Profile
}
if self.controller != "" {
return self.controller
if self.Controller != "" {
return self.Controller
}
if self.def != "" {
return self.def
if self.Default != "" {
return self.Default
}
return "--"
}
func (self *NodeInfoEntry) Source() string {
if self.value != "" {
func (self *Entry) Source() string {
if self.Node != "" {
return "node"
}
if self.group != "" {
if self.Group != "" {
return "group"
}
if self.profile != "" {
if self.Profile != "" {
return "profile"
}
if self.controller != "" {
if self.Controller != "" {
return "controller"
}
if self.def != "" {
if self.Default != "" {
return "default"
}
return ""
}
func (self *NodeInfoEntry) Get() string {
if self.value != "" {
return self.value
func (self *Entry) Get() string {
if self.Node != "" {
return self.Node
}
if self.group != "" {
return self.group
if self.Group != "" {
return self.Group
}
if self.profile != "" {
return self.profile
if self.Profile != "" {
return self.Profile
}
if self.controller != "" {
return self.controller
if self.Controller != "" {
return self.Controller
}
if self.def != "" {
return self.def
if self.Default != "" {
return self.Default
}
return ""
}
func (self *NodeInfoEntry) Defined() bool {
func (self *Entry) Defined() bool {
if self.Get() == "" {
return false
}
@@ -69,47 +69,67 @@ func (self *NodeInfoEntry) Defined() bool {
return true
}
func (self *NodeInfoEntry) SetDefault(value string) {
if value == "" {
return
}
self.def = value
}
func (self *NodeInfoEntry) SetGroup(value string) {
if value == "" {
return
}
self.group = value
}
func (self *NodeInfoEntry) SetProfile(value string) {
if value == "" {
return
}
self.profile = value
}
func (self *NodeInfoEntry) SetController(value string) {
if value == "" {
return
}
self.controller = value
}
func (self *NodeInfoEntry) Set(value string) {
func (self *Entry) SetDefault(value string) {
if value == "" {
return
} else if strings.ToUpper(value) == "UNDEF" {
value = ""
}
self.value = value
self.Default = value
}
func (self *NodeInfoEntry) Unset() {
self.value = ""
func (self *Entry) SetGroup(value string) {
if value == "" {
return
} else if strings.ToUpper(value) == "UNDEF" {
value = ""
}
self.Group = value
}
func (self *NodeInfoEntry) GetReal() string {
return self.value
}
func (self *Entry) SetProfile(value string) {
if value == "" {
return
} else if strings.ToUpper(value) == "UNDEF" {
value = ""
}
self.Profile = value
}
func (self *Entry) SetController(value string) {
if value == "" {
return
} else if strings.ToUpper(value) == "UNDEF" {
value = ""
}
self.Controller = value
}
func (self *Entry) SetNode(value string) {
if value == "" {
return
} else if strings.ToUpper(value) == "UNDEF" {
value = ""
}
self.Node = value
}
func (self *Entry) GetNode() string {
return self.Node
}
func (self *Entry) GetGroup() string {
return self.Group
}
func (self *Entry) GetController() string {
return self.Controller
}
func (self *Entry) GetProfile() string {
return self.Profile
}
func (self *Entry) GetDefault() string {
return self.Default
}

View File

@@ -3,11 +3,19 @@ package node
import (
"github.com/hpcng/warewulf/internal/pkg/errors"
"github.com/hpcng/warewulf/internal/pkg/wwlog"
"strings"
"gopkg.in/yaml.v2"
"os"
)
func get2Set(input string) string {
if strings.ToUpper(input) == "UNDEF" {
return ""
}
return input
}
/****
*
* NODE MODIFIERS
@@ -74,18 +82,18 @@ func (self *nodeYaml) NodeUpdate(node NodeInfo) error {
return errors.New("Nodename does not exist in group: " + nodeID)
}
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].Hostname = node.HostName.GetReal()
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].Vnfs = node.Vnfs.GetReal()
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].DomainName = node.DomainName.GetReal()
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].Ipxe = node.Ipxe.GetReal()
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].KernelVersion = node.KernelVersion.GetReal()
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].KernelArgs = node.KernelArgs.GetReal()
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].IpmiIpaddr = node.IpmiIpaddr.GetReal()
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].IpmiNetmask = node.IpmiNetmask.GetReal()
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].IpmiUserName = node.IpmiUserName.GetReal()
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].IpmiPassword = node.IpmiPassword.GetReal()
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].RuntimeOverlay = node.RuntimeOverlay.GetReal()
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].SystemOverlay = node.SystemOverlay.GetReal()
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].Hostname = get2Set(node.HostName.GetNode())
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].Vnfs = get2Set(node.Vnfs.GetNode())
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].DomainName = get2Set(node.DomainName.GetNode())
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].Ipxe = get2Set(node.Ipxe.GetNode())
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].KernelVersion = get2Set(node.KernelVersion.GetNode())
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].KernelArgs = get2Set(node.KernelArgs.GetNode())
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].IpmiIpaddr = get2Set(node.IpmiIpaddr.GetNode())
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].IpmiNetmask = get2Set(node.IpmiNetmask.GetNode())
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].IpmiUserName = get2Set(node.IpmiUserName.GetNode())
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].IpmiPassword = get2Set(node.IpmiPassword.GetNode())
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].RuntimeOverlay = get2Set(node.RuntimeOverlay.GetNode())
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].SystemOverlay = get2Set(node.SystemOverlay.GetNode())
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].Profiles = node.Profiles
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].NetDevs = node.NetDevs
@@ -135,8 +143,8 @@ func (self *nodeYaml) DelGroup(controllerID string, groupID string) error {
}
func (self *nodeYaml) GroupUpdate(group GroupInfo) error {
controllerID := group.Cid
groupID := group.Id
controllerID := group.Cid.Get()
groupID := group.Id.Get()
if _, ok := self.Controllers[controllerID]; !ok {
return errors.New("Controller does not exist: " + controllerID)
@@ -146,16 +154,16 @@ func (self *nodeYaml) GroupUpdate(group GroupInfo) error {
return errors.New("Group does not exist: " + groupID)
}
self.Controllers[controllerID].NodeGroups[groupID].DomainName = group.DomainName
self.Controllers[controllerID].NodeGroups[groupID].Vnfs = group.Vnfs
self.Controllers[controllerID].NodeGroups[groupID].KernelVersion = group.KernelVersion
self.Controllers[controllerID].NodeGroups[groupID].KernelArgs = group.KernelArgs
self.Controllers[controllerID].NodeGroups[groupID].Ipxe = group.Ipxe
self.Controllers[controllerID].NodeGroups[groupID].IpmiNetmask = group.IpmiNetmask
self.Controllers[controllerID].NodeGroups[groupID].IpmiUserName = group.IpmiUserName
self.Controllers[controllerID].NodeGroups[groupID].IpmiPassword = group.IpmiPassword
self.Controllers[controllerID].NodeGroups[groupID].RuntimeOverlay = group.RuntimeOverlay
self.Controllers[controllerID].NodeGroups[groupID].SystemOverlay = group.SystemOverlay
self.Controllers[controllerID].NodeGroups[groupID].DomainName = group.DomainName.Get()
self.Controllers[controllerID].NodeGroups[groupID].Vnfs = group.Vnfs.Get()
self.Controllers[controllerID].NodeGroups[groupID].KernelVersion = group.KernelVersion.Get()
self.Controllers[controllerID].NodeGroups[groupID].KernelArgs = group.KernelArgs.Get()
self.Controllers[controllerID].NodeGroups[groupID].Ipxe = group.Ipxe.Get()
self.Controllers[controllerID].NodeGroups[groupID].IpmiNetmask = group.IpmiNetmask.Get()
self.Controllers[controllerID].NodeGroups[groupID].IpmiUserName = group.IpmiUserName.Get()
self.Controllers[controllerID].NodeGroups[groupID].IpmiPassword = group.IpmiPassword.Get()
self.Controllers[controllerID].NodeGroups[groupID].RuntimeOverlay = group.RuntimeOverlay.Get()
self.Controllers[controllerID].NodeGroups[groupID].SystemOverlay = group.SystemOverlay.Get()
self.Controllers[controllerID].NodeGroups[groupID].Profiles = group.Profiles
return nil
@@ -207,31 +215,31 @@ func (self *nodeYaml) ControllerUpdate(controller ControllerInfo) error {
self.Controllers[controllerID].Comment = controller.Comment
self.Controllers[controllerID].Fqdn = controller.Fqdn
self.Controllers[controllerID].Services.Warewulfd.Port = controller.Services.Warewulfd.Port
self.Controllers[controllerID].Services.Warewulfd.Port = get2Set(controller.Services.Warewulfd.Port)
self.Controllers[controllerID].Services.Warewulfd.Secure = controller.Services.Warewulfd.Secure
self.Controllers[controllerID].Services.Warewulfd.StartCmd = controller.Services.Warewulfd.StartCmd
self.Controllers[controllerID].Services.Warewulfd.RestartCmd = controller.Services.Warewulfd.RestartCmd
self.Controllers[controllerID].Services.Warewulfd.EnableCmd = controller.Services.Warewulfd.EnableCmd
self.Controllers[controllerID].Services.Warewulfd.StartCmd = get2Set(controller.Services.Warewulfd.StartCmd)
self.Controllers[controllerID].Services.Warewulfd.RestartCmd = get2Set(controller.Services.Warewulfd.RestartCmd)
self.Controllers[controllerID].Services.Warewulfd.EnableCmd = get2Set(controller.Services.Warewulfd.EnableCmd)
self.Controllers[controllerID].Services.Dhcp.Enabled = controller.Services.Dhcp.Enabled
self.Controllers[controllerID].Services.Dhcp.ConfigFile = controller.Services.Dhcp.ConfigFile
self.Controllers[controllerID].Services.Dhcp.RangeStart = controller.Services.Dhcp.RangeStart
self.Controllers[controllerID].Services.Dhcp.RangeEnd = controller.Services.Dhcp.RangeEnd
self.Controllers[controllerID].Services.Dhcp.StartCmd = controller.Services.Dhcp.StartCmd
self.Controllers[controllerID].Services.Dhcp.RestartCmd = controller.Services.Dhcp.RestartCmd
self.Controllers[controllerID].Services.Dhcp.EnableCmd = controller.Services.Dhcp.EnableCmd
self.Controllers[controllerID].Services.Dhcp.ConfigFile = get2Set(controller.Services.Dhcp.ConfigFile)
self.Controllers[controllerID].Services.Dhcp.RangeStart = get2Set(controller.Services.Dhcp.RangeStart)
self.Controllers[controllerID].Services.Dhcp.RangeEnd = get2Set(controller.Services.Dhcp.RangeEnd)
self.Controllers[controllerID].Services.Dhcp.StartCmd = get2Set(controller.Services.Dhcp.StartCmd)
self.Controllers[controllerID].Services.Dhcp.RestartCmd = get2Set(controller.Services.Dhcp.RestartCmd)
self.Controllers[controllerID].Services.Dhcp.EnableCmd = get2Set(controller.Services.Dhcp.EnableCmd)
self.Controllers[controllerID].Services.Nfs.Enabled = controller.Services.Nfs.Enabled
self.Controllers[controllerID].Services.Nfs.Exports = controller.Services.Nfs.Exports
self.Controllers[controllerID].Services.Nfs.StartCmd = controller.Services.Nfs.StartCmd
self.Controllers[controllerID].Services.Nfs.RestartCmd = controller.Services.Nfs.RestartCmd
self.Controllers[controllerID].Services.Nfs.EnableCmd = controller.Services.Nfs.EnableCmd
self.Controllers[controllerID].Services.Nfs.StartCmd = get2Set(controller.Services.Nfs.StartCmd)
self.Controllers[controllerID].Services.Nfs.RestartCmd = get2Set(controller.Services.Nfs.RestartCmd)
self.Controllers[controllerID].Services.Nfs.EnableCmd = get2Set(controller.Services.Nfs.EnableCmd)
self.Controllers[controllerID].Services.Tftp.Enabled = controller.Services.Tftp.Enabled
self.Controllers[controllerID].Services.Tftp.TftpRoot = controller.Services.Tftp.TftpRoot
self.Controllers[controllerID].Services.Tftp.StartCmd = controller.Services.Tftp.StartCmd
self.Controllers[controllerID].Services.Tftp.RestartCmd = controller.Services.Tftp.RestartCmd
self.Controllers[controllerID].Services.Tftp.EnableCmd = controller.Services.Tftp.EnableCmd
self.Controllers[controllerID].Services.Tftp.TftpRoot = get2Set(controller.Services.Tftp.TftpRoot)
self.Controllers[controllerID].Services.Tftp.StartCmd = get2Set(controller.Services.Tftp.StartCmd)
self.Controllers[controllerID].Services.Tftp.RestartCmd = get2Set(controller.Services.Tftp.RestartCmd)
self.Controllers[controllerID].Services.Tftp.EnableCmd = get2Set(controller.Services.Tftp.EnableCmd)
return nil
}
@@ -274,15 +282,15 @@ func (self *nodeYaml) ProfileUpdate(profile ProfileInfo) error {
return errors.New("Group '" + profileID + "' was not found")
}
self.NodeProfiles[profileID].DomainName = profile.DomainName
self.NodeProfiles[profileID].Vnfs = profile.Vnfs
self.NodeProfiles[profileID].Ipxe = profile.Ipxe
self.NodeProfiles[profileID].KernelVersion = profile.KernelVersion
self.NodeProfiles[profileID].IpmiNetmask = profile.IpmiNetmask
self.NodeProfiles[profileID].IpmiUserName = profile.IpmiUserName
self.NodeProfiles[profileID].IpmiPassword = profile.IpmiPassword
self.NodeProfiles[profileID].RuntimeOverlay = profile.RuntimeOverlay
self.NodeProfiles[profileID].SystemOverlay = profile.SystemOverlay
self.NodeProfiles[profileID].DomainName = get2Set(profile.DomainName)
self.NodeProfiles[profileID].Vnfs = get2Set(profile.Vnfs)
self.NodeProfiles[profileID].Ipxe = get2Set(profile.Ipxe)
self.NodeProfiles[profileID].KernelVersion = get2Set(profile.KernelVersion)
self.NodeProfiles[profileID].IpmiNetmask = get2Set(profile.IpmiNetmask)
self.NodeProfiles[profileID].IpmiUserName = get2Set(profile.IpmiUserName)
self.NodeProfiles[profileID].IpmiPassword = get2Set(profile.IpmiPassword)
self.NodeProfiles[profileID].RuntimeOverlay = get2Set(profile.RuntimeOverlay)
self.NodeProfiles[profileID].SystemOverlay = get2Set(profile.SystemOverlay)
return nil
}