diff --git a/etc/nodes.conf b/etc/nodes.conf index 40cf1e3c..b2aa0e9f 100644 --- a/etc/nodes.conf +++ b/etc/nodes.conf @@ -43,7 +43,6 @@ nodegroups: nodes: n0000: hostname: localtest - kernel version: 3.10.0-1127.el7.x86_64 system overlay: test netdevs: eth0: diff --git a/internal/app/warewulfd/response/ipxe.go b/internal/app/warewulfd/response/ipxe.go index 6a9e2d3b..a1e83c2d 100644 --- a/internal/app/warewulfd/response/ipxe.go +++ b/internal/app/warewulfd/response/ipxe.go @@ -46,7 +46,7 @@ func IpxeSend(w http.ResponseWriter, req *http.Request) { return } - if node.HostName != "" { + if node.HostName.Defined() == true { conf := config.New() log.Printf("IPXE: %15s: %s\n", node.Fqdn, req.URL.Path) @@ -62,13 +62,13 @@ func IpxeSend(w http.ResponseWriter, req *http.Request) { var replace iPxeTemplate - replace.Fqdn = node.Fqdn + replace.Fqdn = node.Fqdn.String() replace.Ipaddr = conf.Ipaddr replace.Port = strconv.Itoa(conf.Port) - replace.Hostname = node.HostName + replace.Hostname = node.HostName.String() replace.Hwaddr = url[2] - replace.Vnfs = node.Vnfs - replace.Kernelargs = node.KernelArgs + replace.Vnfs = node.Vnfs.String() + replace.Kernelargs = node.KernelArgs.String() err = tmpl.Execute(w, replace) if err != nil { diff --git a/internal/app/warewulfd/response/kernel.go b/internal/app/warewulfd/response/kernel.go index 8613e9b1..17bd9f7c 100644 --- a/internal/app/warewulfd/response/kernel.go +++ b/internal/app/warewulfd/response/kernel.go @@ -16,10 +16,10 @@ func KernelSend(w http.ResponseWriter, req *http.Request) { return } - if node.KernelVersion != "" { - fileName := config.KernelImage(node.KernelVersion) + if node.KernelVersion.Defined() == true { + fileName := config.KernelImage(node.KernelVersion.String()) - err := sendFile(w, fileName, node.Fqdn) + err := sendFile(w, fileName, node.Fqdn.String()) if err != nil { log.Printf("ERROR: %s\n", err) } else { diff --git a/internal/app/warewulfd/response/kmods.go b/internal/app/warewulfd/response/kmods.go index 90043190..ef0f9787 100644 --- a/internal/app/warewulfd/response/kmods.go +++ b/internal/app/warewulfd/response/kmods.go @@ -15,10 +15,10 @@ func KmodsSend(w http.ResponseWriter, req *http.Request) { log.Println(err) return } - if node.KernelVersion != "" { - fileName := config.KmodsImage(node.KernelVersion) + if node.KernelVersion.Defined() == true { + fileName := config.KmodsImage(node.KernelVersion.String()) - err := sendFile(w, fileName, node.Fqdn) + err := sendFile(w, fileName, node.Fqdn.String()) if err != nil { log.Printf("ERROR: %s\n", err) } else { diff --git a/internal/app/warewulfd/response/runtime.go b/internal/app/warewulfd/response/runtime.go index 06b30309..3e8bc77e 100644 --- a/internal/app/warewulfd/response/runtime.go +++ b/internal/app/warewulfd/response/runtime.go @@ -47,7 +47,7 @@ func RuntimeOverlaySend(w http.ResponseWriter, req *http.Request) { return } - if node.Fqdn == "" { + if node.Fqdn.Defined() == false { log.Printf("UNKNOWN: %15s: %s\n", remote[0], req.URL.Path) w.WriteHeader(404) return @@ -55,10 +55,10 @@ func RuntimeOverlaySend(w http.ResponseWriter, req *http.Request) { log.Printf("REQ: %15s: %s\n", node.Fqdn, req.URL.Path) } - if node.RuntimeOverlay != "" { - fileName := config.RuntimeOverlayImage(node.Fqdn) + if node.RuntimeOverlay.Defined() == true { + fileName := config.RuntimeOverlayImage(node.Fqdn.String()) - err := sendFile(w, fileName, node.Fqdn) + err := sendFile(w, fileName, node.Fqdn.String()) if err != nil { log.Printf("ERROR: %s\n", err) } else { diff --git a/internal/app/warewulfd/response/system.go b/internal/app/warewulfd/response/system.go index ae87fc25..a6729db8 100644 --- a/internal/app/warewulfd/response/system.go +++ b/internal/app/warewulfd/response/system.go @@ -16,10 +16,10 @@ func SystemOverlaySend(w http.ResponseWriter, req *http.Request) { return } - if node.SystemOverlay != "" { - fileName := config.SystemOverlayImage(node.Fqdn) + if node.SystemOverlay.Defined() == true { + fileName := config.SystemOverlayImage(node.Fqdn.String()) - err := sendFile(w, fileName, node.Fqdn) + err := sendFile(w, fileName, node.Fqdn.String()) if err != nil { log.Printf("ERROR: %s\n", err) } else { diff --git a/internal/app/warewulfd/response/util.go b/internal/app/warewulfd/response/util.go index 793ef1fb..4746af0f 100644 --- a/internal/app/warewulfd/response/util.go +++ b/internal/app/warewulfd/response/util.go @@ -27,7 +27,7 @@ func getSanity(req *http.Request) (node.NodeInfo, error) { return ret, errors.New("Could not find node by HW address") } - if ret.Fqdn == "" { + if ret.Fqdn.Defined() == false { log.Printf("UNKNOWN: %15s: %s\n", hwaddr, req.URL.Path) return ret, errors.New("Unknown node HW address: " + hwaddr) } else { diff --git a/internal/app/warewulfd/response/vnfs.go b/internal/app/warewulfd/response/vnfs.go index c6e03fdf..6986926f 100644 --- a/internal/app/warewulfd/response/vnfs.go +++ b/internal/app/warewulfd/response/vnfs.go @@ -17,10 +17,10 @@ func VnfsSend(w http.ResponseWriter, req *http.Request) { return } - if node.Vnfs != "" { - v := vnfs.New(node.Vnfs) + if node.Vnfs.Defined() == true { + v := vnfs.New(node.Vnfs.String()) - err := sendFile(w, config.VnfsImage(v.NameClean()), node.Fqdn) + err := sendFile(w, config.VnfsImage(v.NameClean()), node.Fqdn.String()) if err != nil { log.Printf("ERROR: %s\n", err) } else { diff --git a/internal/app/wwctl/build/main.go b/internal/app/wwctl/build/main.go index 0a2f5edc..353cd5a4 100644 --- a/internal/app/wwctl/build/main.go +++ b/internal/app/wwctl/build/main.go @@ -46,7 +46,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { wwlog.Printf(wwlog.INFO, "Building VNFS images...\n") for _, node := range nodes { - set[node.Vnfs] ++ + set[node.Vnfs.String()] ++ } for e := range set { vnfs.Build(e, buildForce) @@ -60,7 +60,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { wwlog.Printf(wwlog.INFO, "Building Kernel images...\n") for _, node := range nodes { - set[node.KernelVersion] ++ + set[node.KernelVersion.String()] ++ } for e := range set { kernel.Build(e) diff --git a/internal/app/wwctl/group/delete/main.go b/internal/app/wwctl/group/delete/main.go index 97348514..71ee3fd4 100644 --- a/internal/app/wwctl/group/delete/main.go +++ b/internal/app/wwctl/group/delete/main.go @@ -31,7 +31,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { wwlog.Printf(wwlog.ERROR, "%s\n", err) } else { for _, n := range nodes { - if n.GroupName == g { + if n.GroupName.String() == g { numNodes ++ } } diff --git a/internal/app/wwctl/group/list/main.go b/internal/app/wwctl/group/list/main.go index 177ff841..9abbc31e 100644 --- a/internal/app/wwctl/group/list/main.go +++ b/internal/app/wwctl/group/list/main.go @@ -35,7 +35,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } else { fmt.Printf("%-22s %-16s %-30s %-30s %-16s\n", "GROUP NAME", "DOMAINNAME", "KERNEL VERSION", "VNFS IMAGE", "RUNTIME OVERLAY") for _, g := range groups { - fmt.Printf("%-22s %-16s %-30s %-30s %-16s\n", g.GroupName, g.DomainName, g.KernelVersion, g.Vnfs, g.RuntimeOverlay) + fmt.Printf("%-22s %-16s %-30s %-30s %-16s\n", g.GroupName.String(), g.DomainName.String(), g.KernelVersion.String(), g.Vnfs.String(), g.RuntimeOverlay.String()) } } diff --git a/internal/app/wwctl/group/set/main.go b/internal/app/wwctl/group/set/main.go index 4ed4e3e7..e572e600 100644 --- a/internal/app/wwctl/group/set/main.go +++ b/internal/app/wwctl/group/set/main.go @@ -24,7 +24,19 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } - if len(args) > 0 { + if SetGroupAll == true { + var tmp []node.GroupInfo + tmp, err = nodeDB.FindAllGroups() + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) + } + + for _, g := range tmp { + groups = append(groups, g) + } + + } else if len(args) > 0 { var tmp []node.GroupInfo tmp, err = nodeDB.FindAllGroups() if err != nil { @@ -34,7 +46,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { for _, a := range args { for _, g := range tmp { - if g.Id == a { + if g.Id.String() == a { groups = append(groups, g) } } @@ -48,7 +60,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { for _, g := range groups { if SetVnfs != "" { wwlog.Printf(wwlog.VERBOSE, "Group: %s, Setting vnfs to: %s\n", g.Id, SetVnfs) - err := nodeDB.SetGroupVal(g.Id, "vnfs", SetVnfs) + err := nodeDB.SetGroupVal(g.Id.String(), "vnfs", SetVnfs) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -61,14 +73,14 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } for _, n := range nodes { - _ = nodeDB.SetNodeVal(g.Id, n.Id, "vnfs", "") + _ = nodeDB.SetNodeVal(g.Id.String(), n.Id.String(), "vnfs", "") } } } if SetKernel != "" { wwlog.Printf(wwlog.VERBOSE, "Group: %s, Setting kernel to: %s\n", g.Id, SetVnfs) - err := nodeDB.SetGroupVal(g.Id, "kernel", SetKernel) + err := nodeDB.SetGroupVal(g.Id.String(), "kernel", SetKernel) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -81,14 +93,14 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } for _, n := range nodes { - _ = nodeDB.SetNodeVal(g.Id, n.Id, "kernel", "") + _ = nodeDB.SetNodeVal(g.Id.String(), n.Id.String(), "kernel", "") } } } if SetDomainName != "" { wwlog.Printf(wwlog.VERBOSE, "Group: %s, Setting domain name to: %s\n", g.Id, SetDomainName) - err := nodeDB.SetGroupVal(g.Id, "domain", SetDomainName) + err := nodeDB.SetGroupVal(g.Id.String(), "domain", SetDomainName) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -101,14 +113,14 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } for _, n := range nodes { - _ = nodeDB.SetNodeVal(g.Id, n.Id, "domain", "") + _ = nodeDB.SetNodeVal(g.Id.String(), n.Id.String(), "domain", "") } } } if SetIpxe != "" { wwlog.Printf(wwlog.VERBOSE, "Group: %s, Setting iPXE template to: %s\n", g.Id, SetIpxe) - err := nodeDB.SetGroupVal(g.Id, "ipxe", SetIpxe) + err := nodeDB.SetGroupVal(g.Id.String(), "ipxe", SetIpxe) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -121,14 +133,14 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } for _, n := range nodes { - _ = nodeDB.SetNodeVal(g.Id, n.Id, "ipxe", "") + _ = nodeDB.SetNodeVal(g.Id.String(), n.Id.String(), "ipxe", "") } } } if SetRuntimeOverlay != "" { wwlog.Printf(wwlog.VERBOSE, "Group: %s, Setting runtime overlay to: %s\n", g.Id, SetRuntimeOverlay) - err := nodeDB.SetGroupVal(g.Id, "runtimeoverlay", SetRuntimeOverlay) + err := nodeDB.SetGroupVal(g.Id.String(), "runtimeoverlay", SetRuntimeOverlay) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -140,14 +152,14 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } for _, n := range nodes { - _ = nodeDB.SetNodeVal(g.Id, n.Id, "runtimeoverlay", "") + _ = nodeDB.SetNodeVal(g.Id.String(), n.Id.String(), "runtimeoverlay", "") } } } if SetSystemOverlay != "" { wwlog.Printf(wwlog.VERBOSE, "Group: %s, Setting system overlay to: %s\n", g.Id, SetSystemOverlay) - err := nodeDB.SetGroupVal(g.Id, "systemoverlay", SetSystemOverlay) + err := nodeDB.SetGroupVal(g.Id.String(), "systemoverlay", SetSystemOverlay) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -159,13 +171,13 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } for _, n := range nodes { - _ = nodeDB.SetNodeVal(g.Id, n.Id, "systemoverlay", "") + _ = nodeDB.SetNodeVal(g.Id.String(), n.Id.String(), "systemoverlay", "") } } } if SetIpmiIpaddr != "" { wwlog.Printf(wwlog.VERBOSE, "Group: %s, Setting IPMI IP address to: %s\n", g.Id, SetIpmiIpaddr) - err := nodeDB.SetGroupVal(g.Id, "ipmiipaddr", SetIpmiIpaddr) + err := nodeDB.SetGroupVal(g.Id.String(), "ipmiipaddr", SetIpmiIpaddr) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -177,13 +189,13 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } for _, n := range nodes { - _ = nodeDB.SetNodeVal(g.Id, n.Id, "ipmiipaddr", "") + _ = nodeDB.SetNodeVal(g.Id.String(), n.Id.String(), "ipmiipaddr", "") } } } if SetIpmiUsername != "" { wwlog.Printf(wwlog.VERBOSE, "Group: %s, Setting IPMI IP username to: %s\n", g.Id, SetIpmiUsername) - err := nodeDB.SetGroupVal(g.Id, "ipmiusername", SetIpmiUsername) + err := nodeDB.SetGroupVal(g.Id.String(), "ipmiusername", SetIpmiUsername) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -195,13 +207,13 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } for _, n := range nodes { - _ = nodeDB.SetNodeVal(g.Id, n.Id, "ipmiusername", "") + _ = nodeDB.SetNodeVal(g.Id.String(), n.Id.String(), "ipmiusername", "") } } } if SetIpmiPassword != "" { wwlog.Printf(wwlog.VERBOSE, "Group: %s, Setting IPMI IP password to: %s\n", g.Id, SetIpmiPassword) - err := nodeDB.SetGroupVal(g.Id, "ipmipassword", SetIpmiPassword) + err := nodeDB.SetGroupVal(g.Id.String(), "ipmipassword", SetIpmiPassword) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -213,7 +225,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } for _, n := range nodes { - _ = nodeDB.SetNodeVal(g.Id, n.Id, "ipmipassword", "") + _ = nodeDB.SetNodeVal(g.Id.String(), n.Id.String(), "ipmipassword", "") } } } diff --git a/internal/app/wwctl/group/set/root.go b/internal/app/wwctl/group/set/root.go index 8338958b..d4378b52 100644 --- a/internal/app/wwctl/group/set/root.go +++ b/internal/app/wwctl/group/set/root.go @@ -20,7 +20,7 @@ var ( SetIpmiIpaddr string SetIpmiUsername string SetIpmiPassword string - + SetGroupAll bool ) func init() { @@ -35,6 +35,8 @@ func init() { baseCmd.PersistentFlags().StringVar(&SetIpmiPassword, "ipmipass", "", "Set the node's IPMI password") baseCmd.PersistentFlags().BoolVarP(&SetClearNodes, "clear", "c", false, "Clear node configurations when setting parent group") + baseCmd.PersistentFlags().BoolVarP(&SetGroupAll, "all", "a", false, "Set all nodes") + } // GetRootCommand returns the root cobra.Command for the application. diff --git a/internal/app/wwctl/kernel/build/main.go b/internal/app/wwctl/kernel/build/main.go index 89f01653..ae9e7844 100644 --- a/internal/app/wwctl/kernel/build/main.go +++ b/internal/app/wwctl/kernel/build/main.go @@ -27,7 +27,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } for _, node := range nodes { - set[node.KernelVersion] ++ + set[node.KernelVersion.String()] ++ } } else if BuildAll == true { @@ -39,7 +39,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } for _, node := range nodes { - set[node.KernelVersion] ++ + set[node.KernelVersion.String()] ++ } } else if len(args) == 1 { diff --git a/internal/app/wwctl/node/add/main.go b/internal/app/wwctl/node/add/main.go index e52bf95b..ad4d3a49 100644 --- a/internal/app/wwctl/node/add/main.go +++ b/internal/app/wwctl/node/add/main.go @@ -1,6 +1,7 @@ package add import ( + "fmt" "github.com/hpcng/warewulf/internal/pkg/node" "github.com/hpcng/warewulf/internal/pkg/wwlog" "github.com/spf13/cobra" @@ -20,6 +21,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) } + fmt.Printf("Added node: %s\n", a) } nodeDB.Persist() diff --git a/internal/app/wwctl/node/delete/main.go b/internal/app/wwctl/node/delete/main.go index 23b566f4..f036e7c4 100644 --- a/internal/app/wwctl/node/delete/main.go +++ b/internal/app/wwctl/node/delete/main.go @@ -21,11 +21,11 @@ func CobraRunE(cmd *cobra.Command, args []string) error { nodeList, err := nodeDB.SearchByNameList(args) for _, n := range nodeList { - if SetGroup != "" && SetGroup != n.GroupName { + if SetGroup != "" && SetGroup != n.GroupName.String() { wwlog.Printf(wwlog.DEBUG, "skipping node of different group: %s/%s\n", n.GroupName, n.Id) continue } - err := nodeDB.DelNode(n.GroupName, n.Id) + err := nodeDB.DelNode(n.GroupName.String(), n.Id.String()) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) } else { diff --git a/internal/app/wwctl/node/list/main.go b/internal/app/wwctl/node/list/main.go index 95ebec14..3f14b520 100644 --- a/internal/app/wwctl/node/list/main.go +++ b/internal/app/wwctl/node/list/main.go @@ -7,6 +7,7 @@ import ( "github.com/spf13/cobra" "os" "reflect" + "strings" ) @@ -38,32 +39,49 @@ func CobraRunE(cmd *cobra.Command, args []string) error { typeOfS := v.Type() fmt.Printf("################################################################################\n") for i := 0; i< v.NumField(); i++ { - fmt.Printf("%-25s %s = %v\n", node.Fqdn, typeOfS.Field(i).Name, v.Field(i).Interface()) + //TODO: Fix for NetDevs and Interface should print Fprint() method + fmt.Printf("%-25s %s = %v\n", node.Fqdn.String(), typeOfS.Field(i).Name, v.Field(i).Interface()) } } } else if ShowNet == true { - fmt.Printf("%-22s %-10s %-20s %-16s %-16s %-16s %s\n", "NODE NAME", "DEVICE", "HWADDR", "IPADDR", "NETMASK", "GATEWAY", "TYPE") + fmt.Printf("%-22s %-6s %-18s %-15s %-15s\n", "NODE NAME", "DEVICE", "HWADDR", "IPADDR", "GATEWAY") + fmt.Println(strings.Repeat("=", 80)) for _, node := range nodes { - for name, dev := range node.NetDevs { - fmt.Printf("%-22s %-10s %-20s %-16s %-16s %-16s %s\n", node.Fqdn, name, dev.Hwaddr, dev.Ipaddr, dev.Netmask, dev.Gateway, dev.Type) + if len(node.NetDevs) > 0 { + for name, dev := range node.NetDevs { + fmt.Printf("%-22s %-6s %-18s %-15s %-15s\n", node.Fqdn.String(), name, dev.Hwaddr, dev.Ipaddr, dev.Gateway) + } + } else { + fmt.Printf("%-22s %-6s %-18s %-15s %-15s\n", node.Fqdn.String(), "--", "--", "--", "--") } } } else if ShowIpmi == true { fmt.Printf("%-22s %-16s %-20s %-20s\n", "NODE NAME", "IPMI IPADDR", "IPMI USERNAME", "IPMI PASSWORD") + fmt.Println(strings.Repeat("=", 80)) for _, node := range nodes { - fmt.Printf("%-22s %-16s %-20s %-20s\n", node.Fqdn, node.IpmiIpaddr, node.IpmiUserName, node.IpmiPassword) + fmt.Printf("%-22s %-16s %-20s %-20s\n", node.Fqdn.String(), node.IpmiIpaddr.Fprint(), node.IpmiUserName.Fprint(), node.IpmiPassword.Fprint()) + } + + } else if ShowLong == true { + fmt.Printf("%-22s %-12s %-26s %-30s %-12s\n", "NODE NAME", "GROUP NAME", "KERNEL VERSION", "VNFS IMAGE", "R-OVERLAY") + fmt.Println(strings.Repeat("=", 100)) + + for _, node := range nodes { + fmt.Printf("%-22s %-12s %-26s %-30s %-12s\n", node.Fqdn.String(), node.GroupName.Fprint(), node.KernelVersion.Fprint(), node.Vnfs.Fprint(), node.RuntimeOverlay.Fprint()) } } else { - fmt.Printf("%-22s %-16s %-30s %-30s %-16s\n", "NODE NAME", "GROUP NAME", "KERNEL VERSION", "VNFS IMAGE", "RUNTIME OVERLAY") + fmt.Printf("%-22s %-26s %-30s\n", "NODE NAME", "KERNEL VERSION", "VNFS IMAGE") + fmt.Println(strings.Repeat("=", 80)) for _, node := range nodes { - fmt.Printf("%-22s %-16s %-30s %-30s %-16s\n", node.Fqdn, node.GroupName, node.KernelVersion, node.Vnfs, node.RuntimeOverlay) + fmt.Printf("%-22s %-26s %-30s\n", node.Fqdn.String(), node.KernelVersion.Fprint(), node.Vnfs.Fprint()) } + } diff --git a/internal/app/wwctl/node/list/root.go b/internal/app/wwctl/node/list/root.go index 59c1c9cc..9bc4fe3c 100644 --- a/internal/app/wwctl/node/list/root.go +++ b/internal/app/wwctl/node/list/root.go @@ -12,12 +12,14 @@ var ( ShowNet bool ShowIpmi bool ShowAll bool + ShowLong bool ) func init() { baseCmd.PersistentFlags().BoolVarP(&ShowNet, "net", "n", false, "Show node network configurations") baseCmd.PersistentFlags().BoolVarP(&ShowIpmi, "ipmi", "i", false, "Show node IPMI configurations") baseCmd.PersistentFlags().BoolVarP(&ShowAll, "all", "a", false, "Show all node configurations") + baseCmd.PersistentFlags().BoolVarP(&ShowLong, "long", "l", false, "Show long or wide format") } // GetRootCommand returns the root cobra.Command for the application. diff --git a/internal/app/wwctl/node/poweroff/power.go b/internal/app/wwctl/node/poweroff/power.go index 3364fd88..9b17a2e6 100644 --- a/internal/app/wwctl/node/poweroff/power.go +++ b/internal/app/wwctl/node/poweroff/power.go @@ -34,13 +34,13 @@ func CobraRunE(cmd *cobra.Command, args []string) error { for _, node := range nodeList { - if node.IpmiIpaddr == "" { + if node.IpmiIpaddr.String() == "" { wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.HostName) continue } ipmiCmd := power.IPMI{ - HostName: node.IpmiIpaddr, + HostName: node.IpmiIpaddr.String(), User: "ADMIN", Password: "ADMIN", AuthType: "MD5", diff --git a/internal/app/wwctl/node/poweron/power.go b/internal/app/wwctl/node/poweron/power.go index 900177c2..95703f3d 100644 --- a/internal/app/wwctl/node/poweron/power.go +++ b/internal/app/wwctl/node/poweron/power.go @@ -34,13 +34,13 @@ func CobraRunE(cmd *cobra.Command, args []string) error { for _, node := range nodeList { - if node.IpmiIpaddr == "" { + if node.IpmiIpaddr.String() == "" { wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.HostName) continue } ipmiCmd := power.IPMI{ - HostName: node.IpmiIpaddr, + HostName: node.IpmiIpaddr.String(), User: "ADMIN", Password: "ADMIN", AuthType: "MD5", diff --git a/internal/app/wwctl/node/powerstatus/power.go b/internal/app/wwctl/node/powerstatus/power.go index 1f02fb57..960550f4 100644 --- a/internal/app/wwctl/node/powerstatus/power.go +++ b/internal/app/wwctl/node/powerstatus/power.go @@ -34,13 +34,13 @@ func CobraRunE(cmd *cobra.Command, args []string) error { for _, node := range nodeList { - if node.IpmiIpaddr == "" { + if node.IpmiIpaddr.String() == "" { wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.HostName) continue } ipmiCmd := power.IPMI{ - HostName: node.IpmiIpaddr, + HostName: node.IpmiIpaddr.String(), User: "ADMIN", Password: "ADMIN", AuthType: "MD5", diff --git a/internal/app/wwctl/node/set/main.go b/internal/app/wwctl/node/set/main.go index e7d2db05..8c76889f 100644 --- a/internal/app/wwctl/node/set/main.go +++ b/internal/app/wwctl/node/set/main.go @@ -24,31 +24,37 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } - if len(args) > 0 { - nodes, err = nodeDB.SearchByNameList(args) + if SetNodeAll == true { + nodes, err = nodeDB.FindAllNodes() if err != nil { wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err) os.Exit(1) } + } else if len(args) > 0 { + nodes, err = nodeDB.SearchByNameList(args) + if err != nil { + wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err) + os.Exit(1) + } } else { cmd.Usage() os.Exit(1) } for _, n := range nodes { - wwlog.Printf(wwlog.VERBOSE, "Evaluating node: %s\n", n.Fqdn) + wwlog.Printf(wwlog.VERBOSE, "Evaluating node: %s\n", n.Fqdn.String()) if SetVnfs != "" { - wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting vnfs to: %s\n", n.Fqdn, SetVnfs) - err := nodeDB.SetNodeVal(n.Gid, n.Id, "vnfs", SetVnfs) + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting vnfs to: %s\n", n.Fqdn.String(), SetVnfs) + err := nodeDB.SetNodeVal(n.Gid.String(), n.Id.String(), "vnfs", SetVnfs) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) } } if SetKernel != "" { - wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting kernel to: %s\n", n.Fqdn, SetVnfs) - err := nodeDB.SetNodeVal(n.Gid, n.Id, "kernel", SetKernel) + wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting kernel to: %s\n", n.Fqdn.String(), SetKernel) + err := nodeDB.SetNodeVal(n.Gid.String(), n.Id.String(), "kernel", SetKernel) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -56,7 +62,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if SetDomainName != "" { wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting domain name to: %s\n", n.Fqdn, SetDomainName) - err := nodeDB.SetNodeVal(n.Gid, n.Id, "domain", SetDomainName) + err := nodeDB.SetNodeVal(n.Gid.String(), n.Id.String(), "domain", SetDomainName) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -64,7 +70,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if SetIpxe != "" { wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting iPXE template to: %s\n", n.Fqdn, SetIpxe) - err := nodeDB.SetNodeVal(n.Gid, n.Id, "ipxe", SetIpxe) + err := nodeDB.SetNodeVal(n.Gid.String(), n.Id.String(), "ipxe", SetIpxe) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -72,7 +78,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if SetRuntimeOverlay != "" { wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting runtime overlay to: %s\n", n.Fqdn, SetRuntimeOverlay) - err := nodeDB.SetNodeVal(n.Gid, n.Id, "runtimeoverlay", SetRuntimeOverlay) + err := nodeDB.SetNodeVal(n.Gid.String(), n.Id.String(), "runtimeoverlay", SetRuntimeOverlay) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -80,7 +86,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if SetSystemOverlay != "" { wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting system overlay to: %s\n", n.Fqdn, SetSystemOverlay) - err := nodeDB.SetNodeVal(n.Gid, n.Id, "systemoverlay", SetSystemOverlay) + err := nodeDB.SetNodeVal(n.Gid.String(), n.Id.String(), "systemoverlay", SetSystemOverlay) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -88,7 +94,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if SetHostname != "" { wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting hostname to: %s\n", n.Fqdn, SetHostname) - err := nodeDB.SetNodeVal(n.Gid, n.Id, "hostname", SetHostname) + err := nodeDB.SetNodeVal(n.Gid.String(), n.Id.String(), "hostname", SetHostname) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -96,7 +102,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if SetIpmiIpaddr != "" { wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting IPMI IP address to: %s\n", n.Fqdn, SetIpmiIpaddr) - err := nodeDB.SetNodeVal(n.Gid, n.Id, "ipmiipaddr", SetIpmiIpaddr) + err := nodeDB.SetNodeVal(n.Gid.String(), n.Id.String(), "ipmiipaddr", SetIpmiIpaddr) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -104,7 +110,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if SetIpmiUsername != "" { wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting IPMI IP username to: %s\n", n.Fqdn, SetIpmiUsername) - err := nodeDB.SetNodeVal(n.Gid, n.Id, "ipmiusername", SetIpmiUsername) + err := nodeDB.SetNodeVal(n.Gid.String(), n.Id.String(), "ipmiusername", SetIpmiUsername) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -112,7 +118,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if SetIpmiPassword != "" { wwlog.Printf(wwlog.VERBOSE, "Node: %s, Setting IPMI IP password to: %s\n", n.Fqdn, SetIpmiPassword) - err := nodeDB.SetNodeVal(n.Gid, n.Id, "ipmipassword", SetIpmiPassword) + err := nodeDB.SetNodeVal(n.Gid.String(), n.Id.String(), "ipmipassword", SetIpmiPassword) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -127,7 +133,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } wwlog.Printf(wwlog.VERBOSE, "Node: %s, Deleting network device: %s\n", n.Fqdn, SetNetDev) - err := nodeDB.DelNodeNet(n.Gid, n.Id, SetNetDev) + err := nodeDB.DelNodeNet(n.Gid.String(), n.Id.String(), SetNetDev) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -140,7 +146,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting Ipaddr to: %s\n", n.Fqdn, SetNetDev, SetIpaddr) - err := nodeDB.SetNodeNet(n.Gid, n.Id, SetNetDev, "ipaddr", SetIpaddr) + err := nodeDB.SetNodeNet(n.Gid.String(), n.Id.String(), SetNetDev, "ipaddr", SetIpaddr) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -152,7 +158,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting netmask to: %s\n", n.Fqdn, SetNetDev, SetNetmask) - err := nodeDB.SetNodeNet(n.Gid, n.Id, SetNetDev, "netmask", SetNetmask) + err := nodeDB.SetNodeNet(n.Gid.String(), n.Id.String(), SetNetDev, "netmask", SetNetmask) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -164,7 +170,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting gateway to: %s\n", n.Fqdn, SetNetDev, SetGateway) - err := nodeDB.SetNodeNet(n.Gid, n.Id, SetNetDev, "gateway", SetGateway) + err := nodeDB.SetNodeNet(n.Gid.String(), n.Id.String(), SetNetDev, "gateway", SetGateway) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -176,7 +182,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } wwlog.Printf(wwlog.VERBOSE, "Node: %s:%s, Setting HW address to: %s\n", n.Fqdn, SetNetDev, SetHwaddr) - err := nodeDB.SetNodeNet(n.Gid, n.Id, SetNetDev, "hwaddr", SetHwaddr) + err := nodeDB.SetNodeNet(n.Gid.String(), n.Id.String(), SetNetDev, "hwaddr", SetHwaddr) if err != nil { wwlog.Printf(wwlog.ERROR, "%s\n", err) os.Exit(1) @@ -185,17 +191,21 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if len(nodes) > 0 { - q := fmt.Sprintf("Are you sure you want to modify %d nodes(s)", len(nodes)) - - prompt := promptui.Prompt{ - Label: q, - IsConfirm: true, - } - - result, _ := prompt.Run() - - if result == "y" || result == "yes" { + if SetYes == true { nodeDB.Persist() + } else { + q := fmt.Sprintf("Are you sure you want to modify %d nodes(s)", len(nodes)) + + prompt := promptui.Prompt{ + Label: q, + IsConfirm: true, + } + + result, _ := prompt.Run() + + if result == "y" || result == "yes" { + nodeDB.Persist() + } } } else { diff --git a/internal/app/wwctl/node/set/root.go b/internal/app/wwctl/node/set/root.go index 211be16e..f65ec18d 100644 --- a/internal/app/wwctl/node/set/root.go +++ b/internal/app/wwctl/node/set/root.go @@ -25,7 +25,8 @@ var ( SetIpmiIpaddr string SetIpmiUsername string SetIpmiPassword string - + SetNodeAll bool + SetYes bool ) func init() { @@ -46,6 +47,9 @@ func init() { baseCmd.PersistentFlags().StringVarP(&SetGateway, "gateway", "G", "", "Set the node's network device gateway") baseCmd.PersistentFlags().StringVarP(&SetHwaddr, "hwaddr", "N", "", "Set the node's network device HW address") baseCmd.PersistentFlags().BoolVar(&SetNetDevDel, "delete", false, "Delete the node's network device") + baseCmd.PersistentFlags().BoolVarP(&SetNodeAll, "all", "a", false, "Set all nodes") + + baseCmd.PersistentFlags().BoolVarP(&SetYes, "yes", "y", false, "Set 'yes' to all questions asked") } diff --git a/internal/app/wwctl/overlay/build/main.go b/internal/app/wwctl/overlay/build/main.go index 3dbb0eda..b927576c 100644 --- a/internal/app/wwctl/overlay/build/main.go +++ b/internal/app/wwctl/overlay/build/main.go @@ -25,9 +25,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } for _, node := range nodes { - if SystemOverlay == true && node.SystemOverlay == args[0] { + if SystemOverlay == true && node.SystemOverlay.String() == args[0] { updateNodes = append(updateNodes, node) - } else if node.RuntimeOverlay == args[0] { + } else if node.RuntimeOverlay.String() == args[0] { updateNodes = append(updateNodes, node) } } diff --git a/internal/app/wwctl/overlay/chmod/main.go b/internal/app/wwctl/overlay/chmod/main.go index 4ce3c364..bd8352ba 100644 --- a/internal/app/wwctl/overlay/chmod/main.go +++ b/internal/app/wwctl/overlay/chmod/main.go @@ -64,9 +64,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { var updateNodes []node.NodeInfo for _, node := range nodes { - if SystemOverlay == true && node.SystemOverlay == overlayName { + if SystemOverlay == true && node.SystemOverlay.String() == overlayName { updateNodes = append(updateNodes, node) - } else if node.RuntimeOverlay == overlayName { + } else if node.RuntimeOverlay.String() == overlayName { updateNodes = append(updateNodes, node) } } diff --git a/internal/app/wwctl/overlay/create/main.go b/internal/app/wwctl/overlay/create/main.go index 95d31c90..237341cb 100644 --- a/internal/app/wwctl/overlay/create/main.go +++ b/internal/app/wwctl/overlay/create/main.go @@ -48,9 +48,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { var updateNodes []node.NodeInfo for _, node := range nodes { - if SystemOverlay == true && node.SystemOverlay == args[0] { + if SystemOverlay == true && node.SystemOverlay.String() == args[0] { updateNodes = append(updateNodes, node) - } else if node.RuntimeOverlay == args[0] { + } else if node.RuntimeOverlay.String() == args[0] { updateNodes = append(updateNodes, node) } } diff --git a/internal/app/wwctl/overlay/delete/main.go b/internal/app/wwctl/overlay/delete/main.go index 05fbbc25..a59e8c61 100644 --- a/internal/app/wwctl/overlay/delete/main.go +++ b/internal/app/wwctl/overlay/delete/main.go @@ -110,9 +110,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { var updateNodes []node.NodeInfo for _, node := range nodes { - if SystemOverlay == true && node.SystemOverlay == args[0] { + if SystemOverlay == true && node.SystemOverlay.String() == args[0] { updateNodes = append(updateNodes, node) - } else if node.RuntimeOverlay == args[0] { + } else if node.RuntimeOverlay.String() == args[0] { updateNodes = append(updateNodes, node) } } diff --git a/internal/app/wwctl/overlay/edit/main.go b/internal/app/wwctl/overlay/edit/main.go index 1b68e538..cebe1021 100644 --- a/internal/app/wwctl/overlay/edit/main.go +++ b/internal/app/wwctl/overlay/edit/main.go @@ -108,9 +108,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { var updateNodes []node.NodeInfo for _, node := range nodes { - if SystemOverlay == true && node.SystemOverlay == args[0] { + if SystemOverlay == true && node.SystemOverlay.String() == args[0] { updateNodes = append(updateNodes, node) - } else if node.RuntimeOverlay == args[0] { + } else if node.RuntimeOverlay.String() == args[0] { updateNodes = append(updateNodes, node) } } diff --git a/internal/app/wwctl/overlay/imprt/main.go b/internal/app/wwctl/overlay/imprt/main.go index 0ce1c3b1..8374736f 100644 --- a/internal/app/wwctl/overlay/imprt/main.go +++ b/internal/app/wwctl/overlay/imprt/main.go @@ -60,9 +60,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { var updateNodes []node.NodeInfo for _, node := range nodes { - if SystemOverlay == true && node.SystemOverlay == overlayName { + if SystemOverlay == true && node.SystemOverlay.String() == overlayName { updateNodes = append(updateNodes, node) - } else if node.RuntimeOverlay == overlayName { + } else if node.RuntimeOverlay.String() == overlayName { updateNodes = append(updateNodes, node) } } diff --git a/internal/app/wwctl/overlay/list/main.go b/internal/app/wwctl/overlay/list/main.go index 1b51fff9..0266ac14 100644 --- a/internal/app/wwctl/overlay/list/main.go +++ b/internal/app/wwctl/overlay/list/main.go @@ -53,12 +53,12 @@ func CobraRunE(cmd *cobra.Command, args []string) error { for _, node := range nodeList { if SystemOverlay == true { - if node.SystemOverlay != "" { - set[node.SystemOverlay] ++ + if node.SystemOverlay.String() != "" { + set[node.SystemOverlay.String()] ++ } } else { - if node.RuntimeOverlay != "" { - set[node.RuntimeOverlay] ++ + if node.RuntimeOverlay.String() != "" { + set[node.RuntimeOverlay.String()] ++ } } } diff --git a/internal/app/wwctl/overlay/mkdir/main.go b/internal/app/wwctl/overlay/mkdir/main.go index 62dfe7c8..ef38ae0f 100644 --- a/internal/app/wwctl/overlay/mkdir/main.go +++ b/internal/app/wwctl/overlay/mkdir/main.go @@ -57,9 +57,9 @@ func CobraRunE(cmd *cobra.Command, args []string) error { var updateNodes []node.NodeInfo for _, node := range nodes { - if SystemOverlay == true && node.SystemOverlay == args[0] { + if SystemOverlay == true && node.SystemOverlay.String() == args[0] { updateNodes = append(updateNodes, node) - } else if node.RuntimeOverlay == args[0] { + } else if node.RuntimeOverlay.String() == args[0] { updateNodes = append(updateNodes, node) } } diff --git a/internal/app/wwctl/vnfs/build/main.go b/internal/app/wwctl/vnfs/build/main.go index 92590ae8..8fbd1539 100644 --- a/internal/app/wwctl/vnfs/build/main.go +++ b/internal/app/wwctl/vnfs/build/main.go @@ -28,7 +28,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } for _, node := range nodes { - set[node.Vnfs] ++ + set[node.Vnfs.String()] ++ } } else if BuildAll == true { @@ -40,7 +40,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } for _, node := range nodes { - set[node.Vnfs] ++ + set[node.Vnfs.String()] ++ } } else if len(args) == 1 { diff --git a/internal/pkg/node/modify.go b/internal/pkg/node/modify.go new file mode 100644 index 00000000..b3e01de3 --- /dev/null +++ b/internal/pkg/node/modify.go @@ -0,0 +1,249 @@ +package node + +import ( + "github.com/hpcng/warewulf/internal/pkg/errors" + "github.com/hpcng/warewulf/internal/pkg/util" + "github.com/hpcng/warewulf/internal/pkg/wwlog" + + "gopkg.in/yaml.v2" + "os" + "strings" +) + +func (self *nodeYaml) AddGroup(groupID string) error { + var group nodeGroup + + if _, ok := self.NodeGroups[groupID]; ok { + return errors.New("Group name already exists: " + groupID) + } + + self.NodeGroups[groupID] = &group + self.NodeGroups[groupID].DomainSuffix = groupID + + return nil +} + +func (self *nodeYaml) AddNode(groupID string, nodeID string) error { + var node nodeEntry + + wwlog.Printf(wwlog.VERBOSE, "Adding new node: %s/%s\n", groupID, nodeID) + + if _, ok := self.NodeGroups[groupID]; ok { + if _, ok := self.NodeGroups[groupID].Nodes[nodeID]; ok { + return errors.New("Nodename already exists in group: " + nodeID) + } + } else { + return errors.New("Group does not exist: "+groupID) + } + + 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 { + if _, ok := self.NodeGroups[groupID].Nodes[nodeID]; ok { + delete(self.NodeGroups[groupID].Nodes, nodeID) + wwlog.Printf(wwlog.VERBOSE, "Deleting node: %s/%s\n", groupID, nodeID) + } else { + return errors.New("Node '"+nodeID+"' was not found in group '"+groupID+"'") + } + } else { + return errors.New("Group '"+groupID+"' was not found") + } + + return nil +} + +func (self *nodeYaml) DelNodeNet(groupID string, nodeID string, netDev string) error { + + if _, ok := self.NodeGroups[groupID]; ok { + if _, ok := self.NodeGroups[groupID].Nodes[nodeID]; ok { + if _, ok := self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev]; ok { + wwlog.Printf(wwlog.VERBOSE, "Deleting node network device: %s/%s:%s\n", groupID, nodeID, netDev) + delete(self.NodeGroups[groupID].Nodes[nodeID].NetDevs, netDev) + } else { + return errors.New("Network device '"+netDev+"' was not found in node '"+groupID+"/"+nodeID+"'") + } + } else { + return errors.New("Node '"+nodeID+"' was not found in group '"+groupID+"'") + } + } else { + return errors.New("Group '"+groupID+"' was not found") + } + + return nil +} + + +func (self *nodeYaml) DelGroup(groupname string) error { + if _, ok := self.NodeGroups[groupname]; ok { + delete(self.NodeGroups, groupname) + } else { + return errors.New("Node group undefined: " + groupname) + } + + return nil +} + +func (self *nodeYaml) SetGroupVal(groupID string, entry string, value string) error { + if strings.ToUpper(value) == "UNDEF" || strings.ToUpper(value) == "NIL" || strings.ToUpper(value) == "DEL" { + value = "" + } + + if _, ok := self.NodeGroups[groupID]; ok { + wwlog.Printf(wwlog.VERBOSE, "Setting group %s to: %s = '%s'\n", groupID, entry, value ) + + switch strings.ToUpper(entry) { + case "VNFS": + util.ValidateOrDie("VNFS", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].Vnfs = value + case "KERNEL": + util.ValidateOrDie("Kernel Version", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].KernelVersion = value + case "DOMAINSUFFIX": + util.ValidateOrDie("Domain", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].DomainSuffix = value + case "IPXE": + util.ValidateOrDie("iPXE Template", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].Ipxe = value + case "SYSTEMOVERLAY": + util.ValidateOrDie("System Overlay", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].SystemOverlay = value + case "RUNTIMEOVERLAY": + util.ValidateOrDie("Runtime Overlay", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].RuntimeOverlay = value + case "IPMIUSERNAME": + util.ValidateOrDie("IPMI Username", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].IpmiUserName = value + case "IPMIPASSWORD": + util.ValidateOrDie("IPMI Password", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].IpmiPassword = value + + } + } else { + return errors.New("Group does not exist: " +groupID) + } + + return nil +} + +func (self *nodeYaml) SetNodeVal(groupID string, nodeID string, entry string, value string) error { + if strings.ToUpper(value) == "UNDEF" || strings.ToUpper(value) == "NIL" || strings.ToUpper(value) == "DEL" { + value = "" + } + if _, ok := self.NodeGroups[groupID]; ok { + if _, ok := self.NodeGroups[groupID].Nodes[nodeID]; ok { + wwlog.Printf(wwlog.VERBOSE, "Setting node %s/%s to: %s = '%s'\n", groupID, nodeID, entry, value ) + + switch strings.ToUpper(entry) { + case "VNFS": + util.ValidateOrDie("VNFS", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].Nodes[nodeID].Vnfs = value + case "KERNEL": + util.ValidateOrDie("Kernel Version", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].Nodes[nodeID].KernelVersion = value + case "DOMAINSUFFIX": + util.ValidateOrDie("Domain", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].Nodes[nodeID].DomainSuffix = value + case "IPXE": + util.ValidateOrDie("iPXE Template", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].Nodes[nodeID].Ipxe = value + case "SYSTEMOVERLAY": + util.ValidateOrDie("System Overlay", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].Nodes[nodeID].SystemOverlay = value + case "RUNTIMEOVERLAY": + util.ValidateOrDie("Runtime Overlay", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].Nodes[nodeID].RuntimeOverlay = value + case "HOSTNAME": + util.ValidateOrDie("Hostname", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].Nodes[nodeID].Hostname = value + case "IPMIIPADDR": + util.ValidateOrDie("IPMI IP Address", entry, "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$") + self.NodeGroups[groupID].Nodes[nodeID].IpmiIpaddr = value + case "IPMIUSERNAME": + util.ValidateOrDie("IPMI Username", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].Nodes[nodeID].IpmiUserName = value + case "IPMIPASSWORD": + util.ValidateOrDie("IPMI Password", entry, "^[a-zA-Z0-9-._]*$") + self.NodeGroups[groupID].Nodes[nodeID].IpmiPassword = value + + } + } else { + return errors.New("Node does not exist: " +groupID+ "/" +nodeID) + } + } else { + return errors.New("Group does not exist: " +groupID) + } + + return nil +} + +func (self *nodeYaml) SetNodeNet(groupID string, nodeID string, netDev string, entry string, value string) error { + if strings.ToUpper(value) == "UNDEF" || strings.ToUpper(value) == "NIL" || strings.ToUpper(value) == "DEL" { + value = "" + } + + if _, ok := self.NodeGroups[groupID]; ok { + if _, ok := self.NodeGroups[groupID].Nodes[nodeID]; ok { + if _, ok := self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev]; ok { + wwlog.Printf(wwlog.VERBOSE, "Editing existing node NetDev entry for node: %s/%s\n", groupID, nodeID) + } else { + var nd netDevs + self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev] = &nd + } + } else { + return errors.New("Node does not exist: "+groupID+"/"+nodeID) + } + } else { + return errors.New("Group does not exist: "+groupID) + } + + switch strings.ToUpper(entry) { + case "IPADDR": + util.ValidateOrDie("IP address", value, "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$") + self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev].Ipaddr = value + case "NETMASK": + util.ValidateOrDie("Netmask", value, "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$") + self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev].Netmask = value + case "GATEWAY": + util.ValidateOrDie("Gateway", value, "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$") + self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev].Gateway = value + case "TYPE": + util.ValidateOrDie("Network device type", value, "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$") + self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev].Type = value + case "HWADDR": + util.ValidateOrDie("HW address", value, "^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$") + self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev].Hwaddr = value + + } + + return nil +} + +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 +} + diff --git a/internal/pkg/node/node.go b/internal/pkg/node/node.go index 4f559210..79801880 100644 --- a/internal/pkg/node/node.go +++ b/internal/pkg/node/node.go @@ -7,9 +7,7 @@ import ( "github.com/hpcng/warewulf/internal/pkg/wwlog" "gopkg.in/yaml.v2" "io/ioutil" - "os" "regexp" - "strings" ) const ConfigFile = "/etc/warewulf/nodes.conf" @@ -21,7 +19,8 @@ func init() { } type nodeYaml struct { - NodeGroups map[string]*nodeGroup //`yaml:"nodegroups"` + NodeGroups map[string]*nodeGroup //`yaml:"nodegroups"` + Hwaddrs map[string]NodeInfo } type nodeGroup struct { @@ -58,41 +57,96 @@ type netDevs struct { Hwaddr string Ipaddr string Netmask string - Gateway string`yaml:"gateway,omitempty"` + Gateway string `yaml:"gateway,omitempty"` +} + +type EntryInfo struct { + Value string + override string + def string } type NodeInfo struct { - Id string - Gid string - Uid string - GroupName string - HostName string - DomainName string - Fqdn string - Vnfs string - Ipxe string - SystemOverlay string - RuntimeOverlay string - KernelVersion string - KernelArgs string - IpmiIpaddr string - IpmiUserName string - IpmiPassword string + Id EntryInfo + Gid EntryInfo + Uid EntryInfo + GroupName EntryInfo + HostName EntryInfo + DomainName EntryInfo + Fqdn EntryInfo + Vnfs EntryInfo + Ipxe EntryInfo + SystemOverlay EntryInfo + RuntimeOverlay EntryInfo + KernelVersion EntryInfo + KernelArgs EntryInfo + IpmiIpaddr EntryInfo + IpmiUserName EntryInfo + IpmiPassword EntryInfo NetDevs map[string]*netDevs } type GroupInfo struct { - Id string - GroupName string - DomainName string - Vnfs string - Ipxe string - SystemOverlay string - RuntimeOverlay string - KernelVersion string - KernelArgs string - IpmiUserName string - IpmiPassword string + Id EntryInfo + GroupName EntryInfo + DomainName EntryInfo + Vnfs EntryInfo + Ipxe EntryInfo + SystemOverlay EntryInfo + RuntimeOverlay EntryInfo + KernelVersion EntryInfo + KernelArgs EntryInfo + IpmiUserName EntryInfo + IpmiPassword EntryInfo +} + +func (i *EntryInfo) Default (value string) { + if value == "" { + return + } + i.def = value +} + +func (i *EntryInfo) Set (value string) { + if value == "" { + return + } + i.Value = value + i.override = "" +} + +func (i *EntryInfo) Override (value string) { + if value == "" { + return + } + i.override = value +} + +func (i *EntryInfo) String () string { + if i.override != "" { + return i.override + } else if i.Value != "" { + return i.Value + } + return i.def +} + +func (i *EntryInfo) Defined () bool { + if i.String() == "" { + return false + } + return true +} + +func (i *EntryInfo) Fprint () string { + if i.override != "" { + return "["+ i.override +"]" + } else if i.Value != "" { + return i.Value + } else if i.def != "" { + return "("+ i.def +")" + } + return "--" } func New() (nodeYaml, error) { @@ -113,243 +167,6 @@ func New() (nodeYaml, error) { return ret, nil } -func (self *nodeYaml) AddGroup(groupID string) error { - var group nodeGroup - - if _, ok := self.NodeGroups[groupID]; ok { - return errors.New("Group name already exists: " + groupID) - } - - self.NodeGroups[groupID] = &group - self.NodeGroups[groupID].DomainSuffix = groupID - - return nil -} - -func (self *nodeYaml) AddNode(groupID string, nodeID string) error { - var node nodeEntry - - wwlog.Printf(wwlog.VERBOSE, "Adding new node: %s/%s\n", groupID, nodeID) - - if _, ok := self.NodeGroups[groupID]; ok { - if _, ok := self.NodeGroups[groupID].Nodes[nodeID]; ok { - return errors.New("Nodename already exists in group: " + nodeID) - } - } else { - return errors.New("Group does not exist: "+groupID) - } - - 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 { - if _, ok := self.NodeGroups[groupID].Nodes[nodeID]; ok { - delete(self.NodeGroups[groupID].Nodes, nodeID) - wwlog.Printf(wwlog.VERBOSE, "Deleting node: %s/%s\n", groupID, nodeID) - } else { - return errors.New("Node '"+nodeID+"' was not found in group '"+groupID+"'") - } - } else { - return errors.New("Group '"+groupID+"' was not found") - } - - return nil -} - -func (self *nodeYaml) DelNodeNet(groupID string, nodeID string, netDev string) error { - - if _, ok := self.NodeGroups[groupID]; ok { - if _, ok := self.NodeGroups[groupID].Nodes[nodeID]; ok { - if _, ok := self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev]; ok { - wwlog.Printf(wwlog.VERBOSE, "Deleting node network device: %s/%s:%s\n", groupID, nodeID, netDev) - delete(self.NodeGroups[groupID].Nodes[nodeID].NetDevs, netDev) - } else { - return errors.New("Network device '"+netDev+"' was not found in node '"+groupID+"/"+nodeID+"'") - } - } else { - return errors.New("Node '"+nodeID+"' was not found in group '"+groupID+"'") - } - } else { - return errors.New("Group '"+groupID+"' was not found") - } - - return nil -} - - -func (self *nodeYaml) DelGroup(groupname string) error { - if _, ok := self.NodeGroups[groupname]; ok { - delete(self.NodeGroups, groupname) - } else { - return errors.New("Node group undefined: " + groupname) - } - - return nil -} - -func (self *nodeYaml) SetGroupVal(groupID string, entry string, value string) error { - if strings.ToUpper(value) == "UNDEF" || strings.ToUpper(value) == "NIL" || strings.ToUpper(value) == "DEL" { - value = "" - } - - if _, ok := self.NodeGroups[groupID]; ok { - wwlog.Printf(wwlog.VERBOSE, "Setting group %s to: %s = '%s'\n", groupID, entry, value ) - - switch strings.ToUpper(entry) { - case "VNFS": - util.ValidateOrDie("VNFS", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].Vnfs = value - case "KERNEL": - util.ValidateOrDie("Kernel Version", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].KernelVersion = value - case "DOMAINSUFFIX": - util.ValidateOrDie("Domain", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].DomainSuffix = value - case "IPXE": - util.ValidateOrDie("iPXE Template", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].Ipxe = value - case "SYSTEMOVERLAY": - util.ValidateOrDie("System Overlay", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].SystemOverlay = value - case "RUNTIMEOVERLAY": - util.ValidateOrDie("Runtime Overlay", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].RuntimeOverlay = value - case "IPMIUSERNAME": - util.ValidateOrDie("IPMI Username", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].IpmiUserName = value - case "IPMIPASSWORD": - util.ValidateOrDie("IPMI Password", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].IpmiPassword = value - - } - } else { - return errors.New("Group does not exist: " +groupID) - } - - return nil -} - -func (self *nodeYaml) SetNodeVal(groupID string, nodeID string, entry string, value string) error { - if strings.ToUpper(value) == "UNDEF" || strings.ToUpper(value) == "NIL" || strings.ToUpper(value) == "DEL" { - value = "" - } - if _, ok := self.NodeGroups[groupID]; ok { - if _, ok := self.NodeGroups[groupID].Nodes[nodeID]; ok { - wwlog.Printf(wwlog.VERBOSE, "Setting node %s/%s to: %s = '%s'\n", groupID, nodeID, entry, value ) - - switch strings.ToUpper(entry) { - case "VNFS": - util.ValidateOrDie("VNFS", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].Nodes[nodeID].Vnfs = value - case "KERNEL": - util.ValidateOrDie("Kernel Version", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].Nodes[nodeID].KernelVersion = value - case "DOMAINSUFFIX": - util.ValidateOrDie("Domain", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].Nodes[nodeID].DomainSuffix = value - case "IPXE": - util.ValidateOrDie("iPXE Template", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].Nodes[nodeID].Ipxe = value - case "SYSTEMOVERLAY": - util.ValidateOrDie("System Overlay", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].Nodes[nodeID].SystemOverlay = value - case "RUNTIMEOVERLAY": - util.ValidateOrDie("Runtime Overlay", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].Nodes[nodeID].RuntimeOverlay = value - case "HOSTNAME": - util.ValidateOrDie("Hostname", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].Nodes[nodeID].Hostname = value - case "IPMIIPADDR": - util.ValidateOrDie("IPMI IP Address", entry, "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$") - self.NodeGroups[groupID].Nodes[nodeID].IpmiIpaddr = value - case "IPMIUSERNAME": - util.ValidateOrDie("IPMI Username", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].Nodes[nodeID].IpmiUserName = value - case "IPMIPASSWORD": - util.ValidateOrDie("IPMI Password", entry, "^[a-zA-Z0-9-._]*$") - self.NodeGroups[groupID].Nodes[nodeID].IpmiPassword = value - - } - } else { - return errors.New("Node does not exist: " +groupID+ "/" +nodeID) - } - } else { - return errors.New("Group does not exist: " +groupID) - } - - return nil -} - -func (self *nodeYaml) SetNodeNet(groupID string, nodeID string, netDev string, entry string, value string) error { - if strings.ToUpper(value) == "UNDEF" || strings.ToUpper(value) == "NIL" || strings.ToUpper(value) == "DEL" { - value = "" - } - - if _, ok := self.NodeGroups[groupID]; ok { - if _, ok := self.NodeGroups[groupID].Nodes[nodeID]; ok { - if _, ok := self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev]; ok { - wwlog.Printf(wwlog.VERBOSE, "Editing existing node NetDev entry for node: %s/%s\n", groupID, nodeID) - } else { - var nd netDevs - self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev] = &nd - } - } else { - return errors.New("Node does not exist: "+groupID+"/"+nodeID) - } - } else { - return errors.New("Group does not exist: "+groupID) - } - - switch strings.ToUpper(entry) { - case "IPADDR": - util.ValidateOrDie("IP address", value, "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$") - self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev].Ipaddr = value - case "NETMASK": - util.ValidateOrDie("Netmask", value, "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$") - self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev].Netmask = value - case "GATEWAY": - util.ValidateOrDie("Gateway", value, "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$") - self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev].Gateway = value - case "TYPE": - util.ValidateOrDie("Network device type", value, "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$") - self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev].Type = value - case "HWADDR": - util.ValidateOrDie("HW address", value, "^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$") - self.NodeGroups[groupID].Nodes[nodeID].NetDevs[netDev].Hwaddr = value - - } - - return nil -} - -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 -} - func (self *nodeYaml) FindAllGroups() ([]GroupInfo, error) { var ret []GroupInfo @@ -357,17 +174,17 @@ func (self *nodeYaml) FindAllGroups() ([]GroupInfo, error) { for groupname, group := range self.NodeGroups { var g GroupInfo - g.Id = groupname - g.GroupName = groupname - g.RuntimeOverlay = group.RuntimeOverlay - g.SystemOverlay = group.SystemOverlay - g.Ipxe = group.Ipxe - g.KernelVersion = group.KernelVersion - g.KernelArgs = group.KernelArgs - g.Vnfs = group.Vnfs - g.IpmiUserName = group.IpmiUserName - g.IpmiPassword = group.IpmiPassword - g.DomainName = group.DomainSuffix + g.Id.Set(groupname) + g.GroupName.Set(groupname) + g.RuntimeOverlay.Set(group.RuntimeOverlay) + g.SystemOverlay.Set(group.SystemOverlay) + g.Ipxe.Set(group.Ipxe) + g.KernelVersion.Set(group.KernelVersion) + g.KernelArgs.Set(group.KernelArgs) + g.Vnfs.Set(group.Vnfs) + g.IpmiUserName.Set(group.IpmiUserName) + g.IpmiPassword.Set(group.IpmiPassword) + g.DomainName.Set(group.DomainSuffix) // TODO: Validate or die on all inputs @@ -384,79 +201,55 @@ func (self *nodeYaml) FindAllNodes() ([]NodeInfo, error) { for nodename, node := range group.Nodes { var n NodeInfo - n.Id = nodename - n.Gid = groupname -// n.Uid = groupname + ":" + nodename - n.GroupName = groupname - n.HostName = node.Hostname - n.IpmiIpaddr = node.IpmiIpaddr + n.Id.Set(nodename) + n.Gid.Set(groupname) + n.GroupName.Set(groupname) + n.HostName.Set(node.Hostname) + n.IpmiIpaddr.Set(node.IpmiIpaddr) - n.Vnfs = group.Vnfs - n.SystemOverlay = group.SystemOverlay - n.RuntimeOverlay = group.RuntimeOverlay - n.KernelVersion = group.KernelVersion - n.KernelArgs = group.KernelArgs - n.DomainName = group.DomainSuffix - n.Ipxe = group.Ipxe - n.IpmiUserName = group.IpmiUserName - n.IpmiPassword = group.IpmiPassword + n.Vnfs.Set(group.Vnfs) + n.SystemOverlay.Set(group.SystemOverlay) + n.RuntimeOverlay.Set(group.RuntimeOverlay) + n.KernelVersion.Set(group.KernelVersion) + n.KernelArgs.Set(group.KernelArgs) + n.DomainName.Set(group.DomainSuffix) + n.Ipxe.Set(group.Ipxe) + n.IpmiUserName.Set(group.IpmiUserName) + n.IpmiPassword.Set(group.IpmiPassword) + + n.Vnfs.Override(node.Vnfs) + n.SystemOverlay.Override(node.SystemOverlay) + n.RuntimeOverlay.Override(node.RuntimeOverlay) + n.KernelVersion.Override(node.KernelVersion) + n.KernelArgs.Override(node.KernelArgs) + n.DomainName.Override(node.DomainSuffix) + n.Ipxe.Override(node.Ipxe) + n.IpmiUserName.Override(node.IpmiUserName) + n.IpmiPassword.Override(node.IpmiPassword) + + n.RuntimeOverlay.Default("default") + n.SystemOverlay.Default("default") + n.Ipxe.Default("default") + + if n.DomainName.Defined() == true { + if group.DomainSuffix != "" { + n.Fqdn.Set(node.Hostname + "." + group.DomainSuffix) + } else if node.DomainSuffix != "" { + n.Fqdn.Set(node.Hostname + "." + node.DomainSuffix) + } else { + n.Fqdn.Set(node.Hostname) + } + } n.NetDevs = node.NetDevs - if node.IpmiUserName != "" { - n.IpmiUserName = node.IpmiUserName - } - if node.IpmiPassword != "" { - n.IpmiPassword = node.IpmiPassword - } - if node.KernelVersion != "" { - n.KernelVersion = node.KernelVersion - } - if node.Vnfs != "" { - n.Vnfs = node.Vnfs - } - if node.SystemOverlay != "" { - n.SystemOverlay = node.SystemOverlay - } - if node.RuntimeOverlay != "" { - n.RuntimeOverlay = node.RuntimeOverlay - } - if node.DomainSuffix != "" { - n.DomainName = node.DomainSuffix - } - if node.Ipxe != "" { - n.Ipxe = node.Ipxe - } - if node.KernelArgs != "" { - n.KernelArgs = node.KernelArgs - } - - if n.RuntimeOverlay == "" { - n.RuntimeOverlay = "default" - } - if n.SystemOverlay == "" { - n.SystemOverlay = "default" - } - if n.Ipxe == "" { - n.Ipxe = "default" - } - if n.HostName == "" { - n.HostName = nodename - } - - if n.DomainName != "" { - n.Fqdn = node.Hostname + "." + n.DomainName - } else { - n.Fqdn = node.Hostname - } - - util.ValidateOrDie(n.Fqdn +":group name", n.GroupName, "^[a-zA-Z0-9-._]*$") - util.ValidateOrDie(n.Fqdn +":vnfs", n.Vnfs, "^[a-zA-Z0-9-._:/]*$") - util.ValidateOrDie(n.Fqdn +":system overlay", n.SystemOverlay, "^[a-zA-Z0-9-._]*$") - util.ValidateOrDie(n.Fqdn +":runtime overlay", n.RuntimeOverlay, "^[a-zA-Z0-9-._]*$") - util.ValidateOrDie(n.Fqdn +":domain suffix", n.DomainName, "^[a-zA-Z0-9-._]*$") - util.ValidateOrDie(n.Fqdn +":hostname", n.HostName, "^[a-zA-Z0-9-_]*$") - util.ValidateOrDie(n.Fqdn +":kernel version", n.KernelVersion, "^[a-zA-Z0-9-._]*$") + util.ValidateOrDie(n.Fqdn.String() +":group name", n.GroupName.String(), "^[a-zA-Z0-9-._]*$") + util.ValidateOrDie(n.Fqdn.String() +":vnfs", n.Vnfs.String(), "^[a-zA-Z0-9-._:/]*$") + util.ValidateOrDie(n.Fqdn.String() +":system overlay", n.SystemOverlay.String(), "^[a-zA-Z0-9-._]*$") + util.ValidateOrDie(n.Fqdn.String() +":runtime overlay", n.RuntimeOverlay.String(), "^[a-zA-Z0-9-._]*$") + util.ValidateOrDie(n.Fqdn.String() +":domain suffix", n.DomainName.String(), "^[a-zA-Z0-9-._]*$") + util.ValidateOrDie(n.Fqdn.String() +":hostname", n.HostName.String(), "^[a-zA-Z0-9-_]*$") + util.ValidateOrDie(n.Fqdn.String() +":kernel version", n.KernelVersion.String(), "^[a-zA-Z0-9-._]*$") ret = append(ret, n) } @@ -465,10 +258,10 @@ func (self *nodeYaml) FindAllNodes() ([]NodeInfo, error) { return ret, nil } -func (nodes *nodeYaml) FindByHwaddr(hwa string) (NodeInfo, error) { +func (self *nodeYaml) FindByHwaddr(hwa string) (NodeInfo, error) { var ret NodeInfo - n, _ := nodes.FindAllNodes() + n, _ := self.FindAllNodes() for _, node := range n { for _, dev := range node.NetDevs { @@ -481,10 +274,10 @@ func (nodes *nodeYaml) FindByHwaddr(hwa string) (NodeInfo, error) { return ret, errors.New("No nodes found with HW Addr: " + hwa) } -func (nodes *nodeYaml) FindByIpaddr(ipaddr string) (NodeInfo, error) { +func (self *nodeYaml) FindByIpaddr(ipaddr string) (NodeInfo, error) { var ret NodeInfo - n, _ := nodes.FindAllNodes() + n, _ := self.FindAllNodes() for _, node := range n { for _, dev := range node.NetDevs { @@ -503,7 +296,7 @@ func (nodes *nodeYaml) SearchByName(search string) ([]NodeInfo, error) { n, _ := nodes.FindAllNodes() for _, node := range n { - b, _ := regexp.MatchString(search, node.Fqdn) + b, _ := regexp.MatchString(search, node.Fqdn.String()) if b == true { ret = append(ret, node) } @@ -519,7 +312,7 @@ func (nodes *nodeYaml) SearchByNameList(searchList []string) ([]NodeInfo, error) for _, search := range searchList { for _, node := range n { - b, _ := regexp.MatchString(search, node.Fqdn) + b, _ := regexp.MatchString(search, node.Fqdn.String()) if b == true { ret = append(ret, node) } diff --git a/internal/pkg/overlay/runtime.go b/internal/pkg/overlay/runtime.go index e95cdbdd..d72e9e88 100644 --- a/internal/pkg/overlay/runtime.go +++ b/internal/pkg/overlay/runtime.go @@ -60,10 +60,10 @@ func RuntimeBuild(nodeList []node.NodeInfo, force bool) error { wwlog.SetIndent(4) for _, node := range nodeList { - if node.RuntimeOverlay != "" { - OverlayDir := config.RuntimeOverlaySource(node.RuntimeOverlay) - OverlayFile := config.RuntimeOverlayImage(node.Fqdn) - vnfs := vnfs.New(node.Vnfs) + if node.RuntimeOverlay.String() != "" { + OverlayDir := config.RuntimeOverlaySource(node.RuntimeOverlay.String()) + OverlayFile := config.RuntimeOverlayImage(node.Fqdn.String()) + vnfs := vnfs.New(node.Vnfs.String()) vnfsDir := config.VnfsChroot(vnfs.NameClean()) diff --git a/internal/pkg/overlay/system.go b/internal/pkg/overlay/system.go index 89453e62..9b42dbcf 100644 --- a/internal/pkg/overlay/system.go +++ b/internal/pkg/overlay/system.go @@ -60,10 +60,10 @@ func SystemBuild(nodeList []node.NodeInfo, force bool) error { wwlog.SetIndent(4) for _, node := range nodeList { - if node.SystemOverlay != "" { - OverlayDir := config.SystemOverlaySource(node.SystemOverlay) - OverlayFile := config.SystemOverlayImage(node.Fqdn) - vnfs := vnfs.New(node.Vnfs) + if node.SystemOverlay.String() != "" { + OverlayDir := config.SystemOverlaySource(node.SystemOverlay.String()) + OverlayFile := config.SystemOverlayImage(node.Fqdn.String()) + vnfs := vnfs.New(node.Vnfs.String()) vnfsDir := config.VnfsChroot(vnfs.NameClean())