public async Task ShowJobOutputAsync(IDialogContext context, LuisResult result) { EntityRecommendation jobEntity; var accessToken = await context.GetAccessToken(resourceId.Value); if (string.IsNullOrEmpty(accessToken)) { return; } var subscriptionId = context.GetSubscriptionId(); if (result.TryFindEntity("Job", out jobEntity)) { // obtain the name specified by the user -text in LUIS result is different var friendlyJobId = jobEntity.GetEntityOriginalText(result.Query); IList <RunbookJob> automationJobs = context.GetAutomationJobs(subscriptionId); if (automationJobs != null) { var selectedJob = automationJobs.SingleOrDefault(x => !string.IsNullOrWhiteSpace(x.FriendlyJobId) && x.FriendlyJobId.Equals(friendlyJobId, StringComparison.InvariantCultureIgnoreCase)); if (selectedJob == null) { await context.PostAsync($"The job with id '{friendlyJobId}' was not found."); context.Done <string>(null); return; } var jobOutput = await new AutomationDomain().GetAutomationJobOutputAsync(accessToken, subscriptionId, selectedJob.ResourceGroupName, selectedJob.AutomationAccountName, selectedJob.JobId); var outputMessage = string.IsNullOrWhiteSpace(jobOutput) ? $"No output for job '{friendlyJobId}'" : jobOutput; await context.PostAsync(outputMessage); } else { await context.PostAsync($"The job with id '{friendlyJobId}' was not found."); } } else { await context.PostAsync("No runbook job id was specified. Try 'show <jobId> output'."); } context.Done <string>(null); }
public async Task StatusJobAsync(IDialogContext context, LuisResult result) { var accessToken = await context.GetAccessToken(resourceId.Value); if (string.IsNullOrEmpty(accessToken)) { return; } var subscriptionId = context.GetSubscriptionId(); IList <RunbookJob> automationJobs = context.GetAutomationJobs(subscriptionId); if (automationJobs != null && automationJobs.Any()) { var messageBuilder = new StringBuilder(); messageBuilder.AppendLine("|Id|Runbook|Start Time|End Time|Status|"); messageBuilder.AppendLine("|---|---|---|---|---|"); foreach (var job in automationJobs) { var automationJob = await new AutomationDomain().GetAutomationJobAsync(accessToken, subscriptionId, job.ResourceGroupName, job.AutomationAccountName, job.JobId, configureAwait: false); var startDateTime = automationJob.StartDateTime?.ToString("g") ?? string.Empty; var endDateTime = automationJob.EndDateTime?.ToString("g") ?? string.Empty; var status = automationJob.Status ?? string.Empty; messageBuilder.AppendLine($"|{job.FriendlyJobId}|{automationJob.RunbookName}|{startDateTime}|{endDateTime}|{status}|"); } await context.PostAsync(messageBuilder.ToString()); } else { await context.PostAsync("No Runbook Jobs were created in the current session. To create a new Runbook Job type: Start Runbook."); } context.Done <string>(null); }
private async Task RunbookFormComplete(IDialogContext context, RunbookFormState runbookFormState) { try { var accessToken = await context.GetAccessToken(resourceId.Value); if (string.IsNullOrEmpty(accessToken)) { return; } var runbookJob = await new AutomationDomain().StartRunbookAsync( accessToken, runbookFormState.SelectedAutomationAccount.SubscriptionId, runbookFormState.SelectedAutomationAccount.ResourceGroup, runbookFormState.SelectedAutomationAccount.AutomationAccountName, runbookFormState.RunbookName, runbookFormState.RunbookParameters.Where(param => !string.IsNullOrWhiteSpace(param.ParameterValue)) .ToDictionary(param => param.ParameterName, param => param.ParameterValue)); IList <RunbookJob> automationJobs = context.GetAutomationJobs(runbookFormState.SelectedAutomationAccount.SubscriptionId); if (automationJobs == null) { runbookJob.FriendlyJobId = AutomationJobsHelper.NextFriendlyJobId(automationJobs); automationJobs = new List <RunbookJob> { runbookJob }; } else { runbookJob.FriendlyJobId = AutomationJobsHelper.NextFriendlyJobId(automationJobs); automationJobs.Add(runbookJob); } context.StoreAutomationJobs(runbookFormState.SelectedAutomationAccount.SubscriptionId, automationJobs); await context.PostAsync($"Created Job '{runbookJob.JobId}' for the '{runbookFormState.RunbookName}' runbook in '{runbookFormState.AutomationAccountName}' automation account. You'll receive a message when it is completed."); var notCompletedStatusList = new List <string> { "Stopped", "Suspended", "Failed" }; var completedStatusList = new List <string> { "Completed" }; var notifyStatusList = new List <string> { "Running" }; notifyStatusList.AddRange(completedStatusList); notifyStatusList.AddRange(notCompletedStatusList); accessToken = await context.GetAccessToken(resourceId.Value); if (string.IsNullOrEmpty(accessToken)) { return; } #pragma warning disable CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed CheckLongRunningOperationStatus( context, runbookJob, accessToken, new AutomationDomain().GetAutomationJobAsync, rj => rj.EndDateTime.HasValue, (previous, last, job) => { if (!string.Equals(previous?.Status, last?.Status) && notifyStatusList.Contains(last.Status)) { if (notCompletedStatusList.Contains(last.Status)) { return($"The runbook '{job.RunbookName}' (job '{job.JobId}') did not complete with status '{last.Status}'. Please go to the Azure Portal for more detailed information on why."); } else if (completedStatusList.Contains(last.Status)) { return($"Runbook '{job.RunbookName}' is currently in '{last.Status}' status. Type **show {job.FriendlyJobId} output** to see the output."); } else { return($"Runbook '{job.RunbookName}' job '{job.JobId}' is currently in '{last.Status}' status."); } } return(null); }); #pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed } catch (Exception e) { await context.PostAsync($"Oops! Something went wrong :(. Technical Details: {e.InnerException.Message}"); } context.Done <string>(null); }