Skip to content

Commit

Permalink
Reorganize stop and remove commands (use stop), fixes #484 (#1526)
Browse files Browse the repository at this point in the history
* Rename stop command to stop-containers

* Rename remove command to stop

* Change behavior of ddev restart to Stop and Start

* Rename app.Down() to app.Stop()

* Make 'stop' the lead command, rm or remove an additional alias

* Add 'ddev sc' alias for stop-containers

* Fix docs to use 'stop' by default instead of 'remove'
  • Loading branch information
rfay committed Apr 16, 2019
1 parent e64019e commit 9388534
Show file tree
Hide file tree
Showing 29 changed files with 249 additions and 255 deletions.
9 changes: 7 additions & 2 deletions cmd/ddev/cmd/auth-ssh_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,17 @@ func TestCmdAuthSSH(t *testing.T) {
if !util.IsCommandAvailable("expect") {
t.Skip("Skipping TestCmdAuthSSH because expect scripting tool is not available")
}

testDir, _ := os.Getwd()
defer cmd.DevTestSites[0].Chdir()()

_, err := exec.RunCommand(cmd.DdevBin, []string{"start"})
require.NoError(t, err)
// nolint: errcheck
defer exec.RunCommand(cmd.DdevBin, []string{"stop", "--remove-data", "--omit-snapshot"})

// Delete any existing identities from ddev-ssh-agent
_, err := exec.RunCommand("docker", []string{"exec", "ddev-ssh-agent", "ssh-add", "-D"})
_, err = exec.RunCommand("docker", []string{"exec", "ddev-ssh-agent", "ssh-add", "-D"})
assert.NoError(err)

// Run a simple ssh server to act on and get its internal IP address
Expand Down Expand Up @@ -58,7 +64,6 @@ func TestCmdAuthSSH(t *testing.T) {
assert.NoError(err)
sshDir := filepath.Join(testAuthSSHDir, ".ssh")
out, err := exec.RunCommand("expect", []string{filepath.Join(testAuthSSHDir, "ddevauthssh.expect"), cmd.DdevBin, sshDir, "testkey"})
_ = out
assert.NoError(err)
assert.Contains(string(out), "Identity added:")

Expand Down
8 changes: 4 additions & 4 deletions cmd/ddev/cmd/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,7 @@ func TestConfigMariaDBVersion(t *testing.T) {
// Now use NewApp() to load, so that we get the full logic of that function.
app, err = ddevapp.NewApp(tmpDir, false, "")
//nolint: errcheck
defer app.Down(true, false)
defer app.Stop(true, false)
assert.NoError(err)
_, err = app.ReadConfig(false)
assert.NoError(err)
Expand Down Expand Up @@ -436,7 +436,7 @@ func TestConfigMariaDBVersion(t *testing.T) {
// Now test with the logical additions made by NewApp()
app, err = ddevapp.NewApp(tmpDir, false, "")
//nolint: errcheck
defer app.Down(true, false)
defer app.Stop(true, false)
assert.NoError(err)
_, err = app.ReadConfig(false)
assert.NoError(err)
Expand Down Expand Up @@ -472,7 +472,7 @@ func TestConfigMariaDBVersion(t *testing.T) {
// Now test with NewApp's additions, which should leave app.DBImage alone.
app, err = ddevapp.NewApp(tmpDir, false, "")
//nolint: errcheck
defer app.Down(true, false)
defer app.Stop(true, false)
assert.NoError(err)
_, err = app.ReadConfig(false)
assert.NoError(err)
Expand Down Expand Up @@ -508,7 +508,7 @@ func TestConfigMariaDBVersion(t *testing.T) {
// Now test with NewApp()'s adjustments
app, err = ddevapp.NewApp(tmpDir, false, "")
//nolint: errcheck
defer app.Down(true, false)
defer app.Stop(true, false)
assert.NoError(err)
_, err = app.ReadConfig(false)
assert.NoError(err)
Expand Down
83 changes: 0 additions & 83 deletions cmd/ddev/cmd/remove.go

This file was deleted.

6 changes: 3 additions & 3 deletions cmd/ddev/cmd/restart.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import (
// DdevRestartCmd rebuilds an apps settings
var DdevRestartCmd = &cobra.Command{
Use: "restart",
Short: "Restart the development environment for a project.",
Long: `Restart stops the containers for project and starts them back up again.`,
Short: "Restart a project.",
Long: `Restart removes the containers for a project and starts them back up again.`,
PreRun: func(cmd *cobra.Command, args []string) {
if len(args) > 0 {
err := cmd.Usage()
Expand All @@ -32,7 +32,7 @@ var DdevRestartCmd = &cobra.Command{
}

output.UserOut.Printf("Restarting project %s...", app.GetName())
err = app.Stop()
err = app.Stop(false, false)
if err != nil {
util.Failed("Failed to restart %s: %v", app.GetName(), err)
}
Expand Down
4 changes: 2 additions & 2 deletions cmd/ddev/cmd/root_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -167,10 +167,10 @@ func removeSites() {
for _, site := range DevTestSites {
_ = site.Chdir()

args := []string{"remove", "-RO"}
args := []string{"stop", "-RO"}
out, err := exec.RunCommand(DdevBin, args)
if err != nil {
log.Errorf("Failed to run ddev remove -RO command, err: %v, output: %s\n", err, out)
log.Errorf("Failed to run ddev stop -RO command, err: %v, output: %s\n", err, out)
}
}
}
8 changes: 4 additions & 4 deletions cmd/ddev/cmd/start_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ func TestCmdStart(t *testing.T) {
err := addSites()
require.NoError(t, err)

// Stop all sites.
_, err = exec.RunCommand(DdevBin, []string{"stop", "--all"})
// Stop-Containers all sites.
_, err = exec.RunCommand(DdevBin, []string{"stop-containers", "--all"})
assert.NoError(err)

// Ensure all sites are started after ddev start --all.
Expand All @@ -37,8 +37,8 @@ func TestCmdStart(t *testing.T) {
assert.True(app.SiteStatus() == ddevapp.SiteRunning, "All sites should be running, but %s status: %s", app.GetName(), app.SiteStatus())
}

// Stop all sites.
_, err = exec.RunCommand(DdevBin, []string{"stop", "--all"})
// Stop-containers all sites.
_, err = exec.RunCommand(DdevBin, []string{"stop-containers", "--all"})
assert.NoError(err)

// Build start command startMultipleArgs
Expand Down
42 changes: 42 additions & 0 deletions cmd/ddev/cmd/stop-containers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package cmd

import (
"github.com/drud/ddev/pkg/ddevapp"
"github.com/drud/ddev/pkg/util"
"github.com/spf13/cobra"
)

var stopAllContainers bool

// DdevStopContainersCmd represents the stop command
var DdevStopContainersCmd = &cobra.Command{
Use: "stop-containers [projectname ...]",
Short: "uses 'docker stop' to stop the containers belonging to a project.",
Long: `Uses "docker-compose stop" to stop the containers belonging to a project. This leaves the containers instantiated instead of removing them like ddev stop does. You can run 'ddev stop-containers'
from a project directory to stop the containers of that project, or you can stop running projects
in any directory by running 'ddev stop-containers projectname [projectname ...]'`,
Aliases: []string{"sc"},
Run: func(cmd *cobra.Command, args []string) {
projects, err := getRequestedProjects(args, stopAllContainers)
if err != nil {
util.Failed("Unable to get project(s): %v", err)
}

for _, project := range projects {
if err := ddevapp.CheckForMissingProjectFiles(project); err != nil {
util.Failed("Failed to stop-containers %s: %v", project.GetName(), err)
}

if err := project.StopContainers(); err != nil {
util.Failed("Failed to stop-containers %s: %v", project.GetName(), err)
}

util.Success("Containers for project %s have been stopped.", project.GetName())
}
},
}

func init() {
DdevStopContainersCmd.Flags().BoolVarP(&stopAllContainers, "all", "a", false, "Stop-containers on all running projects")
RootCmd.AddCommand(DdevStopContainersCmd)
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,24 +16,28 @@ import (
asrt "github.com/stretchr/testify/assert"
)

// TestCmdRemove runs `ddev rm` on the test apps
func TestCmdRemove(t *testing.T) {
// TestCmdStopContainers runs `ddev stop-containers` on the test apps
func TestCmdStopContainers(t *testing.T) {
assert := asrt.New(t)

// Make sure we have running sites.
err := addSites()
require.NoError(t, err)

for _, site := range DevTestSites {
cleanup := site.Chdir()

out, err := exec.RunCommand(DdevBin, []string{"remove"})
assert.NoError(err, "ddev remove should succeed but failed, err: %v, output: %s", err, out)
assert.Contains(out, "has been removed")
out, err := exec.RunCommand(DdevBin, []string{"stop-containers"})
assert.NoError(err, "ddev stop-containers should succeed but failed, err: %v, output: %s", err, out)
assert.Contains(out, "have been stopped")

// Ensure the site that was just stopped does not appear in the list of sites
apps := ddevapp.GetApps()
for _, app := range apps {
assert.True(app.GetName() != site.Name)
if app.GetName() != site.Name {
continue
}

assert.True(app.SiteStatus() == ddevapp.SiteStopped)
}

cleanup()
Expand All @@ -42,26 +46,27 @@ func TestCmdRemove(t *testing.T) {
// Re-create running sites.
err = addSites()
require.NoError(t, err)
out, err := exec.RunCommand(DdevBin, []string{"stop-containers", "--all"})
assert.NoError(err, "ddev stop --all should succeed but failed, err: %v, output: %s", err, out)

// Ensure the --all option can remove all active apps
out, err := exec.RunCommand(DdevBin, []string{"remove", "--all"})
assert.NoError(err, "ddev remove --all should succeed but failed, err: %v, output: %s", err, out)
out, err = exec.RunCommand(DdevBin, []string{"list"})
assert.NoError(err)
assert.Contains(out, "no active ddev projects")
assert.Equal(0, len(ddevapp.GetApps()), "Not all apps were removed after ddev remove --all")
// Confirm all sites are stopped.
apps := ddevapp.GetApps()
for _, app := range apps {
assert.True(app.SiteStatus() == ddevapp.SiteStopped, "All sites should be stopped, but %s status: %s", app.GetName(), app.SiteStatus())
}

// Now put the sites back together so other tests can use them.
err = addSites()
require.NoError(t, err)
}

// TestCmdRemoveMissingProjectDirectory ensures the `ddev remove` command can operate on a project when the
// project's directory has been removed.
func TestCmdRemoveMissingProjectDirectory(t *testing.T) {
// TestCmdStopContainersMissingProjectDirectory ensures the `ddev stop` command returns the expected help text when
// a project's directory no longer exists.
func TestCmdStopContainersMissingProjectDirectory(t *testing.T) {
var err error
var out string
assert := asrt.New(t)

projDir, _ := os.Getwd()

projectName := util.RandString(6)
Expand All @@ -73,23 +78,20 @@ func TestCmdRemoveMissingProjectDirectory(t *testing.T) {
_, err = exec.RunCommand(DdevBin, []string{"config", "--project-type", "php", "--project-name", projectName})
assert.NoError(err)

//nolint: errcheck
defer exec.RunCommand(DdevBin, []string{"remove", "-RO", projectName})

_, err = exec.RunCommand(DdevBin, []string{"start"})
assert.NoError(err)

//nolint: errcheck
defer exec.RunCommand(DdevBin, []string{"remove", "-RO", projectName})

err = os.Chdir(projDir)
assert.NoError(err)

copyDir := filepath.Join(testcommon.CreateTmpDir(t.Name()), util.RandString(4))
err = os.Rename(tmpDir, copyDir)
assert.NoError(err)

out, err = exec.RunCommand(DdevBin, []string{"remove", projectName})
assert.NoError(err)
assert.Contains(out, "has been removed")

err = os.Rename(copyDir, tmpDir)
assert.NoError(err)
out, err = exec.RunCommand(DdevBin, []string{"stop-containers", projectName})
assert.Error(err, "Expected an error when stopping project with no project directory")
assert.Contains(out, "ddev can no longer find your project files")
}

0 comments on commit 9388534

Please sign in to comment.