public static async Task UploadRunbookAsDraft(AutomationRunbook runbook, AutomationManagementClient automationManagementClient, string resourceGroupName, AutomationAccount account) { RunbookCreateOrUpdateDraftProperties draftProperties; // Parse the script to determine if it is a PS workflow or native script String PSScriptText = File.ReadAllText(runbook.localFileInfo.FullName); System.Management.Automation.Language.Token[] AST; System.Management.Automation.Language.ParseError[] ASTError = null; var ASTScript = System.Management.Automation.Language.Parser.ParseInput(PSScriptText, out AST, out ASTError); // If the script starts with workflow, then create a PS Workflow script runbook or else create a native PS script runbook if (ASTScript.EndBlock.Extent.Text.ToLower().StartsWith("workflow")) { draftProperties = new RunbookCreateOrUpdateDraftProperties(Constants.RunbookType.Workflow, new RunbookDraft()); } else draftProperties = new RunbookCreateOrUpdateDraftProperties(Constants.RunbookType.PowerShellScript, new RunbookDraft()); // Get current properties if is not a new runbook and set these on the draft also so they are preserved. RunbookGetResponse response = null; CancellationTokenSource cts = new CancellationTokenSource(); cts.CancelAfter(TIMEOUT_MS); if (runbook.SyncStatus != AutomationAuthoringItem.Constants.SyncStatus.LocalOnly) { response = await automationManagementClient.Runbooks.GetAsync(resourceGroupName, account.Name, runbook.Name, cts.Token); draftProperties.Description = response.Runbook.Properties.Description; } // Create draft properties RunbookCreateOrUpdateDraftParameters draftParams = new RunbookCreateOrUpdateDraftParameters(draftProperties); draftParams.Name = runbook.Name; draftParams.Location = account.Location; // If this is not a new runbook, set the existing properties of the runbook if (response != null) { draftParams.Tags = response.Runbook.Tags; draftParams.Properties.LogProgress = response.Runbook.Properties.LogProgress; draftParams.Properties.LogVerbose = response.Runbook.Properties.LogVerbose; } cts = new CancellationTokenSource(); cts.CancelAfter(TIMEOUT_MS); await automationManagementClient.Runbooks.CreateOrUpdateWithDraftAsync(resourceGroupName, account.Name, draftParams, cts.Token); /* Update the runbook content from .ps1 file */ RunbookDraftUpdateParameters draftUpdateParams = new RunbookDraftUpdateParameters() { Name = runbook.Name, Stream = PSScriptText }; cts = new CancellationTokenSource(); cts.CancelAfter(TIMEOUT_MS); await automationManagementClient.RunbookDraft.UpdateAsync(resourceGroupName, account.Name, draftUpdateParams, cts.Token); /* Ensure the correct sync status is detected */ RunbookDraft draft = await GetRunbookDraft(runbook.Name, automationManagementClient, resourceGroupName, account.Name); runbook.localFileInfo.LastWriteTime = draft.LastModifiedTime.LocalDateTime; runbook.LastModifiedLocal = draft.LastModifiedTime.LocalDateTime; runbook.LastModifiedCloud = draft.LastModifiedTime.LocalDateTime; }
public static async Task UploadRunbookAsDraft(AutomationRunbook runbook, AutomationManagementClient automationManagementClient, string resourceGroupName, AutomationAccount account) { RunbookCreateOrUpdateDraftProperties draftProperties = new RunbookCreateOrUpdateDraftProperties("Script", new RunbookDraft()); draftProperties.Description = runbook.Description; RunbookCreateOrUpdateDraftParameters draftParams = new RunbookCreateOrUpdateDraftParameters(draftProperties); draftParams.Name = runbook.Name; draftParams.Location = account.Location; await automationManagementClient.Runbooks.CreateOrUpdateWithDraftAsync(resourceGroupName, account.Name, draftParams); /* Update the runbook content from .ps1 file */ RunbookDraftUpdateParameters draftUpdateParams = new RunbookDraftUpdateParameters() { Name = runbook.Name, Stream = File.ReadAllText(runbook.localFileInfo.FullName) }; await automationManagementClient.RunbookDraft.UpdateAsync(resourceGroupName, account.Name, draftUpdateParams); /* Ensure the correct sync status is detected */ RunbookDraft draft = await GetRunbookDraft(runbook.Name, automationManagementClient, resourceGroupName, account.Name); runbook.localFileInfo.LastWriteTime = draft.LastModifiedTime.LocalDateTime; runbook.LastModifiedLocal = draft.LastModifiedTime.LocalDateTime; runbook.LastModifiedCloud = draft.LastModifiedTime.LocalDateTime; }
public static async Task UploadRunbookAsDraft(AutomationRunbook runbook, AutomationManagementClient automationManagementClient, string resourceGroupName, AutomationAccount account) { RunbookCreateOrUpdateDraftProperties draftProperties; // Parse the script to determine if it is a PS workflow or native script String PSScriptText = File.ReadAllText(runbook.localFileInfo.FullName); System.Management.Automation.Language.Token[] AST; System.Management.Automation.Language.ParseError[] ASTError = null; var ASTScript = System.Management.Automation.Language.Parser.ParseInput(PSScriptText, out AST, out ASTError); // If the script starts with workflow, then create a PS Workflow script runbook or else create a native PS script runbook if (ASTScript.EndBlock.Extent.Text.ToLower().StartsWith("workflow")) { draftProperties = new RunbookCreateOrUpdateDraftProperties(Constants.RunbookType.Workflow, new RunbookDraft()); } else draftProperties = new RunbookCreateOrUpdateDraftProperties(Constants.RunbookType.PowerShellScript, new RunbookDraft()); draftProperties.Description = runbook.Description; RunbookCreateOrUpdateDraftParameters draftParams = new RunbookCreateOrUpdateDraftParameters(draftProperties); draftParams.Name = runbook.Name; draftParams.Location = account.Location; await automationManagementClient.Runbooks.CreateOrUpdateWithDraftAsync(resourceGroupName, account.Name, draftParams); /* Update the runbook content from .ps1 file */ RunbookDraftUpdateParameters draftUpdateParams = new RunbookDraftUpdateParameters() { Name = runbook.Name, Stream = PSScriptText }; await automationManagementClient.RunbookDraft.UpdateAsync(resourceGroupName, account.Name, draftUpdateParams); /* Ensure the correct sync status is detected */ RunbookDraft draft = await GetRunbookDraft(runbook.Name, automationManagementClient, resourceGroupName, account.Name); runbook.localFileInfo.LastWriteTime = draft.LastModifiedTime.LocalDateTime; runbook.LastModifiedLocal = draft.LastModifiedTime.LocalDateTime; runbook.LastModifiedCloud = draft.LastModifiedTime.LocalDateTime; }
/* This is the only way I can see to "check out" a runbook (get it from Published to Edit state) using the SDK. */ public static async Task CheckOutRunbook(AutomationRunbook runbook, AutomationManagementClient automationManagementClient, string resourceGroupName, AutomationAccount account) { CancellationTokenSource cts = new CancellationTokenSource(); cts.CancelAfter(TIMEOUT_MS); RunbookGetResponse response = await automationManagementClient.Runbooks.GetAsync(resourceGroupName, account.Name, runbook.Name, cts.Token); if (response.Runbook.Properties.State != "Published") return; cts = new CancellationTokenSource(); cts.CancelAfter(TIMEOUT_MS); RunbookContentResponse runbookContentResponse = await automationManagementClient.Runbooks.ContentAsync(resourceGroupName, account.Name, runbook.Name, cts.Token); // Create draft properties RunbookCreateOrUpdateDraftParameters draftParams = new RunbookCreateOrUpdateDraftParameters(); draftParams.Properties = new RunbookCreateOrUpdateDraftProperties(); draftParams.Properties.Description = response.Runbook.Properties.Description; draftParams.Properties.LogProgress = response.Runbook.Properties.LogProgress; draftParams.Properties.LogVerbose = response.Runbook.Properties.LogVerbose; draftParams.Properties.RunbookType = response.Runbook.Properties.RunbookType; draftParams.Properties.Draft = new RunbookDraft(); draftParams.Tags = response.Runbook.Tags; draftParams.Name = runbook.Name; draftParams.Location = account.Location; cts = new CancellationTokenSource(); cts.CancelAfter(TIMEOUT_MS); await automationManagementClient.Runbooks.CreateOrUpdateWithDraftAsync(resourceGroupName, account.Name, draftParams, cts.Token); RunbookDraftUpdateParameters draftUpdateParams = new RunbookDraftUpdateParameters() { Name = runbook.Name, Stream = runbookContentResponse.Stream.ToString() }; cts = new CancellationTokenSource(); cts.CancelAfter(TIMEOUT_MS); await automationManagementClient.RunbookDraft.UpdateAsync(resourceGroupName, account.Name, draftUpdateParams, cts.Token); /* Ensure the correct sync status is detected */ if (runbook.localFileInfo != null) { RunbookDraft draft = await GetRunbookDraft(runbook.Name, automationManagementClient, resourceGroupName, account.Name); runbook.localFileInfo.LastWriteTime = draft.LastModifiedTime.LocalDateTime; runbook.LastModifiedLocal = draft.LastModifiedTime.LocalDateTime; runbook.LastModifiedCloud = draft.LastModifiedTime.LocalDateTime; } }
public Runbook CreateRunbookByName(string resourceGroupName, string automationAccountName, string runbookName, string description, IDictionary tags, string type, bool? logProgress, bool? logVerbose, bool overwrite) { using (var request = new RequestSettings(this.automationManagementClient)) { var runbookModel = this.TryGetRunbookModel(resourceGroupName, automationAccountName, runbookName); if (runbookModel != null && overwrite == false) { throw new ResourceCommonException(typeof (Runbook), string.Format(CultureInfo.CurrentCulture, Resources.RunbookAlreadyExists, runbookName)); } IDictionary<string, string> runbooksTags = null; if (tags != null) runbooksTags = tags.Cast<DictionaryEntry>().ToDictionary(kvp => kvp.Key.ToString(), kvp => kvp.Value.ToString()); var rdcprop = new RunbookCreateOrUpdateDraftProperties() { Description = description, RunbookType = String.IsNullOrWhiteSpace(type) ? RunbookTypeEnum.Script : (0 == string.Compare(type, Constants.RunbookType.PowerShellWorkflow, StringComparison.OrdinalIgnoreCase)) ? RunbookTypeEnum.Script : type, LogProgress = logProgress.HasValue && logProgress.Value, LogVerbose = logVerbose.HasValue && logVerbose.Value, Draft = new RunbookDraft(), }; var rdcparam = new RunbookCreateOrUpdateDraftParameters() { Name = runbookName, Properties = rdcprop, Tags = runbooksTags, Location = GetAutomationAccount(resourceGroupName, automationAccountName).Location }; this.automationManagementClient.Runbooks.CreateOrUpdateWithDraft(resourceGroupName, automationAccountName, rdcparam); return this.GetRunbook(resourceGroupName, automationAccountName, runbookName); } }
public async Task<OperationResult> SaveRunbookAsync(RunbookModelProxy runbook, string runbookContent) { var runbookCreated = false; var response = default(RunbookCreateOrUpdateResponse); //if (runbook.RunbookID == Guid.Empty) //{ //runbookNeedsCreation = true; // This is a new runbook! var draft = new RunbookDraft(); draft.InEdit = true; draft.CreationTime = DateTimeOffset.Now; draft.LastModifiedTime = DateTimeOffset.Now; var details = new RunbookCreateOrUpdateDraftParameters(); details.Name = runbook.RunbookName; details.Location = _connectionData.AzureRMLocation; details.Tags.Add(AutoStudioTagName, runbook.Tags != null ? runbook.Tags : string.Empty); details.Properties = new RunbookCreateOrUpdateDraftProperties(); details.Properties.RunbookType = "Script"; details.Properties.Description = "Runbook created with Automation Studio."; details.Properties.Draft = draft; response = await _client.Runbooks.CreateOrUpdateWithDraftAsync(_connectionData.AzureRMGroupName, _connectionData.AzureAutomationAccount, details); if (response.StatusCode == System.Net.HttpStatusCode.InternalServerError) runbookCreated = false; else runbookCreated = true; // Need to set the draft runbook ID to notify the system that this runbook is in draft mode runbook.DraftRunbookVersionID = Guid.NewGuid(); //} if (!runbookCreated /*&& runbookNeedsCreation*/) { return new OperationResult { ErrorCode = response.StatusCode.ToString(), ErrorMessage = "Unable to save the runbook", HttpStatusCode = response.StatusCode, Status = OperationStatus.Failed }; } // Now we need to commit the draft var status = await SaveRunbookContentAsync(runbook, runbookContent, RunbookType.Draft); // Make sure that we add the runbook to our Env Explorer if (runbook.RunbookID == Guid.Empty) { Context.Start(); } return new OperationResult { HttpStatusCode = System.Net.HttpStatusCode.OK, Status = status, RequestUrl = string.Empty }; }
public async Task<bool> CheckOut(RunbookViewModel runbook) { CancellationTokenSource cts = new CancellationTokenSource(); cts.CancelAfter(TIMEOUT_MS); RunbookGetResponse response = await _client.Runbooks.GetAsync(_connectionData.AzureRMGroupName, _connectionData.AzureAutomationAccount, runbook.Runbook.RunbookName, cts.Token); if (response.Runbook.Properties.State != "Published") return false; cts = new CancellationTokenSource(); cts.CancelAfter(TIMEOUT_MS); RunbookContentResponse runbookContentResponse = await _client.Runbooks.ContentAsync(_connectionData.AzureRMGroupName, _connectionData.AzureAutomationAccount, runbook.Runbook.RunbookName, cts.Token); // Create draft properties RunbookCreateOrUpdateDraftParameters draftParams = new RunbookCreateOrUpdateDraftParameters(); draftParams.Properties = new RunbookCreateOrUpdateDraftProperties(); draftParams.Properties.Description = response.Runbook.Properties.Description; draftParams.Properties.LogProgress = response.Runbook.Properties.LogProgress; draftParams.Properties.LogVerbose = response.Runbook.Properties.LogVerbose; draftParams.Properties.RunbookType = response.Runbook.Properties.RunbookType; draftParams.Properties.Draft = new RunbookDraft(); draftParams.Tags = response.Runbook.Tags; draftParams.Name = runbook.Runbook.RunbookName; draftParams.Location = _connectionData.AzureRMLocation; cts = new CancellationTokenSource(); cts.CancelAfter(TIMEOUT_MS); await _client.Runbooks.CreateOrUpdateWithDraftAsync(_connectionData.AzureRMGroupName, _connectionData.AzureAutomationAccount, draftParams, cts.Token); RunbookDraftUpdateParameters draftUpdateParams = new RunbookDraftUpdateParameters() { Name = runbook.Runbook.RunbookName, Stream = runbookContentResponse.Stream.ToString() }; cts = new CancellationTokenSource(); cts.CancelAfter(TIMEOUT_MS); await _client.RunbookDraft.UpdateAsync(_connectionData.AzureRMGroupName, _connectionData.AzureAutomationAccount, draftUpdateParams, cts.Token); return true; }
/// <summary> /// Create the runbook identified by runbook name. (see /// http://aka.ms/azureautomationsdk/runbookoperations for more /// information) /// </summary> /// <param name='operations'> /// Reference to the /// Microsoft.Azure.Management.Automation.IRunbookOperations. /// </param> /// <param name='resourceGroupName'> /// Required. The name of the resource group /// </param> /// <param name='automationAccount'> /// Required. The automation account name. /// </param> /// <param name='parameters'> /// Required. The create or update parameters for runbook. /// </param> /// <returns> /// The response model for the runbook create response. /// </returns> public static Task<RunbookCreateOrUpdateResponse> CreateOrUpdateWithDraftAsync(this IRunbookOperations operations, string resourceGroupName, string automationAccount, RunbookCreateOrUpdateDraftParameters parameters) { return operations.CreateOrUpdateWithDraftAsync(resourceGroupName, automationAccount, parameters, CancellationToken.None); }
/// <summary> /// Create the runbook identified by runbook name. (see /// http://aka.ms/azureautomationsdk/runbookoperations for more /// information) /// </summary> /// <param name='operations'> /// Reference to the /// Microsoft.Azure.Management.Automation.IRunbookOperations. /// </param> /// <param name='resourceGroupName'> /// Required. The name of the resource group /// </param> /// <param name='automationAccount'> /// Required. The automation account name. /// </param> /// <param name='parameters'> /// Required. The create or update parameters for runbook. /// </param> /// <returns> /// The response model for the runbook create response. /// </returns> public static RunbookCreateOrUpdateResponse CreateOrUpdateWithDraft(this IRunbookOperations operations, string resourceGroupName, string automationAccount, RunbookCreateOrUpdateDraftParameters parameters) { return Task.Factory.StartNew((object s) => { return ((IRunbookOperations)s).CreateOrUpdateWithDraftAsync(resourceGroupName, automationAccount, parameters); } , operations, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default).Unwrap().GetAwaiter().GetResult(); }