326 lines
12 KiB
Go
326 lines
12 KiB
Go
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
|
|
*
|
|
****/
|
|
|
|
func (self *nodeYaml) AddNode(controllerID string, groupID string, nodeID string) error {
|
|
var node NodeConf
|
|
|
|
wwlog.Printf(wwlog.VERBOSE, "Adding new node: %s/%s\n", groupID, nodeID)
|
|
|
|
if _, ok := self.Controllers[controllerID]; !ok {
|
|
return errors.New("Controller does not exist: " + controllerID)
|
|
}
|
|
|
|
if _, ok := self.Controllers[controllerID].NodeGroups[groupID]; !ok {
|
|
return errors.New("Group does not exist: " + groupID)
|
|
}
|
|
|
|
if _, ok := self.Controllers[controllerID].NodeGroups[groupID].Nodes[groupID]; ok {
|
|
return errors.New("Nodename already exists in group: " + nodeID)
|
|
}
|
|
|
|
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID] = &node
|
|
self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID].Hostname = nodeID
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *nodeYaml) DelNode(controllerID string, groupID string, nodeID string) error {
|
|
|
|
if _, ok := self.Controllers[controllerID]; !ok {
|
|
return errors.New("Controller does not exist: " + controllerID)
|
|
}
|
|
|
|
if _, ok := self.Controllers[controllerID].NodeGroups[groupID]; !ok {
|
|
return errors.New("Group does not exist: " + groupID)
|
|
}
|
|
|
|
if _, ok := self.Controllers[controllerID].NodeGroups[groupID].Nodes[groupID]; ok {
|
|
return errors.New("Nodename does not exist in group: " + nodeID)
|
|
}
|
|
|
|
wwlog.Printf(wwlog.VERBOSE, "Deleting node network device: %s/%s\n", groupID, nodeID)
|
|
delete(self.Controllers[controllerID].NodeGroups[groupID].Nodes, nodeID)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *nodeYaml) NodeUpdate(node NodeInfo) error {
|
|
controllerID := node.Cid.Get()
|
|
groupID := node.Gid.Get()
|
|
nodeID := node.Id.Get()
|
|
|
|
if _, ok := self.Controllers[controllerID]; !ok {
|
|
return errors.New("Controller does not exist: " + controllerID)
|
|
}
|
|
|
|
if _, ok := self.Controllers[controllerID].NodeGroups[groupID]; !ok {
|
|
return errors.New("Group does not exist: " + groupID)
|
|
}
|
|
|
|
if _, ok := self.Controllers[controllerID].NodeGroups[groupID].Nodes[nodeID]; !ok {
|
|
return errors.New("Nodename does not exist in group: " + nodeID)
|
|
}
|
|
|
|
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
|
|
|
|
return nil
|
|
}
|
|
|
|
/****
|
|
*
|
|
* GROUP MODIFIERS
|
|
*
|
|
****/
|
|
|
|
func (self *nodeYaml) AddGroup(controllerID string, groupID string) error {
|
|
var group GroupConf
|
|
|
|
wwlog.Printf(wwlog.VERBOSE, "Adding new group: %s/%s\n", groupID)
|
|
|
|
if _, ok := self.Controllers[controllerID]; !ok {
|
|
return errors.New("Controller does not exist: " + controllerID)
|
|
}
|
|
|
|
if _, ok := self.Controllers[controllerID].NodeGroups[groupID]; ok {
|
|
return errors.New("Group already exists: " + groupID)
|
|
}
|
|
|
|
self.Controllers[controllerID].NodeGroups[groupID] = &group
|
|
self.Controllers[controllerID].NodeGroups[groupID].DomainName = groupID
|
|
self.Controllers[controllerID].NodeGroups[groupID].Profiles = []string{"default"}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *nodeYaml) DelGroup(controllerID string, groupID string) error {
|
|
|
|
if _, ok := self.Controllers[controllerID]; !ok {
|
|
return errors.New("Controller does not exist: " + controllerID)
|
|
}
|
|
|
|
if _, ok := self.Controllers[controllerID].NodeGroups[groupID]; !ok {
|
|
return errors.New("Group does not exist: " + groupID)
|
|
}
|
|
|
|
wwlog.Printf(wwlog.VERBOSE, "Deleting group: %s\n", groupID)
|
|
delete(self.Controllers[controllerID].NodeGroups, groupID)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *nodeYaml) GroupUpdate(group GroupInfo) error {
|
|
controllerID := group.Cid.Get()
|
|
groupID := group.Id.Get()
|
|
|
|
if _, ok := self.Controllers[controllerID]; !ok {
|
|
return errors.New("Controller does not exist: " + controllerID)
|
|
}
|
|
|
|
if _, ok := self.Controllers[controllerID].NodeGroups[groupID]; !ok {
|
|
return errors.New("Group does not exist: " + groupID)
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
/****
|
|
*
|
|
* CONTROLLER MODIFIERS
|
|
*
|
|
****/
|
|
|
|
func (self *nodeYaml) AddController(controllerID string) error {
|
|
var controller ControllerConf
|
|
var group GroupConf
|
|
|
|
wwlog.Printf(wwlog.VERBOSE, "Adding new controller: %s/%s\n", controllerID)
|
|
|
|
if _, ok := self.Controllers[controllerID]; ok {
|
|
return errors.New("Controller already exists: " + controllerID)
|
|
}
|
|
|
|
self.Controllers[controllerID] = &controller
|
|
self.Controllers[controllerID].NodeGroups = make(map[string]*GroupConf)
|
|
self.Controllers[controllerID].NodeGroups["default"] = &group
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *nodeYaml) DelController(controllerID string) error {
|
|
|
|
if _, ok := self.Controllers[controllerID]; !ok {
|
|
return errors.New("Controller does not exist: " + controllerID)
|
|
}
|
|
|
|
wwlog.Printf(wwlog.VERBOSE, "Deleting controller: %s\n", controllerID)
|
|
delete(self.Controllers, controllerID)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *nodeYaml) ControllerUpdate(controller ControllerInfo) error {
|
|
controllerID := controller.Id
|
|
|
|
if _, ok := self.Controllers[controllerID]; !ok {
|
|
return errors.New("Controller does not exist: " + controllerID)
|
|
}
|
|
|
|
self.Controllers[controllerID].Ipaddr = controller.Ipaddr
|
|
self.Controllers[controllerID].Comment = controller.Comment
|
|
self.Controllers[controllerID].Fqdn = controller.Fqdn
|
|
|
|
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 = 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 = 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 = 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 = 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
|
|
}
|
|
|
|
/****
|
|
*
|
|
* PROFILE MODIFIERS
|
|
*
|
|
****/
|
|
|
|
func (self *nodeYaml) AddProfile(profileID string) error {
|
|
var profile ProfileConf
|
|
|
|
wwlog.Printf(wwlog.VERBOSE, "Adding new profile: %s/%s\n", profileID)
|
|
|
|
if _, ok := self.NodeProfiles[profileID]; ok {
|
|
return errors.New("Profile name already exists: " + profileID)
|
|
}
|
|
|
|
self.NodeProfiles[profileID] = &profile
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *nodeYaml) DelProfile(profileID string) error {
|
|
if _, ok := self.NodeProfiles[profileID]; !ok {
|
|
return errors.New("Group '" + profileID + "' was not found")
|
|
}
|
|
|
|
wwlog.Printf(wwlog.VERBOSE, "Deleting profile: %s\n", profileID)
|
|
delete(self.NodeProfiles, profileID)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *nodeYaml) ProfileUpdate(profile ProfileInfo) error {
|
|
profileID := profile.Id
|
|
|
|
if _, ok := self.NodeProfiles[profileID]; !ok {
|
|
return errors.New("Group '" + profileID + "' was not found")
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
/****
|
|
*
|
|
* PERSISTENCE
|
|
*
|
|
****/
|
|
|
|
func (self *nodeYaml) Persist() error {
|
|
|
|
out, err := yaml.Marshal(self)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
file, err := os.OpenFile(ConfigFile, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
|
|
if err != nil {
|
|
wwlog.Printf(wwlog.ERROR, "%s\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
defer file.Close()
|
|
|
|
_, err = file.WriteString(string(out))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|