added test for power status

Signed-off-by: Christian Goll <cgoll@suse.com>
This commit is contained in:
Christian Goll
2023-12-05 20:04:32 +01:00
committed by Jonathon Anderson
parent 4597fdfaa9
commit f53ae48ae6
17 changed files with 486 additions and 170 deletions

View File

@@ -12,8 +12,9 @@ import (
"github.com/warewulf/warewulf/internal/pkg/wwlog"
)
func CobraRunE(cmd *cobra.Command, args []string) error {
var returnErr error = nil
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 {
@@ -25,23 +26,23 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
return fmt.Errorf("could not get node list: %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.FilterByName(nodes, hostlist.Expand(args))
} else {
//nolint:errcheck
cmd.Usage()
os.Exit(1)
}
if len(nodes) == 0 {
return fmt.Errorf("no nodes found")
}
batchpool := batch.New(50)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
batchpool := batch.New(50)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
for _, n := range nodes {
for _, n := range nodes {
if node.Ipmi.Ipaddr.IsUnspecified() {
wwlog.Error("%s: No IPMI IP address", node.Id())
@@ -56,25 +57,24 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
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
}
fmt.Printf("%s: %s\n", result.Ipaddr, out)
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: %s\n", result.Ipaddr, out)
}
return returnErr
}
return returnErr
}

View File

@@ -2,19 +2,36 @@ package cycle
import (
"github.com/spf13/cobra"
"github.com/warewulf/warewulf/internal/pkg/node"
)
var (
powerCmd = &cobra.Command{
type variables struct {
Showcmd bool
}
// GetRootCommand returns the root cobra.Command for the application.
func GetCommand() *cobra.Command {
vars := variables{}
powerCmd := &cobra.Command{
DisableFlagsInUseLine: true,
Use: "cycle [OPTIONS] [PATTERN ...]",
Short: "Power cycle the given node(s)",
Long: "This command cycles power for a set of nodes specified by PATTERN.",
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
}
// GetRootCommand returns the root cobra.Command for the application.
func GetCommand() *cobra.Command {
nodeDB, _ := node.New()
nodes, _ := nodeDB.FindAllNodes()
var node_names []string
for _, node := range nodes {
node_names = append(node_names, node.Id.Get())
}
return node_names, cobra.ShellCompDirectiveNoFileComp
},
}
powerCmd.PersistentFlags().BoolVarP(&vars.Showcmd, "show", "s", false, "only show command which will be executed")
return powerCmd
}

View File

@@ -0,0 +1,42 @@
package powercycle
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: ipmitool -I lan -H 10.10.10.10 -p 623 -U admin -P admin -e ~ chassis power cycle", strings.TrimSpace(buf.String()))
})
}

View File

@@ -12,8 +12,9 @@ import (
"github.com/warewulf/warewulf/internal/pkg/wwlog"
)
func CobraRunE(cmd *cobra.Command, args []string) error {
var returnErr error = nil
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 {
@@ -25,21 +26,21 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
return fmt.Errorf("could not get node list: %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.FilterByName(nodes, hostlist.Expand(args))
} else {
//nolint:errcheck
cmd.Usage()
os.Exit(1)
}
if len(nodes) == 0 {
return fmt.Errorf("no nodes found")
}
batchpool := batch.New(50)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
batchpool := batch.New(50)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
for _, node := range nodes {
@@ -56,25 +57,26 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
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
}
fmt.Printf("%s: %s\n", result.Ipaddr, out)
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: %s\n", result.Ipaddr, out)
}
return returnErr
}
return returnErr
}

View File

