/// <summary> /// on data movement job finish /// </summary> /// <param name="progress">progress information</param> /// <param name="e">run time exception</param> protected virtual void OnDMJobFinish(object data, Exception e) { try { if (ShouldForceQuit) { return; } DataMovementUserData userData = data as DataMovementUserData; string status = string.Empty; if (null == e) { try { OnTaskSuccessful(userData); } catch (Exception postProcessException) { e = postProcessException; } } if (null == e) { status = Resources.TransmitSuccessfully; userData.taskSource.SetResult(true); } else { status = String.Format(Resources.TransmitFailed, e.Message); userData.taskSource.SetException(e); } if (userData != null && userData.Record != null) { if (e == null) { userData.Record.PercentComplete = 100; } userData.Record.StatusDescription = status; OutputStream.WriteProgress(userData.Record); } } catch (Exception unknownException) { Debug.Fail(unknownException.ToString()); } }
protected async Task RunTransferJob(BlobTransferJob transferJob, DataMovementUserData userData) { this.SetRequestOptionsInTransferJob(transferJob); transferJob.OverwritePromptCallback = ConfirmOverwrite; try { await this.transferJobRunner.RunTransferJob( transferJob, (percent, speed) => { if (userData.Record != null) { userData.Record.PercentComplete = (int)percent; userData.Record.StatusDescription = string.Format(CultureInfo.CurrentCulture, Resources.FileTransmitStatus, (int)percent, Util.BytesToHumanReadableSize(speed)); this.OutputStream.WriteProgress(userData.Record); } }, this.CmdletCancellationToken); if (userData.Record != null) { userData.Record.PercentComplete = 100; userData.Record.StatusDescription = Resources.TransmitSuccessfully; this.OutputStream.WriteProgress(userData.Record); } } catch (OperationCanceledException) { if (userData.Record != null) { userData.Record.StatusDescription = Resources.TransmitCancelled; this.OutputStream.WriteProgress(userData.Record); } } catch (Exception e) { if (userData.Record != null) { userData.Record.StatusDescription = string.Format(CultureInfo.CurrentCulture, Resources.TransmitFailed, e.Message); this.OutputStream.WriteProgress(userData.Record); } throw; } }
protected TransferContext GetTransferContext(DataMovementUserData userData) { TransferContext transferContext = new TransferContext(); transferContext.ClientRequestId = CmdletOperationContext.ClientRequestId; transferContext.OverwriteCallback = ConfirmOverwrite; transferContext.ProgressHandler = new TransferProgressHandler((transferProgress) => { if (userData.Record != null) { // Size of the source file might be 0, when it is, directly treat the progress as 100 percent. userData.Record.PercentComplete = 0 == userData.TotalSize ? 100 : (int)(transferProgress.BytesTransferred * 100 / userData.TotalSize); userData.Record.StatusDescription = string.Format(CultureInfo.CurrentCulture, Resources.FileTransmitStatus, userData.Record.PercentComplete); this.OutputStream.WriteProgress(userData.Record); } }); return transferContext; }
/// <summary> /// On Task run successfully /// </summary> /// <param name="data">User data</param> protected virtual void OnTaskSuccessful(DataMovementUserData data) { }
/// <summary> /// On Task run successfully /// </summary> /// <param name="data">User data</param> protected override void OnTaskSuccessful(DataMovementUserData data) { StorageBlob.CloudBlob blob = data.Data as StorageBlob.CloudBlob; IStorageBlobManagement localChannel = data.Channel; if (blob != null) { AccessCondition accessCondition = null; StorageBlob.BlobRequestOptions requestOptions = RequestOptions; if (BlobProperties != null || BlobMetadata != null) { Task[] tasks = new Task[2]; tasks[0] = SetBlobProperties(localChannel, blob, BlobProperties); tasks[1] = SetBlobMeta(localChannel, blob, BlobMetadata); Task.WaitAll(tasks); } try { localChannel.FetchBlobAttributesAsync(blob, accessCondition, requestOptions, OperationContext, CmdletCancellationToken).Wait(); } catch (AggregateException e) { StorageException storageException = e.InnerException as StorageException; //Handle the limited read permission. if (storageException == null || !storageException.IsNotFoundException()) { throw e.InnerException; } } WriteCloudBlobObject(data.TaskId, localChannel, blob); } }
/// <summary> /// upload file to azure blob /// </summary> /// <param name="taskId">Task id</param> /// <param name="filePath">local file path</param> /// <param name="blob">destination azure blob object</param> internal virtual async Task Upload2Blob(long taskId, IStorageBlobManagement localChannel, string filePath, StorageBlob.CloudBlob blob) { string activity = String.Format(Resources.SendAzureBlobActivity, filePath, blob.Name, blob.Container.Name); string status = Resources.PrepareUploadingBlob; ProgressRecord pr = new ProgressRecord(OutputStream.GetProgressId(taskId), activity, status); FileInfo fileInfo = new FileInfo(filePath); DataMovementUserData data = new DataMovementUserData() { Data = blob, TaskId = taskId, Channel = localChannel, Record = pr, TotalSize = fileInfo.Length }; await DataMovementTransferHelper.DoTransfer(() => { return this.TransferManager.UploadAsync(filePath, blob, null, this.GetTransferContext(data), this.CmdletCancellationToken); }, data.Record, this.OutputStream); if (this.BlobProperties != null || this.BlobMetadata != null) { await TaskEx.WhenAll( this.SetBlobProperties(localChannel, blob, this.BlobProperties), this.SetBlobMeta(localChannel, blob, this.BlobMetadata)); } try { await localChannel.FetchBlobAttributesAsync( blob, AccessCondition.GenerateEmptyCondition(), this.RequestOptions, this.OperationContext, this.CmdletCancellationToken); } catch (StorageException e) { //Handle the limited read permission. if (!e.IsNotFoundException()) { throw; } } WriteCloudBlobObject(data.TaskId, localChannel, blob); }
/// <summary> /// upload file to azure blob /// </summary> /// <param name="taskId">Task id</param> /// <param name="filePath">local file path</param> /// <param name="blob">destination azure blob object</param> internal virtual async Task<bool> Upload2Blob(long taskId, IStorageBlobManagement localChannel, string filePath, ICloudBlob blob) { string activity = String.Format(Resources.SendAzureBlobActivity, filePath, blob.Name, blob.Container.Name); string status = Resources.PrepareUploadingBlob; ProgressRecord pr = new ProgressRecord(OutputStream.GetProgressId(taskId), activity, status); DataMovementUserData data = new DataMovementUserData() { Data = blob, TaskId = taskId, Channel = localChannel, Record = pr }; transferManager.QueueUpload(blob, filePath, OnDMJobStart, OnDMJobProgress, OnDMJobFinish, data); return await data.taskSource.Task; }
protected virtual void AppendEventHandlers(TransferJobBase transferJob, DataMovementUserData userData) { transferJob.StartEvent += (eventSource, eventArgs) => { this.OnDMJobStart(userData); }; transferJob.ProgressEvent += (eventSource, eventArgs) => { this.OnDMJobProgress(userData, eventArgs.Speed, eventArgs.Progress); }; transferJob.FinishEvent += (eventSource, eventArgs) => { this.OnDMJobFinish(userData, eventArgs.Exception); }; }
protected void EnqueueTransferJob(BlobTransferJob transferJob, DataMovementUserData userData) { this.AppendEventHandlers(transferJob, userData); this.SetRequestOptionsInTransferJob(transferJob); transferJob.OverwritePromptCallback = ConfirmOverwrite; transferManager.EnqueueJob(transferJob, CmdletCancellationToken); }
/// <summary> /// upload file to azure blob /// </summary> /// <param name="taskId">Task id</param> /// <param name="filePath">local file path</param> /// <param name="blob">destination azure blob object</param> internal virtual async Task Upload2Blob(long taskId, IStorageBlobManagement localChannel, string filePath, StorageBlob.CloudBlob blob) { string activity = String.Format(Resources.SendAzureBlobActivity, filePath, blob.Name, blob.Container.Name); string status = Resources.PrepareUploadingBlob; ProgressRecord pr = new ProgressRecord(OutputStream.GetProgressId(taskId), activity, status); DataMovementUserData data = new DataMovementUserData() { Data = blob, TaskId = taskId, Channel = localChannel, Record = pr }; TransferJob uploadJob = new TransferJob( new TransferLocation(filePath), new TransferLocation(blob), TransferMethod.SyncCopy); await this.RunTransferJob(uploadJob, data); if (this.BlobProperties != null || this.BlobMetadata != null) { await TaskEx.WhenAll( this.SetBlobProperties(localChannel, blob, this.BlobProperties), this.SetBlobMeta(localChannel, blob, this.BlobMetadata)); } try { await localChannel.FetchBlobAttributesAsync( blob, AccessCondition.GenerateEmptyCondition(), this.RequestOptions, this.OperationContext, this.CmdletCancellationToken); } catch (StorageException e) { //Handle the limited read permission. if (!e.IsNotFoundException()) { throw; } } WriteCloudBlobObject(data.TaskId, localChannel, blob); }