diff --git a/image/store.go b/image/store.go index d0d4d5a3e2..291150c607 100644 --- a/image/store.go +++ b/image/store.go @@ -5,6 +5,7 @@ import ( "sync" "time" + "github.com/docker/docker/errdefs" "github.com/docker/docker/layer" "github.com/docker/docker/pkg/system" "github.com/opencontainers/go-digest" @@ -137,12 +138,12 @@ func (is *store) Create(config []byte) (ID, error) { } } if layerCounter > len(img.RootFS.DiffIDs) { - return "", errors.New("too many non-empty layers in History section") + return "", errdefs.InvalidParameter(errors.New("too many non-empty layers in History section")) } dgst, err := is.fs.Set(config) if err != nil { - return "", err + return "", errdefs.InvalidParameter(err) } imageID := IDFromDigest(dgst) @@ -158,11 +159,11 @@ func (is *store) Create(config []byte) (ID, error) { var l layer.Layer if layerID != "" { if !system.IsOSSupported(img.OperatingSystem()) { - return "", system.ErrNotSupportedOperatingSystem + return "", errdefs.InvalidParameter(system.ErrNotSupportedOperatingSystem) } l, err = is.lss.Get(layerID) if err != nil { - return "", errors.Wrapf(err, "failed to get layer %s", layerID) + return "", errdefs.InvalidParameter(errors.Wrapf(err, "failed to get layer %s", layerID)) } } @@ -174,7 +175,7 @@ func (is *store) Create(config []byte) (ID, error) { is.images[imageID] = imageMeta if err := is.digestSet.Add(imageID.Digest()); err != nil { delete(is.images, imageID) - return "", err + return "", errdefs.InvalidParameter(err) } return imageID, nil @@ -204,12 +205,12 @@ func (is *store) Get(id ID) (*Image, error) { // todo: Detect manual insertions and start using them config, err := is.fs.Get(id.Digest()) if err != nil { - return nil, err + return nil, errdefs.NotFound(err) } img, err := NewFromJSON(config) if err != nil { - return nil, err + return nil, errdefs.InvalidParameter(err) } img.computedID = id @@ -227,11 +228,11 @@ func (is *store) Delete(id ID) ([]layer.Metadata, error) { imageMeta := is.images[id] if imageMeta == nil { - return nil, fmt.Errorf("unrecognized image ID %s", id.String()) + return nil, errdefs.NotFound(fmt.Errorf("unrecognized image ID %s", id.String())) } _, err := is.Get(id) if err != nil { - return nil, fmt.Errorf("unrecognized image %s, %v", id.String(), err) + return nil, errdefs.NotFound(fmt.Errorf("unrecognized image %s, %v", id.String(), err)) } for id := range imageMeta.children { is.fs.DeleteMetadata(id.Digest(), "parent") @@ -257,7 +258,7 @@ func (is *store) SetParent(id, parent ID) error { defer is.Unlock() parentMeta := is.images[parent] if parentMeta == nil { - return fmt.Errorf("unknown parent image ID %s", parent.String()) + return errdefs.NotFound(fmt.Errorf("unknown parent image ID %s", parent.String())) } if parent, err := is.GetParent(id); err == nil && is.images[parent] != nil { delete(is.images[parent].children, id) @@ -269,7 +270,7 @@ func (is *store) SetParent(id, parent ID) error { func (is *store) GetParent(id ID) (ID, error) { d, err := is.fs.GetMetadata(id.Digest(), "parent") if err != nil { - return "", err + return "", errdefs.NotFound(err) } return ID(d), nil // todo: validate? } diff --git a/image/store_test.go b/image/store_test.go index 22f2618475..d5a717253c 100644 --- a/image/store_test.go +++ b/image/store_test.go @@ -4,6 +4,7 @@ import ( "fmt" "testing" + "github.com/docker/docker/errdefs" "github.com/docker/docker/layer" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" @@ -49,6 +50,7 @@ func TestRestore(t *testing.T) { assert.Check(t, is.Equal("def", img2.Comment)) _, err = imgStore.GetParent(ID(id1)) + assert.Check(t, is.ErrorType(err, errdefs.IsNotFound)) assert.ErrorContains(t, err, "failed to read metadata") p, err := imgStore.GetParent(ID(id2)) @@ -70,7 +72,8 @@ func TestRestore(t *testing.T) { invalidPattern := id1.Encoded()[1:6] _, err = imgStore.Search(invalidPattern) - assert.ErrorContains(t, err, "No such image") + assert.Check(t, is.ErrorType(err, errdefs.IsNotFound)) + assert.Check(t, is.ErrorContains(err, invalidPattern)) } func TestAddDelete(t *testing.T) { @@ -99,12 +102,14 @@ func TestAddDelete(t *testing.T) { assert.NilError(t, err) _, err = imgStore.Get(id1) + assert.Check(t, is.ErrorType(err, errdefs.IsNotFound)) assert.ErrorContains(t, err, "failed to get digest") _, err = imgStore.Get(id2) assert.NilError(t, err) _, err = imgStore.GetParent(id2) + assert.Check(t, is.ErrorType(err, errdefs.IsNotFound)) assert.ErrorContains(t, err, "failed to read metadata") } @@ -123,9 +128,18 @@ func TestSearchAfterDelete(t *testing.T) { assert.NilError(t, err) _, err = imgStore.Search(string(id)[:15]) + assert.Check(t, is.ErrorType(err, errdefs.IsNotFound)) assert.ErrorContains(t, err, "No such image") } +func TestDeleteNotExisting(t *testing.T) { + imgStore, cleanup := defaultImageStore(t) + defer cleanup() + + _, err := imgStore.Delete(ID("i_dont_exists")) + assert.Check(t, is.ErrorType(err, errdefs.IsNotFound)) +} + func TestParentReset(t *testing.T) { imgStore, cleanup := defaultImageStore(t) defer cleanup()