diff --git a/commands/rm.go b/commands/rm.go index cc50df1bbc..cb64430ecd 100644 --- a/commands/rm.go +++ b/commands/rm.go @@ -17,9 +17,13 @@ func cmdRm(c CommandLine, api libmachine.API) error { confirm := c.Bool("y") for _, hostName := range c.Args() { - h, err := api.Load(hostName) - if err != nil { - return fmt.Errorf("Error removing host %q: %s", hostName, err) + h, loaderr := api.Load(hostName) + if loaderr != nil { + // On --force, continue to remove on-disk files/dir + if !force { + return fmt.Errorf("Error removing host %q: %s", hostName, loaderr) + } + log.Errorf("Error removing host %q: %s. Continuing on `-f`, host instance may by running", hostName, loaderr) } if !confirm && !force { @@ -29,10 +33,12 @@ func cmdRm(c CommandLine, api libmachine.API) error { } } - if err := h.Driver.Remove(); err != nil { - if !force { - log.Errorf("Provider error removing machine %q: %s", hostName, err) - continue + if loaderr == nil { + if err := h.Driver.Remove(); err != nil { + if !force { + log.Errorf("Provider error removing machine %q: %s", hostName, err) + continue + } } } diff --git a/commands/rm_test.go b/commands/rm_test.go index b90e8152ce..5e41f0c4b6 100644 --- a/commands/rm_test.go +++ b/commands/rm_test.go @@ -53,3 +53,87 @@ func TestCmdRm(t *testing.T) { assert.False(t, libmachinetest.Exists(api, "machineToRemove2")) assert.True(t, libmachinetest.Exists(api, "machine")) } + +func TestCmdRmforcefully(t *testing.T) { + commandLine := &commandstest.FakeCommandLine{ + CliArgs: []string{"machineToRemove1", "machineToRemove2"}, + LocalFlags: &commandstest.FakeFlagger{ + Data: map[string]interface{}{ + "force": true, + }, + }, + } + api := &libmachinetest.FakeAPI{ + Hosts: []*host.Host{ + { + Name: "machineToRemove1", + Driver: &fakedriver.Driver{}, + }, + { + Name: "machineToRemove2", + Driver: &fakedriver.Driver{}, + }, + }, + } + + err := cmdRm(commandLine, api) + assert.NoError(t, err) + + assert.False(t, libmachinetest.Exists(api, "machineToRemove1")) + assert.False(t, libmachinetest.Exists(api, "machineToRemove2")) +} + +func TestCmdRmforceDoesAutoConfirm(t *testing.T) { + commandLine := &commandstest.FakeCommandLine{ + CliArgs: []string{"machineToRemove1", "machineToRemove2"}, + LocalFlags: &commandstest.FakeFlagger{ + Data: map[string]interface{}{ + "y": false, + "force": true, + }, + }, + } + api := &libmachinetest.FakeAPI{ + Hosts: []*host.Host{ + { + Name: "machineToRemove1", + Driver: &fakedriver.Driver{}, + }, + { + Name: "machineToRemove2", + Driver: &fakedriver.Driver{}, + }, + }, + } + + err := cmdRm(commandLine, api) + assert.NoError(t, err) + + assert.False(t, libmachinetest.Exists(api, "machineToRemove1")) + assert.False(t, libmachinetest.Exists(api, "machineToRemove2")) +} + +func TestCmdRmforceConfirmUnset(t *testing.T) { + commandLine := &commandstest.FakeCommandLine{ + CliArgs: []string{"machineToRemove1"}, + LocalFlags: &commandstest.FakeFlagger{ + Data: map[string]interface{}{ + "y": false, + "force": false, + }, + }, + } + api := &libmachinetest.FakeAPI{ + Hosts: []*host.Host{ + { + Name: "machineToRemove1", + Driver: &fakedriver.Driver{}, + }, + }, + } + + err := cmdRm(commandLine, api) + assert.EqualError(t, err, "EOF") + + assert.True(t, libmachinetest.Exists(api, "machineToRemove1")) +}