瀏覽代碼

image/store: Use errdefs for errors

Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
Paweł Gronowski 2 年之前
父節點
當前提交
e214503789
共有 2 個文件被更改,包括 27 次插入12 次删除
  1. 12 11
      image/store.go
  2. 15 1
      image/store_test.go

+ 12 - 11
image/store.go

@@ -5,6 +5,7 @@ import (
 	"sync"
 	"sync"
 	"time"
 	"time"
 
 
+	"github.com/docker/docker/errdefs"
 	"github.com/docker/docker/layer"
 	"github.com/docker/docker/layer"
 	"github.com/docker/docker/pkg/system"
 	"github.com/docker/docker/pkg/system"
 	"github.com/opencontainers/go-digest"
 	"github.com/opencontainers/go-digest"
@@ -137,12 +138,12 @@ func (is *store) Create(config []byte) (ID, error) {
 		}
 		}
 	}
 	}
 	if layerCounter > len(img.RootFS.DiffIDs) {
 	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)
 	dgst, err := is.fs.Set(config)
 	if err != nil {
 	if err != nil {
-		return "", err
+		return "", errdefs.InvalidParameter(err)
 	}
 	}
 	imageID := IDFromDigest(dgst)
 	imageID := IDFromDigest(dgst)
 
 
@@ -158,11 +159,11 @@ func (is *store) Create(config []byte) (ID, error) {
 	var l layer.Layer
 	var l layer.Layer
 	if layerID != "" {
 	if layerID != "" {
 		if !system.IsOSSupported(img.OperatingSystem()) {
 		if !system.IsOSSupported(img.OperatingSystem()) {
-			return "", system.ErrNotSupportedOperatingSystem
+			return "", errdefs.InvalidParameter(system.ErrNotSupportedOperatingSystem)
 		}
 		}
 		l, err = is.lss.Get(layerID)
 		l, err = is.lss.Get(layerID)
 		if err != nil {
 		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
 	is.images[imageID] = imageMeta
 	if err := is.digestSet.Add(imageID.Digest()); err != nil {
 	if err := is.digestSet.Add(imageID.Digest()); err != nil {
 		delete(is.images, imageID)
 		delete(is.images, imageID)
-		return "", err
+		return "", errdefs.InvalidParameter(err)
 	}
 	}
 
 
 	return imageID, nil
 	return imageID, nil
@@ -204,12 +205,12 @@ func (is *store) Get(id ID) (*Image, error) {
 	// todo: Detect manual insertions and start using them
 	// todo: Detect manual insertions and start using them
 	config, err := is.fs.Get(id.Digest())
 	config, err := is.fs.Get(id.Digest())
 	if err != nil {
 	if err != nil {
-		return nil, err
+		return nil, errdefs.NotFound(err)
 	}
 	}
 
 
 	img, err := NewFromJSON(config)
 	img, err := NewFromJSON(config)
 	if err != nil {
 	if err != nil {
-		return nil, err
+		return nil, errdefs.InvalidParameter(err)
 	}
 	}
 	img.computedID = id
 	img.computedID = id
 
 
@@ -227,11 +228,11 @@ func (is *store) Delete(id ID) ([]layer.Metadata, error) {
 
 
 	imageMeta := is.images[id]
 	imageMeta := is.images[id]
 	if imageMeta == nil {
 	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)
 	_, err := is.Get(id)
 	if err != nil {
 	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 {
 	for id := range imageMeta.children {
 		is.fs.DeleteMetadata(id.Digest(), "parent")
 		is.fs.DeleteMetadata(id.Digest(), "parent")
@@ -257,7 +258,7 @@ func (is *store) SetParent(id, parent ID) error {
 	defer is.Unlock()
 	defer is.Unlock()
 	parentMeta := is.images[parent]
 	parentMeta := is.images[parent]
 	if parentMeta == nil {
 	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 {
 	if parent, err := is.GetParent(id); err == nil && is.images[parent] != nil {
 		delete(is.images[parent].children, id)
 		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) {
 func (is *store) GetParent(id ID) (ID, error) {
 	d, err := is.fs.GetMetadata(id.Digest(), "parent")
 	d, err := is.fs.GetMetadata(id.Digest(), "parent")
 	if err != nil {
 	if err != nil {
-		return "", err
+		return "", errdefs.NotFound(err)
 	}
 	}
 	return ID(d), nil // todo: validate?
 	return ID(d), nil // todo: validate?
 }
 }

+ 15 - 1
image/store_test.go

@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"fmt"
 	"testing"
 	"testing"
 
 
+	"github.com/docker/docker/errdefs"
 	"github.com/docker/docker/layer"
 	"github.com/docker/docker/layer"
 	"gotest.tools/v3/assert"
 	"gotest.tools/v3/assert"
 	is "gotest.tools/v3/assert/cmp"
 	is "gotest.tools/v3/assert/cmp"
@@ -49,6 +50,7 @@ func TestRestore(t *testing.T) {
 	assert.Check(t, is.Equal("def", img2.Comment))
 	assert.Check(t, is.Equal("def", img2.Comment))
 
 
 	_, err = imgStore.GetParent(ID(id1))
 	_, err = imgStore.GetParent(ID(id1))
+	assert.Check(t, is.ErrorType(err, errdefs.IsNotFound))
 	assert.ErrorContains(t, err, "failed to read metadata")
 	assert.ErrorContains(t, err, "failed to read metadata")
 
 
 	p, err := imgStore.GetParent(ID(id2))
 	p, err := imgStore.GetParent(ID(id2))
@@ -70,7 +72,8 @@ func TestRestore(t *testing.T) {
 
 
 	invalidPattern := id1.Encoded()[1:6]
 	invalidPattern := id1.Encoded()[1:6]
 	_, err = imgStore.Search(invalidPattern)
 	_, 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) {
 func TestAddDelete(t *testing.T) {
@@ -99,12 +102,14 @@ func TestAddDelete(t *testing.T) {
 	assert.NilError(t, err)
 	assert.NilError(t, err)
 
 
 	_, err = imgStore.Get(id1)
 	_, err = imgStore.Get(id1)
+	assert.Check(t, is.ErrorType(err, errdefs.IsNotFound))
 	assert.ErrorContains(t, err, "failed to get digest")
 	assert.ErrorContains(t, err, "failed to get digest")
 
 
 	_, err = imgStore.Get(id2)
 	_, err = imgStore.Get(id2)
 	assert.NilError(t, err)
 	assert.NilError(t, err)
 
 
 	_, err = imgStore.GetParent(id2)
 	_, err = imgStore.GetParent(id2)
+	assert.Check(t, is.ErrorType(err, errdefs.IsNotFound))
 	assert.ErrorContains(t, err, "failed to read metadata")
 	assert.ErrorContains(t, err, "failed to read metadata")
 }
 }
 
 
@@ -123,9 +128,18 @@ func TestSearchAfterDelete(t *testing.T) {
 	assert.NilError(t, err)
 	assert.NilError(t, err)
 
 
 	_, err = imgStore.Search(string(id)[:15])
 	_, err = imgStore.Search(string(id)[:15])
+	assert.Check(t, is.ErrorType(err, errdefs.IsNotFound))
 	assert.ErrorContains(t, err, "No such image")
 	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) {
 func TestParentReset(t *testing.T) {
 	imgStore, cleanup := defaultImageStore(t)
 	imgStore, cleanup := defaultImageStore(t)
 	defer cleanup()
 	defer cleanup()