public async Task PollAssessment()

in src/HttpRequestHelper/HttpClientHelper.cs [603:689]


        public async Task<AssessmentPollResponse> PollAssessment(UserInput userInputObj, AssessmentInformation assessmentInfo)
        {
            if (userInputObj.CancellationContext.IsCancellationRequested)
                UtilityFunctions.InitiateCancellation(userInputObj);

            userInputObj.LoggerObj.LogInformation($"Polling assessment {assessmentInfo.AssessmentName} for status");
            
            AuthenticationResult authResult = null;
            HttpResponseMessage response;

            try
            {
                authResult = await AzureAuthenticationHandler.RetrieveAuthenticationToken();
            }
            catch (Exception exCacheTokenRetrieval)
            {
                throw new Exception($"Cached token retrieval failed: {exCacheTokenRetrieval.Message} Please re-login");
            }

            string workflow = userInputObj.WorkflowObj.IsExpressWorkflow ? "express" : "custom";

            try
            {
                HttpClient httpClient = new HttpClient()
                {
                    Timeout = TimeSpan.FromSeconds(60),
                };

                string url = Routes.ProtocolScheme + Routes.AzureManagementApiHostname + Routes.ForwardSlash +
                             Routes.SubscriptionPath + Routes.ForwardSlash + userInputObj.Subscription.Key + Routes.ForwardSlash +
                             Routes.ResourceGroupPath + Routes.ForwardSlash + userInputObj.ResourceGroupName.Value + Routes.ForwardSlash +
                             Routes.ProvidersPath + Routes.ForwardSlash + Routes.MigrateProvidersPath + Routes.ForwardSlash +
                             Routes.AssessmentProjectsPath + Routes.ForwardSlash + userInputObj.AssessmentProjectName + Routes.ForwardSlash +
                             Routes.GroupsPath + Routes.ForwardSlash + assessmentInfo.GroupName + Routes.ForwardSlash +
                             new EnumDescriptionHelper().GetEnumDescription(assessmentInfo.AssessmentType) + Routes.ForwardSlash + assessmentInfo.AssessmentName +
                             Routes.QueryStringQuestionMark +
                             Routes.QueryParameterApiVersion + Routes.QueryStringEquals + Routes.AssessmentMachineListApiVersion;
                Uri baseAddress = new Uri(url);
                string clientRequestId = Guid.NewGuid().ToString();
                httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + authResult.AccessToken);
                httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
                httpClient.DefaultRequestHeaders.Add("x-ms-client-request-id", clientRequestId + "-" + workflow + "-azmigexp");
                
                response = await httpClient.GetAsync(baseAddress);

                if (response == null || !response.IsSuccessStatusCode)
                {
                    userInputObj.LoggerObj.LogWarning($"Assessment {assessmentInfo.AssessmentName} polling response was not success. Status: {response?.StatusCode} Content: {response?.Content}");
                    if (!HttpUtilities.IsRetryNeeded(response, null))
                        return AssessmentPollResponse.Error;
                    
                    return AssessmentPollResponse.NotCompleted;
                }

                string responseContent = await response.Content.ReadAsStringAsync();
                AssessmentInformationJSON assessmentInformationObj = JsonConvert.DeserializeObject<AssessmentInformationJSON>(responseContent);

                if (assessmentInformationObj.Properties.Status.Equals("Completed"))
                {
                    userInputObj.LoggerObj.LogInformation($"Assessment {assessmentInfo.AssessmentName} completed");
                    return AssessmentPollResponse.Completed;
                }
                else if (assessmentInformationObj.Properties.Status.Equals("OutDated"))
                {
                    userInputObj.LoggerObj.LogWarning($"Assessment {assessmentInfo.AssessmentName} became out-dated during computation");
                    return AssessmentPollResponse.OutDated;
                }
                else if (assessmentInformationObj.Properties.Status.Equals("Invalid"))
                {
                    userInputObj.LoggerObj.LogError($"Assessment {assessmentInfo.AssessmentName} is invalid, corresponding datapoints will contain default values");
                    return AssessmentPollResponse.Invalid;
                }

                userInputObj.LoggerObj.LogInformation($"Assessment {assessmentInfo.AssessmentName} status is {assessmentInformationObj.Properties.Status}");

                return AssessmentPollResponse.NotCompleted;
            }
            catch (Exception exPollAssessment)
            {
                userInputObj.LoggerObj.LogWarning($"Assessment {assessmentInfo.AssessmentName} polling error: {exPollAssessment.Message}");

                if (!HttpUtilities.IsRetryNeeded(null, exPollAssessment))
                    return AssessmentPollResponse.Error;
            }

            return AssessmentPollResponse.NotCompleted;
        }