Merge pull request #7968 from xordspar0/oci-runtime-error

Print the correct underlying cause for OCI errors
This commit is contained in:
OpenShift Merge Robot 2020-10-09 15:24:58 -04:00 committed by GitHub
commit cec240375d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 52 additions and 1 deletions

View file

@ -11,6 +11,7 @@ import (
"github.com/containers/common/pkg/config"
"github.com/containers/podman/v2/cmd/podman/registry"
"github.com/containers/podman/v2/cmd/podman/validate"
"github.com/containers/podman/v2/libpod/define"
"github.com/containers/podman/v2/pkg/domain/entities"
"github.com/containers/podman/v2/pkg/parallel"
"github.com/containers/podman/v2/pkg/rootless"
@ -84,7 +85,7 @@ func init() {
func Execute() {
if err := rootCmd.ExecuteContext(registry.GetContextWithOptions()); err != nil {
fmt.Fprintln(os.Stderr, "Error:", err.Error())
fmt.Fprintln(os.Stderr, formatError(err))
} else if registry.GetExitCode() == registry.ExecErrorCodeGeneric {
// The exitCode modified from registry.ExecErrorCodeGeneric,
// indicates an application
@ -331,3 +332,19 @@ func resolveDestination() (string, string, string) {
}
return cfg.Engine.ActiveService, uri, ident
}
func formatError(err error) string {
var message string
if errors.Cause(err) == define.ErrOCIRuntime {
// OCIRuntimeErrors include the reason for the failure in the
// second to last message in the error chain.
message = fmt.Sprintf(
"Error: %s: %s",
define.ErrOCIRuntime.Error(),
strings.TrimSuffix(err.Error(), ": "+define.ErrOCIRuntime.Error()),
)
} else {
message = "Error: " + err.Error()
}
return message
}

34
cmd/podman/root_test.go Normal file
View file

@ -0,0 +1,34 @@
package main
import (
"fmt"
"strings"
"testing"
"github.com/containers/podman/v2/libpod/define"
"github.com/pkg/errors"
)
func TestFormatError(t *testing.T) {
err := errors.New("unknown error")
output := formatError(err)
expected := fmt.Sprintf("Error: %v", err)
if output != expected {
t.Errorf("Expected \"%s\" to equal \"%s\"", output, err.Error())
}
}
func TestFormatOCIError(t *testing.T) {
expectedPrefix := "Error: "
expectedSuffix := "OCI runtime output"
err := errors.Wrap(define.ErrOCIRuntime, expectedSuffix)
output := formatError(err)
if !strings.HasPrefix(output, expectedPrefix) {
t.Errorf("Expected \"%s\" to start with \"%s\"", output, expectedPrefix)
}
if !strings.HasSuffix(output, expectedSuffix) {
t.Errorf("Expected \"%s\" to end with \"%s\"", output, expectedSuffix)
}
}