From 4bc523a0523d8019ba98157cfdfcb7d67345482e Mon Sep 17 00:00:00 2001 From: Gregory Kurtzer Date: Sun, 25 Apr 2021 15:43:35 -0700 Subject: [PATCH] Optimized sorting methods across nodes and profiles --- internal/app/wwctl/node/console/power.go | 26 ++++--- internal/app/wwctl/node/delete/main.go | 59 ++++++++++----- internal/app/wwctl/node/delete/root.go | 2 +- internal/app/wwctl/node/list/main.go | 26 ++----- internal/app/wwctl/node/sensors/power.go | 31 ++++---- internal/app/wwctl/node/set/main.go | 55 ++++++-------- internal/app/wwctl/power/cycle/power.go | 29 ++++---- internal/app/wwctl/power/off/power.go | 29 ++++---- internal/app/wwctl/power/on/power.go | 29 ++++---- internal/app/wwctl/power/status/power.go | 29 ++++---- internal/app/wwctl/profile/delete/main.go | 87 ++++++++++++++--------- internal/app/wwctl/profile/list/main.go | 4 +- internal/app/wwctl/profile/set/main.go | 34 ++++----- internal/pkg/node/constructors.go | 33 --------- internal/pkg/node/methods.go | 27 +++++++ 15 files changed, 266 insertions(+), 234 deletions(-) diff --git a/internal/app/wwctl/node/console/power.go b/internal/app/wwctl/node/console/power.go index 2da2d576..29d7e993 100644 --- a/internal/app/wwctl/node/console/power.go +++ b/internal/app/wwctl/node/console/power.go @@ -1,6 +1,7 @@ package console import ( + "fmt" "os" "github.com/hpcng/warewulf/internal/pkg/node" @@ -11,27 +12,32 @@ import ( func CobraRunE(cmd *cobra.Command, args []string) error { var returnErr error = nil - var nodeList []node.NodeInfo - n, err := node.New() + nodeDB, err := node.New() if err != nil { wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err) os.Exit(1) } - if len(args) == 1 { - nodeList, _ = n.SearchByName(args[0]) + nodes, err := nodeDB.FindAllNodes() + if err != nil { + wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err) + os.Exit(1) + } + + if len(args) > 0 { + nodes = node.FilterByName(nodes, args) } else { - wwlog.Printf(wwlog.ERROR, "Please specify a node\n") - os.Exit(255) + cmd.Usage() + os.Exit(1) } - if len(nodeList) == 0 { - wwlog.Printf(wwlog.ERROR, "No nodes found matching: '%s'\n", args[0]) - os.Exit(255) + if len(nodes) == 0 { + fmt.Printf("No nodes found\n") + os.Exit(1) } - for _, node := range nodeList { + for _, node := range nodes { if node.IpmiIpaddr.Get() == "" { wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get()) diff --git a/internal/app/wwctl/node/delete/main.go b/internal/app/wwctl/node/delete/main.go index 1435189e..e7c7ef65 100644 --- a/internal/app/wwctl/node/delete/main.go +++ b/internal/app/wwctl/node/delete/main.go @@ -12,6 +12,7 @@ import ( func CobraRunE(cmd *cobra.Command, args []string) error { var count int + var nodeList []node.NodeInfo nodeDB, err := node.New() if err != nil { @@ -19,7 +20,30 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } - nodeList, err := nodeDB.SearchByNameList(args) + nodes, err := nodeDB.FindAllNodes() + if err != nil { + wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err) + os.Exit(1) + } + + for _, r := range args { + var match bool + for _, n := range nodes { + if n.Id.Get() == r { + nodeList = append(nodeList, n) + match = true + } + } + + if !match { + fmt.Fprintf(os.Stderr, "ERROR: No match for node: %s\n", r) + } + } + + if len(nodeList) == 0 { + fmt.Printf("No nodes found\n") + os.Exit(1) + } for _, n := range nodeList { err := nodeDB.DelNode(n.Id.Get()) @@ -27,28 +51,25 @@ func CobraRunE(cmd *cobra.Command, args []string) error { wwlog.Printf(wwlog.ERROR, "%s\n", err) } else { count++ + fmt.Printf("Deleting node: %s\n", n.Id.Print()) } } - if count > 0 { - if SetYes == true { - nodeDB.Persist() - } else { - q := fmt.Sprintf("Are you sure you want to delete %d nodes(s)", count) - - prompt := promptui.Prompt{ - Label: q, - IsConfirm: true, - } - - result, _ := prompt.Run() - - if result == "y" || result == "yes" { - nodeDB.Persist() - } - } + if SetYes { + nodeDB.Persist() } else { - fmt.Printf("No nodes found\n") + q := fmt.Sprintf("Are you sure you want to delete %d nodes(s)", count) + + prompt := promptui.Prompt{ + Label: q, + IsConfirm: true, + } + + result, _ := prompt.Run() + + if result == "y" || result == "yes" { + nodeDB.Persist() + } } return nil diff --git a/internal/app/wwctl/node/delete/root.go b/internal/app/wwctl/node/delete/root.go index 3a30dce0..3bdf8f46 100644 --- a/internal/app/wwctl/node/delete/root.go +++ b/internal/app/wwctl/node/delete/root.go @@ -4,7 +4,7 @@ import "github.com/spf13/cobra" var ( baseCmd = &cobra.Command{ - Use: "delete [flags] [node pattern]...", + Use: "delete [flags] [exact node name]...", Short: "Delete a node from Warewulf", Long: "This command will remove a node from the Warewulf node configuration.", Args: cobra.MinimumNArgs(1), diff --git a/internal/app/wwctl/node/list/main.go b/internal/app/wwctl/node/list/main.go index 4691b93a..713ab66c 100644 --- a/internal/app/wwctl/node/list/main.go +++ b/internal/app/wwctl/node/list/main.go @@ -13,26 +13,21 @@ import ( func CobraRunE(cmd *cobra.Command, args []string) error { var err error - var nodes []node.NodeInfo - n, err := node.New() + nodeDB, err := node.New() if err != nil { wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err) os.Exit(1) } - if len(args) > 0 { - nodes, err = n.SearchByNameList(args) - } else { - nodes, err = n.FindAllNodes() - } + nodes, err := nodeDB.FindAllNodes() if err != nil { wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err) os.Exit(1) } if ShowAll { - for _, node := range nodes { + for _, node := range node.FilterByName(nodes, args) { fmt.Printf("################################################################################\n") fmt.Printf("%-20s %-18s %-12s %s\n", "NODE", "FIELD", "PROFILE", "VALUE") fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), "Id", node.Id.Source(), node.Id.Print()) @@ -63,20 +58,13 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-20s %-18s %-12s %s\n", node.Id.Get(), name+":TYPE", netdev.Type.Source(), netdev.Type.Print()) fmt.Printf("%-20s %-18s %-12s %t\n", node.Id.Get(), name+":DEFAULT", netdev.Default.Source(), netdev.Default.PrintB()) } - - // v := reflect.ValueOf(node) - // typeOfS := v.Type() - // for i := 0; i< v.NumField(); i++ { - // //TODO: Fix for NetDevs and Interface should print Fprint() method - // fmt.Printf("%-25s %s = %#v\n", node.Fqdn.Get(), typeOfS.Field(i).Name, v.Field(i).Interface()) - // } } } else if ShowNet { fmt.Printf("%-22s %-6s %-18s %-15s %-15s\n", "NODE NAME", "DEVICE", "HWADDR", "IPADDR", "GATEWAY") fmt.Println(strings.Repeat("=", 80)) - for _, node := range nodes { + for _, node := range node.FilterByName(nodes, args) { if len(node.NetDevs) > 0 { for name, dev := range node.NetDevs { fmt.Printf("%-22s %-6s %-18s %-15s %-15s\n", node.Id.Get(), name, dev.Hwaddr.Print(), dev.Ipaddr.Print(), dev.Gateway.Print()) @@ -90,7 +78,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-22s %-16s %-20s %-20s\n", "NODE NAME", "IPMI IPADDR", "IPMI USERNAME", "IPMI PASSWORD") fmt.Println(strings.Repeat("=", 80)) - for _, node := range nodes { + for _, node := range node.FilterByName(nodes, args) { fmt.Printf("%-22s %-16s %-20s %-20s\n", node.Id.Get(), node.IpmiIpaddr.Print(), node.IpmiUserName.Print(), node.IpmiPassword.Print()) } @@ -98,7 +86,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-22s %-26s %-35s %s\n", "NODE NAME", "KERNEL VERSION", "CONTAINER", "OVERLAYS (S/R)") fmt.Println(strings.Repeat("=", 120)) - for _, node := range nodes { + for _, node := range node.FilterByName(nodes, args) { fmt.Printf("%-22s %-26s %-35s %s\n", node.Id.Get(), node.KernelVersion.Print(), node.ContainerName.Print(), node.SystemOverlay.Print()+"/"+node.RuntimeOverlay.Print()) } @@ -106,7 +94,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-22s %-26s %s\n", "NODE NAME", "PROFILES", "NETWORK") fmt.Println(strings.Repeat("=", 80)) - for _, node := range nodes { + for _, node := range node.FilterByName(nodes, args) { var netdevs []string if len(node.NetDevs) > 0 { for name, dev := range node.NetDevs { diff --git a/internal/app/wwctl/node/sensors/power.go b/internal/app/wwctl/node/sensors/power.go index af2d54e2..b0379dce 100644 --- a/internal/app/wwctl/node/sensors/power.go +++ b/internal/app/wwctl/node/sensors/power.go @@ -13,31 +13,36 @@ import ( func CobraRunE(cmd *cobra.Command, args []string) error { var returnErr error = nil - var nodeList []node.NodeInfo - n, err := node.New() + nodeDB, err := node.New() if err != nil { wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err) os.Exit(1) } - if len(args) >= 1 { - nodeList, _ = n.SearchByNameList(args) - } else { - wwlog.Printf(wwlog.ERROR, "No requested nodes\n") - os.Exit(255) + nodes, err := nodeDB.FindAllNodes() + if err != nil { + wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err) + os.Exit(1) } - if len(nodeList) == 0 { - wwlog.Printf(wwlog.ERROR, "No nodes found matching: '%s'\n", args[0]) - os.Exit(255) + if len(args) > 0 { + nodes = node.FilterByName(nodes, args) + } else { + cmd.Usage() + os.Exit(1) + } + + if len(nodes) == 0 { + fmt.Printf("No nodes found\n") + os.Exit(1) } batchpool := batch.New(50) - jobcount := len(nodeList) + jobcount := len(nodes) results := make(chan power.IPMI, jobcount) - for _, node := range nodeList { + for _, node := range nodes { if node.IpmiIpaddr.Get() == "" { wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get()) @@ -55,7 +60,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fullFlag := full batchpool.Submit(func() { - if fullFlag == true { + if fullFlag { ipmiCmd.SensorList() } else { ipmiCmd.SDRList() diff --git a/internal/app/wwctl/node/set/main.go b/internal/app/wwctl/node/set/main.go index 4d11f393..e8db25f4 100644 --- a/internal/app/wwctl/node/set/main.go +++ b/internal/app/wwctl/node/set/main.go @@ -16,7 +16,6 @@ import ( func CobraRunE(cmd *cobra.Command, args []string) error { var err error - var nodes []node.NodeInfo var SetProfiles []string nodeDB, err := node.New() @@ -25,26 +24,23 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } + nodes, err := nodeDB.FindAllNodes() if err != nil { wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err) os.Exit(1) } - if SetNodeAll == true { - nodes, err = nodeDB.FindAllNodes() - if err != nil { - wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err) + if !SetNodeAll { + if len(args) > 0 { + nodes = node.FilterByName(nodes, args) + } else { + cmd.Usage() 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() + if len(nodes) == 0 { + fmt.Printf("No nodes found\n") os.Exit(1) } @@ -336,28 +332,23 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } } - if len(nodes) > 0 { - if SetYes == true { - nodeDB.Persist() - warewulfd.DaemonReload() - } else { - q := fmt.Sprintf("Are you sure you want to modify %d nodes(s)", len(nodes)) + if SetYes == true { + nodeDB.Persist() + warewulfd.DaemonReload() + } 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() - warewulfd.DaemonReload() - } + prompt := promptui.Prompt{ + Label: q, + IsConfirm: true, } - } else { - fmt.Printf("No nodes found\n") + result, _ := prompt.Run() + + if result == "y" || result == "yes" { + nodeDB.Persist() + warewulfd.DaemonReload() + } } return nil diff --git a/internal/app/wwctl/power/cycle/power.go b/internal/app/wwctl/power/cycle/power.go index f7298a55..c3aa7c80 100644 --- a/internal/app/wwctl/power/cycle/power.go +++ b/internal/app/wwctl/power/cycle/power.go @@ -13,31 +13,36 @@ import ( func CobraRunE(cmd *cobra.Command, args []string) error { var returnErr error = nil - var nodeList []node.NodeInfo - n, err := node.New() + nodeDB, err := node.New() if err != nil { wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err) os.Exit(1) } - if len(args) >= 1 { - nodeList, _ = n.SearchByNameList(args) - } else { - wwlog.Printf(wwlog.ERROR, "No requested nodes\n") - os.Exit(255) + nodes, err := nodeDB.FindAllNodes() + if err != nil { + wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err) + os.Exit(1) } - if len(nodeList) == 0 { - wwlog.Printf(wwlog.ERROR, "No nodes found matching: '%s'\n", args[0]) - os.Exit(255) + if len(args) > 0 { + nodes = node.FilterByName(nodes, args) + } else { + cmd.Usage() + os.Exit(1) + } + + if len(nodes) == 0 { + fmt.Printf("No nodes found\n") + os.Exit(1) } batchpool := batch.New(50) - jobcount := len(nodeList) + jobcount := len(nodes) results := make(chan power.IPMI, jobcount) - for _, node := range nodeList { + for _, node := range nodes { if node.IpmiIpaddr.Get() == "" { wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get()) diff --git a/internal/app/wwctl/power/off/power.go b/internal/app/wwctl/power/off/power.go index 29987ffa..43d4b358 100644 --- a/internal/app/wwctl/power/off/power.go +++ b/internal/app/wwctl/power/off/power.go @@ -13,31 +13,36 @@ import ( func CobraRunE(cmd *cobra.Command, args []string) error { var returnErr error = nil - var nodeList []node.NodeInfo - n, err := node.New() + nodeDB, err := node.New() if err != nil { wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err) os.Exit(1) } - if len(args) >= 1 { - nodeList, _ = n.SearchByNameList(args) - } else { - wwlog.Printf(wwlog.ERROR, "No requested nodes\n") - os.Exit(255) + nodes, err := nodeDB.FindAllNodes() + if err != nil { + wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err) + os.Exit(1) } - if len(nodeList) == 0 { - wwlog.Printf(wwlog.ERROR, "No nodes found matching: '%s'\n", args[0]) - os.Exit(255) + if len(args) > 0 { + nodes = node.FilterByName(nodes, args) + } else { + cmd.Usage() + os.Exit(1) + } + + if len(nodes) == 0 { + fmt.Printf("No nodes found\n") + os.Exit(1) } batchpool := batch.New(50) - jobcount := len(nodeList) + jobcount := len(nodes) results := make(chan power.IPMI, jobcount) - for _, node := range nodeList { + for _, node := range nodes { if node.IpmiIpaddr.Get() == "" { wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get()) diff --git a/internal/app/wwctl/power/on/power.go b/internal/app/wwctl/power/on/power.go index 020bf1ed..2dad58ea 100644 --- a/internal/app/wwctl/power/on/power.go +++ b/internal/app/wwctl/power/on/power.go @@ -13,33 +13,36 @@ import ( func CobraRunE(cmd *cobra.Command, args []string) error { var returnErr error = nil - var nodeList []node.NodeInfo - n, err := node.New() + nodeDB, err := node.New() if err != nil { wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err) os.Exit(1) } - if len(args) >= 1 { - nodeList, _ = n.SearchByNameList(args) - } else { - wwlog.Printf(wwlog.ERROR, "No requested nodes\n") - os.Exit(255) + nodes, err := nodeDB.FindAllNodes() + if err != nil { + wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err) + os.Exit(1) } - if len(nodeList) == 0 { - wwlog.Printf(wwlog.ERROR, "No nodes found matching: '%s'\n", args[0]) - os.Exit(255) + if len(args) > 0 { + nodes = node.FilterByName(nodes, args) } else { - wwlog.Printf(wwlog.VERBOSE, "Found %d matching nodes for power command\n", len(nodeList)) + cmd.Usage() + os.Exit(1) + } + + if len(nodes) == 0 { + fmt.Printf("No nodes found\n") + os.Exit(1) } batchpool := batch.New(50) - jobcount := len(nodeList) + jobcount := len(nodes) results := make(chan power.IPMI, jobcount) - for _, node := range nodeList { + for _, node := range nodes { if node.IpmiIpaddr.Get() == "" { wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get()) diff --git a/internal/app/wwctl/power/status/power.go b/internal/app/wwctl/power/status/power.go index 5ec31622..35f815b1 100644 --- a/internal/app/wwctl/power/status/power.go +++ b/internal/app/wwctl/power/status/power.go @@ -13,33 +13,36 @@ import ( func CobraRunE(cmd *cobra.Command, args []string) error { var returnErr error = nil - var nodeList []node.NodeInfo - n, err := node.New() + nodeDB, err := node.New() if err != nil { wwlog.Printf(wwlog.ERROR, "Could not open node configuration: %s\n", err) os.Exit(1) } - if len(args) >= 1 { - nodeList, _ = n.SearchByNameList(args) - } else { - wwlog.Printf(wwlog.ERROR, "No requested nodes\n") - os.Exit(255) + nodes, err := nodeDB.FindAllNodes() + if err != nil { + wwlog.Printf(wwlog.ERROR, "Cloud not get nodeList: %s\n", err) + os.Exit(1) } - if len(nodeList) == 0 { - wwlog.Printf(wwlog.ERROR, "No nodes found matching: '%s'\n", args[0]) - os.Exit(255) + if len(args) > 0 { + nodes = node.FilterByName(nodes, args) } else { - wwlog.Printf(wwlog.VERBOSE, "Found %d matching nodes for power command\n", len(nodeList)) + cmd.Usage() + os.Exit(1) + } + + if len(nodes) == 0 { + fmt.Printf("No nodes found\n") + os.Exit(1) } batchpool := batch.New(50) - jobcount := len(nodeList) + jobcount := len(nodes) results := make(chan power.IPMI, jobcount) - for _, node := range nodeList { + for _, node := range nodes { if node.IpmiIpaddr.Get() == "" { wwlog.Printf(wwlog.ERROR, "%s: No IPMI IP address\n", node.Id.Get()) diff --git a/internal/app/wwctl/profile/delete/main.go b/internal/app/wwctl/profile/delete/main.go index 651d07b5..0a7715ee 100644 --- a/internal/app/wwctl/profile/delete/main.go +++ b/internal/app/wwctl/profile/delete/main.go @@ -13,8 +13,6 @@ import ( func CobraRunE(cmd *cobra.Command, args []string) error { var count int - var numNodes int - var numGroups int nodeDB, err := node.New() if err != nil { @@ -22,50 +20,71 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } - nodes, err := nodeDB.FindAllNodes() + profiles, err := nodeDB.FindAllProfiles() if err != nil { - wwlog.Printf(wwlog.ERROR, "Could not load all nodes: %s\n", err) + wwlog.Printf(wwlog.ERROR, "Could not load all profiles: %s\n", err) os.Exit(1) } - for _, p := range args { - err := nodeDB.DelProfile(p) - if err != nil { - wwlog.Printf(wwlog.ERROR, "%s\n", err) - continue - } - for _, n := range nodes { - for _, np := range n.Profiles { - if np == p { - numNodes++ - wwlog.Printf(wwlog.VERBOSE, "Removing profile from node %s: %s\n", n.Id.Get(), p) - n.Profiles = util.SliceRemoveElement(n.Profiles, p) - nodeDB.NodeUpdate(n) + for _, r := range args { + for _, p := range profiles { + if p.Id.Get() == r { + nodes, err := nodeDB.FindAllNodes() + if err != nil { + wwlog.Printf(wwlog.ERROR, "Could not load all nodes: %s\n", err) + os.Exit(1) + } + for _, n := range nodes { + for _, np := range n.Profiles { + if np == r { + wwlog.Printf(wwlog.VERBOSE, "Removing profile from node %s: %s\n", n.Id.Get(), r) + n.Profiles = util.SliceRemoveElement(n.Profiles, r) + nodeDB.NodeUpdate(n) + } + } } } } - count++ } - if count > 0 { - if SetYes == true { - nodeDB.Persist() - } else { - q := fmt.Sprintf("Are you sure you want to delete %d profile(s) (%d groups, %d nodes)", count, numGroups, numNodes) - - prompt := promptui.Prompt{ - Label: q, - IsConfirm: true, - } - - result, _ := prompt.Run() - - if result == "y" || result == "yes" { - nodeDB.Persist() + for _, r := range args { + var found bool + for _, p := range profiles { + if p.Id.Get() == r { + count++ + found = true + err := nodeDB.DelProfile(r) + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + } } } + + if !found { + fmt.Fprintf(os.Stderr, "Profile not found: %s\n", r) + } + } + + if count == 0 { + fmt.Fprintf(os.Stderr, "No profiles found\n") + os.Exit(1) + } + + if SetYes { + nodeDB.Persist() } else { - wwlog.Printf(wwlog.INFO, "No groups found\n") + q := fmt.Sprintf("Are you sure you want to delete %d profile(s)", count) + + prompt := promptui.Prompt{ + Label: q, + IsConfirm: true, + } + + result, _ := prompt.Run() + + if result == "y" || result == "yes" { + nodeDB.Persist() + } } return nil diff --git a/internal/app/wwctl/profile/list/main.go b/internal/app/wwctl/profile/list/main.go index 81d58b7e..c84998b4 100644 --- a/internal/app/wwctl/profile/list/main.go +++ b/internal/app/wwctl/profile/list/main.go @@ -25,7 +25,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { } if ShowAll { - for _, profile := range profiles { + for _, profile := range node.FilterByName(profiles, args) { fmt.Printf("################################################################################\n") fmt.Printf("%-20s %-18s %s\n", "PROFILE NAME", "FIELD", "VALUE") fmt.Printf("%-20s %-18s %s\n", profile.Id.Get(), "Id", profile.Id.Print()) @@ -59,7 +59,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { fmt.Printf("%-20s %s\n", "PROFILE NAME", "COMMENT/DESCRIPTION") fmt.Println(strings.Repeat("=", 80)) - for _, profile := range profiles { + for _, profile := range node.FilterByName(profiles, args) { fmt.Printf("%-20s %s\n", profile.Id.Print(), profile.Comment.Print()) } } diff --git a/internal/app/wwctl/profile/set/main.go b/internal/app/wwctl/profile/set/main.go index 7c7664b2..696dfa4d 100644 --- a/internal/app/wwctl/profile/set/main.go +++ b/internal/app/wwctl/profile/set/main.go @@ -15,7 +15,6 @@ import ( func CobraRunE(cmd *cobra.Command, args []string) error { var err error - var profiles []node.NodeInfo nodeDB, err := node.New() if err != nil { @@ -23,31 +22,24 @@ func CobraRunE(cmd *cobra.Command, args []string) error { os.Exit(1) } - if len(args) == 0 { - args = append(args, "default") + profiles, err := nodeDB.FindAllProfiles() + if err != nil { + wwlog.Printf(wwlog.ERROR, "%s\n", err) + os.Exit(1) } - if SetAll == true { - profiles, err = nodeDB.FindAllProfiles() - if err != nil { - wwlog.Printf(wwlog.ERROR, "%s\n", err) - os.Exit(1) - } - } else { - var tmp []node.NodeInfo - tmp, err = nodeDB.FindAllProfiles() - if err != nil { - wwlog.Printf(wwlog.ERROR, "%s\n", err) + if !SetAll { + if len(args) > 0 { + profiles = node.FilterByName(profiles, args) + } else { + cmd.Usage() os.Exit(1) } + } - for _, a := range args { - for _, p := range tmp { - if p.Id.Get() == a { - profiles = append(profiles, p) - } - } - } + if len(profiles) == 0 { + fmt.Printf("No profiles found\n") + os.Exit(1) } if SetContainer != "" { diff --git a/internal/pkg/node/constructors.go b/internal/pkg/node/constructors.go index 1aeff240..6e15f2f3 100644 --- a/internal/pkg/node/constructors.go +++ b/internal/pkg/node/constructors.go @@ -3,7 +3,6 @@ package node import ( "fmt" "io/ioutil" - "regexp" "sort" "strings" @@ -264,35 +263,3 @@ func (config *nodeYaml) FindByIpaddr(ipaddr string) (NodeInfo, error) { return ret, errors.New("No nodes found with IP Addr: " + ipaddr) } - -func (nodes *nodeYaml) SearchByName(search string) ([]NodeInfo, error) { - var ret []NodeInfo - - n, _ := nodes.FindAllNodes() - - for _, node := range n { - b, _ := regexp.MatchString(search, node.Id.Get()) - if b { - ret = append(ret, node) - } - } - - return ret, nil -} - -func (nodes *nodeYaml) SearchByNameList(searchList []string) ([]NodeInfo, error) { - var ret []NodeInfo - - n, _ := nodes.FindAllNodes() - - for _, search := range searchList { - for _, node := range n { - b, _ := regexp.MatchString(search, node.Id.Get()) - if b { - ret = append(ret, node) - } - } - } - - return ret, nil -} diff --git a/internal/pkg/node/methods.go b/internal/pkg/node/methods.go index 98d1b74f..63e5c972 100644 --- a/internal/pkg/node/methods.go +++ b/internal/pkg/node/methods.go @@ -1,5 +1,32 @@ package node +import "regexp" + +/********** + * + * Filters + * + *********/ + +func FilterByName(set []NodeInfo, searchList []string) []NodeInfo { + var ret []NodeInfo + + if len(searchList) > 0 { + for _, search := range searchList { + for _, entry := range set { + b, _ := regexp.MatchString(search, entry.Id.Get()) + if b { + ret = append(ret, entry) + } + } + } + } else { + ret = set + } + + return ret +} + /********** * * Sets