Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }