public async Task <IActionResult> TestDhmConcurrentVmCreation(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            var parameters = req.GetQueryParameterDictionary();

            if (!parameters.ContainsKey(ResourceGroupName) || string.IsNullOrEmpty(parameters[ResourceGroupName]))
            {
                return(new BadRequestObjectResult("Resource group name was missing in the query parameters."));
            }

            if (!parameters.ContainsKey(HostGroupName) || string.IsNullOrEmpty(parameters[HostGroupName]))
            {
                return(new BadRequestObjectResult("Host group name was missing in the query parameters."));
            }

            if (!parameters.ContainsKey(VmCount) || string.IsNullOrEmpty(parameters[VmCount]))
            {
                return(new BadRequestObjectResult("VmCount was missing in the query parameters."));
            }

            if (!parameters.ContainsKey(VmSku) || string.IsNullOrEmpty(parameters[VmSku]))
            {
                return(new BadRequestObjectResult("VM SKU was missing in the query parameters."));
            }

            var authEndpoint       = _configuration["AuthEndpoint"];
            var azureRmEndpoint    = _configuration["AzureRmEndpoint"];
            var location           = _configuration["Location"];
            var virtualMachineSize = parameters[VmSku];
            var numVirtualMachines = int.Parse(parameters[VmCount]);
            var tenantId           = _configuration["TenantId"];
            var clientId           = _configuration["ClientId"];
            var clientSecret       = _configuration["FairfaxClientSecret"];
            var subscriptionId     = _configuration["SubscriptionId"];
            var resourceGroupName  = parameters[ResourceGroupName];
            var hostGroupName      = parameters[HostGroupName];

            log.LogInformation($"Generating auth token...");

            var token = await TokenHelper.GetToken(
                authEndpoint,
                azureRmEndpoint,
                tenantId,
                clientId,
                clientSecret);

            var customTokenProvider = new AzureCredentials(
                new TokenCredentials(token),
                new TokenCredentials(token),
                tenantId,
                AzureEnvironment.FromName(_configuration["CloudName"]));
            var client = RestClient
                         .Configure()
                         .WithEnvironment(AzureEnvironment.FromName(_configuration["CloudName"]))
                         .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
                         .WithCredentials(customTokenProvider)
                         .Build();

            var azure = Azure.Authenticate(client, tenantId).WithSubscription(subscriptionId);
            var computeManagementClient = new ComputeManagementClient(customTokenProvider)
            {
                SubscriptionId = subscriptionId,
                BaseUri        = new Uri(_configuration["ResourceManagerUri"]),
                LongRunningOperationRetryTimeout = 5
            };

            log.LogInformation($"Creating resource group ({resourceGroupName}), if needed");
            var resourceGroup = azure.ResourceGroups.Define(resourceGroupName)
                                .WithRegion(location)
                                .Create();

            log.LogInformation($"Creating host group ({hostGroupName}), if needed");
            var newDedicatedHostGroup = new DedicatedHostGroup()
            {
                Location = location,
                PlatformFaultDomainCount = 1
            };
            await computeManagementClient.DedicatedHostGroups.CreateOrUpdateAsync(
                resourceGroupName,
                hostGroupName,
                newDedicatedHostGroup);

            var taskList        = new List <Task <HttpResponseMessage> >();
            var inputDictionary = new Dictionary <string, StringContent>();

            for (var i = 0; i < numVirtualMachines; i++)
            {
                var vmName = $"vm{i}-{new Random().Next(1, 10000)}";

                log.LogInformation($"Configuring (not provisioning) VM: {vmName}");
                var virtualMachine = CreateVmHelper.CreateVirtualMachine(
                    computeManagementClient,
                    azure,
                    Region.Create(location),
                    resourceGroupName,
                    vmName,
                    virtualMachineSize,
                    null,
                    "pip-" + Guid.NewGuid(),
                    "adh-poc-vnet",
                    "nic-" + Guid.NewGuid());

#if DEBUG
                var createVmUri =
                    $"http://localhost:7071/api/CreateVm" +
                    $"?token={token}" +
                    $"&cloudName={_configuration["CloudName"]}" +
                    $"&tenantId={tenantId}" +
                    $"&subscriptionId={subscriptionId}" +
                    $"&resourceGroup={resourceGroupName}" +
                    $"&location={location}" +
                    $"&vmSku={virtualMachineSize}" +
                    $"&vmName={vmName}" +
                    $"&dedicatedHostGroupName={hostGroupName}" +
                    $"&platformFaultDomainCount=1";
#else
                var createVmUri =
                    _configuration["DhmCreateVmnUri"] +
                    $"&token={token}" +
                    $"&cloudName={_configuration["CloudName"]}" +
                    $"&tenantId={tenantId}" +
                    $"&subscriptionId={subscriptionId}" +
                    $"&resourceGroup={resourceGroupName}" +
                    $"&location={location}" +
                    $"&vmSku={virtualMachineSize}" +
                    $"&vmName={vmName}" +
                    $"&dedicatedHostGroupName={hostGroupName}" +
                    $"&platformFaultDomainCount=1";
#endif
                var httpContent = new StringContent(JsonConvert.SerializeObject(virtualMachine), Encoding.UTF8, "application/json");
                inputDictionary[createVmUri] = httpContent;
            }

            foreach (var item in inputDictionary)
            {
                taskList.Add(_httpClient.PostAsync(item.Key, item.Value));
            }

            await Task.WhenAll(taskList);

            return(new OkObjectResult($"VM provisioning kicked off successfully for {numVirtualMachines} VMs - exiting."));
        }
        public static async Task Main(string[] args)
        {
            var config = new ConfigurationBuilder()
                         .SetBasePath(Directory.GetCurrentDirectory())
                         .AddUserSecrets <DedicatedHostsManagerConsoleClient>()
                         .Build();

            var resourceGroupName  = config["ResourceGroupName"];
            var authEndpoint       = config["AuthEndpoint"];
            var azureRmEndpoint    = config["AzureRmEndpoint"];
            var location           = config["Location"];
            var virtualMachineSize = config["VirtualMachineSize"];
            var numVirtualMachines = int.Parse(config["NumVirtualMachines"]);
            var tenantId           = config["TenantId"];
            var clientId           = config["ClientId"];
            var clientSecret       = config["FairfaxClientSecret"];
            var subscriptionId     = config["SubscriptionId"];
            var hostGroupName      = config["HostGroupName"];

            var token = await TokenHelper.GetToken(
                authEndpoint,
                azureRmEndpoint,
                tenantId,
                clientId,
                clientSecret);

            var customTokenProvider = new AzureCredentials(
                new TokenCredentials(token),
                new TokenCredentials(token),
                tenantId,
                AzureEnvironment.FromName(config["CloudName"]));
            var client = RestClient
                         .Configure()
                         .WithEnvironment(AzureEnvironment.FromName(config["CloudName"]))
                         .WithLogLevel(HttpLoggingDelegatingHandler.Level.Basic)
                         .WithCredentials(customTokenProvider)
                         .Build();

            var azure = Azure.Authenticate(client, tenantId).WithSubscription(subscriptionId);
            var computeManagementClient = new ComputeManagementClient(customTokenProvider)
            {
                SubscriptionId = subscriptionId,
                BaseUri        = new Uri(config["ResourceManagerUri"]),
                LongRunningOperationRetryTimeout = 5
            };

            var resourceGroup = azure.ResourceGroups.Define(resourceGroupName)
                                .WithRegion(location)
                                .Create();

            var newDedicatedHostGroup = new DedicatedHostGroup()
            {
                Location = location,
                PlatformFaultDomainCount = 1
            };

            await computeManagementClient.DedicatedHostGroups.CreateOrUpdateAsync(
                resourceGroupName,
                hostGroupName,
                newDedicatedHostGroup);

            var taskList        = new List <Task <HttpResponseMessage> >();
            var inputDictionary = new Dictionary <string, StringContent>();

            for (var i = 0; i < numVirtualMachines; i++)
            {
                var vmName         = $"vm{i}-{new Random().Next(1,10000)}";
                var virtualMachine = CreateVmHelper.CreateVirtualMachine(
                    computeManagementClient,
                    azure,
                    Region.Create(location),
                    resourceGroupName,
                    vmName,
                    virtualMachineSize,
                    null,
                    "pip-" + Guid.NewGuid(),
                    "adh-poc-vnet",
                    "nic-" + Guid.NewGuid());

#if DEBUG
                var createVmUri =
                    $"http://localhost:7071/api/CreateVm" +
                    $"?token={token}" +
                    $"&cloudName={config["CloudName"]}" +
                    $"&tenantId={tenantId}" +
                    $"&subscriptionId={subscriptionId}" +
                    $"&resourceGroup={resourceGroupName}" +
                    $"&location={location}" +
                    $"&vmSku={virtualMachineSize}" +
                    $"&vmName={vmName}" +
                    $"&dedicatedHostGroupName={hostGroupName}" +
                    $"&platformFaultDomainCount=1";
#else
                var createVmUri =
                    config["DhmCreateVmnUri"] +
                    $"&token={token}" +
                    $"&cloudName={config["CloudName"]}" +
                    $"&tenantId={tenantId}" +
                    $"&subscriptionId={subscriptionId}" +
                    $"&resourceGroup={resourceGroupName}" +
                    $"&location={location}" +
                    $"&vmSku={virtualMachineSize}" +
                    $"&vmName={vmName}" +
                    $"&dedicatedHostGroupName={hostGroupName}" +
                    $"&platformFaultDomainCount=1";
#endif
                var httpContent = new StringContent(JsonConvert.SerializeObject(virtualMachine), Encoding.UTF8, "application/json");
                inputDictionary[createVmUri] = httpContent;
            }

            foreach (var item in inputDictionary)
            {
                taskList.Add(HttpClient.PostAsync(item.Key, item.Value));
            }

            var results = await Task.WhenAll(taskList);
        }