mirror of
https://github.com/containers/podman.git
synced 2026-04-03 14:35:18 -04:00
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>
66 lines
1.4 KiB
Go
66 lines
1.4 KiB
Go
// +build remoteclient
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"syscall"
|
|
|
|
"github.com/containers/libpod/cmd/podman/varlink"
|
|
"github.com/containers/libpod/libpod/define"
|
|
"github.com/pkg/errors"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
func outputError(err error) {
|
|
if MainGlobalOpts.LogLevel == "debug" {
|
|
logrus.Errorf(err.Error())
|
|
} else {
|
|
if ee, ok := err.(*exec.ExitError); ok {
|
|
if status, ok := ee.Sys().(syscall.WaitStatus); ok {
|
|
exitCode = status.ExitStatus()
|
|
}
|
|
}
|
|
var ne error
|
|
switch e := err.(type) {
|
|
// For some reason golang wont let me list them with commas so listing them all.
|
|
case *iopodman.ImageNotFound:
|
|
ne = errors.New(e.Reason)
|
|
case *iopodman.ContainerNotFound:
|
|
ne = errors.New(e.Reason)
|
|
case *iopodman.PodNotFound:
|
|
ne = errors.New(e.Reason)
|
|
case *iopodman.VolumeNotFound:
|
|
ne = errors.New(e.Reason)
|
|
case *iopodman.InvalidState:
|
|
ne = errors.New(e.Reason)
|
|
case *iopodman.ErrorOccurred:
|
|
ne = errors.New(e.Reason)
|
|
default:
|
|
ne = err
|
|
}
|
|
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
|
|
}
|