public void ParseWebAppAssessments()

in src/Assessment/Parser/AzureWebAppParser.cs [19:159]


        public void ParseWebAppAssessments(Dictionary<string, AzureWebAppDataset> AzureWebAppData, UserInput userInputObj)
        {
            if (userInputObj == null)
                throw new Exception("Received null user input object.");
            
            if (AzureWebAppAssessmentStatusMap == null)
            {
                userInputObj.LoggerObj.LogError("Azure web app asessment status map is null, terminating parsing");
                return;
            }

            if (AzureWebAppAssessmentStatusMap.Count <= 0)
            {
                userInputObj.LoggerObj.LogError("Azure web app assessment status map is empty, terminating parsing");
                return;
            }

            foreach (var kvp in AzureWebAppAssessmentStatusMap)
            {
                if (!UtilityFunctions.IsAssessmentCompleted(kvp))
                {
                    userInputObj.LoggerObj.LogWarning($"Skipping parsing assessment {kvp.Key.AssessmentName} as it is in {new EnumDescriptionHelper().GetEnumDescription(kvp.Value)} state");
                    continue;
                }

                userInputObj.LoggerObj.LogInformation($"Parsing Azure Web App assessment {kvp.Key.AssessmentName}");

                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 + kvp.Key.GroupName + Routes.ForwardSlash +
                             new EnumDescriptionHelper().GetEnumDescription(kvp.Key.AssessmentType) + Routes.ForwardSlash + kvp.Key.AssessmentName +
                             Routes.QueryStringQuestionMark +
                             Routes.QueryParameterApiVersion + Routes.QueryStringEquals + Routes.AssessmentMachineListApiVersion;
                
                string assessmentPropertiesResponse = "";
                try
                {
                    assessmentPropertiesResponse = new HttpClientHelper().GetHttpRequestJsonStringResponse(url, userInputObj).Result;
                }
                catch (OperationCanceledException)
                {
                    throw;
                }
                catch (AggregateException aeWebAppAssessmentProperty)
                {
                    string errorMessage = "";
                    foreach (var e in aeWebAppAssessmentProperty.Flatten().InnerExceptions)
                    {
                        if (e is OperationCanceledException)
                            throw e;
                        else
                        {
                            errorMessage = errorMessage + e.Message + " ";
                        }
                    }
                    userInputObj.LoggerObj.LogError($"Failed to retrieve Azure web app assessment properties for assessment: {errorMessage}");
                    url = "";
                    continue;
                }
                catch (Exception exWebAppProperties)
                {
                    userInputObj.LoggerObj.LogError($"Failed to retrieve Azure web app assessment properties for assessment: {exWebAppProperties.Message}");
                    url = "";
                    continue;
                }

                AzureAppServiceWebAppPropertiesJSON webAppPropertiesObj = JsonConvert.DeserializeObject<AzureAppServiceWebAppPropertiesJSON>(assessmentPropertiesResponse);
                double monthlyCostEstimate = webAppPropertiesObj.Properties.MonthlyCost;
                double monthlySecurityCostEstimate = webAppPropertiesObj.Properties.MonthlySecurityCost;

                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 + kvp.Key.GroupName + Routes.ForwardSlash +
                      new EnumDescriptionHelper().GetEnumDescription(kvp.Key.AssessmentType) + Routes.ForwardSlash + kvp.Key.AssessmentName + Routes.ForwardSlash +
                      Routes.AzureAppServiceAssessedWebAppsPath +
                      Routes.QueryStringQuestionMark +
                      Routes.QueryParameterApiVersion + Routes.QueryStringEquals + Routes.AssessmentMachineListApiVersion;

                while (!string.IsNullOrEmpty(url))
                {
                    if (userInputObj.CancellationContext.IsCancellationRequested)
                        UtilityFunctions.InitiateCancellation(userInputObj);
                    
                    string assessedWebAppsResponse = "";
                    try
                    {
                        assessedWebAppsResponse = new HttpClientHelper().GetHttpRequestJsonStringResponse(url, userInputObj).Result;
                    }
                    catch (OperationCanceledException)
                    {
                        throw;
                    }
                    catch (AggregateException aeAssessedWebApps)
                    {
                        string errorMessage = "";
                        foreach (var e in aeAssessedWebApps.Flatten().InnerExceptions)
                        {
                            if (e is OperationCanceledException)
                                throw e;
                            else
                            {
                                errorMessage = errorMessage + e.Message + " ";
                            }
                        }
                        userInputObj.LoggerObj.LogError($"Failed to retrieve web app data from assessment: {errorMessage}");
                        url = "";
                        continue;
                    }
                    catch (Exception exAssessedWebApps)
                    {
                        userInputObj.LoggerObj.LogError($"Failed to retrieve web app data from assessment: {exAssessedWebApps.Message}");
                        url = "";
                        continue;
                    }

                    AzureAppServiceAssessedWebAppsJSON obj = JsonConvert.DeserializeObject<AzureAppServiceAssessedWebAppsJSON>(assessedWebAppsResponse);
                    url = obj.NextLink;

                    foreach (var value in obj.Values)
                    {
                        string key = value.Properties.DiscoveredWebAppId?.ToLower();
                        UpdateAssessedWebAppDataset(AzureWebAppData, value, key, kvp.Key);

                        AzureWebAppData[key].MonthlySecurityCost = monthlySecurityCostEstimate;

                        if (kvp.Key.AssessmentTag == AssessmentTag.PerformanceBased)
                            AzureWebAppData[key].EstimatedComputeCost = monthlyCostEstimate;
                        else if (kvp.Key.AssessmentTag == AssessmentTag.PerformanceBased_RI3year)
                            AzureWebAppData[key].EstimatedComputeCost_RI3year = monthlyCostEstimate;
                        else if (kvp.Key.AssessmentTag == AssessmentTag.PerformanceBased_ASP3year)
                            AzureWebAppData[key].EstimatedComputeCost_ASP3year = monthlyCostEstimate;
                    }
                }
            }
        }