diff --git a/README.md b/README.md index c5c0ba5029..971d0dbe49 100644 --- a/README.md +++ b/README.md @@ -626,11 +626,14 @@ Remove one or more servers. Options: + -f, --force=false Force the removal of a server -h, --help=false Print usage Examples: - $ scw rm my-stopped-server my-second-stopped-server + $ scw rm myserver + $ scw rm -f myserver + $ scw rm my-stopped-server my-second-stopped-serv $ scw rm $(scw ps -q) $ scw rm $(scw ps | grep mysql | awk '{print $1}') ``` @@ -1129,6 +1132,7 @@ $ scw inspect myserver | jq '.[0].public_ip.address' * `scw info` now prints user/organization info from the API ([#142](https://github.com/scaleway/scaleway-cli/issues/130) * Added helpers to manipulate new `user_data` API ([#150](https://github.com/scaleway/scaleway-cli/issues/150)) +* Support of `scw rm -f/--force` option ([#158](https://github.com/scaleway/scaleway-cli/issues/158)) #### Fixes diff --git a/pkg/api/helpers.go b/pkg/api/helpers.go index da3b1a29f9..5f821b7cfd 100644 --- a/pkg/api/helpers.go +++ b/pkg/api/helpers.go @@ -515,6 +515,7 @@ func StartServerOnce(api *ScalewayAPI, needle string, wait bool, successChan cha // DeleteServerSafe tries to delete a server using multiple ways func (a *ScalewayAPI) DeleteServerSafe(serverID string) error { // FIXME: also delete attached volumes and ip address + // FIXME: call delete and stop -t in parallel to speed up process err := a.DeleteServer(serverID) if err == nil { logrus.Infof("Server '%s' successfuly deleted", serverID) @@ -527,7 +528,8 @@ func (a *ScalewayAPI) DeleteServerSafe(serverID string) error { return nil } + // FIXME: retry in a loop until timeout or Control+C logrus.Errorf("Failed to delete server %s", serverID) - logrus.Errorf("Try to run 'scw rm %s' later", serverID) + logrus.Errorf("Try to run 'scw rm -f %s' later", serverID) return err } diff --git a/pkg/cli/cmd_rm.go b/pkg/cli/cmd_rm.go index 1bb3be011a..91b10a9f15 100644 --- a/pkg/cli/cmd_rm.go +++ b/pkg/cli/cmd_rm.go @@ -12,6 +12,8 @@ var cmdRm = &Command{ Description: "Remove one or more servers", Help: "Remove one or more servers.", Examples: ` + $ scw rm myserver + $ scw rm -f myserver $ scw rm my-stopped-server my-second-stopped-server $ scw rm $(scw ps -q) $ scw rm $(scw ps | grep mysql | awk '{print $1}') @@ -20,10 +22,12 @@ var cmdRm = &Command{ func init() { cmdRm.Flag.BoolVar(&rmHelp, []string{"h", "-help"}, false, "Print usage") + cmdRm.Flag.BoolVar(&rmForce, []string{"f", "-force"}, false, "Force the removal of a server") } // Flags -var rmHelp bool // -h, --help flag +var rmHelp bool // -h, --help flag +var rmForce bool // -f, --force flag func runRm(cmd *Command, rawArgs []string) error { if rmHelp { @@ -35,6 +39,7 @@ func runRm(cmd *Command, rawArgs []string) error { args := commands.RmArgs{ Servers: rawArgs, + Force: rmForce, } ctx := cmd.GetContext(rawArgs) return commands.RunRm(ctx, args) diff --git a/pkg/commands/rm.go b/pkg/commands/rm.go index a62a52f7af..ea4bf294e1 100644 --- a/pkg/commands/rm.go +++ b/pkg/commands/rm.go @@ -13,6 +13,7 @@ import ( // RmArgs are flags for the `RunRm` function type RmArgs struct { Servers []string + Force bool } // RunRm is the handler for 'scw rm' @@ -20,7 +21,12 @@ func RunRm(ctx CommandContext, args RmArgs) error { hasError := false for _, needle := range args.Servers { server := ctx.API.GetServerID(needle) - err := ctx.API.DeleteServer(server) + var err error + if args.Force { + err = ctx.API.DeleteServerSafe(server) + } else { + err = ctx.API.DeleteServer(server) + } if err != nil { logrus.Errorf("failed to delete server %s: %s", server, err) hasError = true