diff --git a/cmd/kpod/rm.go b/cmd/kpod/rm.go index 86d08f2d39..511679770b 100644 --- a/cmd/kpod/rm.go +++ b/cmd/kpod/rm.go @@ -2,8 +2,10 @@ package main import ( "fmt" + "os" "github.com/pkg/errors" + "github.com/projectatomic/libpod/libpod" "github.com/urfave/cli" ) @@ -13,6 +15,10 @@ var ( Name: "force, f", Usage: "Force removal of a running container. The default is false", }, + cli.BoolFlag{ + Name: "all, a", + Usage: "Remove all containers", + }, } rmDescription = "Remove one or more containers" rmCommand = cli.Command{ @@ -39,20 +45,45 @@ func rmCmd(c *cli.Context) error { defer runtime.Shutdown(false) args := c.Args() - if len(args) == 0 { + if len(args) == 0 && !c.Bool("all") { return errors.Errorf("specify one or more containers to remove") } - for _, container := range args { - ctr, err := runtime.LookupContainer(container) + var delContainers []*libpod.Container + var lastError error + if c.Bool("all") { + delContainers, err = runtime.GetContainers() if err != nil { - return errors.Wrapf(err, "error looking up container", container) + return errors.Wrapf(err, "unable to get container list") } - err = runtime.RemoveContainer(ctr, c.Bool("force")) - if err != nil { - return errors.Wrapf(err, "error removing container %q", ctr.ID()) + } else { + for _, i := range args { + container, err := runtime.LookupContainer(i) + if err != nil { + fmt.Fprintln(os.Stderr, err) + lastError = errors.Wrapf(err, "unable to find container %s", i) + continue + } + delContainers = append(delContainers, container) } - fmt.Println(ctr.ID()) } - return nil + for _, container := range delContainers { + if err != nil { + if lastError != nil { + fmt.Fprintln(os.Stderr, lastError) + } + lastError = errors.Wrapf(err, "failed to find container %s", container.ID()) + continue + } + err = runtime.RemoveContainer(container, c.Bool("force")) + if err != nil { + if lastError != nil { + fmt.Fprintln(os.Stderr, lastError) + } + lastError = errors.Wrapf(err, "failed to delete container %v", container.ID()) + } else { + fmt.Println(container.ID()) + } + } + return lastError } diff --git a/completions/bash/kpod b/completions/bash/kpod index 8b7e121d83..0fb413fe88 100644 --- a/completions/bash/kpod +++ b/completions/bash/kpod @@ -1213,6 +1213,8 @@ _kpod_run() { _kpod_rm() { local boolean_options=" + --all + -a --force -f " diff --git a/docs/kpod-rm.1.md b/docs/kpod-rm.1.md index 4e2c490a67..77753f1fe8 100644 --- a/docs/kpod-rm.1.md +++ b/docs/kpod-rm.1.md @@ -9,7 +9,7 @@ kpod rm - Remove one or more containers **kpod** **rm** [*options* [...]] container ## DESCRIPTION -Kpod rm will remove one or more containers from the host. The container name or ID can be used. This does not remove images. Running containers will not be removed without the -f option +kpod rm will remove one or more containers from the host. The container name or ID can be used. This does not remove images. Running containers will not be removed without the -f option ## OPTIONS @@ -17,13 +17,20 @@ Kpod rm will remove one or more containers from the host. The container name or Force the removal of a running container +**--all, a** + +Remove all containers. Can be used in conjunction with -f as well. ## EXAMPLE kpod rm mywebserver +kpod rm mywebserver myflaskserver 860a4b23 + kpod rm -f 860a4b23 +kpod rm -f -a + ## SEE ALSO kpod(1), kpod-rmi(1) diff --git a/test/kpod_rm.bats b/test/kpod_rm.bats index 73d469ca2a..3a7551ea60 100644 --- a/test/kpod_rm.bats +++ b/test/kpod_rm.bats @@ -2,60 +2,28 @@ load helpers -IMAGE="alpine:latest" - -function teardown() { - cleanup_test -} - function setup() { copy_images } @test "remove a stopped container" { - skip "Test needs to be converted to kpod run" - start_crio - run crioctl pod run --config "$TESTDATA"/sandbox_config.json - echo "$output" - [ "$status" -eq 0 ] - pod_id="$output" - run crioctl ctr create --config "$TESTDATA"/container_config.json --pod "$pod_id" + run ${KPOD_BINARY} $KPOD_OPTIONS run -d ${ALPINE} ls echo "$output" [ "$status" -eq 0 ] ctr_id="$output" - run crioctl ctr start --id "$ctr_id" - echo "$output" - [ "$status" -eq 0 ] - run crioctl ctr stop --id "$ctr_id" - echo "$output" - [ "$status" -eq 0 ] run bash -c ${KPOD_BINARY} $KPOD_OPTIONS rm "$ctr_id" echo "$output" [ "$status" -eq 0 ] - cleanup_pods - stop_crio } @test "refuse to remove a running container" { - skip "Test needs to be converted to kpod run" - start_crio - run crioctl pod run --config "$TESTDATA"/sandbox_config.json - echo "$output" - [ "$status" -eq 0 ] - pod_id="$output" - run crioctl ctr create --config "$TESTDATA"/container_redis.json --pod "$pod_id" + run ${KPOD_BINARY} $KPOD_OPTIONS run -d ${ALPINE} sleep 15 echo "$output" [ "$status" -eq 0 ] ctr_id="$output" - run crioctl ctr start --id "$ctr_id" - echo "$output" - [ "$status" -eq 0 ] - run bash -c ${KPOD_BINARY} $KPOD_OPTIONS rm "$ctr_id" + run bash ${KPOD_BINARY} $KPOD_OPTIONS rm "$ctr_id" echo "$output" [ "$status" -ne 0 ] - cleanup_ctrs - cleanup_pods - stop_crio } @test "remove a created container" { @@ -69,22 +37,33 @@ function setup() { } @test "remove a running container" { - skip "Test needs to be converted to kpod run" - start_crio - run crioctl pod run --config "$TESTDATA"/sandbox_config.json - echo "$output" - [ "$status" -eq 0 ] - pod_id="$output" - run crioctl ctr create --config "$TESTDATA"/container_redis.json --pod "$pod_id" + skip "Skipping until kpod stop is implemented" + run ${KPOD_BINARY} $KPOD_OPTIONS run -d ${ALPINE} sleep 15 echo "$output" [ "$status" -eq 0 ] ctr_id="$output" - run crioctl ctr start --id "$ctr_id" - echo "$output" - [ "$status" -eq 0 ] run bash -c ${KPOD_BINARY} $KPOD_OPTIONS rm -f "$ctr_id" echo "$output" - [ "$status" -eq 0 ] - cleanup_pods - stop_crio + [ "$status" -eq 1 ] +} + +@test "remove all containers" { + ${KPOD_BINARY} ${KPOD_OPTIONS} create $BB ls + ${KPOD_BINARY} ${KPOD_OPTIONS} create $BB ls -l + ${KPOD_BINARY} ${KPOD_OPTIONS} create $BB true + ${KPOD_BINARY} ${KPOD_OPTIONS} create $BB whoami + run ${KPOD_BINARY} $KPOD_OPTIONS rm -a + echo "$output" + [ "$status" -eq 1 ] +} + +@test "remove all containers with one running" { + skip "Skipping until kpod stop is implemented" + ${KPOD_BINARY} ${KPOD_OPTIONS} create $BB ls + ${KPOD_BINARY} ${KPOD_OPTIONS} create $BB ls -l + ${KPOD_BINARY} ${KPOD_OPTIONS} create $BB whoami + ${KPOD_BINARY} ${KPOD_OPTIONS} run -d ${ALPINE} sleep 30 + run ${KPOD_BINARY} $KPOD_OPTIONS rm -a -f + echo "$output" + [ "$status" -eq 1 ] }