예제 #1
0
        public virtual async Task <Response <UploadManifestResult> > UploadManifestAsync(Stream stream, UploadManifestOptions options = default, CancellationToken cancellationToken = default)
        {
            options ??= new UploadManifestOptions();

            string reference = options.Tag ?? DigestHelper.ComputeDigest(DigestHelper.AlgorithmIdentifierSha256, stream);

            stream.Position = 0;
            ResponseWithHeaders <ContainerRegistryCreateManifestHeaders> response = await _restClient.CreateManifestAsync(_repositoryName, reference, options.MediaType, stream, cancellationToken).ConfigureAwait(false);

            return(Response.FromValue(new UploadManifestResult(), response.GetRawResponse()));
        }
예제 #2
0
        private static void ValidateManifestResponse(Response <DownloadManifestResult> manifestResponse)
        {
            var digestFromRegistry = manifestResponse.Value.Digest;

            var stream = manifestResponse.Value.Content;

            stream.Position = 0;

            // TODO: The registry may use a different digest algorithm - we need to handle that
            string digestFromContent = DigestHelper.ComputeDigest(DigestHelper.AlgorithmIdentifierSha256, stream);

            if (!string.Equals(digestFromRegistry, digestFromContent, DigestComparison))
            {
                throw new OciModuleRegistryException($"There is a mismatch in the manifest digests. Received content digest = {digestFromContent}, Digest in registry response = {digestFromRegistry}");
            }
        }
예제 #3
0
        public virtual async Task <Response <UploadBlobResult> > UploadBlobAsync(Stream stream, CancellationToken cancellationToken = default)
        {
            string digest = DigestHelper.ComputeDigest(DigestHelper.AlgorithmIdentifierSha256, stream);

            ResponseWithHeaders <ContainerRegistryBlobStartUploadHeaders> startUploadResult =
                await _blobRestClient.StartUploadAsync(_repositoryName, cancellationToken).ConfigureAwait(false);

            stream.Position = 0;
            ResponseWithHeaders <ContainerRegistryBlobUploadChunkHeaders> uploadChunkResult =
                await _blobRestClient.UploadChunkAsync(startUploadResult.Headers.Location, stream, cancellationToken).ConfigureAwait(false);

            ResponseWithHeaders <ContainerRegistryBlobCompleteUploadHeaders> completeUploadResult =
                await _blobRestClient.CompleteUploadAsync(digest, uploadChunkResult.Headers.Location, null, cancellationToken).ConfigureAwait(false);

            return(Response.FromValue(new UploadBlobResult(), completeUploadResult.GetRawResponse()));
        }
예제 #4
0
        private static void ValidateBlobResponse(Response <DownloadBlobResult> blobResponse, OciDescriptor descriptor)
        {
            var stream = blobResponse.Value.Content;

            if (descriptor.Size != stream.Length)
            {
                throw new InvalidModuleException($"Expected blob size of {descriptor.Size} bytes but received {stream.Length} bytes from the registry.");
            }

            stream.Position = 0;
            string digestFromContents = DigestHelper.ComputeDigest(DigestHelper.AlgorithmIdentifierSha256, stream);

            stream.Position = 0;

            if (!string.Equals(descriptor.Digest, digestFromContents, DigestComparison))
            {
                throw new InvalidModuleException($"There is a mismatch in the layer digests. Received content digest = {digestFromContents}, Requested digest = {descriptor.Digest}");
            }
        }