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); }
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)); }