in ecr/manifest_writer.go [57:111]
func (mw *manifestWriter) Commit(ctx context.Context, size int64, expected digest.Digest, opts ...content.Opt) error {
manifest := mw.buf.String()
ecrSpec := mw.base.ecrSpec
log.G(mw.ctx).
WithField("manifest", manifest).
WithField("size", size).
WithField("expected", expected.String()).
Debug("ecr.manifest.commit")
putImageInput := &ecr.PutImageInput{
RegistryId: aws.String(ecrSpec.Registry()),
RepositoryName: aws.String(ecrSpec.Repository),
ImageManifest: aws.String(manifest),
ImageManifestMediaType: aws.String(mw.desc.MediaType),
ImageDigest: aws.String(expected.String()),
}
// Tag only if this push is the image's root descriptor, as indicated by the
// parsed ECRSpec.
rootDigest := ecrSpec.Spec().Digest()
if mw.desc.Digest == rootDigest {
if tag, _ := ecrSpec.TagDigest(); tag != "" {
log.G(ctx).
WithField("tag", tag).
WithField("ref", rootDigest.String()).
Debug("ecr.manifest.commit: tag set on push")
putImageInput.ImageTag = aws.String(tag)
}
}
output, err := mw.base.client.PutImageWithContext(ctx, putImageInput)
if err != nil {
return errors.Wrapf(err, "ecr: failed to put manifest: %v", ecrSpec)
}
status, err := mw.tracker.GetStatus(mw.ref)
if err == nil {
status.Offset = int64(len(manifest))
status.UpdatedAt = time.Now()
mw.tracker.SetStatus(mw.ref, status)
} else {
log.G(mw.ctx).WithError(err).WithField("ref", mw.ref).Warn("Failed to update status")
}
if output == nil {
return errors.Errorf("ecr: failed to put manifest, nil output: %v", ecrSpec)
}
actual := aws.StringValue(output.Image.ImageId.ImageDigest)
if actual != expected.String() {
return errors.Errorf("digest mismatch: ECR returned %s, expected %s", actual, expected)
}
return nil
}