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); }