func()

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
}