improve localResolve

Signed-off-by: yanxuean <yan.xuean@zte.com.cn>
This commit is contained in:
yanxuean 2017-11-21 19:30:18 +08:00
parent cbe7f0dd5a
commit b4ebf2d7a7

View File

@ -28,7 +28,6 @@ import (
"github.com/containerd/cgroups" "github.com/containerd/cgroups"
"github.com/containerd/containerd" "github.com/containerd/containerd"
"github.com/containerd/containerd/content" "github.com/containerd/containerd/content"
"github.com/containerd/containerd/errdefs"
"github.com/docker/distribution/reference" "github.com/docker/distribution/reference"
imagedigest "github.com/opencontainers/go-digest" imagedigest "github.com/opencontainers/go-digest"
"github.com/opencontainers/image-spec/identity" "github.com/opencontainers/image-spec/identity"
@ -205,34 +204,41 @@ func getRepoDigestAndTag(namedRef reference.Named, digest imagedigest.Digest, sc
// localResolve resolves image reference locally and returns corresponding image metadata. It returns // localResolve resolves image reference locally and returns corresponding image metadata. It returns
// nil without error if the reference doesn't exist. // nil without error if the reference doesn't exist.
func (c *criContainerdService) localResolve(ctx context.Context, ref string) (*imagestore.Image, error) { func (c *criContainerdService) localResolve(ctx context.Context, refOrID string) (*imagestore.Image, error) {
_, err := imagedigest.Parse(ref) getImageID := func(refOrId string) string {
if err != nil { if _, err := imagedigest.Parse(refOrID); err == nil {
// ref is not image id, try to resolve it locally. return refOrID
normalized, err := util.NormalizeImageRef(ref)
if err != nil {
return nil, fmt.Errorf("invalid image reference %q: %v", ref, err)
} }
image, err := c.client.GetImage(ctx, normalized.String())
if err != nil { return func(ref string) string {
if errdefs.IsNotFound(err) { // ref is not image id, try to resolve it locally.
return nil, nil normalized, err := util.NormalizeImageRef(ref)
if err != nil {
return ""
} }
return nil, fmt.Errorf("failed to get image from containerd: %v", err) image, err := c.client.GetImage(ctx, normalized.String())
} if err != nil {
desc, err := image.Config(ctx) return ""
if err != nil { }
return nil, fmt.Errorf("failed to get image config descriptor: %v", err) desc, err := image.Config(ctx)
} if err != nil {
ref = desc.Digest.String() return ""
}
return desc.Digest.String()
}(refOrID)
}
imageID := getImageID(refOrID)
if imageID == "" {
// Try to treat ref as imageID
imageID = refOrID
} }
imageID := ref
image, err := c.imageStore.Get(imageID) image, err := c.imageStore.Get(imageID)
if err != nil { if err != nil {
if err == store.ErrNotExist { if err == store.ErrNotExist {
return nil, nil return nil, nil
} }
return nil, fmt.Errorf("failed to get image %q metadata: %v", imageID, err) return nil, fmt.Errorf("failed to get image %q : %v", imageID, err)
} }
return &image, nil return &image, nil
} }