diff --git a/image/image.go b/image/image.go index 29de613a3e..a9db58fd65 100644 --- a/image/image.go +++ b/image/image.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "io" + "reflect" "runtime" "strings" "time" @@ -218,6 +219,16 @@ func NewHistory(author, comment, createdBy string, isEmptyLayer bool) History { } } +// Equal compares two history structs for equality +func (h History) Equal(i History) bool { + if !h.Created.Equal(i.Created) { + return false + } + i.Created = h.Created + + return reflect.DeepEqual(h, i) +} + // Exporter provides interface for loading and saving images type Exporter interface { Load(io.ReadCloser, io.Writer, bool) error diff --git a/image/image_test.go b/image/image_test.go index b174b80908..21f81c768d 100644 --- a/image/image_test.go +++ b/image/image_test.go @@ -56,6 +56,29 @@ func TestMarshalKeyOrder(t *testing.T) { } } +const sampleHistoryJSON = `{ + "created": "2021-01-13T09:35:56Z", + "created_by": "image_test.go" +}` + +func TestHistoryEqual(t *testing.T) { + h := historyFromJSON(t, sampleHistoryJSON) + hCopy := h + assert.Check(t, h.Equal(hCopy)) + + hUTC := historyFromJSON(t, `{"created": "2021-01-13T14:00:00Z"}`) + hOffset0 := historyFromJSON(t, `{"created": "2021-01-13T14:00:00+00:00"}`) + assert.Check(t, hUTC.Created != hOffset0.Created) + assert.Check(t, hUTC.Equal(hOffset0)) +} + +func historyFromJSON(t *testing.T, historyJSON string) History { + var h History + err := json.Unmarshal([]byte(historyJSON), &h) + assert.Check(t, err) + return h +} + func TestImage(t *testing.T) { cid := "50a16564e727" config := &container.Config{ diff --git a/image/tarexport/load.go b/image/tarexport/load.go index bbbb238b2b..37ac4bf082 100644 --- a/image/tarexport/load.go +++ b/image/tarexport/load.go @@ -8,7 +8,6 @@ import ( "io/ioutil" "os" "path/filepath" - "reflect" "runtime" "github.com/containerd/containerd/platforms" @@ -406,7 +405,7 @@ func checkValidParent(img, parent *image.Image) bool { return false } for i, h := range parent.History { - if !reflect.DeepEqual(h, img.History[i]) { + if !h.Equal(img.History[i]) { return false } }