diff --git a/api/types/jsonstream/json_error.go b/api/types/jsonstream/json_error.go new file mode 100644 index 0000000000..632b25fdf4 --- /dev/null +++ b/api/types/jsonstream/json_error.go @@ -0,0 +1,12 @@ +package jsonstream + +// Error wraps a concrete Code and Message, Code is +// an integer error code, Message is the error message. +type Error struct { + Code int `json:"code,omitempty"` + Message string `json:"message,omitempty"` +} + +func (e *Error) Error() string { + return e.Message +} diff --git a/api/types/jsonstream/json_error_test.go b/api/types/jsonstream/json_error_test.go new file mode 100644 index 0000000000..5f62df2741 --- /dev/null +++ b/api/types/jsonstream/json_error_test.go @@ -0,0 +1,13 @@ +package jsonstream + +import ( + "testing" + + "gotest.tools/v3/assert" + is "gotest.tools/v3/assert/cmp" +) + +func TestError(t *testing.T) { + je := Error{404, "Not found"} + assert.Assert(t, is.Error(&je, "Not found")) +} diff --git a/daemon/builder/dockerfile/dispatchers.go b/daemon/builder/dockerfile/dispatchers.go index 0581bfc0a2..9858e880ff 100644 --- a/daemon/builder/dockerfile/dispatchers.go +++ b/daemon/builder/dockerfile/dispatchers.go @@ -19,11 +19,11 @@ import ( "github.com/docker/docker/daemon/builder" "github.com/docker/docker/daemon/internal/image" "github.com/docker/docker/errdefs" - "github.com/docker/docker/pkg/jsonmessage" "github.com/docker/go-connections/nat" "github.com/moby/buildkit/frontend/dockerfile/instructions" "github.com/moby/buildkit/frontend/dockerfile/parser" "github.com/moby/buildkit/frontend/dockerfile/shell" + "github.com/moby/moby/api/types/jsonstream" "github.com/moby/sys/signal" ocispec "github.com/opencontainers/image-spec/specs-go/v1" "github.com/pkg/errors" @@ -386,7 +386,7 @@ func dispatchRun(ctx context.Context, d dispatchRequest, c *instructions.RunComm if err.Error() != "" { msg = fmt.Sprintf("%s: %s", msg, err.Error()) } - return &jsonmessage.JSONError{ + return &jsonstream.Error{ Message: msg, Code: err.StatusCode(), } diff --git a/daemon/builder/dockerfile/internals_windows.go b/daemon/builder/dockerfile/internals_windows.go index afec1b1f9c..947e5e0a41 100644 --- a/daemon/builder/dockerfile/internals_windows.go +++ b/daemon/builder/dockerfile/internals_windows.go @@ -9,8 +9,8 @@ import ( "github.com/containerd/platforms" "github.com/docker/docker/errdefs" - "github.com/docker/docker/pkg/jsonmessage" "github.com/moby/moby/api/types/container" + "github.com/moby/moby/api/types/jsonstream" "github.com/moby/moby/api/types/mount" "github.com/moby/sys/user" "golang.org/x/sys/windows" @@ -106,7 +106,7 @@ func lookupNTAccount(ctx context.Context, builder *Builder, accountName string, if err := builder.containerManager.Run(ctx, container.ID, stdout, stderr); err != nil { if err, ok := err.(*statusCodeError); ok { - return identity{}, &jsonmessage.JSONError{ + return identity{}, &jsonstream.Error{ Message: stderr.String(), Code: err.StatusCode(), } diff --git a/pkg/jsonmessage/jsonmessage.go b/pkg/jsonmessage/jsonmessage.go index abf82406c6..5b09d9ba72 100644 --- a/pkg/jsonmessage/jsonmessage.go +++ b/pkg/jsonmessage/jsonmessage.go @@ -8,6 +8,7 @@ import ( "time" "github.com/docker/go-units" + "github.com/moby/moby/api/types/jsonstream" "github.com/moby/term" ) @@ -15,17 +16,6 @@ import ( // ensure the formatted time isalways the same number of characters. const RFC3339NanoFixed = "2006-01-02T15:04:05.000000000Z07:00" -// JSONError wraps a concrete Code and Message, Code is -// an integer error code, Message is the error message. -type JSONError struct { - Code int `json:"code,omitempty"` - Message string `json:"message,omitempty"` -} - -func (e *JSONError) Error() string { - return e.Message -} - // JSONProgress describes a progress message in a JSON stream. type JSONProgress struct { // Current is the current status and value of the progress made towards Total. @@ -148,12 +138,12 @@ type JSONMessage struct { // ProgressMessage is a pre-formatted presentation of [Progress]. // // Deprecated: this field is deprecated since docker v0.7.1 / API v1.8. Use the information in [Progress] instead. This field will be omitted in a future release. - ProgressMessage string `json:"progress,omitempty"` - ID string `json:"id,omitempty"` - From string `json:"from,omitempty"` - Time int64 `json:"time,omitempty"` - TimeNano int64 `json:"timeNano,omitempty"` - Error *JSONError `json:"errorDetail,omitempty"` + ProgressMessage string `json:"progress,omitempty"` + ID string `json:"id,omitempty"` + From string `json:"from,omitempty"` + Time int64 `json:"time,omitempty"` + TimeNano int64 `json:"timeNano,omitempty"` + Error *jsonstream.Error `json:"errorDetail,omitempty"` // ErrorMessage contains errors encountered during the operation. // diff --git a/pkg/jsonmessage/jsonmessage_test.go b/pkg/jsonmessage/jsonmessage_test.go index b61d0f4a68..70fde7d52f 100644 --- a/pkg/jsonmessage/jsonmessage_test.go +++ b/pkg/jsonmessage/jsonmessage_test.go @@ -7,16 +7,12 @@ import ( "testing" "time" + "github.com/moby/moby/api/types/jsonstream" "github.com/moby/term" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" ) -func TestError(t *testing.T) { - je := JSONError{404, "Not found"} - assert.Assert(t, is.Error(&je, "Not found")) -} - func TestProgressString(t *testing.T) { type expected struct { short string @@ -207,14 +203,14 @@ func TestJSONMessageDisplay(t *testing.T) { // Test JSONMessage with an Error. It will return an error with the text as error, not the meaning of the HTTP code. func TestJSONMessageDisplayWithJSONError(t *testing.T) { data := bytes.NewBuffer([]byte{}) - jsonMessage := JSONMessage{Error: &JSONError{404, "Can't find it"}} + jsonMessage := JSONMessage{Error: &jsonstream.Error{Code: 404, Message: "Can't find it"}} err := jsonMessage.Display(data, true) if err == nil || err.Error() != "Can't find it" { - t.Fatalf("Expected a JSONError 404, got %q", err) + t.Fatalf("Expected a jsonstream.Error 404, got %q", err) } - jsonMessage = JSONMessage{Error: &JSONError{401, "Anything"}} + jsonMessage = JSONMessage{Error: &jsonstream.Error{Code: 401, Message: "Anything"}} err = jsonMessage.Display(data, true) assert.Check(t, is.Error(err, "Anything")) } diff --git a/pkg/streamformatter/streamformatter.go b/pkg/streamformatter/streamformatter.go index 24e1b45f27..dc30728430 100644 --- a/pkg/streamformatter/streamformatter.go +++ b/pkg/streamformatter/streamformatter.go @@ -9,6 +9,7 @@ import ( "github.com/docker/docker/pkg/jsonmessage" "github.com/docker/docker/pkg/progress" + "github.com/moby/moby/api/types/jsonstream" ) const streamNewline = "\r\n" @@ -31,9 +32,9 @@ func FormatStatus(id, format string, a ...interface{}) []byte { // FormatError formats the error as a JSON object func FormatError(err error) []byte { - jsonError, ok := err.(*jsonmessage.JSONError) + jsonError, ok := err.(*jsonstream.Error) if !ok { - jsonError = &jsonmessage.JSONError{Message: err.Error()} + jsonError = &jsonstream.Error{Message: err.Error()} } if b, err := json.Marshal(&jsonmessage.JSONMessage{Error: jsonError, ErrorMessage: err.Error()}); err == nil { return appendNewline(b) diff --git a/pkg/streamformatter/streamformatter_test.go b/pkg/streamformatter/streamformatter_test.go index dc0311c12c..e97bacf791 100644 --- a/pkg/streamformatter/streamformatter_test.go +++ b/pkg/streamformatter/streamformatter_test.go @@ -10,6 +10,7 @@ import ( "github.com/docker/docker/pkg/jsonmessage" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" + "github.com/moby/moby/api/types/jsonstream" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" ) @@ -47,7 +48,7 @@ func TestFormatError(t *testing.T) { } func TestFormatJSONError(t *testing.T) { - err := &jsonmessage.JSONError{Code: 50, Message: "Json error"} + err := &jsonstream.Error{Code: 50, Message: "Json error"} res := FormatError(err) expected := `{"errorDetail":{"code":50,"message":"Json error"},"error":"Json error"}` + streamNewline assert.Check(t, is.Equal(expected, string(res))) diff --git a/vendor/github.com/moby/moby/api/types/jsonstream/json_error.go b/vendor/github.com/moby/moby/api/types/jsonstream/json_error.go new file mode 100644 index 0000000000..632b25fdf4 --- /dev/null +++ b/vendor/github.com/moby/moby/api/types/jsonstream/json_error.go @@ -0,0 +1,12 @@ +package jsonstream + +// Error wraps a concrete Code and Message, Code is +// an integer error code, Message is the error message. +type Error struct { + Code int `json:"code,omitempty"` + Message string `json:"message,omitempty"` +} + +func (e *Error) Error() string { + return e.Message +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 161a005442..c7564faa88 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -950,6 +950,7 @@ github.com/moby/moby/api/types/container github.com/moby/moby/api/types/events github.com/moby/moby/api/types/filters github.com/moby/moby/api/types/image +github.com/moby/moby/api/types/jsonstream github.com/moby/moby/api/types/mount github.com/moby/moby/api/types/network github.com/moby/moby/api/types/registry