Skip to content

Commit 46ba016

Browse files
committed
Refactored 'start' command (scaleway#80)
1 parent fd6ad5b commit 46ba016

File tree

2 files changed

+71
-40
lines changed

2 files changed

+71
-40
lines changed

pkg/cli/start.go

+12-40
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,9 @@
55
package cli
66

77
import (
8-
"fmt"
9-
"os"
10-
"time"
8+
"github.com/scaleway/scaleway-cli/vendor/github.com/Sirupsen/logrus"
119

12-
log "github.com/scaleway/scaleway-cli/vendor/github.com/Sirupsen/logrus"
13-
14-
"github.com/scaleway/scaleway-cli/pkg/api"
10+
"github.com/scaleway/scaleway-cli/pkg/commands"
1511
)
1612

1713
var cmdStart = &Command{
@@ -32,46 +28,22 @@ var startW bool // -w flag
3228
var startTimeout float64 // -T flag
3329
var startHelp bool // -h, --help flag
3430

35-
func runStart(cmd *Command, args []string) {
31+
func runStart(cmd *Command, rawArgs []string) {
3632
if startHelp {
3733
cmd.PrintUsage()
3834
}
39-
if len(args) < 1 {
35+
if len(rawArgs) < 1 {
4036
cmd.PrintShortUsage()
4137
}
4238

43-
hasError := false
44-
errChan := make(chan error)
45-
successChan := make(chan bool)
46-
remainingItems := len(args)
47-
48-
for i := range args {
49-
needle := args[i]
50-
go api.StartServerOnce(cmd.API, needle, startW, successChan, errChan)
51-
}
52-
53-
if startTimeout > 0 {
54-
go func() {
55-
time.Sleep(time.Duration(startTimeout*1000) * time.Millisecond)
56-
log.Fatalf("Operation timed out")
57-
}()
58-
}
59-
60-
for {
61-
select {
62-
case _ = <-successChan:
63-
remainingItems--
64-
case err := <-errChan:
65-
log.Errorf(fmt.Sprintf("%s", err))
66-
remainingItems--
67-
hasError = true
68-
}
69-
70-
if remainingItems == 0 {
71-
break
72-
}
39+
args := commands.StartArgs{
40+
Servers: rawArgs,
41+
Timeout: startTimeout,
42+
Wait: startW,
7343
}
74-
if hasError {
75-
os.Exit(1)
44+
ctx := cmd.GetContext(rawArgs)
45+
err := commands.RunStart(ctx, args)
46+
if err != nil {
47+
logrus.Fatalf("Cannot execute 'start': %v", err)
7648
}
7749
}

pkg/commands/start.go

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Copyright (C) 2015 Scaleway. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE.md file.
4+
5+
package commands
6+
7+
import (
8+
"fmt"
9+
"time"
10+
11+
"github.com/scaleway/scaleway-cli/pkg/api"
12+
"github.com/scaleway/scaleway-cli/vendor/github.com/Sirupsen/logrus"
13+
)
14+
15+
// StartArgs are flags for the `RunStart` function
16+
type StartArgs struct {
17+
Servers []string
18+
Wait bool
19+
Timeout float64
20+
}
21+
22+
// RunStart is the handler for 'scw start'
23+
func RunStart(ctx CommandContext, args StartArgs) error {
24+
hasError := false
25+
errChan := make(chan error)
26+
successChan := make(chan bool)
27+
remainingItems := len(args.Servers)
28+
29+
for _, needle := range args.Servers {
30+
go api.StartServerOnce(ctx.API, needle, args.Wait, successChan, errChan)
31+
}
32+
33+
if args.Timeout > 0 {
34+
go func() {
35+
time.Sleep(time.Duration(args.Timeout*1000) * time.Millisecond)
36+
// FIXME: avoid use of fatalf
37+
logrus.Fatalf("Operation timed out")
38+
}()
39+
}
40+
41+
for {
42+
select {
43+
case _ = <-successChan:
44+
remainingItems--
45+
case err := <-errChan:
46+
logrus.Errorf(fmt.Sprintf("%s", err))
47+
remainingItems--
48+
hasError = true
49+
}
50+
51+
if remainingItems == 0 {
52+
break
53+
}
54+
}
55+
if hasError {
56+
return fmt.Errorf("at least 1 server failed to start")
57+
}
58+
return nil
59+
}

0 commit comments

Comments
 (0)