diff --git a/etc/nodes.conf b/etc/nodes.conf index 33a32a1c..2adba2ec 100644 --- a/etc/nodes.conf +++ b/etc/nodes.conf @@ -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: diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index ccaa4f14..3270be2d 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -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) diff --git a/internal/pkg/node/datastructure.go b/internal/pkg/node/datastructure.go index 9999fcac..be324799 100644 --- a/internal/pkg/node/datastructure.go +++ b/internal/pkg/node/datastructure.go @@ -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 } diff --git a/internal/pkg/node/methods.go b/internal/pkg/node/methods.go index 011b9026..521b8595 100644 --- a/internal/pkg/node/methods.go +++ b/internal/pkg/node/methods.go @@ -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 -} \ No newline at end of file +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 +} diff --git a/internal/pkg/node/modifiers.go b/internal/pkg/node/modifiers.go index f0e24438..4686dfa0 100644 --- a/internal/pkg/node/modifiers.go +++ b/internal/pkg/node/modifiers.go @@ -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 }