isula-build/patch/0064-clean-code-tidy-FindImage-function.patch
DCCooper 36a8e66c74 isula-build:Sync patch from upstream
reason: sync patches from upstream, including
relocate export package, clean code for tests and golint

Signed-off-by: DCCooper <1866858@gmail.com>
2021-10-25 17:27:38 +08:00

237 lines
8.4 KiB
Diff

From 9b1191dafa500bc55b37912898e3ebb8e9d6ec24 Mon Sep 17 00:00:00 2001
From: xingweizheng <xingweizheng@huawei.com>
Date: Sat, 28 Aug 2021 23:27:49 +0800
Subject: [PATCH 15/20] clean code: tidy FindImage function
---
daemon/images.go | 2 +-
daemon/images_test.go | 2 +-
daemon/push_test.go | 2 +-
daemon/remove.go | 2 +-
daemon/save.go | 2 +-
daemon/save_test.go | 2 +-
exporter/docker/archive/archive.go | 4 +-
image/image.go | 67 ++++++------------------------
image/image_test.go | 2 +-
9 files changed, 21 insertions(+), 64 deletions(-)
diff --git a/daemon/images.go b/daemon/images.go
index e61817cc..baeb375c 100644
--- a/daemon/images.go
+++ b/daemon/images.go
@@ -70,7 +70,7 @@ func listOneImage(opts listOptions) (*pb.ListResponse, error) {
_, image, err := image.FindImage(opts.localStore, opts.imageName)
if err != nil {
opts.logEntry.Error(err)
- return nil, errors.Wrapf(err, "find local image %v error", opts.imageName)
+ return nil, errors.Wrapf(err, "find local image %q failed", opts.imageName)
}
result := make([]*pb.ListResponse_ImageInfo, 0, len(image.Names))
diff --git a/daemon/images_test.go b/daemon/images_test.go
index a970ce0b..efbf6f14 100644
--- a/daemon/images_test.go
+++ b/daemon/images_test.go
@@ -96,7 +96,7 @@ func TestList(t *testing.T) {
ImageName: "coffee:costa",
},
wantErr: true,
- errString: "failed to parse image",
+ errString: "not found in local store",
},
{
name: "abnormal case no repository",
diff --git a/daemon/push_test.go b/daemon/push_test.go
index f4a9e2b1..7358d0cd 100644
--- a/daemon/push_test.go
+++ b/daemon/push_test.go
@@ -69,7 +69,7 @@ func TestPush(t *testing.T) {
Format: "docker",
},
wantErr: true,
- errString: "failed to parse image",
+ errString: "not found in local store",
},
{
name: "manifestNotExist",
diff --git a/daemon/remove.go b/daemon/remove.go
index 89e68cfc..d4e0bbd9 100644
--- a/daemon/remove.go
+++ b/daemon/remove.go
@@ -49,7 +49,7 @@ func (b *Backend) Remove(req *pb.RemoveRequest, stream pb.Control_RemoveServer)
}
for _, imageID := range rmImageIDs {
- _, img, err := image.FindImageLocally(s, imageID)
+ _, img, err := image.FindImage(s, imageID)
if err != nil {
rmFailed = true
errMsg := fmt.Sprintf("Find local image %q failed: %v", imageID, err)
diff --git a/daemon/save.go b/daemon/save.go
index 7ad12851..1a2d3fed 100644
--- a/daemon/save.go
+++ b/daemon/save.go
@@ -186,7 +186,7 @@ func filterImageName(opts *saveOptions) error {
}
visitedImage[imageName] = true
- _, img, err := image.FindImageLocally(opts.localStore, imageName)
+ _, img, err := image.FindImage(opts.localStore, imageName)
if err != nil {
return errors.Wrapf(err, "filter image name failed when finding image name %q", imageName)
}
diff --git a/daemon/save_test.go b/daemon/save_test.go
index a59086a8..c1b37342 100644
--- a/daemon/save_test.go
+++ b/daemon/save_test.go
@@ -129,7 +129,7 @@ func TestSave(t *testing.T) {
Format: "docker",
},
wantErr: true,
- errString: "failed to parse image",
+ errString: "not found in local store",
},
{
name: "abnormal case wrong image format",
diff --git a/exporter/docker/archive/archive.go b/exporter/docker/archive/archive.go
index cc6b8721..36a28811 100644
--- a/exporter/docker/archive/archive.go
+++ b/exporter/docker/archive/archive.go
@@ -60,7 +60,7 @@ func (d *dockerArchiveExporter) Init(opts exporter.ExportOptions, src, destSpec
// destSpec could be "file:name:tag" or "file:name" or just "file" with transport "docker-archive", such as docker-archive:output.tar:name:tag
// When more than two parts, build must be called
if parts := strings.Split(destSpec, ":"); len(parts) > partsNum {
- srcReference, _, err = image.FindImageLocally(localStore, src)
+ srcReference, _, err = image.FindImage(localStore, src)
if err != nil {
return errors.Wrapf(err, "find src image: %q failed with transport %q", src, d.Name())
}
@@ -89,7 +89,7 @@ func (d *dockerArchiveExporter) Init(opts exporter.ExportOptions, src, destSpec
DockerArchiveExporter.InitArchiveWriter(opts.ExportID, archWriter)
}
- srcReference, _, err = image.FindImageLocally(localStore, src)
+ srcReference, _, err = image.FindImage(localStore, src)
if err != nil {
return errors.Wrapf(err, "find src image: %q failed with transport %q", src, d.Name())
}
diff --git a/image/image.go b/image/image.go
index 5ae7245e..4a1ca881 100644
--- a/image/image.go
+++ b/image/image.go
@@ -468,71 +468,29 @@ func ResolveImageName(s string, resolveArg func(string) string) (string, error)
return newStr, nil
}
-// FindImage get the image from storage by image describe
+// FindImage get the image from local storage by image describe
func FindImage(store *store.Store, image string) (types.ImageReference, *storage.Image, error) {
- names, _, err := ResolveName(image, nil, store)
- if err != nil {
- return nil, nil, errors.Wrapf(err, "error parsing name %q", image)
- }
-
- ref, img, err := ParseImagesToReference(store, names)
- if err != nil {
- return nil, nil, errors.Wrapf(err, "locating image %q failed", image)
- }
- return ref, img, nil
-}
-
-// FindImageLocally get the image from local storage by image describe
-func FindImageLocally(store *store.Store, image string) (types.ImageReference, *storage.Image, error) {
// 1. check name valid
- if image == "" {
- return nil, nil, errors.Errorf("image name %q cannot be empty string", image)
+ if _, err := reference.Parse(image); err != nil {
+ return nil, nil, errors.Wrapf(err, "parse image %q failed", image)
}
// 2. try to find image with name or id in local store
localName := tryResolveNameInStore(image, store)
if localName == "" {
- return nil, nil, errors.Errorf("no image %q in local store", image)
+ return nil, nil, errors.Errorf("image %q not found in local store", image)
}
- // 3. parse to image reference
- ref, img, err := ParseImagesToReference(store, []string{localName})
+ // 3. get image reference and storage.Image
+ ref, err := is.Transport.ParseStoreReference(store, localName)
if err != nil {
- return nil, nil, errors.Wrapf(err, "locating image %q locally failed", image)
- }
- return ref, img, nil
-}
-
-// ParseImagesToReference get the image reference in store
-func ParseImagesToReference(store *store.Store, names []string) (types.ImageReference, *storage.Image, error) {
- var (
- ref types.ImageReference
- img *storage.Image
- err error
- )
- for _, name := range names {
- ref, err = is.Transport.ParseStoreReference(store, name)
- if err != nil {
- logrus.Debugf("Error parsing reference to image %q: %v", name, err)
- continue
- }
-
- var gErr error
- img, gErr = is.Transport.GetStoreImage(store, ref)
- // When name is the format of name[:rag] with out registry domain, err is storage.ErrImageUnknown
- if gErr != nil {
- img2, err2 := store.Image(name)
- if err2 != nil {
- logrus.Debugf("Error locating image %q: %v", name, err2)
- continue
- }
- img = img2
- }
- break
+ return nil, nil, errors.Wrapf(err, "error parsing reference to image %q", localName)
}
- if ref == nil || img == nil || err != nil {
- return nil, nil, errors.Errorf("failed to parse image %v in local store", names)
+ img, err := is.Transport.GetStoreImage(store, ref)
+ if err != nil {
+ return nil, nil, errors.Wrapf(err, "failed to parse image %q in local store", localName)
}
+
return ref, img, nil
}
@@ -572,14 +530,13 @@ func ResolveName(name string, sc *types.SystemContext, store *store.Store) ([]st
}
func tryResolveNameInStore(name string, store *store.Store) string {
- defaultTag := "latest"
-
logrus.Infof("Try to find image: %s in local storage", name)
img, err := store.Image(name)
if err == nil {
return img.ID
}
+ defaultTag := "latest"
logrus.Infof("Try to find image: %s:%s in local storage", name, defaultTag)
img, err = store.Image(fmt.Sprintf("%s:%s", name, defaultTag))
if err != nil {
diff --git a/image/image_test.go b/image/image_test.go
index c698b4d8..43d936f5 100644
--- a/image/image_test.go
+++ b/image/image_test.go
@@ -51,7 +51,7 @@ func TestFindImageWhenImageNameIsEmpty(t *testing.T) {
src := ""
srcReference, _, err := FindImage(&localStore, src)
- assert.ErrorContains(t, err, "locating image")
+ assert.ErrorContains(t, err, "repository name must have at least one component")
assert.Assert(t, cmp.Nil(srcReference))
}
--
2.31.1