using Microsoft.Azure.Management.Fluent; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Core; using Tango.Logging; namespace Tango.AzureUtils { public abstract class AzureUtilsComponentBase : ExtendedObject { protected IAzure Azure { get; private set; } public event EventHandler Progress; public event EventHandler ConfirmationRequired; public AzureUtilsComponentBase(IAzure azure) { Azure = azure; } protected virtual void OnProgress(AzureUtilsStage stage, String message = null, double progress = 0, double maximum = 100, bool indeterminate = true) { LogManager.Log($"{stage}: {message}"); Progress?.Invoke(this, new AzureUtilsProgressEventArgs() { Stage = stage, Message = message, Progress = progress, Maximum = maximum, IsIndeterminate = indeterminate, }); } protected virtual void OnCompleted(String message) { OnProgress(AzureUtilsStage.Ready, message, 0, 100, false); } protected virtual void OnProgress(AzureUtilsProgressEventArgs e) { Progress?.Invoke(this, e); } protected async Task RequestConfirmation(String message) { LogManager.Log($"Confirmation Required: {message}"); AzureUtilsConfirmationEventArgs e = new AzureUtilsConfirmationEventArgs(message); if (ConfirmationRequired != null) { OnProgress(AzureUtilsStage.ConfirmationRequired, "Waiting for user confirmation..."); OnRequestConfirmation(e); var result = await e.GetAwaiter(); if (!result) { throw new OperationCanceledException("Operation canceled."); } return result; } else { throw new OperationCanceledException($"Confirmation required no event handler found. ({message})"); } } protected void OnRequestConfirmation(AzureUtilsConfirmationEventArgs e) { ConfirmationRequired?.Invoke(this, e); } protected T CreateManager() where T : AzureUtilsComponentBase { T manager = Activator.CreateInstance(typeof(T), new object[] { Azure }) as T; manager.ConfirmationRequired += (x, e) => OnRequestConfirmation(e); manager.Progress += (x, e) => OnProgress(e); return manager; } } }