@@ -5,13 +5,19 @@ import (
"github.com/warewulf/warewulf/internal/pkg/node"
)
var (
powerCmd = &cobra.Command{
type variables struct {
Showcmd bool
}
// GetRootCommand returns the root cobra.Command for the application.
func GetCommand() *cobra.Command {
vars := variables{}
powerCmd := &cobra.Command{
DisableFlagsInUseLine: true,
Use: "off [OPTIONS] [PATTERN ...]",
Short: "Power off the given node(s)",
Long: "This command will shutdown power to a set of nodes specified by PATTERN.",
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
@@ -26,9 +32,7 @@ var (
return node_names, cobra.ShellCompDirectiveNoFileComp
},
}
)
powerCmd.PersistentFlags().BoolVarP(&vars.Showcmd, "show", "s", false, "only show command which will be executed")
// GetRootCommand returns the root cobra.Command for the application.
func GetCommand() *cobra.Command {
return powerCmd
}

View File

@@ -0,0 +1,42 @@
package poweroff
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: ipmitool -I lan -H 10.10.10.10 -p 623 -U admin -P admin -e ~ chassis power off", strings.TrimSpace(buf.String()))
})
}

View File

@@ -12,8 +12,10 @@ import (
"github.com/warewulf/warewulf/internal/pkg/wwlog"
)
func CobraRunE(cmd *cobra.Command, args []string) error {
var returnErr error = nil
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 {
@@ -25,21 +27,21 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
return fmt.Errorf("could not get node list: %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.FilterByName(nodes, hostlist.Expand(args))
} else {
//nolint:errcheck
cmd.Usage()
os.Exit(1)
}
if len(nodes) == 0 {
return fmt.Errorf("no nodes found")
}
batchpool := batch.New(50)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
batchpool := batch.New(50)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
for _, node := range nodes {
@@ -56,25 +58,26 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
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
}
fmt.Printf("%s: %s\n", result.Ipaddr, out)
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: %s\n", result.Ipaddr, out)
}
return returnErr
}
return returnErr
}

View File

@@ -5,12 +5,18 @@ import (
"github.com/warewulf/warewulf/internal/pkg/node"
)
var (
powerCmd = &cobra.Command{
type variables struct {
Showcmd bool
}
// GetRootCommand returns the root cobra.Command for the application.
func GetCommand() *cobra.Command {
vars := variables{}
powerCmd := &cobra.Command{
Use: "on [OPTIONS] [PATTERN ...]",
Short: "Power on the given node(s)",
Long: "This command will power on a set of nodes specified by PATTERN.",
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
@@ -25,9 +31,7 @@ var (
return node_names, cobra.ShellCompDirectiveNoFileComp
},
}
)
powerCmd.PersistentFlags().BoolVarP(&vars.Showcmd, "show", "s", false, "only show command which will be executed")
// GetRootCommand returns the root cobra.Command for the application.
func GetCommand() *cobra.Command {
return powerCmd
}

View File

@@ -0,0 +1,42 @@
package poweron
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: ipmitool -I lan -H 10.10.10.10 -p 623 -U admin -P admin -e ~ chassis power on", strings.TrimSpace(buf.String()))
})
}

View File

@@ -12,8 +12,10 @@ import (
"github.com/warewulf/warewulf/internal/pkg/wwlog"
)
func CobraRunE(cmd *cobra.Command, args []string) error {
var returnErr error = nil
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 {
@@ -25,6 +27,13 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
return fmt.Errorf("cloud not get nodeList: %s", err)
}
if len(args) > 0 {
nodes = node.FilterByName(nodes, hostlist.Expand(args))
} else {
//nolint:errcheck
cmd.Usage()
os.Exit(1)
}
if len(args) > 0 {
nodes = node.FilterNodeListByName(nodes, hostlist.Expand(args))
} else {
@@ -37,11 +46,11 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
return fmt.Errorf("no nodes found")
}
batchpool := batch.New(50)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
batchpool := batch.New(50)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
for _, n := range nodes {
for _, n := range nodes {
if node.Ipmi.Ipaddr.IsUnspecified() {
wwlog.Error("%s: No IPMI IP address", node.Id())
@@ -56,25 +65,26 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
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
}
fmt.Printf("%s: %s\n", result.Ipaddr, out)
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: %s\n", result.Ipaddr, out)
}
return returnErr
}
return returnErr
}

