From 54b2164c4e1b6b5ee6516e0d8c8573b9e8bca833 Mon Sep 17 00:00:00 2001 From: Niko Kivel Date: Mon, 10 May 2021 00:12:13 +0200 Subject: [PATCH] custom paramters --- internal/app/wwctl/node/list/main.go | 2 +- internal/app/wwctl/node/set/main.go | 20 ++++++++++++++-- internal/app/wwctl/node/set/root.go | 2 ++ internal/app/wwctl/profile/list/main.go | 4 ++++ internal/app/wwctl/profile/set/main.go | 31 ++++++++++++++++++++++++- internal/app/wwctl/profile/set/root.go | 7 ++++++ internal/pkg/node/constructors.go | 23 +++++++++++++++--- internal/pkg/node/datastructure.go | 12 ++-------- internal/pkg/node/modifiers.go | 13 +++++++---- 9 files changed, 92 insertions(+), 22 deletions(-) diff --git a/internal/app/wwctl/node/list/main.go b/internal/app/wwctl/node/list/main.go index a2cf31e4..affa39e3 100644 --- a/internal/app/wwctl/node/list/main.go +++ b/internal/app/wwctl/node/list/main.go @@ -60,7 +60,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } for name, param := range node.Params { - fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), name+":VALUE", param.Value.Source(), param.Value.Print()) + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), name, param.Source(), param.Print()) } } diff --git a/internal/app/wwctl/node/set/main.go b/internal/app/wwctl/node/set/main.go index a20639fd..9b0fbdce 100644 --- a/internal/app/wwctl/node/set/main.go +++ b/internal/app/wwctl/node/set/main.go @@ -332,11 +332,27 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if _, ok := n.Params[SetParam]; !ok { - var nd node.ParamEntry + wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting Value %s\n", n.Id.Get(), SetParam, SetValue) + var nd node.Entry n.Params[SetParam] = &nd } wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting Value %s\n", n.Id.Get(), SetParam, SetValue) - n.Params[SetParam].Value.Set(SetValue) + n.Params[SetParam].Set(SetValue) + } + + if SetParamDel == true { + if SetParam == "" { + wwlog.Printf(wwlog.ERROR, "You must include the '--param' option\n") + os.Exit(1) + } + + if _, ok := n.Params[SetParam]; !ok { + wwlog.Printf(wwlog.ERROR, "Custom parameter doesn't exist: %s\n", SetParam) + os.Exit(1) + } + + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Deleting custom parameter: %s\n", n.Id.Get(), SetNetDev) + delete(n.Params, SetParam) } err := nodeDB.NodeUpdate(n) diff --git a/internal/app/wwctl/node/set/root.go b/internal/app/wwctl/node/set/root.go index 2ec4e4a8..cc708cd7 100644 --- a/internal/app/wwctl/node/set/root.go +++ b/internal/app/wwctl/node/set/root.go @@ -43,6 +43,7 @@ var ( SetRoot string SetParam string SetValue string + SetParamDel bool ) func init() { @@ -78,6 +79,7 @@ func init() { baseCmd.PersistentFlags().StringVarP(&SetParam, "param", "p", "", "Define custom parameter") baseCmd.PersistentFlags().StringVarP(&SetValue, "value", "", "", "Set custom parameter value") + baseCmd.PersistentFlags().BoolVar(&SetParamDel, "paramdel", false, "Delete custom parameter") baseCmd.PersistentFlags().BoolVarP(&SetNodeAll, "all", "a", false, "Set all nodes") diff --git a/internal/app/wwctl/profile/list/main.go b/internal/app/wwctl/profile/list/main.go index c84998b4..0f453a71 100644 --- a/internal/app/wwctl/profile/list/main.go +++ b/internal/app/wwctl/profile/list/main.go @@ -54,6 +54,10 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), name+":TYPE", netdev.Hwaddr.Print()) fmt.Printf("%-20s %-18s %t\n", profile.Id.Get(), name+":DEFAULT", netdev.Default.PrintB()) } + + for name, param := range profile.Params { + fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), name, param.Print()) + } } } else { fmt.Printf("%-20s %s\n", "PROFILE NAME", "COMMENT/DESCRIPTION") diff --git a/internal/app/wwctl/profile/set/main.go b/internal/app/wwctl/profile/set/main.go index 696dfa4d..c1af8e66 100644 --- a/internal/app/wwctl/profile/set/main.go +++ b/internal/app/wwctl/profile/set/main.go @@ -233,7 +233,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { p.NetDevs[SetNetDev] = &nd } - wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting device as default\n", p.Id.Get(), SetNetDev) + wwlog.Printf(wwlog.VERBOSE, "Profile: %s:%s, Setting device as default\n", p.Id.Get(), SetNetDev) for _, dev := range p.NetDevs { // First clear all other devices that might be configured as default dev.Default.SetB(false) @@ -241,6 +241,35 @@ func CobraRunE(cmd *cobra.Command, args []string) error { p.NetDevs[SetNetDev].Default.SetB(true) } + if SetValue != "" { + if SetParam == "" { + wwlog.Printf(wwlog.ERROR, "You must include the '--param' option\n") + os.Exit(1) + } + + if _, ok := p.Params[SetParam]; !ok { + var nd node.Entry + p.Params[SetParam] = &nd + } + wwlog.Printf(wwlog.VERBOSE, "Profile: %s:%s, Setting Value %s\n", p.Id.Get(), SetParam, SetValue) + p.Params[SetParam].Set(SetValue) + } + + if SetParamDel == true { + if SetParam == "" { + wwlog.Printf(wwlog.ERROR, "You must include the '--param' option\n") + os.Exit(1) + } + + if _, ok := p.Params[SetParam]; !ok { + wwlog.Printf(wwlog.ERROR, "Custom parameter doesn't exist: %s\n", SetParam) + os.Exit(1) + } + + wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Deleting custom parameter: %s\n", p.Id.Get(), SetNetDev) + delete(p.Params, SetParam) + } + err := nodeDB.ProfileUpdate(p) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) diff --git a/internal/app/wwctl/profile/set/root.go b/internal/app/wwctl/profile/set/root.go index 6d81f861..42e14995 100644 --- a/internal/app/wwctl/profile/set/root.go +++ b/internal/app/wwctl/profile/set/root.go @@ -35,6 +35,9 @@ var ( SetNetDevDefault bool SetInit string SetRoot string + SetParam string + SetValue string + SetParamDel bool ) func init() { @@ -63,6 +66,10 @@ func init() { baseCmd.PersistentFlags().BoolVar(&SetNetDevDel, "netdel", false, "Delete the node's network device") baseCmd.PersistentFlags().BoolVar(&SetNetDevDefault, "netdefault", false, "Set this network to be default") + baseCmd.PersistentFlags().StringVarP(&SetParam, "param", "p", "", "Define custom parameter") + baseCmd.PersistentFlags().StringVarP(&SetValue, "value", "", "", "Set custom parameter value") + baseCmd.PersistentFlags().BoolVar(&SetParamDel, "paramdel", false, "Delete custom parameter") + baseCmd.PersistentFlags().BoolVarP(&SetAll, "all", "a", false, "Set all profiles") baseCmd.PersistentFlags().BoolVarP(&SetForce, "force", "f", false, "Force configuration (even on error)") baseCmd.PersistentFlags().BoolVarP(&SetYes, "yes", "y", false, "Set 'yes' to all questions asked") diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index 675f9ba5..4e7e9d99 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -43,7 +43,7 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { wwlog.Printf(wwlog.DEBUG, "In node loop: %s\n", nodename) n.NetDevs = make(map[string]*NetDevEntry) - n.Params = make(map[string]*ParamEntry) + n.Params = make(map[string]*Entry) n.SystemOverlay.SetDefault("default") n.RuntimeOverlay.SetDefault("default") n.Ipxe.SetDefault("default") @@ -97,10 +97,10 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { for paramname, param := range node.Params { if _, ok := n.Params[paramname]; !ok { - var param ParamEntry + var param Entry n.Params[paramname] = ¶m } - n.Params[paramname].Value.Set(param.Value) + n.Params[paramname].Set(param) } for _, p := range n.Profiles { @@ -143,6 +143,14 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { n.NetDevs[devname].Type.SetAlt(netdev.Type, p) n.NetDevs[devname].Default.SetAltB(netdev.Default, p) } + + for paramname, param := range config.NodeProfiles[p].Params { + if _, ok := n.Params[paramname]; !ok { + var param Entry + n.Params[paramname] = ¶m + } + n.Params[paramname].SetAlt(param, p) + } } ret = append(ret, n) @@ -169,6 +177,7 @@ func (config *nodeYaml) FindAllProfiles() ([]NodeInfo, error) { for name, profile := range config.NodeProfiles { var p NodeInfo p.NetDevs = make(map[string]*NetDevEntry) + p.Params = make(map[string]*Entry) p.Id.Set(name) p.Comment.Set(profile.Comment) @@ -203,6 +212,14 @@ func (config *nodeYaml) FindAllProfiles() ([]NodeInfo, error) { p.NetDevs[devname].Default.SetB(netdev.Default) } + for paramname, param := range profile.Params { + if _, ok := p.Params[paramname]; !ok { + var param Entry + p.Params[paramname] = ¶m + } + p.Params[paramname].Set(param) + } + // TODO: Validate or die on all inputs ret = append(ret, p) diff --git a/internal/pkg/node/datastructure.go b/internal/pkg/node/datastructure.go index 45e667db..243b0838 100644 --- a/internal/pkg/node/datastructure.go +++ b/internal/pkg/node/datastructure.go @@ -36,7 +36,7 @@ type NodeConf struct { Discoverable bool `yaml:"discoverable,omitempty"` Profiles []string `yaml:"profiles,omitempty"` NetDevs map[string]*NetDevs `yaml:"network devices,omitempty"` - Params map[string]*Params `yaml:"parameters,omitempty"` + Params map[string]string `yaml:"parameters,omitempty"` } type NetDevs struct { @@ -48,10 +48,6 @@ type NetDevs struct { Gateway string `yaml:"gateway,omitempty"` } -type Params struct { - Value string `yaml:"value,omitempty"` -} - /****** * Internal code data representations ******/ @@ -87,7 +83,7 @@ type NodeInfo struct { Profiles []string GroupProfiles []string NetDevs map[string]*NetDevEntry - Params map[string]*ParamEntry + Params map[string]*Entry } type NetDevEntry struct { @@ -99,10 +95,6 @@ type NetDevEntry struct { Gateway Entry `yaml:"gateway,omitempty"` } -type ParamEntry struct { - Value Entry `yaml:"value,omitempty"` -} - func init() { //TODO: Check to make sure nodes.conf is found if !util.IsFile(ConfigFile) { diff --git a/internal/pkg/node/modifiers.go b/internal/pkg/node/modifiers.go index 80265cb6..9a95b399 100644 --- a/internal/pkg/node/modifiers.go +++ b/internal/pkg/node/modifiers.go @@ -27,7 +27,6 @@ func (config *nodeYaml) AddNode(nodeID string) (NodeInfo, error) { config.Nodes[nodeID] = &node config.Nodes[nodeID].Profiles = []string{"default"} config.Nodes[nodeID].NetDevs = make(map[string]*NetDevs) - // config.Nodes[nodeID].Params = make(map[string]*Params) n.Id.Set(nodeID) n.Profiles = []string{"default"} @@ -76,7 +75,7 @@ func (config *nodeYaml) NodeUpdate(node NodeInfo) error { config.Nodes[nodeID].Profiles = node.Profiles config.Nodes[nodeID].NetDevs = make(map[string]*NetDevs) - config.Nodes[nodeID].Params = make(map[string]*Params) + config.Nodes[nodeID].Params = make(map[string]string) for devname, netdev := range node.NetDevs { var newdev NetDevs @@ -91,9 +90,7 @@ func (config *nodeYaml) NodeUpdate(node NodeInfo) error { } for paramname, param := range node.Params { - var newparam Params - config.Nodes[nodeID].Params[paramname] = &newparam - config.Nodes[nodeID].Params[paramname].Value = param.Value.GetReal() + config.Nodes[nodeID].Params[paramname] = param.GetReal() } return nil @@ -160,6 +157,8 @@ func (config *nodeYaml) ProfileUpdate(profile NodeInfo) error { config.NodeProfiles[profileID].Profiles = profile.Profiles config.NodeProfiles[profileID].NetDevs = make(map[string]*NetDevs) + + config.NodeProfiles[profileID].Params = make(map[string]string) for devname, netdev := range profile.NetDevs { var newdev NetDevs @@ -173,6 +172,10 @@ func (config *nodeYaml) ProfileUpdate(profile NodeInfo) error { config.NodeProfiles[profileID].NetDevs[devname].Default = netdev.Default.GetRealB() } + for paramname, param := range profile.Params { + config.NodeProfiles[profileID].Params[paramname] = param.GetReal() + } + return nil }