diff options
Diffstat (limited to 'cmd/podman/rm.go')
-rw-r--r-- | cmd/podman/rm.go | 64 |
1 files changed, 26 insertions, 38 deletions
diff --git a/cmd/podman/rm.go b/cmd/podman/rm.go index f64eca6f4..c6641e879 100644 --- a/cmd/podman/rm.go +++ b/cmd/podman/rm.go @@ -2,7 +2,7 @@ package main import ( "fmt" - "os" + rt "runtime" "github.com/containers/libpod/cmd/podman/libpodruntime" "github.com/containers/libpod/libpod" @@ -45,6 +45,12 @@ Running containers will not be removed without the -f option. // saveCmd saves the image to either docker-archive or oci func rmCmd(c *cli.Context) error { + var ( + delContainers []*libpod.Container + lastError error + deleteFuncs []workerInput + ) + ctx := getContext() if err := validateFlags(c, rmFlags); err != nil { return err @@ -56,49 +62,31 @@ func rmCmd(c *cli.Context) error { } defer runtime.Shutdown(false) - args := c.Args() - if c.Bool("latest") && c.Bool("all") { - return errors.Errorf("--all and --latest cannot be used together") + if err := checkAllAndLatest(c); err != nil { + return err } - if len(args) == 0 && !c.Bool("all") && !c.Bool("latest") { - return errors.Errorf("specify one or more containers to remove") - } + delContainers, lastError = getAllOrLatestContainers(c, runtime, -1, "all") - var delContainers []*libpod.Container - var lastError error - if c.Bool("all") { - delContainers, err = runtime.GetContainers() - if err != nil { - return errors.Wrapf(err, "unable to get container list") - } - } else if c.Bool("latest") { - lastCtr, err := runtime.GetLatestContainer() - if err != nil { - return errors.Wrapf(err, "unable to get latest container") - } - delContainers = append(delContainers, lastCtr) - } 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) + for _, container := range delContainers { + f := func() error { + return runtime.RemoveContainer(ctx, container, c.Bool("force")) } + + deleteFuncs = append(deleteFuncs, workerInput{ + containerID: container.ID(), + parallelFunc: f, + }) } - for _, container := range delContainers { - err = runtime.RemoveContainer(ctx, 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()) + + deleteErrors := parallelExecuteWorkerPool(rt.NumCPU()*3, deleteFuncs) + for cid, result := range deleteErrors { + if result != nil { + fmt.Println(result.Error()) + lastError = result + continue } + fmt.Println(cid) } return lastError } |