summaryrefslogtreecommitdiff
path: root/cmd/podman
diff options
context:
space:
mode:
authorDaniel J Walsh <dwalsh@redhat.com>2019-06-15 06:24:42 -0400
committerDaniel J Walsh <dwalsh@redhat.com>2019-08-01 03:40:29 -0400
commit5370d9cb76a8075332f5ab6a0efef9fba28ba19b (patch)
tree5f537b4a2a70c140aeb6533657c301fc5e9e2b7e /cmd/podman
parenta622f8d345b1853401de2e533e9fbf14ef169fa2 (diff)
downloadpodman-5370d9cb76a8075332f5ab6a0efef9fba28ba19b.tar.gz
podman-5370d9cb76a8075332f5ab6a0efef9fba28ba19b.tar.bz2
podman-5370d9cb76a8075332f5ab6a0efef9fba28ba19b.zip
Add new exit codes to rm & rmi for running containers & dependencies
This enables programs and scripts wrapping the podman command to handle 'podman rm' and 'podman rmi' failures caused by paused or running containers or due to images having other child images or dependent containers. These errors are common enough that it makes sense to have a more machine readable way of detecting them than parsing the standard error output. Signed-off-by: Ondrej Zoder <ozoder@redhat.com> Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
Diffstat (limited to 'cmd/podman')
-rw-r--r--cmd/podman/errors.go13
-rw-r--r--cmd/podman/errors_remote.go20
-rw-r--r--cmd/podman/rm.go13
-rw-r--r--cmd/podman/rmi.go1
4 files changed, 39 insertions, 8 deletions
diff --git a/cmd/podman/errors.go b/cmd/podman/errors.go
index 9731037f4..ae9e73e62 100644
--- a/cmd/podman/errors.go
+++ b/cmd/podman/errors.go
@@ -8,6 +8,8 @@ import (
"os/exec"
"syscall"
+ "github.com/containers/libpod/libpod/define"
+ "github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
@@ -24,3 +26,14 @@ func outputError(err error) {
fmt.Fprintln(os.Stderr, "Error:", err.Error())
}
}
+
+func setExitCode(err error) int {
+ cause := errors.Cause(err)
+ switch cause {
+ case define.ErrNoSuchCtr:
+ return 1
+ case define.ErrCtrStateInvalid:
+ return 2
+ }
+ return exitCode
+}
diff --git a/cmd/podman/errors_remote.go b/cmd/podman/errors_remote.go
index 1e276be10..19df2d2d8 100644
--- a/cmd/podman/errors_remote.go
+++ b/cmd/podman/errors_remote.go
@@ -9,6 +9,7 @@ import (
"syscall"
"github.com/containers/libpod/cmd/podman/varlink"
+ "github.com/containers/libpod/libpod/define"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
)
@@ -43,3 +44,22 @@ func outputError(err error) {
fmt.Fprintln(os.Stderr, "Error:", ne.Error())
}
}
+
+func setExitCode(err error) int {
+ cause := errors.Cause(err)
+ switch e := cause.(type) {
+ // For some reason golang wont let me list them with commas so listing them all.
+ case *iopodman.ContainerNotFound:
+ return 1
+ case *iopodman.InvalidState:
+ return 2
+ default:
+ switch e {
+ case define.ErrNoSuchCtr:
+ return 1
+ case define.ErrCtrStateInvalid:
+ return 2
+ }
+ }
+ return exitCode
+}
diff --git a/cmd/podman/rm.go b/cmd/podman/rm.go
index 958ca1c60..9e3ce4d0b 100644
--- a/cmd/podman/rm.go
+++ b/cmd/podman/rm.go
@@ -4,7 +4,6 @@ import (
"fmt"
"github.com/containers/libpod/cmd/podman/cliconfig"
- "github.com/containers/libpod/libpod/define"
"github.com/containers/libpod/pkg/adapter"
"github.com/pkg/errors"
"github.com/spf13/cobra"
@@ -65,18 +64,16 @@ func rmCmd(c *cliconfig.RmValues) error {
ok, failures, err := runtime.RemoveContainers(getContext(), c)
if err != nil {
- if errors.Cause(err) == define.ErrNoSuchCtr {
- if len(c.InputArgs) > 1 {
- exitCode = 125
- } else {
- exitCode = 1
- }
+ if len(c.InputArgs) < 2 {
+ exitCode = setExitCode(err)
}
return err
}
if len(failures) > 0 {
- exitCode = 125
+ for _, err := range failures {
+ exitCode = setExitCode(err)
+ }
}
return printCmdResults(ok, failures)
diff --git a/cmd/podman/rmi.go b/cmd/podman/rmi.go
index 57e78c34a..3f621116e 100644
--- a/cmd/podman/rmi.go
+++ b/cmd/podman/rmi.go
@@ -74,6 +74,7 @@ func rmiCmd(c *cliconfig.RmiValues) error {
fmt.Printf("A container associated with containers/storage, i.e. via Buildah, CRI-O, etc., may be associated with this image: %-12.12s\n", img.ID())
}
if !adapter.IsImageNotFound(err) {
+ exitCode = 2
failureCnt++
}
if lastError != nil {