diff --git a/internal/app/wwctl/node/list/main.go b/internal/app/wwctl/node/list/main.go index d2b0b68d..0e6845c8 100644 --- a/internal/app/wwctl/node/list/main.go +++ b/internal/app/wwctl/node/list/main.go @@ -57,6 +57,10 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "IpmiUserName", node.IpmiUserName.Source(), node.IpmiUserName.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "IpmiInterface", node.IpmiInterface.Source(), node.IpmiInterface.Print()) + for keyname, key := range node.Tags { + fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Tag["+keyname+"]", key.Source(), key.Print()) + } + for name, netdev := range node.NetDevs { fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), name+":DEVICE", netdev.Device.Source(), netdev.Device.Print()) fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), name+":HWADDR", netdev.Hwaddr.Source(), netdev.Hwaddr.Print()) @@ -68,9 +72,6 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-20s %-18s %-12s %t\n", node.Id.Get(), name+":DEFAULT", netdev.Default.Source(), netdev.Default.PrintB()) } - for keyname, key := range node.Keys { - fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Keys."+keyname, key.Source(), key.Print()) - } } } else if ShowNet { diff --git a/internal/app/wwctl/node/set/main.go b/internal/app/wwctl/node/set/main.go index c4a69f48..dfa7fd89 100644 --- a/internal/app/wwctl/node/set/main.go +++ b/internal/app/wwctl/node/set/main.go @@ -301,33 +301,34 @@ func CobraRunE(cmd *cobra.Command, args []string) error { delete(n.NetDevs, SetNetName) } - if SetValue != "" { - if SetKey == "" { - wwlog.Printf(wwlog.ERROR, "You must include the '--key/-k' option\n") - os.Exit(1) - } + if len(SetTags) > 0 { + for _, t := range SetTags { + keyval := strings.SplitN(t, "=", 2) + key := keyval[0] + val := keyval[1] - if _, ok := n.Keys[SetKey]; !ok { - var nd node.Entry - n.Keys[SetKey] = &nd + if _, ok := n.Tags[key]; !ok { + var nd node.Entry + n.Tags[key] = &nd + } + + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting Tag '%s'='%s'\n", n.Id.Get(), key, val) + n.Tags[key].Set(val) } - wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting Value %s\n", n.Id.Get(), SetKey, SetValue) - n.Keys[SetKey].Set(SetValue) } + if len(SetDelTags) > 0 { + for _, t := range SetDelTags { + keyval := strings.SplitN(t, "=", 1) + key := keyval[0] - if SetKeyDel { - if SetKey == "" { - wwlog.Printf(wwlog.ERROR, "You must include the '--key/-k' option\n") - os.Exit(1) + if _, ok := n.Tags[key]; !ok { + wwlog.Printf(wwlog.WARN, "Key does not exist: %s\n", key) + os.Exit(1) + } + + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Deleting tag: %s\n", n.Id.Get(), key) + delete(n.Tags, key) } - - if _, ok := n.Keys[SetKey]; !ok { - wwlog.Printf(wwlog.ERROR, "Custom parameter doesn't exist: %s\n", SetKey) - os.Exit(1) - } - - wwlog.Printf(wwlog.VERBOSE, "Node: %s, Deleting custom parameter: %s\n", n.Id.Get(), SetNetDev) - delete(n.Keys, SetKey) } err := nodeDB.NodeUpdate(n) diff --git a/internal/app/wwctl/node/set/root.go b/internal/app/wwctl/node/set/root.go index 750b9a12..5c575ad8 100644 --- a/internal/app/wwctl/node/set/root.go +++ b/internal/app/wwctl/node/set/root.go @@ -68,9 +68,8 @@ var ( SetDiscoverable bool SetUndiscoverable bool SetRoot string - SetKey string - SetValue string - SetKeyDel bool + SetTags []string + SetDelTags []string SetAssetKey string ) @@ -144,10 +143,8 @@ func init() { baseCmd.PersistentFlags().BoolVar(&SetNetDevDel, "netdel", false, "Delete the node's network device") - baseCmd.PersistentFlags().StringVarP(&SetKey, "key", "k", "", "Define custom key") - baseCmd.PersistentFlags().BoolVar(&SetKeyDel, "keydel", false, "Delete custom key") - - baseCmd.PersistentFlags().StringVarP(&SetValue, "value", "", "", "Set value") + baseCmd.PersistentFlags().StringSliceVarP(&SetTags, "tag", "t", []string{}, "Define custom tag (key=value)") + baseCmd.PersistentFlags().StringSliceVar(&SetDelTags, "tagdel", []string{}, "Delete tag") 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 bac61c3a..a419952e 100644 --- a/internal/app/wwctl/profile/list/main.go +++ b/internal/app/wwctl/profile/list/main.go @@ -48,6 +48,10 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "IpmiUserName", profile.IpmiUserName.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "IpmiInterface", profile.IpmiInterface.Print()) + for keyname, key := range profile.Tags { + fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "Tag["+keyname+"]", key.Print()) + } + for name, netdev := range profile.NetDevs { fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), name+":IPADDR", netdev.Ipaddr.Print()) fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), name+":NETMASK", netdev.Netmask.Print()) @@ -57,10 +61,6 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-20s %-18s %t\n", profile.Id.Get(), name+":ONBOOT", netdev.OnBoot.PrintB()) fmt.Printf("%-20s %-18s %t\n", profile.Id.Get(), name+":DEFAULT", netdev.Default.PrintB()) } - - for keyname, key := range profile.Keys { - fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "Keys."+keyname, key.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 e950ce02..7b4f958c 100644 --- a/internal/app/wwctl/profile/set/main.go +++ b/internal/app/wwctl/profile/set/main.go @@ -3,6 +3,7 @@ package set import ( "fmt" "os" + "strings" "github.com/hpcng/warewulf/internal/pkg/node" "github.com/hpcng/warewulf/internal/pkg/warewulfd" @@ -269,33 +270,34 @@ func CobraRunE(cmd *cobra.Command, args []string) error { delete(p.NetDevs, SetNetDev) } - if SetValue != "" { - if SetKey == "" { - wwlog.Printf(wwlog.ERROR, "You must include the '--key/-k' option\n") - os.Exit(1) - } + if len(SetTags) > 0 { + for _, t := range SetTags { + keyval := strings.SplitN(t, "=", 2) + key := keyval[0] + val := keyval[1] - if _, ok := p.Keys[SetKey]; !ok { - var nd node.Entry - p.Keys[SetKey] = &nd + if _, ok := p.Tags[key]; !ok { + var nd node.Entry + p.Tags[key] = &nd + } + + wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Setting Tag '%s'='%s'\n", p.Id.Get(), key, val) + p.Tags[key].Set(val) } - wwlog.Printf(wwlog.VERBOSE, "Profile: %s:%s, Setting Value %s\n", p.Id.Get(), SetKey, SetValue) - p.Keys[SetKey].Set(SetValue) } + if len(SetDelTags) > 0 { + for _, t := range SetDelTags { + keyval := strings.SplitN(t, "=", 1) + key := keyval[0] - if SetKeyDel { - if SetKey == "" { - wwlog.Printf(wwlog.ERROR, "You must include the '--key/-k' option\n") - os.Exit(1) + if _, ok := p.Tags[key]; !ok { + wwlog.Printf(wwlog.WARN, "Key does not exist: %s\n", key) + os.Exit(1) + } + + wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Deleting tag: %s\n", p.Id.Get(), key) + delete(p.Tags, key) } - - if _, ok := p.Keys[SetKey]; !ok { - wwlog.Printf(wwlog.ERROR, "Custom key doesn't exist: %s\n", SetKey) - os.Exit(1) - } - - wwlog.Printf(wwlog.VERBOSE, "Profile: %s, Deleting custom key: %s\n", p.Id.Get(), SetNetDev) - delete(p.Keys, SetKey) } err := nodeDB.ProfileUpdate(p) diff --git a/internal/app/wwctl/profile/set/root.go b/internal/app/wwctl/profile/set/root.go index 8b4deb7d..500b17c9 100644 --- a/internal/app/wwctl/profile/set/root.go +++ b/internal/app/wwctl/profile/set/root.go @@ -65,8 +65,8 @@ var ( SetInit string SetRoot string SetKey string - SetValue string - SetKeyDel bool + SetTags []string + SetDelTags []string SetAssetKey string ) @@ -126,10 +126,8 @@ func init() { baseCmd.PersistentFlags().BoolVar(&SetNetDevDel, "netdel", false, "Delete the node's network device") - baseCmd.PersistentFlags().StringVarP(&SetKey, "key", "k", "", "Define custom key") - baseCmd.PersistentFlags().BoolVar(&SetKeyDel, "keydel", false, "Delete custom key") - - baseCmd.PersistentFlags().StringVarP(&SetValue, "value", "", "", "Set value") + baseCmd.PersistentFlags().StringSliceVarP(&SetTags, "tag", "t", []string{}, "Define custom tag (key=value)") + baseCmd.PersistentFlags().StringSliceVar(&SetDelTags, "tagdel", []string{}, "Delete tag") baseCmd.PersistentFlags().BoolVarP(&SetAll, "all", "a", false, "Set all profiles") baseCmd.PersistentFlags().BoolVarP(&SetForce, "force", "f", false, "Force configuration (even on error)") diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index 99c9d1e0..e50727bf 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -50,7 +50,7 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { wwlog.Printf(wwlog.DEBUG, "In node loop: %s\n", nodename) n.NetDevs = make(map[string]*NetDevEntry) - n.Keys = make(map[string]*Entry) + n.Tags = make(map[string]*Entry) n.SystemOverlay.SetDefault("wwinit") n.RuntimeOverlay.SetDefault("generic") n.Ipxe.SetDefault("default") @@ -107,12 +107,12 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { n.NetDevs[devname].Default.Set(netdev.Default) } - for keyname, key := range node.Keys { - if _, ok := n.Keys[keyname]; !ok { + for keyname, key := range node.Tags { + if _, ok := n.Tags[keyname]; !ok { var key Entry - n.Keys[keyname] = &key + n.Tags[keyname] = &key } - n.Keys[keyname].Set(key) + n.Tags[keyname].Set(key) } for _, p := range n.Profiles { @@ -161,12 +161,12 @@ func (config *nodeYaml) FindAllNodes() ([]NodeInfo, error) { n.NetDevs[devname].Default.SetAlt(netdev.Default, p) } - for keyname, key := range config.NodeProfiles[p].Keys { - if _, ok := n.Keys[keyname]; !ok { + for keyname, key := range config.NodeProfiles[p].Tags { + if _, ok := n.Tags[keyname]; !ok { var key Entry - n.Keys[keyname] = &key + n.Tags[keyname] = &key } - n.Keys[keyname].SetAlt(key, p) + n.Tags[keyname].SetAlt(key, p) } } @@ -194,7 +194,7 @@ func (config *nodeYaml) FindAllProfiles() ([]NodeInfo, error) { for name, profile := range config.NodeProfiles { var p NodeInfo p.NetDevs = make(map[string]*NetDevEntry) - p.Keys = make(map[string]*Entry) + p.Tags = make(map[string]*Entry) p.Id.Set(name) p.Comment.Set(profile.Comment) @@ -235,12 +235,12 @@ func (config *nodeYaml) FindAllProfiles() ([]NodeInfo, error) { p.NetDevs[devname].Default.Set(netdev.Default) } - for keyname, key := range profile.Keys { - if _, ok := p.Keys[keyname]; !ok { + for keyname, key := range profile.Tags { + if _, ok := p.Tags[keyname]; !ok { var key Entry - p.Keys[keyname] = &key + p.Tags[keyname] = &key } - p.Keys[keyname].Set(key) + p.Tags[keyname].Set(key) } // TODO: Validate or die on all inputs diff --git a/internal/pkg/node/datastructure.go b/internal/pkg/node/datastructure.go index 8702aa16..f2cefac0 100644 --- a/internal/pkg/node/datastructure.go +++ b/internal/pkg/node/datastructure.go @@ -36,7 +36,7 @@ type NodeConf struct { Discoverable string `yaml:"discoverable,omitempty"` Profiles []string `yaml:"profiles,omitempty"` NetDevs map[string]*NetDevs `yaml:"network devices,omitempty"` - Keys map[string]string `yaml:"keys,omitempty"` + Tags map[string]string `yaml:"tags,omitempty"` } type NetDevs struct { @@ -88,7 +88,7 @@ type NodeInfo struct { Profiles []string GroupProfiles []string NetDevs map[string]*NetDevEntry - Keys map[string]*Entry + Tags map[string]*Entry } type NetDevEntry struct { diff --git a/internal/pkg/node/modifiers.go b/internal/pkg/node/modifiers.go index a976f5dc..29557bd8 100644 --- a/internal/pkg/node/modifiers.go +++ b/internal/pkg/node/modifiers.go @@ -79,7 +79,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].Keys = make(map[string]string) + config.Nodes[nodeID].Tags = make(map[string]string) for devname, netdev := range node.NetDevs { var newdev NetDevs @@ -95,8 +95,8 @@ func (config *nodeYaml) NodeUpdate(node NodeInfo) error { config.Nodes[nodeID].NetDevs[devname].Default = netdev.Default.GetReal() } - for keyname, key := range node.Keys { - config.Nodes[nodeID].Keys[keyname] = key.GetReal() + for keyname, key := range node.Tags { + config.Nodes[nodeID].Tags[keyname] = key.GetReal() } return nil @@ -167,7 +167,7 @@ func (config *nodeYaml) ProfileUpdate(profile NodeInfo) error { config.NodeProfiles[profileID].Profiles = profile.Profiles config.NodeProfiles[profileID].NetDevs = make(map[string]*NetDevs) - config.NodeProfiles[profileID].Keys = make(map[string]string) + config.NodeProfiles[profileID].Tags = make(map[string]string) for devname, netdev := range profile.NetDevs { var newdev NetDevs @@ -183,8 +183,8 @@ func (config *nodeYaml) ProfileUpdate(profile NodeInfo) error { config.NodeProfiles[profileID].NetDevs[devname].Default = netdev.Default.GetReal() } - for keyname, key := range profile.Keys { - config.NodeProfiles[profileID].Keys[keyname] = key.GetReal() + for keyname, key := range profile.Tags { + config.NodeProfiles[profileID].Tags[keyname] = key.GetReal() } return nil diff --git a/internal/pkg/overlay/overlay.go b/internal/pkg/overlay/overlay.go index 3de08c1c..4c646c98 100644 --- a/internal/pkg/overlay/overlay.go +++ b/internal/pkg/overlay/overlay.go @@ -38,7 +38,7 @@ type TemplateStruct struct { RuntimeOverlay string SystemOverlay string NetDevs map[string]*node.NetDevs - Keys map[string]string + Tags map[string]string AllNodes []node.NodeInfo NFSMounts []string } @@ -187,7 +187,7 @@ func BuildOverlay(nodeInfo node.NodeInfo, overlayName string) error { tstruct.RuntimeOverlay = nodeInfo.RuntimeOverlay.Get() tstruct.SystemOverlay = nodeInfo.SystemOverlay.Get() tstruct.NetDevs = make(map[string]*node.NetDevs) - tstruct.Keys = make(map[string]string) + tstruct.Tags = make(map[string]string) for devname, netdev := range nodeInfo.NetDevs { var nd node.NetDevs tstruct.NetDevs[devname] = &nd @@ -208,8 +208,8 @@ func BuildOverlay(nodeInfo node.NodeInfo, overlayName string) error { tstruct.NetDevs[devname].IpCIDR = netaddr.String() } - for keyname, key := range nodeInfo.Keys { - tstruct.Keys[keyname] = key.Get() + for keyname, key := range nodeInfo.Tags { + tstruct.Tags[keyname] = key.Get() } tstruct.AllNodes = allNodes for _, export := range controller.Nfs.ExportsExtended {