Skip to content

Commit 99b9f94

Browse files
author
Sebastien Rannou
committed
Added support of -w flag in 'scw restart' (Fix #185)
1 parent 394822a commit 99b9f94

File tree

3 files changed

+69
-12
lines changed

3 files changed

+69
-12
lines changed

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,8 @@ Restart a running server.
614614
Options:
615615

616616
-h, --help=false Print usage
617+
-T, --timeout=0 Set timeout values to seconds
618+
-w, --wait=false Synchronous restart. Wait for SSH to be ready
617619
```
618620

619621

@@ -1130,6 +1132,7 @@ $ scw inspect myserver | jq '.[0].public_ip.address'
11301132
### master (unreleased)
11311133

11321134
* Support of `scw _userdata name VAR=@/path/to/file` ([#183](https://github.com/scaleway/scaleway-cli/issues/183))
1135+
* Support of `scw restart -w` ([#185](https://github.com/scaleway/scaleway-cli/issues/185))
11331136

11341137
View full [commits list](https://github.com/scaleway/scaleway-cli/compare/v1.5.0...master)
11351138

pkg/cli/cmd_restart.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,15 @@ var cmdRestart = &Command{
1414
}
1515

1616
func init() {
17+
cmdRestart.Flag.BoolVar(&restartW, []string{"w", "-wait"}, false, "Synchronous restart. Wait for SSH to be ready")
18+
cmdRestart.Flag.Float64Var(&restartTimeout, []string{"T", "-timeout"}, 0, "Set timeout values to seconds")
1719
cmdRestart.Flag.BoolVar(&restartHelp, []string{"h", "-help"}, false, "Print usage")
1820
}
1921

2022
// Flags
21-
var restartHelp bool // -h, --help flag
23+
var restartW bool // -w flag
24+
var restartTimeout float64 // -T flag
25+
var restartHelp bool // -h, --help flag
2226

2327
func runRestart(cmd *Command, rawArgs []string) error {
2428
if restartHelp {
@@ -29,6 +33,8 @@ func runRestart(cmd *Command, rawArgs []string) error {
2933
}
3034

3135
args := commands.RestartArgs{
36+
Timeout: restartTimeout,
37+
Wait: restartW,
3238
Servers: rawArgs,
3339
}
3440
ctx := cmd.GetContext(rawArgs)

pkg/commands/restart.go

+59-11
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,80 @@ package commands
66

77
import (
88
"fmt"
9+
"sync"
10+
"time"
911

12+
"github.com/scaleway/scaleway-cli/pkg/api"
1013
"github.com/scaleway/scaleway-cli/vendor/github.com/Sirupsen/logrus"
1114
)
1215

1316
// RestartArgs are flags for the `RunRestart` function
1417
type RestartArgs struct {
18+
Wait bool
19+
Timeout float64
1520
Servers []string
1621
}
1722

23+
// restartIdentifiers resolves server IDs, restarts, and waits for them to be ready (-w)
24+
func restartIdentifiers(ctx CommandContext, wait bool, servers []string, cr chan string) {
25+
var wg sync.WaitGroup
26+
for _, needle := range servers {
27+
wg.Add(1)
28+
go func(needle string) {
29+
server := ctx.API.GetServerID(needle)
30+
res := server
31+
err := ctx.API.PostServerAction(server, "reboot")
32+
if err != nil {
33+
if err.Error() != "server is being stopped or rebooted" {
34+
logrus.Errorf("failed to restart server %s: %s", server, err)
35+
}
36+
res = ""
37+
} else {
38+
if wait {
39+
// FIXME: handle gateway
40+
api.WaitForServerReady(ctx.API, server, "")
41+
}
42+
}
43+
cr <- res
44+
wg.Done()
45+
}(needle)
46+
}
47+
wg.Wait()
48+
close(cr)
49+
}
50+
1851
// RunRestart is the handler for 'scw restart'
1952
func RunRestart(ctx CommandContext, args RestartArgs) error {
53+
if args.Wait && args.Timeout > 0 {
54+
go func() {
55+
time.Sleep(time.Duration(args.Timeout*1000) * time.Millisecond)
56+
// FIXME: avoid use of fatalf
57+
logrus.Fatalf("Operation timed out")
58+
}()
59+
}
60+
61+
cr := make(chan string)
62+
go restartIdentifiers(ctx, args.Wait, args.Servers, cr)
63+
done := false
2064
hasError := false
21-
for _, needle := range args.Servers {
22-
server := ctx.API.GetServerID(needle)
23-
err := ctx.API.PostServerAction(server, "reboot")
24-
if err != nil {
25-
if err.Error() != "server is being stopped or rebooted" {
26-
logrus.Errorf("failed to restart server %s: %s", server, err)
65+
66+
for !done {
67+
select {
68+
case uuid, more := <-cr:
69+
if !more {
70+
done = true
71+
break
72+
}
73+
if len(uuid) > 0 {
74+
fmt.Fprintln(ctx.Stdout, uuid)
75+
} else {
2776
hasError = true
2877
}
29-
} else {
30-
fmt.Fprintln(ctx.Stdout, needle)
31-
}
32-
if hasError {
33-
return fmt.Errorf("at least 1 server failed to restart")
3478
}
3579
}
80+
81+
if hasError {
82+
return fmt.Errorf("at least 1 server failed to restart")
83+
}
3684
return nil
3785
}

0 commit comments

Comments
 (0)