View File

@@ -5,13 +5,19 @@ import (
"github.com/warewulf/warewulf/internal/pkg/node"
)
var (
powerCmd = &cobra.Command{
type variables struct {
Showcmd bool
}
// GetRootCommand returns the root cobra.Command for the application.
func GetCommand() *cobra.Command {
vars := variables{}
powerCmd := &cobra.Command{
DisableFlagsInUseLine: true,
Use: "reset [OPTIONS] [PATTERN ...]",
Short: "Issue a reset to node(s)",
Long: "This command will issue a reset to a set of nodes specified by PATTERN.",
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
@@ -26,9 +32,7 @@ var (
return node_names, cobra.ShellCompDirectiveNoFileComp
},
}
)
powerCmd.PersistentFlags().BoolVarP(&vars.Showcmd, "show", "s", false, "only show command which will be executed")
// GetRootCommand returns the root cobra.Command for the application.
func GetCommand() *cobra.Command {
return powerCmd
}

View File

@@ -0,0 +1,42 @@
package powerreset
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: ipmitool -I lan -H 10.10.10.10 -p 623 -U admin -P admin -e ~ chassis power reset", strings.TrimSpace(buf.String()))
})
}

View File

@@ -12,8 +12,10 @@ import (
"github.com/warewulf/warewulf/internal/pkg/wwlog"
)
func CobraRunE(cmd *cobra.Command, args []string) error {
var returnErr error = nil
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 {
@@ -37,11 +39,11 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
return fmt.Errorf("no nodes found")
}
batchpool := batch.New(50)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
batchpool := batch.New(50)
jobcount := len(nodes)
results := make(chan power.IPMI, jobcount)
for _, n := range nodes {
for _, n := range nodes {
if node.Ipmi.Ipaddr.IsUnspecified() {
wwlog.Error("%s: No IPMI IP address", node.Id())
@@ -56,25 +58,26 @@ func CobraRunE(cmd *cobra.Command, args []string) error {
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
}
fmt.Printf("%s: %s\n", result.Ipaddr, out)
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: %s\n", result.Ipaddr, out)
}
return returnErr
}
return returnErr
}

View File

@@ -5,13 +5,19 @@ import (
"github.com/warewulf/warewulf/internal/pkg/node"
)
var (
powerCmd = &cobra.Command{
type variables struct {
Showcmd bool
}
// GetRootCommand returns the root cobra.Command for the application.
func GetCommand() *cobra.Command {
vars := variables{}
powerCmd := &cobra.Command{
DisableFlagsInUseLine: true,
Use: "soft",
Short: "Gracefully shuts down the given node(s)",
Long: "This command uses the operating system to shut down the set of nodes specified by PATTERN.",
RunE: CobraRunE,
Long: "This command uses the operationg 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 {
return nil, cobra.ShellCompDirectiveNoFileComp
@@ -26,9 +32,6 @@ var (
return node_names, cobra.ShellCompDirectiveNoFileComp
},
}
)
// GetRootCommand returns the root cobra.Command for the application.
func GetCommand() *cobra.Command {
powerCmd.PersistentFlags().BoolVarP(&vars.Showcmd, "show", "s", false, "only show command which will be executed")
return powerCmd
}

View File

@@ -0,0 +1,42 @@
package powersoft
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: ipmitool -I lan -H 10.10.10.10 -p 623 -U admin -P admin -e ~ chassis power soft", strings.TrimSpace(buf.String()))
})
}

View File

@@ -0,0 +1,42 @@
package powerstatus
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: ipmitool -I lan -H 10.10.10.10 -p 623 -U admin -P admin -e ~ chassis power status", strings.TrimSpace(buf.String()))
})
}