summaryrefslogtreecommitdiff
path: root/pkg/domain/infra/tunnel/containers.go
diff options
context:
space:
mode:
authorValentin Rothberg <rothberg@redhat.com>2022-01-12 15:33:00 +0100
committerValentin Rothberg <rothberg@redhat.com>2022-01-13 17:08:31 +0100
commita4cef543504600db95453aa863b97ed82c833d41 (patch)
treea48d511c9a677f3a2b1f5f84769910baea53f6fe /pkg/domain/infra/tunnel/containers.go
parentab7228b3c27719e447de4dffe9b3fd7f67d6f346 (diff)
downloadpodman-a4cef543504600db95453aa863b97ed82c833d41.tar.gz
podman-a4cef543504600db95453aa863b97ed82c833d41.tar.bz2
podman-a4cef543504600db95453aa863b97ed82c833d41.zip
podman container rm: remove pod
Support removing the entire pod when --depend is used on an infra container. --all now implies --depend to properly support removing all containers and not error out when hitting infra containers. Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
Diffstat (limited to 'pkg/domain/infra/tunnel/containers.go')
-rw-r--r--pkg/domain/infra/tunnel/containers.go48
1 files changed, 33 insertions, 15 deletions
diff --git a/pkg/domain/infra/tunnel/containers.go b/pkg/domain/infra/tunnel/containers.go
index 4f72eab96..ae689f1f7 100644
--- a/pkg/domain/infra/tunnel/containers.go
+++ b/pkg/domain/infra/tunnel/containers.go
@@ -188,35 +188,53 @@ func (ic *ContainerEngine) ContainerRm(ctx context.Context, namesOrIds []string,
if opts.Timeout != nil {
options = options.WithTimeout(*opts.Timeout)
}
+
+ toRemove := []string{}
+ alreadyRemoved := make(map[string]bool) // Avoids trying to remove already removed containers
if opts.All {
- ctrs, err := getContainersByContext(ic.ClientCtx, opts.All, opts.Ignore, namesOrIds)
+ ctrs, err := getContainersByContext(ic.ClientCtx, opts.All, opts.Ignore, nil)
if err != nil {
return nil, err
}
- rmReports := make([]*reports.RmReport, 0, len(ctrs))
for _, c := range ctrs {
- report, err := containers.Remove(ic.ClientCtx, c.ID, options)
+ toRemove = append(toRemove, c.ID)
+ }
+ } else {
+ for _, ctr := range namesOrIds {
+ // NOTE that we set ignore=true here to support
+ // removing external containers (e.g., Buildah
+ // containers). If we don't find the container,
+ // we'll use the raw input provided by the user
+ // instead of the ID. Since this can only happen
+ // with external containers, it poses no threat
+ // to the `alreadyRemoved` checks below.
+ ctrs, err := getContainersByContext(ic.ClientCtx, false, true, []string{ctr})
if err != nil {
- return rmReports, err
+ return nil, err
}
- rmReports = append(rmReports, report...)
+ id := ctr
+ if len(ctrs) == 1 {
+ id = ctrs[0].ID
+ }
+ toRemove = append(toRemove, id)
}
- return rmReports, nil
}
- rmReports := make([]*reports.RmReport, 0, len(namesOrIds))
- for _, name := range namesOrIds {
- report, err := containers.Remove(ic.ClientCtx, name, options)
+ rmReports := make([]*reports.RmReport, 0, len(toRemove))
+ for _, nameOrID := range toRemove {
+ if alreadyRemoved[nameOrID] {
+ continue
+ }
+ newReports, err := containers.Remove(ic.ClientCtx, nameOrID, options)
if err != nil {
- rmReports = append(rmReports, &reports.RmReport{
- Id: name,
- Err: err,
- })
+ rmReports = append(rmReports, &reports.RmReport{Id: nameOrID, Err: err})
continue
}
- rmReports = append(rmReports, report...)
+ for i := range newReports {
+ alreadyRemoved[newReports[i].Id] = true
+ rmReports = append(rmReports, newReports[i])
+ }
}
-
return rmReports, nil
}