image/store: Use errdefs for errors

Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
(cherry picked from commit e214503789)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
Paweł Gronowski 2022-12-06 12:27:39 +01:00 committed by Sebastiaan van Stijn
parent c0c146fc82
commit ffa2c0b517
No known key found for this signature in database
GPG key ID: 76698F39D527CE8C
2 changed files with 27 additions and 12 deletions

View file

@ -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?
}

View file

@ -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()