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
}