Beispiel #1
0
        private async Task <string> UploadZipToStorage(Stream zip, IDictionary <string, string> appSettings)
        {
            const string containerName  = "function-releases";
            const string blobNameFormat = "{0}-{1}.zip";

            var storageConnection = appSettings["AzureWebJobsStorage"];
            var storageAccount    = CloudStorageAccount.Parse(storageConnection);
            var blobClient        = storageAccount.CreateCloudBlobClient();
            var blobContainer     = blobClient.GetContainerReference(containerName);
            await blobContainer.CreateIfNotExistsAsync();

            var releaseName = Guid.NewGuid().ToString();
            var blob        = blobContainer.GetBlockBlobReference(string.Format(blobNameFormat, DateTimeOffset.UtcNow.ToString("yyyyMMddHHmmss"), releaseName));

            using (var progress = new StorageProgressBar($"Uploading {Utilities.BytesToHumanReadable(zip.Length)}", zip.Length))
            {
                await blob.UploadFromStreamAsync(zip,
                                                 AccessCondition.GenerateEmptyCondition(),
                                                 new BlobRequestOptions(),
                                                 new OperationContext(),
                                                 progress,
                                                 new CancellationToken());
            }

            var sasConstraints = new SharedAccessBlobPolicy();

            sasConstraints.SharedAccessStartTime  = DateTimeOffset.UtcNow.AddMinutes(-5);
            sasConstraints.SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddYears(10);
            sasConstraints.Permissions            = SharedAccessBlobPermissions.Read;

            var blobToken = blob.GetSharedAccessSignature(sasConstraints);

            return(blob.Uri + blobToken);
        }
Beispiel #2
0
        private async Task <string> UploadZipToStorage(Stream zip, IDictionary <string, string> appSettings)
        {
            return(await RetryHelper.Retry(async() =>
            {
                // Setting position to zero, in case we retry, we want to reset the stream
                zip.Position = 0;
                var zipMD5 = SecurityHelpers.CalculateMd5(zip);

                const string containerName = "function-releases";
                const string blobNameFormat = "{0}-{1}.zip";

                CloudBlobContainer blobContainer = null;

                try
                {
                    var storageConnection = appSettings["AzureWebJobsStorage"];
                    var storageAccount = CloudStorageAccount.Parse(storageConnection);
                    var blobClient = storageAccount.CreateCloudBlobClient();
                    blobContainer = blobClient.GetContainerReference(containerName);
                    await blobContainer.CreateIfNotExistsAsync();
                }
                catch (Exception ex)
                {
                    if (StaticSettings.IsDebug)
                    {
                        ColoredConsole.Error.WriteLine(ErrorColor(ex.ToString()));
                    }
                    throw new CliException($"Error creating a Blob container reference. Please make sure your connection string in \"AzureWebJobsStorage\" is valid");
                }

                var releaseName = Guid.NewGuid().ToString();
                var blob = blobContainer.GetBlockBlobReference(string.Format(blobNameFormat, DateTimeOffset.UtcNow.ToString("yyyyMMddHHmmss"), releaseName));
                using (var progress = new StorageProgressBar($"Uploading {Utilities.BytesToHumanReadable(zip.Length)}", zip.Length))
                {
                    await blob.UploadFromStreamAsync(zip,
                                                     AccessCondition.GenerateEmptyCondition(),
                                                     new BlobRequestOptions(),
                                                     new OperationContext(),
                                                     progress,
                                                     new CancellationToken());
                }

                var cloudMd5 = blob.Properties.ContentMD5;

                if (!cloudMd5.Equals(zipMD5))
                {
                    throw new CliException("Upload failed: Integrity error: MD5 hash mismatch between the local copy and the uploaded copy.");
                }

                var sasConstraints = new SharedAccessBlobPolicy();
                sasConstraints.SharedAccessStartTime = DateTimeOffset.UtcNow.AddMinutes(-5);
                sasConstraints.SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddYears(10);
                sasConstraints.Permissions = SharedAccessBlobPermissions.Read;

                var blobToken = blob.GetSharedAccessSignature(sasConstraints);

                return blob.Uri + blobToken;
            }, 3, TimeSpan.FromSeconds(1), displayError : true));
        }