podman-remote prune containers

enable the ability to prune containers from the remote-command.  this
also includes the system prune command.

Signed-off-by: baude <bbaude@redhat.com>
This commit is contained in:
baude
2019-04-20 12:58:59 -05:00
parent 135c8bef22
commit 2e800d63aa
9 changed files with 97 additions and 48 deletions

View File

@@ -786,3 +786,51 @@ func (r *LocalRuntime) Top(cli *cliconfig.TopValues) ([]string, error) {
}
return container.Top(descriptors)
}
// Prune removes stopped containers
func (r *LocalRuntime) Prune(ctx context.Context, maxWorkers int, force bool) ([]string, map[string]error, error) {
var (
ok = []string{}
failures = map[string]error{}
err error
)
logrus.Debugf("Setting maximum rm workers to %d", maxWorkers)
filter := func(c *libpod.Container) bool {
state, err := c.State()
if err != nil {
logrus.Error(err)
return false
}
if c.PodID() != "" {
return false
}
if state == libpod.ContainerStateStopped || state == libpod.ContainerStateExited {
return true
}
return false
}
delContainers, err := r.Runtime.GetContainers(filter)
if err != nil {
return ok, failures, err
}
if len(delContainers) < 1 {
return ok, failures, err
}
pool := shared.NewPool("prune", maxWorkers, len(delContainers))
for _, c := range delContainers {
ctr := c
pool.Add(shared.Job{
ID: ctr.ID(),
Fn: func() error {
err := r.Runtime.RemoveContainer(ctx, ctr, force, false)
if err != nil {
logrus.Debugf("Failed to prune container %s: %s", ctr.ID(), err.Error())
}
return err
},
})
}
return pool.Run()
}

View File

@@ -852,3 +852,31 @@ func (r *LocalRuntime) Top(cli *cliconfig.TopValues) ([]string, error) {
}
return iopodman.Top().Call(r.Conn, ctr.ID(), descriptors)
}
// Prune removes stopped containers
func (r *LocalRuntime) Prune(ctx context.Context, maxWorkers int, force bool) ([]string, map[string]error, error) {
var (
ok = []string{}
failures = map[string]error{}
ctrs []*Container
err error
)
logrus.Debugf("Setting maximum rm workers to %d", maxWorkers)
filters := []string{libpod.ContainerStateExited.String()}
ctrs, err = r.LookupContainersWithStatus(filters)
if err != nil {
return ok, failures, err
}
for _, c := range ctrs {
c := c
_, err := iopodman.RemoveContainer().Call(r.Conn, c.ID(), false, false)
if err != nil {
failures[c.ID()] = err
} else {
ok = append(ok, c.ID())
}
}
return ok, failures, nil
}