Skip to content

Commit e07a1fb

Browse files
committed
Refactored ps command (scaleway#80)
1 parent 526f27a commit e07a1fb

File tree

2 files changed

+63
-14
lines changed

2 files changed

+63
-14
lines changed

pkg/commands/ps.go

+40-14
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package commands
66

77
import (
88
"fmt"
9-
"os"
109
"text/tabwriter"
1110
"time"
1211

@@ -18,7 +17,7 @@ import (
1817
)
1918

2019
var cmdPs = &types.Command{
21-
Exec: runPs,
20+
Exec: cmdExecPs,
2221
UsageLine: "ps [OPTIONS]",
2322
Description: "List servers",
2423
Help: "List servers. By default, only running servers are displayed.",
@@ -41,39 +40,66 @@ var psNoTrunc bool // -no-trunc flag
4140
var psN int // -n flag
4241
var psHelp bool // -h, --help flag
4342

44-
func runPs(cmd *types.Command, args []string) {
43+
// PsArgs are flags for the `RunPs` function
44+
type PsArgs struct {
45+
All bool
46+
Latest bool
47+
NLast int
48+
NoTrunc bool
49+
Quiet bool
50+
}
51+
52+
func cmdExecPs(cmd *types.Command, rawArgs []string) {
4553
if psHelp {
4654
cmd.PrintUsage()
4755
}
48-
if len(args) != 0 {
56+
if len(rawArgs) != 0 {
4957
cmd.PrintShortUsage()
5058
}
5159

52-
limit := psN
53-
if psL {
60+
args := PsArgs{
61+
All: psA,
62+
Latest: psL,
63+
Quiet: psQ,
64+
NoTrunc: psNoTrunc,
65+
NLast: psN,
66+
}
67+
ctx := cmd.GetContext(rawArgs)
68+
err := RunPs(ctx, args)
69+
if err != nil {
70+
log.Fatalf("Cannot exec 'ps': %v", err)
71+
}
72+
}
73+
74+
// RunPs is the handler for 'scw ps'
75+
func RunPs(ctx types.CommandContext, args PsArgs) error {
76+
limit := args.NLast
77+
if args.Latest {
5478
limit = 1
5579
}
56-
servers, err := cmd.API.GetServers(psA || psN > 0 || psL, limit)
80+
all := args.All || args.NLast > 0 || args.Latest
81+
servers, err := ctx.API.GetServers(all, limit)
5782
if err != nil {
58-
log.Fatalf("Unable to fetch servers from the Scaleway API: %v", err)
83+
return fmt.Errorf("Unable to fetch servers from the Scaleway API: %v", err)
5984
}
6085

61-
w := tabwriter.NewWriter(os.Stdout, 20, 1, 3, ' ', 0)
86+
w := tabwriter.NewWriter(ctx.Stdout, 20, 1, 3, ' ', 0)
6287
defer w.Flush()
63-
if !psQ {
88+
if !args.Quiet {
6489
fmt.Fprintf(w, "SERVER ID\tIMAGE\tCOMMAND\tCREATED\tSTATUS\tPORTS\tNAME\n")
6590
}
6691
for _, server := range *servers {
67-
if psQ {
92+
if args.Quiet {
6893
fmt.Fprintf(w, "%s\n", server.Identifier)
6994
} else {
70-
shortID := utils.TruncIf(server.Identifier, 8, !psNoTrunc)
71-
shortImage := utils.TruncIf(utils.Wordify(server.Image.Name), 25, !psNoTrunc)
72-
shortName := utils.TruncIf(utils.Wordify(server.Name), 25, !psNoTrunc)
95+
shortID := utils.TruncIf(server.Identifier, 8, !args.NoTrunc)
96+
shortImage := utils.TruncIf(utils.Wordify(server.Image.Name), 25, !args.NoTrunc)
97+
shortName := utils.TruncIf(utils.Wordify(server.Name), 25, !args.NoTrunc)
7398
creationTime, _ := time.Parse("2006-01-02T15:04:05.000000+00:00", server.CreationDate)
7499
shortCreationDate := units.HumanDuration(time.Now().UTC().Sub(creationTime))
75100
port := server.PublicAddress.IP
76101
fmt.Fprintf(w, "%s\t%s\t\t%s\t%s\t%s\t%s\n", shortID, shortImage, shortCreationDate, server.State, port, shortName)
77102
}
78103
}
104+
return nil
79105
}

pkg/commands/types/command.go

+23
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package types
88
import (
99
"bytes"
1010
"fmt"
11+
"io"
1112
"log"
1213
"os"
1314
"strings"
@@ -45,6 +46,28 @@ type Command struct {
4546
API *api.ScalewayAPI
4647
}
4748

49+
// CommandContext is passed to all commands and contains streams, environment, api and arguments
50+
type CommandContext struct {
51+
Stdin io.Reader
52+
Stdout io.Writer
53+
Stderr io.Writer
54+
Env []string
55+
RawArgs []string
56+
API *api.ScalewayAPI
57+
}
58+
59+
// GetContext returns a standard context, with real stdin, stdout, stderr, a configured API and raw arguments
60+
func (c *Command) GetContext(rawArgs []string) CommandContext {
61+
return CommandContext{
62+
Stdin: os.Stdin,
63+
Stdout: os.Stdout,
64+
Stderr: os.Stderr,
65+
Env: os.Environ(),
66+
RawArgs: rawArgs,
67+
API: c.API,
68+
}
69+
}
70+
4871
// Name returns the command's name
4972
func (c *Command) Name() string {
5073
name := c.UsageLine

0 commit comments

Comments
 (0)