From 2e2a7d7de3c31ebec0717927b6efeea2532c7983 Mon Sep 17 00:00:00 2001 From: Jonathon Anderson Date: Thu, 7 Nov 2024 17:45:02 -0700 Subject: [PATCH] rebased for the use without NodeInfo make fanout configureable via commanline Signed-off-by: Christian Goll --- internal/app/wwctl/node/console/main.go | 4 +- internal/app/wwctl/node/sensors/main.go | 134 ++++++++++--------- internal/app/wwctl/node/sensors/root.go | 26 ++-- internal/app/wwctl/node/sensors/root_test.go | 42 ++++++ internal/app/wwctl/power/cycle/main.go | 53 ++++---- internal/app/wwctl/power/cycle/root.go | 4 +- internal/app/wwctl/power/cycle/root_test.go | 2 +- internal/app/wwctl/power/off/main.go | 53 ++++---- internal/app/wwctl/power/off/root.go | 2 + internal/app/wwctl/power/off/root_test.go | 2 +- internal/app/wwctl/power/on/main.go | 53 ++++---- internal/app/wwctl/power/on/root.go | 2 + internal/app/wwctl/power/on/root_test.go | 2 +- internal/app/wwctl/power/reset/main.go | 60 ++++----- internal/app/wwctl/power/reset/root.go | 3 +- internal/app/wwctl/power/reset/root_test.go | 2 +- internal/app/wwctl/power/soft/main.go | 65 ++++----- internal/app/wwctl/power/soft/root.go | 4 +- internal/app/wwctl/power/soft/root_test.go | 2 +- internal/app/wwctl/power/status/main.go | 35 ++--- internal/app/wwctl/power/status/root.go | 2 + internal/app/wwctl/power/status/root_test.go | 2 +- 22 files changed, 304 insertions(+), 250 deletions(-) create mode 100644 internal/app/wwctl/node/sensors/root_test.go diff --git a/internal/app/wwctl/node/console/main.go b/internal/app/wwctl/node/console/main.go index 3361d4a5..0f150e31 100644 --- a/internal/app/wwctl/node/console/main.go +++ b/internal/app/wwctl/node/console/main.go @@ -44,9 +44,7 @@ func CobraRunE(cmd *cobra.Command, args []string) error { wwlog.Error("%s: No IPMI IP address", node.Id()) continue } - var conf node.NodeConf - conf.GetFrom(n) - ipmiCmd := power.IPMI{IpmiConf: *conf.Ipmi} + ipmiCmd := power.IPMI{IpmiConf: *node.Ipmi} err := ipmiCmd.Console() if err != nil { wwlog.Error("%s: Console problem", node.Id()) diff --git a/internal/app/wwctl/node/sensors/main.go b/internal/app/wwctl/node/sensors/main.go index 436c4528..ea1a8db6 100644 --- a/internal/app/wwctl/node/sensors/main.go +++ b/internal/app/wwctl/node/sensors/main.go @@ -12,75 +12,77 @@ import ( "github.com/warewulf/warewulf/internal/pkg/wwlog" ) -func CobraRunE(cmd *cobra.Command, args []string) error { - var returnErr error = nil - - nodeDB, err := node.New() - if err != nil { - return fmt.Errorf("could not open node configuration: %s", err) - } - - nodes, err := nodeDB.FindAllNodes() - if err != nil { - return fmt.Errorf("could not get node list: %s", err) - } - - args = hostlist.Expand(args) - - if len(args) > 0 { - nodes = node.FilterNodeListByName(nodes, args) - } else { - //nolint:errcheck - cmd.Usage() - os.Exit(1) - } - - if len(nodes) == 0 { - wwlog.Info("No nodes found") - os.Exit(1) - } - - batchpool := batch.New(50) - jobcount := len(nodes) - results := make(chan power.IPMI, jobcount) - - for _, node := range nodes { - if node.Ipmi.Ipaddr.IsUnspecified() { - wwlog.Error("%s: No IPMI IP address", node.Id()) - continue - } - var conf node.NodeConf - conf.GetFrom(n) - ipmiCmd := power.IPMI{IpmiConf: *conf.Ipmi} - fullFlag := full - batchpool.Submit(func() { - if fullFlag { - //nolint:errcheck - ipmiCmd.SensorList() - } else { - //nolint:errcheck - ipmiCmd.SDRList() - } - results <- ipmiCmd - }) - - } - - batchpool.Run() - - close(results) - - for result := range results { - out, err := result.Result() +func CobraRunE(vars *variables) func(cmd *cobra.Command, args []string) (err error) { + return func(cmd *cobra.Command, args []string) error { + var returnErr error = nil + nodeDB, err := node.New() if err != nil { - wwlog.Error("%s: %s", result.Ipaddr, out) - returnErr = err - continue + return fmt.Errorf("could not open node configuration: %s", err) } - fmt.Printf("%s:\n%s\n", result.Ipaddr, out) - } + nodes, err := nodeDB.FindAllNodes() + if err != nil { + return fmt.Errorf("could not get node list: %s", err) + } - return returnErr + args = hostlist.Expand(args) + + if len(args) > 0 { + nodes = node.FilterNodeListByName(nodes, args) + } else { + //nolint:errcheck + cmd.Usage() + os.Exit(1) + } + + if len(nodes) == 0 { + wwlog.Info("No nodes found") + os.Exit(1) + } + + batchpool := batch.New(50) + jobcount := len(nodes) + results := make(chan power.IPMI, jobcount) + + for _, node := range nodes { + if node.Ipmi.Ipaddr.IsUnspecified() { + wwlog.Error("%s: No IPMI IP address", node.Id()) + continue + } + ipmiCmd := power.IPMI{ + IpmiConf: *node.Ipmi, + ShowOnly: vars.Showcmd, + } + batchpool.Submit(func() { + if vars.Full { + //nolint:errcheck + ipmiCmd.SensorList() + } else { + //nolint:errcheck + ipmiCmd.SDRList() + } + results <- ipmiCmd + }) + + } + + batchpool.Run() + + close(results) + + for result := range results { + out, err := result.Result() + + if err != nil { + wwlog.Error("%s: %s", result.Ipaddr, out) + returnErr = err + continue + } + + wwlog.Info("%s:\n%s\n", result.Ipaddr, out) + } + + return returnErr + } } diff --git a/internal/app/wwctl/node/sensors/root.go b/internal/app/wwctl/node/sensors/root.go index e67f48eb..f367caeb 100644 --- a/internal/app/wwctl/node/sensors/root.go +++ b/internal/app/wwctl/node/sensors/root.go @@ -5,14 +5,22 @@ import ( "github.com/warewulf/warewulf/internal/pkg/node" ) -var ( - powerCmd = &cobra.Command{ +type variables struct { + Showcmd bool + Full bool + Fanout int +} + +func GetCommand() *cobra.Command { + vars := variables{} + + powerCmd := &cobra.Command{ DisableFlagsInUseLine: true, Use: "sensors [OPTIONS] PATTERN", Short: "Show node IPMI sensor information", Long: "Show IPMI sensor information for nodes matching PATTERN.", Args: cobra.MinimumNArgs(1), - RunE: CobraRunE, + RunE: CobraRunE(&vars), ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { if len(args) != 0 { return nil, cobra.ShellCompDirectiveNoFileComp @@ -27,14 +35,8 @@ var ( return node_names, cobra.ShellCompDirectiveNoFileComp }, } - full bool -) - -func init() { - powerCmd.PersistentFlags().BoolVarP(&full, "full", "F", false, "show detailed output.") -} - -// GetRootCommand returns the root cobra.Command for the application. -func GetCommand() *cobra.Command { + powerCmd.PersistentFlags().BoolVarP(&vars.Full, "full", "F", false, "show detailed output.") + powerCmd.PersistentFlags().BoolVarP(&vars.Showcmd, "show", "s", false, "only show command which will be executed") + powerCmd.PersistentFlags().IntVar(&vars.Fanout, "fanout", 50, "how many command should be executed in parallel") return powerCmd } diff --git a/internal/app/wwctl/node/sensors/root_test.go b/internal/app/wwctl/node/sensors/root_test.go new file mode 100644 index 00000000..d2fcc970 --- /dev/null +++ b/internal/app/wwctl/node/sensors/root_test.go @@ -0,0 +1,42 @@ +package sensors + +import ( + "bytes" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/warewulf/warewulf/internal/pkg/testenv" + "github.com/warewulf/warewulf/internal/pkg/warewulfd" + "github.com/warewulf/warewulf/internal/pkg/wwlog" +) + +func Test_Power_Status(t *testing.T) { + env := testenv.New(t) + defer env.RemoveAll(t) + + env.WriteFile(t, "etc/warewulf/nodes.conf", `WW_INTERNAL: 43 +nodeprofiles: + default: + ipmi: + username: admin + password: admin +nodes: + n01: + profiles: + - default + ipmi: + ipaddr: 10.10.10.10`) + warewulfd.SetNoDaemon() + t.Run("ipmitool status test", func(t *testing.T) { + baseCmd := GetCommand() + buf := new(bytes.Buffer) + baseCmd.SetOut(buf) + baseCmd.SetErr(buf) + wwlog.SetLogWriter(buf) + baseCmd.SetArgs([]string{"--show", "n01"}) + err := baseCmd.Execute() + assert.NoError(t, err) + assert.Equal(t, "10.10.10.10:\nipmitool -I lan -H 10.10.10.10 -p 623 -U admin -P admin -e ~ sdr list", strings.TrimSpace(buf.String())) + }) +} diff --git a/internal/app/wwctl/power/cycle/main.go b/internal/app/wwctl/power/cycle/main.go index 9ffd0aa6..1ed8e57a 100644 --- a/internal/app/wwctl/power/cycle/main.go +++ b/internal/app/wwctl/power/cycle/main.go @@ -16,46 +16,47 @@ func CobraRunE(vars *variables) func(cmd *cobra.Command, args []string) (err err return func(cmd *cobra.Command, args []string) error { var returnErr error = nil - nodeDB, err := node.New() - if err != nil { - return fmt.Errorf("could not open node configuration: %s", err) - } + nodeDB, err := node.New() + if err != nil { + return fmt.Errorf("could not open node configuration: %s", err) + } - nodes, err := nodeDB.FindAllNodes() - if err != nil { - return fmt.Errorf("could not get node list: %s", err) - } + nodes, err := nodeDB.FindAllNodes() + if err != nil { + return fmt.Errorf("could not get node list: %s", err) + } if len(args) > 0 { - nodes = node.FilterByName(nodes, hostlist.Expand(args)) + nodes = node.FilterNodeListByName(nodes, hostlist.Expand(args)) } else { //nolint:errcheck cmd.Usage() os.Exit(1) } - if len(nodes) == 0 { - return fmt.Errorf("no nodes found") - } + if len(nodes) == 0 { + return fmt.Errorf("no nodes found") + } - batchpool := batch.New(50) + batchpool := batch.New(vars.Fanout) jobcount := len(nodes) results := make(chan power.IPMI, jobcount) - for _, n := range nodes { + for _, node := range nodes { - if node.Ipmi.Ipaddr.IsUnspecified() { - wwlog.Error("%s: No IPMI IP address", node.Id()) - continue - } - var conf node.NodeConf - conf.GetFrom(n) - ipmiCmd := power.IPMI{IpmiConf: *conf.Ipmi} - batchpool.Submit(func() { - //nolint:errcheck - ipmiCmd.PowerCycle() - results <- ipmiCmd - }) + if node.Ipmi.Ipaddr.IsUnspecified() { + wwlog.Error("%s: No IPMI IP address", node.Id()) + continue + } + ipmiCmd := power.IPMI{ + IpmiConf: *node.Ipmi, + ShowOnly: vars.Showcmd, + } + batchpool.Submit(func() { + //nolint:errcheck + ipmiCmd.PowerCycle() + results <- ipmiCmd + }) } diff --git a/internal/app/wwctl/power/cycle/root.go b/internal/app/wwctl/power/cycle/root.go index 9054a5ea..8b450b8c 100644 --- a/internal/app/wwctl/power/cycle/root.go +++ b/internal/app/wwctl/power/cycle/root.go @@ -7,6 +7,7 @@ import ( type variables struct { Showcmd bool + Fanout int } // GetRootCommand returns the root cobra.Command for the application. @@ -27,11 +28,12 @@ func GetCommand() *cobra.Command { nodes, _ := nodeDB.FindAllNodes() var node_names []string for _, node := range nodes { - node_names = append(node_names, node.Id.Get()) + node_names = append(node_names, node.Id()) } return node_names, cobra.ShellCompDirectiveNoFileComp }, } powerCmd.PersistentFlags().BoolVarP(&vars.Showcmd, "show", "s", false, "only show command which will be executed") + powerCmd.PersistentFlags().IntVar(&vars.Fanout, "fanout", 50, "how many command should be executed in parallel") return powerCmd } diff --git a/internal/app/wwctl/power/cycle/root_test.go b/internal/app/wwctl/power/cycle/root_test.go index 37f4dca1..a3e72186 100644 --- a/internal/app/wwctl/power/cycle/root_test.go +++ b/internal/app/wwctl/power/cycle/root_test.go @@ -1,4 +1,4 @@ -package powercycle +package cycle import ( "bytes" diff --git a/internal/app/wwctl/power/off/main.go b/internal/app/wwctl/power/off/main.go index 60f156e8..9426ff0e 100644 --- a/internal/app/wwctl/power/off/main.go +++ b/internal/app/wwctl/power/off/main.go @@ -16,46 +16,47 @@ func CobraRunE(vars *variables) func(cmd *cobra.Command, args []string) (err err return func(cmd *cobra.Command, args []string) error { var returnErr error = nil - nodeDB, err := node.New() - if err != nil { - return fmt.Errorf("could not open node configuration: %s", err) - } + nodeDB, err := node.New() + if err != nil { + return fmt.Errorf("could not open node configuration: %s", err) + } - nodes, err := nodeDB.FindAllNodes() - if err != nil { - return fmt.Errorf("could not get node list: %s", err) - } + nodes, err := nodeDB.FindAllNodes() + if err != nil { + return fmt.Errorf("could not get node list: %s", err) + } if len(args) > 0 { - nodes = node.FilterByName(nodes, hostlist.Expand(args)) + nodes = node.FilterNodeListByName(nodes, hostlist.Expand(args)) } else { //nolint:errcheck cmd.Usage() os.Exit(1) } - if len(nodes) == 0 { - return fmt.Errorf("no nodes found") - } + if len(nodes) == 0 { + return fmt.Errorf("no nodes found") + } - batchpool := batch.New(50) + batchpool := batch.New(vars.Fanout) jobcount := len(nodes) results := make(chan power.IPMI, jobcount) - for _, node := range nodes { + for _, node := range nodes { - if node.Ipmi.Ipaddr.IsUnspecified() { - wwlog.Error("%s: No IPMI IP address", node.Id()) - continue - } - var conf node.NodeConf - conf.GetFrom(n) - ipmiCmd := power.IPMI{IpmiConf: *conf.Ipmi} - batchpool.Submit(func() { - //nolint:errcheck - ipmiCmd.PowerOff() - results <- ipmiCmd - }) + if node.Ipmi.Ipaddr.IsUnspecified() { + wwlog.Error("%s: No IPMI IP address", node.Id()) + continue + } + ipmiCmd := power.IPMI{ + IpmiConf: *node.Ipmi, + ShowOnly: vars.Showcmd, + } + batchpool.Submit(func() { + //nolint:errcheck + ipmiCmd.PowerOff() + results <- ipmiCmd + }) } diff --git a/internal/app/wwctl/power/off/root.go b/internal/app/wwctl/power/off/root.go index bedd5c9e..43670e29 100644 --- a/internal/app/wwctl/power/off/root.go +++ b/internal/app/wwctl/power/off/root.go @@ -7,6 +7,7 @@ import ( type variables struct { Showcmd bool + Fanout int } // GetRootCommand returns the root cobra.Command for the application. @@ -33,6 +34,7 @@ func GetCommand() *cobra.Command { }, } powerCmd.PersistentFlags().BoolVarP(&vars.Showcmd, "show", "s", false, "only show command which will be executed") + powerCmd.PersistentFlags().IntVar(&vars.Fanout, "fanout", 50, "how many command should be executed in parallel") return powerCmd } diff --git a/internal/app/wwctl/power/off/root_test.go b/internal/app/wwctl/power/off/root_test.go index 7af6e297..ce4adb09 100644 --- a/internal/app/wwctl/power/off/root_test.go +++ b/internal/app/wwctl/power/off/root_test.go @@ -1,4 +1,4 @@ -package poweroff +package off import ( "bytes" diff --git a/internal/app/wwctl/power/on/main.go b/internal/app/wwctl/power/on/main.go index b19ba533..eed53bb9 100644 --- a/internal/app/wwctl/power/on/main.go +++ b/internal/app/wwctl/power/on/main.go @@ -17,46 +17,47 @@ func CobraRunE(vars *variables) func(cmd *cobra.Command, args []string) (err err var returnErr error = nil - nodeDB, err := node.New() - if err != nil { - return fmt.Errorf("could not open node configuration: %s", err) - } + nodeDB, err := node.New() + if err != nil { + return fmt.Errorf("could not open node configuration: %s", err) + } - nodes, err := nodeDB.FindAllNodes() - if err != nil { - return fmt.Errorf("could not get node list: %s", err) - } + nodes, err := nodeDB.FindAllNodes() + if err != nil { + return fmt.Errorf("could not get node list: %s", err) + } if len(args) > 0 { - nodes = node.FilterByName(nodes, hostlist.Expand(args)) + nodes = node.FilterNodeListByName(nodes, hostlist.Expand(args)) } else { //nolint:errcheck cmd.Usage() os.Exit(1) } - if len(nodes) == 0 { - return fmt.Errorf("no nodes found") - } + if len(nodes) == 0 { + return fmt.Errorf("no nodes found") + } - batchpool := batch.New(50) + batchpool := batch.New(vars.Fanout) jobcount := len(nodes) results := make(chan power.IPMI, jobcount) - for _, node := range nodes { + for _, node := range nodes { - if node.Ipmi.Ipaddr.IsUnspecified() { - wwlog.Error("%s: No IPMI IP address", node.Id()) - continue - } - var conf node.NodeConf - conf.GetFrom(n) - ipmiCmd := power.IPMI{IpmiConf: *conf.Ipmi} - batchpool.Submit(func() { - //nolint:errcheck - ipmiCmd.PowerOn() - results <- ipmiCmd - }) + if node.Ipmi.Ipaddr.IsUnspecified() { + wwlog.Error("%s: No IPMI IP address", node.Id()) + continue + } + ipmiCmd := power.IPMI{ + IpmiConf: *node.Ipmi, + ShowOnly: vars.Showcmd, + } + batchpool.Submit(func() { + //nolint:errcheck + ipmiCmd.PowerOn() + results <- ipmiCmd + }) } diff --git a/internal/app/wwctl/power/on/root.go b/internal/app/wwctl/power/on/root.go index 8fb83ff2..f5841222 100644 --- a/internal/app/wwctl/power/on/root.go +++ b/internal/app/wwctl/power/on/root.go @@ -7,6 +7,7 @@ import ( type variables struct { Showcmd bool + Fanout int } // GetRootCommand returns the root cobra.Command for the application. @@ -32,6 +33,7 @@ func GetCommand() *cobra.Command { }, } powerCmd.PersistentFlags().BoolVarP(&vars.Showcmd, "show", "s", false, "only show command which will be executed") + powerCmd.PersistentFlags().IntVar(&vars.Fanout, "fanout", 50, "how many command should be executed in parallel") return powerCmd } diff --git a/internal/app/wwctl/power/on/root_test.go b/internal/app/wwctl/power/on/root_test.go index 0dd39ba8..b67f0968 100644 --- a/internal/app/wwctl/power/on/root_test.go +++ b/internal/app/wwctl/power/on/root_test.go @@ -1,4 +1,4 @@ -package poweron +package on import ( "bytes" diff --git a/internal/app/wwctl/power/reset/main.go b/internal/app/wwctl/power/reset/main.go index 1abe3d3c..aad82f42 100644 --- a/internal/app/wwctl/power/reset/main.go +++ b/internal/app/wwctl/power/reset/main.go @@ -17,53 +17,47 @@ func CobraRunE(vars *variables) func(cmd *cobra.Command, args []string) (err err var returnErr error = nil - nodeDB, err := node.New() - if err != nil { - return fmt.Errorf("could not open node configuration: %s", err) - } + nodeDB, err := node.New() + if err != nil { + return fmt.Errorf("could not open node configuration: %s", err) + } - nodes, err := nodeDB.FindAllNodes() - if err != nil { - return fmt.Errorf("cloud not get nodeList: %s", err) - } + nodes, err := nodeDB.FindAllNodes() + if err != nil { + return fmt.Errorf("cloud not get nodeList: %s", err) + } if len(args) > 0 { - nodes = node.FilterByName(nodes, hostlist.Expand(args)) + nodes = node.FilterNodeListByName(nodes, hostlist.Expand(args)) } else { //nolint:errcheck cmd.Usage() os.Exit(1) } - if len(args) > 0 { - nodes = node.FilterNodeListByName(nodes, hostlist.Expand(args)) - } else { - //nolint:errcheck - cmd.Usage() - os.Exit(1) - } - if len(nodes) == 0 { - return fmt.Errorf("no nodes found") - } + if len(nodes) == 0 { + return fmt.Errorf("no nodes found") + } - batchpool := batch.New(50) + batchpool := batch.New(vars.Fanout) jobcount := len(nodes) results := make(chan power.IPMI, jobcount) - for _, n := range nodes { + for _, node := range nodes { - if node.Ipmi.Ipaddr.IsUnspecified() { - wwlog.Error("%s: No IPMI IP address", node.Id()) - continue - } - var conf node.NodeConf - conf.GetFrom(n) - ipmiCmd := power.IPMI{IpmiConf: *conf.Ipmi} - batchpool.Submit(func() { - //nolint:errcheck - ipmiCmd.PowerReset() - results <- ipmiCmd - }) + if node.Ipmi.Ipaddr.IsUnspecified() { + wwlog.Error("%s: No IPMI IP address", node.Id()) + continue + } + ipmiCmd := power.IPMI{ + IpmiConf: *node.Ipmi, + ShowOnly: vars.Showcmd, + } + batchpool.Submit(func() { + //nolint:errcheck + ipmiCmd.PowerReset() + results <- ipmiCmd + }) } diff --git a/internal/app/wwctl/power/reset/root.go b/internal/app/wwctl/power/reset/root.go index bdab6b84..c7346135 100644 --- a/internal/app/wwctl/power/reset/root.go +++ b/internal/app/wwctl/power/reset/root.go @@ -7,6 +7,7 @@ import ( type variables struct { Showcmd bool + Fanout int } // GetRootCommand returns the root cobra.Command for the application. @@ -33,6 +34,6 @@ func GetCommand() *cobra.Command { }, } powerCmd.PersistentFlags().BoolVarP(&vars.Showcmd, "show", "s", false, "only show command which will be executed") - + powerCmd.PersistentFlags().IntVar(&vars.Fanout, "fanout", 50, "how many command should be executed in parallel") return powerCmd } diff --git a/internal/app/wwctl/power/reset/root_test.go b/internal/app/wwctl/power/reset/root_test.go index d486d2d4..013648e0 100644 --- a/internal/app/wwctl/power/reset/root_test.go +++ b/internal/app/wwctl/power/reset/root_test.go @@ -1,4 +1,4 @@ -package powerreset +package reset import ( "bytes" diff --git a/internal/app/wwctl/power/soft/main.go b/internal/app/wwctl/power/soft/main.go index 5027707b..4a9359dd 100644 --- a/internal/app/wwctl/power/soft/main.go +++ b/internal/app/wwctl/power/soft/main.go @@ -17,46 +17,47 @@ func CobraRunE(vars *variables) func(cmd *cobra.Command, args []string) (err err var returnErr error = nil - nodeDB, err := node.New() - if err != nil { - return fmt.Errorf("could not open node configuration: %s", err) - } + nodeDB, err := node.New() + if err != nil { + return fmt.Errorf("could not open node configuration: %s", err) + } - nodes, err := nodeDB.FindAllNodes() - if err != nil { - return fmt.Errorf("could not get nodeList: %s", err) - } + nodes, err := nodeDB.FindAllNodes() + if err != nil { + return fmt.Errorf("could not get nodeList: %s", err) + } - if len(args) > 0 { - nodes = node.FilterNodeListByName(nodes, hostlist.Expand(args)) - } else { - //nolint:errcheck - cmd.Usage() - os.Exit(1) - } + if len(args) > 0 { + nodes = node.FilterNodeListByName(nodes, hostlist.Expand(args)) + } else { + //nolint:errcheck + cmd.Usage() + os.Exit(1) + } - if len(nodes) == 0 { - return fmt.Errorf("no nodes found") - } + if len(nodes) == 0 { + return fmt.Errorf("no nodes found") + } - batchpool := batch.New(50) + batchpool := batch.New(vars.Fanout) jobcount := len(nodes) results := make(chan power.IPMI, jobcount) - for _, n := range nodes { + for _, node := range nodes { - if node.Ipmi.Ipaddr.IsUnspecified() { - wwlog.Error("%s: No IPMI IP address", node.Id()) - continue - } - var conf node.NodeConf - conf.GetFrom(n) - ipmiCmd := power.IPMI{IpmiConf: *conf.Ipmi} - batchpool.Submit(func() { - //nolint:errcheck - ipmiCmd.PowerSoft() - results <- ipmiCmd - }) + if node.Ipmi.Ipaddr.IsUnspecified() { + wwlog.Error("%s: No IPMI IP address", node.Id()) + continue + } + ipmiCmd := power.IPMI{ + IpmiConf: *node.Ipmi, + ShowOnly: vars.Showcmd, + } + batchpool.Submit(func() { + //nolint:errcheck + ipmiCmd.PowerSoft() + results <- ipmiCmd + }) } diff --git a/internal/app/wwctl/power/soft/root.go b/internal/app/wwctl/power/soft/root.go index 6c7df0c3..10093211 100644 --- a/internal/app/wwctl/power/soft/root.go +++ b/internal/app/wwctl/power/soft/root.go @@ -7,6 +7,7 @@ import ( type variables struct { Showcmd bool + Fanout int } // GetRootCommand returns the root cobra.Command for the application. @@ -16,7 +17,7 @@ func GetCommand() *cobra.Command { DisableFlagsInUseLine: true, Use: "soft", Short: "Gracefully shuts down the given node(s)", - Long: "This command uses the operationg system to shut down the set of nodes specified by PATTERN.", + Long: "This command uses the operating system to shut down the set of nodes specified by PATTERN.", RunE: CobraRunE(&vars), ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { if len(args) != 0 { @@ -33,5 +34,6 @@ func GetCommand() *cobra.Command { }, } powerCmd.PersistentFlags().BoolVarP(&vars.Showcmd, "show", "s", false, "only show command which will be executed") + powerCmd.PersistentFlags().IntVar(&vars.Fanout, "fanout", 50, "how many command should be executed in parallel") return powerCmd } diff --git a/internal/app/wwctl/power/soft/root_test.go b/internal/app/wwctl/power/soft/root_test.go index 87bb00b3..9c9a28d5 100644 --- a/internal/app/wwctl/power/soft/root_test.go +++ b/internal/app/wwctl/power/soft/root_test.go @@ -1,4 +1,4 @@ -package powersoft +package soft import ( "bytes" diff --git a/internal/app/wwctl/power/status/main.go b/internal/app/wwctl/power/status/main.go index 5e91d7fe..d2d15fe9 100644 --- a/internal/app/wwctl/power/status/main.go +++ b/internal/app/wwctl/power/status/main.go @@ -27,35 +27,36 @@ func CobraRunE(vars *variables) func(cmd *cobra.Command, args []string) (err err } if len(args) > 0 { - nodes = node.FilterByName(nodes, hostlist.Expand(args)) + nodes = node.FilterNodeListByName(nodes, hostlist.Expand(args)) } else { //nolint:errcheck cmd.Usage() os.Exit(1) } - if len(nodes) == 0 { - return fmt.Errorf("no nodes found") - } + if len(nodes) == 0 { + return fmt.Errorf("no nodes found") + } batchpool := batch.New(50) jobcount := len(nodes) results := make(chan power.IPMI, jobcount) - for _, n := range nodes { + for _, node := range nodes { - if node.Ipmi.Ipaddr.IsUnspecified() { - wwlog.Error("%s: No IPMI IP address", node.Id()) - continue - } - var conf node.NodeConf - conf.GetFrom(n) - ipmiCmd := power.IPMI{IpmiConf: *conf.Ipmi} - batchpool.Submit(func() { - //nolint:errcheck - ipmiCmd.PowerStatus() - results <- ipmiCmd - }) + if node.Ipmi.Ipaddr.IsUnspecified() { + wwlog.Error("%s: No IPMI IP address", node.Id()) + continue + } + ipmiCmd := power.IPMI{ + IpmiConf: *node.Ipmi, + ShowOnly: vars.Showcmd, + } + batchpool.Submit(func() { + //nolint:errcheck + ipmiCmd.PowerStatus() + results <- ipmiCmd + }) } diff --git a/internal/app/wwctl/power/status/root.go b/internal/app/wwctl/power/status/root.go index 116404a6..1176792d 100644 --- a/internal/app/wwctl/power/status/root.go +++ b/internal/app/wwctl/power/status/root.go @@ -7,6 +7,7 @@ import ( type variables struct { Showcmd bool + Fanout int } // GetRootCommand returns the root cobra.Command for the application. @@ -33,5 +34,6 @@ func GetCommand() *cobra.Command { }, } powerCmd.PersistentFlags().BoolVarP(&vars.Showcmd, "show", "s", false, "only show command which will be executed") + powerCmd.PersistentFlags().IntVar(&vars.Fanout, "fanout", 50, "how many command should be executed in parallel") return powerCmd } diff --git a/internal/app/wwctl/power/status/root_test.go b/internal/app/wwctl/power/status/root_test.go index 4446c37c..1aa2f52a 100644 --- a/internal/app/wwctl/power/status/root_test.go +++ b/internal/app/wwctl/power/status/root_test.go @@ -1,4 +1,4 @@ -package powerstatus +package status import ( "bytes"