Files
warewulf/internal/pkg/node/modifiers.go
2020-11-27 16:39:27 -08:00

220 lines
5.7 KiB
Go

package node
import (
"github.com/hpcng/warewulf/internal/pkg/errors"
"github.com/hpcng/warewulf/internal/pkg/wwlog"
"gopkg.in/yaml.v2"
"os"
)
/****
*
* NODE MODIFIERS
*
****/
func (self *nodeYaml) AddNode(groupID string, nodeID string) error {
var node NodeConf
wwlog.Printf(wwlog.VERBOSE, "Adding new node: %s/%s\n", groupID, nodeID)
if _, ok := self.NodeGroups[groupID]; !ok {
return errors.New("Group does not exist: " + groupID)
}
if _, ok := self.NodeGroups[groupID].Nodes[groupID]; ok {
return errors.New("Nodename already exists in group: " + nodeID)
}
self.NodeGroups[groupID].Nodes[nodeID] = &node
self.NodeGroups[groupID].Nodes[nodeID].Hostname = nodeID
return nil
}
func (self *nodeYaml) DelNode(groupID string, nodeID string) error {
if _, ok := self.NodeGroups[groupID]; !ok {
return errors.New("Group '" + groupID + "' was not found")
}
if _, ok := self.NodeGroups[groupID].Nodes[nodeID]; !ok {
return errors.New("Node '" + nodeID + "' was not found in group '" + groupID + "'")
}
wwlog.Printf(wwlog.VERBOSE, "Deleting node network device: %s/%s\n", groupID, nodeID)
delete(self.NodeGroups[groupID].Nodes, nodeID)
return nil
}
func(self *nodeYaml) NodeUpdate(node NodeInfo) error {
groupID := node.Gid.Get()
nodeID := node.Id.Get()
if _, ok := self.NodeGroups[groupID]; !ok {
return errors.New("Group '" + groupID + "' was not found")
}
if _, ok := self.NodeGroups[groupID].Nodes[nodeID]; !ok {
return errors.New("Node '" + nodeID + "' was not found in group '" + groupID + "'")
}
self.NodeGroups[groupID].Nodes[nodeID].Hostname = node.HostName.GetReal()
self.NodeGroups[groupID].Nodes[nodeID].Vnfs = node.Vnfs.GetReal()
self.NodeGroups[groupID].Nodes[nodeID].DomainName = node.DomainName.GetReal()
self.NodeGroups[groupID].Nodes[nodeID].Ipxe = node.Ipxe.GetReal()
self.NodeGroups[groupID].Nodes[nodeID].KernelVersion = node.KernelVersion.GetReal()
self.NodeGroups[groupID].Nodes[nodeID].KernelArgs = node.KernelArgs.GetReal()
self.NodeGroups[groupID].Nodes[nodeID].IpmiIpaddr = node.IpmiIpaddr.GetReal()
self.NodeGroups[groupID].Nodes[nodeID].IpmiUserName = node.IpmiUserName.GetReal()
self.NodeGroups[groupID].Nodes[nodeID].IpmiPassword = node.IpmiPassword.GetReal()
self.NodeGroups[groupID].Nodes[nodeID].RuntimeOverlay = node.RuntimeOverlay.GetReal()
self.NodeGroups[groupID].Nodes[nodeID].SystemOverlay = node.SystemOverlay.GetReal()
self.NodeGroups[groupID].Nodes[nodeID].Profiles = node.Profiles
self.NodeGroups[groupID].Nodes[nodeID].NetDevs = node.NetDevs
return nil
}
/****
*
* GROUP MODIFIERS
*
****/
func (self *nodeYaml) AddGroup(groupID string) error {
var group GroupConf
wwlog.Printf(wwlog.VERBOSE, "Adding new group: %s/%s\n", groupID)
if _, ok := self.NodeGroups[groupID]; ok {
return errors.New("Group name already exists: " + groupID)
}
self.NodeGroups[groupID] = &group
self.NodeGroups[groupID].DomainName = groupID
self.NodeGroups[groupID].Profiles = []string{"default"}
return nil
}
func (self *nodeYaml) DelGroup(groupID string) error {
if _, ok := self.NodeGroups[groupID]; !ok {
return errors.New("Group '" + groupID + "' was not found")
}
wwlog.Printf(wwlog.VERBOSE, "Deleting group: %s\n", groupID)
delete(self.NodeGroups, groupID)
return nil
}
func(self *nodeYaml) GroupUpdate(group GroupInfo) error {
groupID := group.Id
if _, ok := self.NodeGroups[groupID]; !ok {
return errors.New("Group '" + groupID + "' was not found")
}
self.NodeGroups[groupID].DomainName = group.DomainName
self.NodeGroups[groupID].Vnfs = group.Vnfs
self.NodeGroups[groupID].KernelVersion = group.KernelVersion
self.NodeGroups[groupID].KernelArgs = group.KernelArgs
self.NodeGroups[groupID].Ipxe = group.Ipxe
self.NodeGroups[groupID].IpmiUserName = group.IpmiUserName
self.NodeGroups[groupID].IpmiPassword = group.IpmiPassword
self.NodeGroups[groupID].RuntimeOverlay = group.RuntimeOverlay
self.NodeGroups[groupID].SystemOverlay = group.SystemOverlay
self.NodeGroups[groupID].Profiles = group.Profiles
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 = profile.DomainName
self.NodeProfiles[profileID].Vnfs = profile.Vnfs
self.NodeProfiles[profileID].Ipxe = profile.Ipxe
self.NodeProfiles[profileID].KernelVersion = profile.KernelVersion
self.NodeProfiles[profileID].IpmiUserName = profile.IpmiUserName
self.NodeProfiles[profileID].IpmiPassword = profile.IpmiPassword
self.NodeProfiles[profileID].RuntimeOverlay = profile.RuntimeOverlay
self.NodeProfiles[profileID].SystemOverlay = 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
}