private async Task SendGroupCreationRequest()

in src/HttpRequestHelper/HttpClientHelper.cs [259:336]


        private async Task<HttpResponseMessage> SendGroupCreationRequest(UserInput userInputObj, KeyValuePair<string, List<string>> groupInformation)
        {
            if (userInputObj.CancellationContext.IsCancellationRequested)
                UtilityFunctions.InitiateCancellation(userInputObj);

            NumberOfTries++;
            AuthenticationResult authResult = null;
            HttpResponseMessage response;
            bool isException = false;
            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 + groupInformation.Key +
                             Routes.QueryStringQuestionMark +
                             Routes.QueryParameterApiVersion + Routes.QueryStringEquals + Routes.CreateGroupApiVersion;
                Uri baseAddress = new Uri(url);

                string clientRequestId = Guid.NewGuid().ToString();
                httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + authResult.AccessToken);
                httpClient.DefaultRequestHeaders.Add("x-ms-client-request-id", clientRequestId + "-" + workflow + "-azmigexp");

                CreateGroupBodyJSON createGroupJsonObj = new CreateGroupBodyJSON();

                if (userInputObj.AzureMigrateSourceAppliances.Contains("import"))
                    createGroupJsonObj.Properties.GroupType = "Import";
                
                string createGroupJsonBody = JsonConvert.SerializeObject(createGroupJsonObj);
                byte[] buffer = Encoding.UTF8.GetBytes(createGroupJsonBody);
                ByteArrayContent byteContent = new ByteArrayContent(buffer);
                byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

                response = await httpClient.PutAsync(baseAddress, byteContent);
            }
            catch (Exception exCreateGroup)
            {
                isException = true;
                if (NumberOfTries < HttpUtilities.MaxInformationDataRetries && HttpUtilities.IsRetryNeeded(null, exCreateGroup))
                {
                    userInputObj.LoggerObj.LogWarning($"HTTP PUT create group {groupInformation.Key} request error: {exCreateGroup.Message} Will try again after 1 minute");
                    Thread.Sleep(60000);
                    response = await SendGroupCreationRequest(userInputObj, groupInformation);
                }
                else
                    throw;
            }

            if (!isException)
            {
                if ((response == null || !response.IsSuccessStatusCode) && HttpUtilities.IsRetryNeeded(response, null) && NumberOfTries < HttpUtilities.MaxInformationDataRetries)
                {
                    userInputObj.LoggerObj.LogWarning($"HTTP PUT create group {groupInformation.Key} request failed: {response.StatusCode}: {response.Content} Will try again after 1 minute");
                    Thread.Sleep(60000);
                    response = await SendGroupCreationRequest(userInputObj, groupInformation);
                }
            }

            return response;
        }