@@ -7,9 +7,11 @@ package commands
77import (
88 "fmt"
99 "os"
10+ "time"
1011
1112 log "github.com/Sirupsen/logrus"
1213
14+ "github.com/scaleway/scaleway-cli/api"
1315 types "github.com/scaleway/scaleway-cli/commands/types"
1416)
1517
@@ -23,18 +25,23 @@ var cmdStop = &types.Command{
2325 $ scw stop -t my-running-server my-second-running-server
2426 $ scw stop $(scw ps -q)
2527 $ scw stop $(scw ps | grep mysql | awk '{print $1}')
28+ $ scw stop server && stop wait server
29+ $ scw stop -w server
2630` ,
2731}
2832
2933func init () {
3034 cmdStop .Flag .BoolVar (& stopT , []string {"t" , "-terminate" }, false , "Stop and trash a server with its volumes" )
3135 cmdStop .Flag .BoolVar (& stopHelp , []string {"h" , "-help" }, false , "Print usage" )
36+ cmdStop .Flag .BoolVar (& stopW , []string {"w" , "-wait" }, false , "Synchronous stop. Wait for SSH to be ready" )
3237}
3338
3439// Flags
3540var stopT bool // -t flag
3641var stopHelp bool // -h, --help flag
42+ var stopW bool // -w, --wait flat
3743
44+ // FIXME: parallelize stop when stopping multiple servers
3845func runStop (cmd * types.Command , args []string ) {
3946 if stopHelp {
4047 cmd .PrintUsage ()
@@ -45,21 +52,31 @@ func runStop(cmd *types.Command, args []string) {
4552
4653 hasError := false
4754 for _ , needle := range args {
48- server := cmd .API .GetServerID (needle )
55+ serverID := cmd .API .GetServerID (needle )
4956 action := "poweroff"
5057 if stopT {
5158 action = "terminate"
5259 }
53- err := cmd .API .PostServerAction (server , action )
60+ err := cmd .API .PostServerAction (serverID , action )
5461 if err != nil {
5562 if err .Error () != "server should be running" && err .Error () != "server is being stopped or rebooted" {
56- log .Warningf ("failed to stop server %s: %s" , server , err )
63+ log .Warningf ("failed to stop server %s: %s" , serverID , err )
5764 hasError = true
5865 }
5966 } else {
67+ if stopW {
68+ // We wait for 10 seconds which is the minimal amount of time needed for a server to stop
69+ time .Sleep (10 * time .Second )
70+ _ , err = api .WaitForServerStopped (cmd .API , serverID )
71+ if err != nil {
72+ log .Errorf ("failed to wait for server %s: %v" , serverID , err )
73+ hasError = true
74+ }
75+ }
6076 fmt .Println (needle )
6177 }
6278 }
79+
6380 if hasError {
6481 os .Exit (1 )
6582 }
0 commit comments