/// <summary> /// Retrieves VMs (number and type) that can be allocated on a Dedicated Host. /// </summary> /// <param name="token">Auth token.</param> /// <param name="azureEnvironment">Azure cloud.</param> /// <param name="tenantId">Tenant ID.</param> /// <param name="subscriptionId">Subscription ID.</param> /// <param name="resourceGroup">Resource group.</param> /// <param name="hostGroupName">Dedicated host group name.</param> /// <param name="dedicatedHost">Dedicated Host object.</param> /// <param name="dictionary">Dictionary object.</param> public virtual async Task GetAllocatableVmsOnHost( string token, AzureEnvironment azureEnvironment, string tenantId, string subscriptionId, string resourceGroup, string hostGroupName, DedicatedHost dedicatedHost, IDictionary <DedicatedHost, List <DedicatedHostAllocatableVM> > dictionary) { if (string.IsNullOrEmpty(token)) { throw new ArgumentNullException(nameof(token)); } if (azureEnvironment == null) { throw new ArgumentNullException(nameof(azureEnvironment)); } if (string.IsNullOrEmpty(tenantId)) { throw new ArgumentNullException(nameof(tenantId)); } var azureCredentials = new AzureCredentials( new TokenCredentials(token), new TokenCredentials(token), tenantId, azureEnvironment); var computeManagementClient = await _dhmComputeClient.GetComputeManagementClient( subscriptionId, azureCredentials, azureEnvironment); var dedicatedHostDetails = await computeManagementClient.DedicatedHosts.GetAsync( resourceGroup, hostGroupName, dedicatedHost.Name, InstanceViewTypes.InstanceView, default(CancellationToken)); var virtualMachineList = dedicatedHostDetails?.InstanceView?.AvailableCapacity?.AllocatableVMs?.ToList(); if (virtualMachineList == null) { _logger.LogError($"Could not get available VM list for {dedicatedHost.Id}"); return; } dictionary[dedicatedHost] = virtualMachineList; }
/// <summary> /// Creates a Dedicated Host Group. /// </summary> /// <param name="token">Auth token.</param> /// <param name="azureEnvironment">Azure cloud.</param> /// <param name="tenantId">Tenant ID.</param> /// <param name="subscriptionId">Subscription ID.</param> /// <param name="resourceGroup">Resource group.</param> /// <param name="dhgName">Dedicated Host group name.</param> /// <param name="azName">Availability zone.</param> /// <param name="platformFaultDomainCount">Fault domain count.</param> /// <param name="location">Location/region.</param> public async Task <AzureOperationResponse <DedicatedHostGroup> > CreateDedicatedHostGroup( string token, AzureEnvironment azureEnvironment, string tenantId, string subscriptionId, string resourceGroup, string dhgName, string azName, int platformFaultDomainCount, string location) { if (string.IsNullOrEmpty(token)) { throw new ArgumentNullException(nameof(token)); } if (azureEnvironment == null) { throw new ArgumentNullException(nameof(azureEnvironment)); } if (string.IsNullOrEmpty(tenantId)) { throw new ArgumentNullException(nameof(tenantId)); } if (string.IsNullOrEmpty(subscriptionId)) { throw new ArgumentException(nameof(subscriptionId)); } if (string.IsNullOrEmpty(resourceGroup)) { throw new ArgumentException(nameof(resourceGroup)); } if (string.IsNullOrEmpty(dhgName)) { throw new ArgumentException(nameof(dhgName)); } if (string.IsNullOrEmpty(location)) { throw new ArgumentException(nameof(location)); } var azureCredentials = new AzureCredentials( new TokenCredentials(token), new TokenCredentials(token), tenantId, azureEnvironment); var newDedicatedHostGroup = new DedicatedHostGroup() { Location = location, PlatformFaultDomainCount = platformFaultDomainCount }; if (!string.IsNullOrEmpty(azName)) { newDedicatedHostGroup.Zones = new List <string> { azName }; } var dhgCreateRetryCount = _config.DhgCreateRetryCount; var computeManagementClient = await _dhmComputeClient.GetComputeManagementClient( subscriptionId, azureCredentials, azureEnvironment); var response = new AzureOperationResponse <DedicatedHostGroup>(); await Policy .Handle <CloudException>() .WaitAndRetryAsync( dhgCreateRetryCount, r => TimeSpan.FromSeconds(2 * r), (ex, ts, r) => _logger.LogInformation( $"Create host group {dhgName} failed. Attempt #{r}/{dhgCreateRetryCount}. Will try again in {ts.TotalSeconds} seconds. Exception={ex}")) .ExecuteAsync(async() => { response = await computeManagementClient.DedicatedHostGroups.CreateOrUpdateWithHttpMessagesAsync( resourceGroup, dhgName, newDedicatedHostGroup, null, default(CancellationToken)); }); return(response); }