func()

in ecr/resolver.go [146:225]


func (r *ecrResolver) Resolve(ctx context.Context, ref string) (string, ocispec.Descriptor, error) {
	ecrSpec, err := ParseRef(ref)
	if err != nil {
		return "", ocispec.Descriptor{}, err
	}

	if ecrSpec.Object == "" {
		return "", ocispec.Descriptor{}, reference.ErrObjectRequired
	}

	batchGetImageInput := &ecr.BatchGetImageInput{
		RegistryId:         aws.String(ecrSpec.Registry()),
		RepositoryName:     aws.String(ecrSpec.Repository),
		ImageIds:           []*ecr.ImageIdentifier{ecrSpec.ImageID()},
		AcceptedMediaTypes: aws.StringSlice(supportedImageMediaTypes),
	}

	client := r.getClient(ecrSpec.Region())

	batchGetImageOutput, err := client.BatchGetImageWithContext(ctx, batchGetImageInput)
	if err != nil {
		log.G(ctx).
			WithField("ref", ref).
			WithError(err).
			Warn("Failed while calling BatchGetImage")
		return "", ocispec.Descriptor{}, err
	}
	log.G(ctx).
		WithField("ref", ref).
		WithField("batchGetImageOutput", batchGetImageOutput).
		Debug("ecr.resolver.resolve")

	if len(batchGetImageOutput.Images) == 0 {
		return "", ocispec.Descriptor{}, reference.ErrInvalid
	}
	ecrImage := batchGetImageOutput.Images[0]

	mediaType := aws.StringValue(ecrImage.ImageManifestMediaType)
	if mediaType == "" {
		manifestBody := aws.StringValue(ecrImage.ImageManifest)
		log.G(ctx).
			WithField("ref", ref).
			WithField("manifest", manifestBody).
			Trace("ecr.resolver.resolve: parsing mediaType from manifest")
		mediaType, err = parseImageManifestMediaType(ctx, manifestBody)
		if err != nil {
			return "", ocispec.Descriptor{}, err
		}
	}
	log.G(ctx).
		WithField("ref", ref).
		WithField("mediaType", mediaType).
		Debug("ecr.resolver.resolve")
	// check resolved image's mediaType, it should be one of the specified in
	// the request.
	for i, accepted := range aws.StringValueSlice(batchGetImageInput.AcceptedMediaTypes) {
		if mediaType == accepted {
			break
		}
		if i+1 == len(batchGetImageInput.AcceptedMediaTypes) {
			log.G(ctx).
				WithField("ref", ref).
				WithField("mediaType", mediaType).
				Debug("ecr.resolver.resolve: unrequested mediaType, deferring to caller")
		}
	}

	desc := ocispec.Descriptor{
		Digest:    digest.Digest(aws.StringValue(ecrImage.ImageId.ImageDigest)),
		MediaType: mediaType,
		Size:      int64(len(aws.StringValue(ecrImage.ImageManifest))),
	}
	// assert matching digest if the provided ref includes one.
	if expectedDigest := ecrSpec.Spec().Digest().String(); expectedDigest != "" &&
		desc.Digest.String() != expectedDigest {
		return "", ocispec.Descriptor{}, errors.Wrap(errdefs.ErrFailedPrecondition, "resolved image digest mismatch")
	}

	return ecrSpec.Canonical(), desc, nil
}