From 5c23ef9f946ba6149ed9750b1c19832d0b95f3cf Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Sun, 13 Dec 2020 20:20:03 -0800 Subject: [PATCH] Fininshed with node discovery and service refactoring --- etc/nodes.conf | 8 -------- internal/app/wwctl/node/list/main.go | 3 +++ internal/app/wwctl/node/set/main.go | 21 +++++++++++++++++++++ internal/app/wwctl/node/set/root.go | 4 ++++ internal/pkg/node/constructors.go | 20 +++++++++++++++----- internal/pkg/node/datastructure.go | 21 +++++++++++++++++++-- internal/pkg/node/methods.go | 13 +++++++++++-- internal/pkg/node/modifiers.go | 8 ++++++++ internal/pkg/warewulfd/daemon.go | 3 ++- internal/pkg/warewulfd/ipxe.go | 3 ++- 10 files changed, 85 insertions(+), 19 deletions(-) delete mode 100644 etc/nodes.conf diff --git a/etc/nodes.conf b/etc/nodes.conf deleted file mode 100644 index 83b14876..00000000 --- a/etc/nodes.conf +++ /dev/null @@ -1,8 +0,0 @@ -nodeprofiles: - default: - comment: "This profile is automatically included for each node" - container name: "" - kernel version: "" - kernel args: crashkernel=no quiet - -nodes: {} diff --git a/internal/app/wwctl/node/list/main.go b/internal/app/wwctl/node/list/main.go index 4150db2d..3ec31da6 100644 --- a/internal/app/wwctl/node/list/main.go +++ b/internal/app/wwctl/node/list/main.go @@ -50,6 +50,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "ClusterName", node.ClusterName.Source(), node.ClusterName.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Profiles", "--", strings.Join(node.Profiles, ",")) + fmt.Printf("%-20s %-18s %-12s %t\n", node.Id.Get(), "Disabled", node.Disabled.Source(), node.Disabled.PrintB()) + fmt.Printf("%-20s %-18s %-12s %t\n", node.Id.Get(), "Discoverable", node.Discoverable.Source(), node.Discoverable.PrintB()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "ContainerName", node.ContainerName.Source(), node.ContainerName.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "KernelVersion", node.KernelVersion.Source(), node.KernelVersion.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "KernelArgs", node.KernelArgs.Source(), node.KernelArgs.Print()) diff --git a/internal/app/wwctl/node/set/main.go b/internal/app/wwctl/node/set/main.go index 942620d8..cf2245c6 100644 --- a/internal/app/wwctl/node/set/main.go +++ b/internal/app/wwctl/node/set/main.go @@ -185,6 +185,27 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } } + if SetDiscoverable == true { + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting node to discoverable\n", n.Id.Get()) + + n.Discoverable.SetB(true) + err := nodeDB.NodeUpdate(n) + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) + } + } + if SetUndiscoverable == true { + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting node to undiscoverable\n", n.Id.Get()) + + n.Discoverable.SetB(false) + err := nodeDB.NodeUpdate(n) + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) + } + } + if len(SetAddProfile) > 0 { for _, p := range SetAddProfile { wwlog.Printf(wwlog.VERBOSE, "Node: %s, adding profile to '%s'\n", n.Id.Get(), p) diff --git a/internal/app/wwctl/node/set/root.go b/internal/app/wwctl/node/set/root.go index c0eff8c5..72164fff 100644 --- a/internal/app/wwctl/node/set/root.go +++ b/internal/app/wwctl/node/set/root.go @@ -32,6 +32,8 @@ var ( SetDelProfile []string SetForce bool SetInit string + SetDiscoverable bool + SetUndiscoverable bool ) func init() { @@ -61,6 +63,8 @@ func init() { baseCmd.PersistentFlags().BoolVarP(&SetYes, "yes", "y", false, "Set 'yes' to all questions asked") baseCmd.PersistentFlags().BoolVarP(&SetForce, "force", "f", false, "Force configuration (even on error)") + baseCmd.PersistentFlags().BoolVar(&SetDiscoverable, "discoverable", false, "Make this node discoverable") + baseCmd.PersistentFlags().BoolVar(&SetUndiscoverable, "undiscoverable", false, "Remove the discoverable flag") } diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index 35895d1b..960bd029 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -74,6 +74,9 @@ func (self *nodeYaml) FindAllNodes() ([]NodeInfo, error) { n.SystemOverlay.Set(node.SystemOverlay) n.RuntimeOverlay.Set(node.RuntimeOverlay) + n.Discoverable.SetB(node.Discoverable) + n.Disabled.SetB(node.Disabled) + for devname, netdev := range node.NetDevs { if _, ok := n.NetDevs[devname]; !ok { var netdev NetDevEntry @@ -112,6 +115,9 @@ func (self *nodeYaml) FindAllNodes() ([]NodeInfo, error) { n.SystemOverlay.SetAlt(self.NodeProfiles[p].SystemOverlay, pstring) n.RuntimeOverlay.SetAlt(self.NodeProfiles[p].RuntimeOverlay, pstring) + n.Disabled.SetAltB(self.NodeProfiles[p].Disabled, pstring) + n.Discoverable.SetAltB(self.NodeProfiles[p].Discoverable, pstring) + for devname, netdev := range self.NodeProfiles[p].NetDevs { if _, ok := n.NetDevs[devname]; !ok { var netdev NetDevEntry @@ -155,6 +161,9 @@ func (self *nodeYaml) FindAllProfiles() ([]NodeInfo, error) { p.RuntimeOverlay.Set(profile.RuntimeOverlay) p.SystemOverlay.Set(profile.SystemOverlay) + p.Disabled.SetB(profile.Disabled) + p.Discoverable.SetB(profile.Discoverable) + for devname, netdev := range profile.NetDevs { if _, ok := p.NetDevs[devname]; !ok { var netdev NetDevEntry @@ -190,17 +199,18 @@ func (self *nodeYaml) FindAllProfiles() ([]NodeInfo, error) { return ret, nil } -func (self *nodeYaml) FindUnconfiguredNode() (NodeInfo, string, error) { +func (self *nodeYaml) FindDiscoverableNode() (NodeInfo, string, error) { var ret NodeInfo nodes, _ := self.FindAllNodes() for _, node := range nodes { + if node.Discoverable.GetB() == false { + continue + } for netdev, dev := range node.NetDevs { - if dev.Hwaddr.Defined() == false && dev.Ipaddr.Defined() == true { - if dev.Type.Defined() == false || dev.Type.Get() == "ethernet" { - return node, netdev, nil - } + if dev.Hwaddr.Defined() == false { + return node, netdev, nil } } } diff --git a/internal/pkg/node/datastructure.go b/internal/pkg/node/datastructure.go index d4e8077e..0b5bb8a3 100644 --- a/internal/pkg/node/datastructure.go +++ b/internal/pkg/node/datastructure.go @@ -1,6 +1,7 @@ package node import ( + "fmt" "github.com/hpcng/warewulf/internal/pkg/util" "github.com/hpcng/warewulf/internal/pkg/wwlog" "os" @@ -30,6 +31,7 @@ type NodeConf struct { RuntimeOverlay string `yaml:"runtime overlay files,omitempty"` SystemOverlay string `yaml:"system overlay files,omitempty"` Init string `yaml:"init,omitempty"` + Discoverable bool `yaml:"discoverable,omitempty"` Profiles []string `yaml:"profiles,omitempty"` NetDevs map[string]*NetDevs `yaml:"network devices,omitempty"` } @@ -71,6 +73,8 @@ type NodeInfo struct { IpmiPassword Entry RuntimeOverlay Entry SystemOverlay Entry + Discoverable Entry + Disabled Entry Init Entry //TODO: Finish adding this... Profiles []string GroupProfiles []string @@ -89,7 +93,20 @@ type NetDevEntry struct { func init() { //TODO: Check to make sure nodes.conf is found if util.IsFile(ConfigFile) == false { - wwlog.Printf(wwlog.ERROR, "Configuration file not found: %s\n", ConfigFile) - os.Exit(1) + c, err := os.OpenFile(ConfigFile, os.O_RDWR|os.O_CREATE, 0644) + if err != nil { + wwlog.Printf(wwlog.ERROR, "Could not create new configuration file: %s\n", err) + os.Exit(1) + } + + fmt.Fprintf(c, "nodeprofiles:\n") + fmt.Fprintf(c, " default:\n") + fmt.Fprintf(c, " comment: This profile is automatically included for each node\n") + fmt.Fprintf(c, " kernel args: crashkernel=no quiet\n") + fmt.Fprintf(c, "nodes: {}\n") + + c.Close() + + wwlog.Printf(wwlog.INFO, "Created default node configuration\n") } } diff --git a/internal/pkg/node/methods.go b/internal/pkg/node/methods.go index 9068831c..1fcbd7a7 100644 --- a/internal/pkg/node/methods.go +++ b/internal/pkg/node/methods.go @@ -41,8 +41,10 @@ func (self *Entry) SetAlt(val string, from string) { } func (self *Entry) SetAltB(val bool, from string) { - self.altbool = val - self.from = from + if val == true { + self.altbool = val + self.from = from + } return } @@ -106,6 +108,13 @@ func (self *Entry) Print() string { return "--" } +func (self *Entry) PrintB() bool { + if self.from == "" { + return self.bool + } + return self.altbool +} + func (self *Entry) Source() string { if self.value != "" && self.altvalue != "" { return "SUPERSEDED" diff --git a/internal/pkg/node/modifiers.go b/internal/pkg/node/modifiers.go index 9905f28c..8d36f68b 100644 --- a/internal/pkg/node/modifiers.go +++ b/internal/pkg/node/modifiers.go @@ -66,6 +66,10 @@ func (self *nodeYaml) NodeUpdate(node NodeInfo) error { self.Nodes[nodeID].IpmiPassword = node.IpmiPassword.GetReal() self.Nodes[nodeID].RuntimeOverlay = node.RuntimeOverlay.GetReal() self.Nodes[nodeID].SystemOverlay = node.SystemOverlay.GetReal() + + self.Nodes[nodeID].Disabled = node.Disabled.GetRealB() + self.Nodes[nodeID].Discoverable = node.Discoverable.GetRealB() + self.Nodes[nodeID].Profiles = node.Profiles self.Nodes[nodeID].NetDevs = make(map[string]*NetDevs) @@ -138,6 +142,10 @@ func (self *nodeYaml) ProfileUpdate(profile NodeInfo) error { self.NodeProfiles[profileID].IpmiPassword = profile.IpmiPassword.GetReal() self.NodeProfiles[profileID].RuntimeOverlay = profile.RuntimeOverlay.GetReal() self.NodeProfiles[profileID].SystemOverlay = profile.SystemOverlay.GetReal() + + self.NodeProfiles[profileID].Disabled = profile.Disabled.GetRealB() + self.NodeProfiles[profileID].Discoverable = profile.Discoverable.GetRealB() + self.NodeProfiles[profileID].Profiles = profile.Profiles self.NodeProfiles[profileID].NetDevs = make(map[string]*NetDevs) diff --git a/internal/pkg/warewulfd/daemon.go b/internal/pkg/warewulfd/daemon.go index 5dbf94e5..f52ffe9f 100644 --- a/internal/pkg/warewulfd/daemon.go +++ b/internal/pkg/warewulfd/daemon.go @@ -41,7 +41,8 @@ func DaemonStart() error { cmd.Start() pid := cmd.Process.Pid - p.WriteString(fmt.Sprintf("%d", pid)) + fmt.Fprintf(p, "%d", pid) + p.Close() time.Sleep(1 * time.Second) diff --git a/internal/pkg/warewulfd/ipxe.go b/internal/pkg/warewulfd/ipxe.go index 6022ca59..d50edc52 100644 --- a/internal/pkg/warewulfd/ipxe.go +++ b/internal/pkg/warewulfd/ipxe.go @@ -59,7 +59,7 @@ func IpxeSend(w http.ResponseWriter, req *http.Request) { wwlog.Printf(wwlog.INFO, "Node was not found, looking for discoverable nodes...\n") - n, netdev, err = nodeDB.FindUnconfiguredNode() + n, netdev, err = nodeDB.FindDiscoverableNode() if err != nil { wwlog.Printf(wwlog.WARN, "Node was not found, no nodes are discoverable...\n") unconfiguredNode = true @@ -68,6 +68,7 @@ func IpxeSend(w http.ResponseWriter, req *http.Request) { wwlog.Printf(wwlog.INFO, "Adding new configuration to discoverable node: %s\n", n.Id.Get()) n.NetDevs[netdev].Hwaddr.Set(hwaddr) + n.Discoverable.SetB(false) err := nodeDB.NodeUpdate(n) if err != nil { wwlog.Printf(wwlog.ERROR, "Could not add discovered configuration for node: %s\n", n.Id.Get())