async Task StrategyExecuteCmdletAsync(IAsyncCmdlet asyncCmdlet) { var client = new Client(DefaultProfile.DefaultContext); ResourceGroupName = ResourceGroupName ?? Name; VirtualNetworkName = VirtualNetworkName ?? Name; SubnetName = SubnetName ?? Name; PublicIpAddressName = PublicIpAddressName ?? Name; SecurityGroupName = SecurityGroupName ?? Name; var resourceClient = AzureSession.Instance.ClientFactory.CreateArmClient <ResourceManagementClient>( DefaultProfile.DefaultContext, AzureEnvironment.Endpoint.ResourceManager); var parameters = new Parameters(this, client, resourceClient); if (DiskFile != null) { if (!resourceClient.ResourceGroups.CheckExistence(ResourceGroupName)) { Location = Location ?? parameters.DefaultLocation; var st0 = resourceClient.ResourceGroups.CreateOrUpdate( ResourceGroupName, new ResourceGroup { Location = Location, Name = ResourceGroupName }); } parameters.ImageAndOsType = new ImageAndOsType( Linux ? OperatingSystemTypes.Linux : OperatingSystemTypes.Windows, null, null); var storageClient = AzureSession.Instance.ClientFactory.CreateArmClient <StorageManagementClient>( DefaultProfile.DefaultContext, AzureEnvironment.Endpoint.ResourceManager); var st1 = storageClient.StorageAccounts.Create( ResourceGroupName, Name, new StorageAccountCreateParameters { Sku = new Microsoft.Azure.Management.Storage.Version2017_10_01.Models.Sku { Name = SkuName.PremiumLRS }, Location = Location }); var filePath = new FileInfo(SessionState.Path.GetUnresolvedProviderPathFromPSPath(DiskFile)); using (var vds = new VirtualDiskStream(filePath.FullName)) { // 2 ^ 9 == 512 if (vds.DiskType == DiskType.Fixed && filePath.Length % 512 != 0) { throw new ArgumentOutOfRangeException( "filePath", string.Format("Given vhd file '{0}' is a corrupted fixed vhd", filePath)); } } var storageAccount = storageClient.StorageAccounts.GetProperties(ResourceGroupName, Name); // BlobUri destinationUri = null; BlobUri.TryParseUri( new Uri(string.Format( "{0}{1}/{2}{3}", storageAccount.PrimaryEndpoints.Blob, ResourceGroupName.ToLower(), Name.ToLower(), ".vhd")), out parameters.DestinationUri); if (parameters.DestinationUri?.Uri == null) { throw new ArgumentNullException("destinationUri"); } var storageCredentialsFactory = new StorageCredentialsFactory( ResourceGroupName, storageClient, DefaultContext.Subscription); var uploadParameters = new UploadParameters(parameters.DestinationUri, null, filePath, true, 2) { Cmdlet = this, BlobObjectFactory = new CloudPageBlobObjectFactory(storageCredentialsFactory, TimeSpan.FromMinutes(1)) }; if (!string.Equals( Environment.GetEnvironmentVariable("AZURE_TEST_MODE"), "Playback", StringComparison.OrdinalIgnoreCase)) { var st2 = VhdUploaderModel.Upload(uploadParameters); } } var result = await client.RunAsync(client.SubscriptionId, parameters, asyncCmdlet); if (result != null) { var fqdn = PublicIPAddressStrategy.Fqdn(DomainNameLabel, Location); var psResult = ComputeAutoMapperProfile.Mapper.Map <PSVirtualMachine>(result); psResult.FullyQualifiedDomainName = fqdn; var connectionString = parameters.ImageAndOsType.GetConnectionString( fqdn, Credential?.UserName); asyncCmdlet.WriteVerbose( Resources.VirtualMachineUseConnectionString, connectionString); asyncCmdlet.WriteObject(psResult); } }
public async Task <ResourceConfig <VirtualMachine> > CreateConfigAsync() { if (_cmdlet.DiskFile == null) { ImageAndOsType = await _client.UpdateImageAndOsTypeAsync( ImageAndOsType, _cmdlet.ResourceGroupName, _cmdlet.Image, Location); } _cmdlet.DomainNameLabel = await PublicIPAddressStrategy.UpdateDomainNameLabelAsync( domainNameLabel : _cmdlet.DomainNameLabel, name : _cmdlet.Name, location : Location, client : _client); var resourceGroup = ResourceGroupStrategy.CreateResourceGroupConfig(_cmdlet.ResourceGroupName); var virtualNetwork = resourceGroup.CreateVirtualNetworkConfig( name: _cmdlet.VirtualNetworkName, addressPrefix: _cmdlet.AddressPrefix); var subnet = virtualNetwork.CreateSubnet(_cmdlet.SubnetName, _cmdlet.SubnetAddressPrefix); var publicIpAddress = resourceGroup.CreatePublicIPAddressConfig( name: _cmdlet.PublicIpAddressName, domainNameLabel: _cmdlet.DomainNameLabel, allocationMethod: _cmdlet.AllocationMethod, sku: _cmdlet.Zone == null ? PublicIPAddressStrategy.Sku.Basic : PublicIPAddressStrategy.Sku.Standard, zones: _cmdlet.Zone); _cmdlet.OpenPorts = ImageAndOsType.UpdatePorts(_cmdlet.OpenPorts); var networkSecurityGroup = resourceGroup.CreateNetworkSecurityGroupConfig( name: _cmdlet.SecurityGroupName, openPorts: _cmdlet.OpenPorts); bool enableAcceleratedNetwork = Utils.DoesConfigSupportAcceleratedNetwork(_client, ImageAndOsType, _cmdlet.Size, Location, DefaultLocation); var networkInterface = resourceGroup.CreateNetworkInterfaceConfig( _cmdlet.Name, subnet, publicIpAddress, networkSecurityGroup, enableAcceleratedNetwork); var ppgSubResourceFunc = resourceGroup.CreateProximityPlacementGroupSubResourceFunc(_cmdlet.ProximityPlacementGroupId); var availabilitySet = _cmdlet.AvailabilitySetName == null ? null : resourceGroup.CreateAvailabilitySetConfig( name: _cmdlet.AvailabilitySetName, proximityPlacementGroup: ppgSubResourceFunc); if (_cmdlet.DiskFile == null) { return(resourceGroup.CreateVirtualMachineConfig( name: _cmdlet.Name, networkInterface: networkInterface, imageAndOsType: ImageAndOsType, adminUsername: _cmdlet.Credential.UserName, adminPassword: new NetworkCredential(string.Empty, _cmdlet.Credential.Password).Password, size: _cmdlet.Size, availabilitySet: availabilitySet, dataDisks: _cmdlet.DataDiskSizeInGb, zones: _cmdlet.Zone, ultraSSDEnabled: _cmdlet.EnableUltraSSD.IsPresent, identity: _cmdlet.GetVMIdentityFromArgs(), proximityPlacementGroup: ppgSubResourceFunc, hostId: _cmdlet.HostId, priority: _cmdlet.Priority, evictionPolicy: _cmdlet.EvictionPolicy, maxPrice: _cmdlet.IsParameterBound(c => c.MaxPrice) ? _cmdlet.MaxPrice : (double?)null )); } else { var disk = resourceGroup.CreateManagedDiskConfig( name: _cmdlet.Name, sourceUri: DestinationUri.Uri.ToString()); return(resourceGroup.CreateVirtualMachineConfig( name: _cmdlet.Name, networkInterface: networkInterface, osType: ImageAndOsType.OsType, disk: disk, size: _cmdlet.Size, availabilitySet: availabilitySet, dataDisks: _cmdlet.DataDiskSizeInGb, zones: _cmdlet.Zone, ultraSSDEnabled: _cmdlet.EnableUltraSSD.IsPresent, identity: _cmdlet.GetVMIdentityFromArgs(), proximityPlacementGroup: ppgSubResourceFunc, hostId: _cmdlet.HostId, priority: _cmdlet.Priority, evictionPolicy: _cmdlet.EvictionPolicy, maxPrice: _cmdlet.IsParameterBound(c => c.MaxPrice) ? _cmdlet.MaxPrice : (double?)null )); } }
async Task SimpleParameterSetExecuteCmdlet(IAsyncCmdlet asyncCmdlet) { bool loadBalancerNamePassedIn = !String.IsNullOrWhiteSpace(LoadBalancerName); ResourceGroupName = ResourceGroupName ?? VMScaleSetName; VirtualNetworkName = VirtualNetworkName ?? VMScaleSetName; SubnetName = SubnetName ?? VMScaleSetName; PublicIpAddressName = PublicIpAddressName ?? VMScaleSetName; SecurityGroupName = SecurityGroupName ?? VMScaleSetName; LoadBalancerName = LoadBalancerName ?? VMScaleSetName; FrontendPoolName = FrontendPoolName ?? VMScaleSetName; BackendPoolName = BackendPoolName ?? VMScaleSetName; var client = new Client(DefaultProfile.DefaultContext); var parameters = new Parameters(this, client); if (parameters?.ImageAndOsType?.Image?.Version?.ToLower() != "latest") { WriteWarning("You are deploying VMSS pinned to a specific image version from Azure Marketplace. \n" + "Consider using \"latest\" as the image version. This allows VMSS to auto upgrade when a newer version is available."); } // If the user did not specify a load balancer name, mark the LB setting to ignore // preexisting check. The most common scenario is users will let the cmdlet create and name the LB for them with the default // config. We do not want to block that scenario in case the cmdlet failed mid operation and tthe user kicks it off again. if (!loadBalancerNamePassedIn) { LoadBalancerStrategy.IgnorePreExistingConfigCheck = true; } else { LoadBalancerStrategy.IgnorePreExistingConfigCheck = false; } var result = await client.RunAsync(client.SubscriptionId, parameters, asyncCmdlet); if (result != null) { var fqdn = PublicIPAddressStrategy.Fqdn(DomainNameLabel, Location); var psObject = new PSVirtualMachineScaleSet(); ComputeAutomationAutoMapperProfile.Mapper.Map(result, psObject); psObject.FullyQualifiedDomainName = fqdn; var port = "<port>"; var connectionString = parameters.ImageAndOsType.GetConnectionString( fqdn, Credential.UserName, port); var range = FirstPortRangeStart.ToString() + ".." + (FirstPortRangeStart + InstanceCount * 2 - 1).ToString(); asyncCmdlet.WriteVerbose( Resources.VmssUseConnectionString, connectionString); asyncCmdlet.WriteVerbose( Resources.VmssPortRange, port, range); asyncCmdlet.WriteObject(psObject); } }
private async Task <ResourceConfig <VirtualMachineScaleSet> > SimpleParameterSetOrchestrationModeFlexible() { //check omode params and throw error otherwise checkFlexibleOrchestrationModeParams(); int platformFaultDomainCountFlexibleDefault = 1; SwitchParameter singlePlacementGroupFlexibleDefault = false; ImageAndOsType = await _client.UpdateImageAndOsTypeAsync( ImageAndOsType, _cmdlet.ResourceGroupName, _cmdlet.ImageName, Location); // generate a domain name label if it's not specified. _cmdlet.DomainNameLabel = await PublicIPAddressStrategy.UpdateDomainNameLabelAsync( domainNameLabel : _cmdlet.DomainNameLabel, name : _cmdlet.VMScaleSetName, location : Location, client : _client); var resourceGroup = ResourceGroupStrategy.CreateResourceGroupConfig(_cmdlet.ResourceGroupName); var noZones = _cmdlet.Zone == null || _cmdlet.Zone.Count == 0; var publicIpAddress = resourceGroup.CreatePublicIPAddressConfig( name: _cmdlet.PublicIpAddressName, edgeZone: _cmdlet.EdgeZone, domainNameLabel: _cmdlet.DomainNameLabel, allocationMethod: _cmdlet.AllocationMethod, //sku.Basic is not compatible with multiple placement groups sku: (noZones && _cmdlet.SinglePlacementGroup.IsPresent) ? PublicIPAddressStrategy.Sku.Basic : PublicIPAddressStrategy.Sku.Standard, zones: null); var virtualNetwork = resourceGroup.CreateVirtualNetworkConfig( name: _cmdlet.VirtualNetworkName, edgeZone: _cmdlet.EdgeZone, addressPrefix: _cmdlet.VnetAddressPrefix); var subnet = virtualNetwork.CreateSubnet( _cmdlet.SubnetName, _cmdlet.SubnetAddressPrefix); var loadBalancer = resourceGroup.CreateLoadBalancerConfig( name: _cmdlet.LoadBalancerName, //sku.Basic is not compatible with multiple placement groups sku: (noZones && _cmdlet.SinglePlacementGroup.IsPresent) ? LoadBalancerStrategy.Sku.Basic : LoadBalancerStrategy.Sku.Standard); var frontendIpConfiguration = loadBalancer.CreateFrontendIPConfiguration( name: _cmdlet.FrontendPoolName, publicIpAddress: publicIpAddress); var backendAddressPool = loadBalancer.CreateBackendAddressPool( name: _cmdlet.BackendPoolName); if (_cmdlet.BackendPort != null) { var loadBalancingRuleName = _cmdlet.LoadBalancerName; foreach (var backendPort in _cmdlet.BackendPort) { loadBalancer.CreateLoadBalancingRule( name: loadBalancingRuleName + backendPort.ToString(), fronendIpConfiguration: frontendIpConfiguration, backendAddressPool: backendAddressPool, frontendPort: backendPort, backendPort: backendPort); } } _cmdlet.NatBackendPort = ImageAndOsType.UpdatePorts(_cmdlet.NatBackendPort); var networkSecurityGroup = noZones ? null : resourceGroup.CreateNetworkSecurityGroupConfig( _cmdlet.VMScaleSetName, _cmdlet.NatBackendPort.Concat(_cmdlet.BackendPort).ToList()); var proximityPlacementGroup = resourceGroup.CreateProximityPlacementGroupSubResourceFunc(_cmdlet.ProximityPlacementGroupId); var hostGroup = resourceGroup.CreateDedicatedHostGroupSubResourceFunc(_cmdlet.HostGroupId); return(resourceGroup.CreateVirtualMachineScaleSetConfigOrchestrationModeFlexible( name: _cmdlet.VMScaleSetName, subnet: subnet, backendAdressPool: backendAddressPool, networkSecurityGroup: networkSecurityGroup, imageAndOsType: ImageAndOsType, adminUsername: _cmdlet.Credential.UserName, adminPassword: new NetworkCredential(string.Empty, _cmdlet.Credential.Password).Password, vmSize: _cmdlet.VmSize, instanceCount: _cmdlet.InstanceCount, dataDisks: _cmdlet.DataDiskSizeInGb, zones: _cmdlet.Zone, ultraSSDEnabled: _cmdlet.EnableUltraSSD.IsPresent, identity: _cmdlet.GetVmssIdentityFromArgs(), singlePlacementGroup: singlePlacementGroupFlexibleDefault, proximityPlacementGroup: proximityPlacementGroup, hostGroup: hostGroup, priority: _cmdlet.Priority, evictionPolicy: _cmdlet.EvictionPolicy, maxPrice: _cmdlet.IsParameterBound(c => c.MaxPrice) ? _cmdlet.MaxPrice : (double?)null, scaleInPolicy: _cmdlet.ScaleInPolicy, doNotRunExtensionsOnOverprovisionedVMs: _cmdlet.SkipExtensionsOnOverprovisionedVMs.IsPresent, encryptionAtHost: _cmdlet.EncryptionAtHost.IsPresent, platformFaultDomainCount: platformFaultDomainCountFlexibleDefault, edgeZone: _cmdlet.EdgeZone, orchestrationMode: _cmdlet.IsParameterBound(c => c.OrchestrationMode) ? _cmdlet.OrchestrationMode : null, capacityReservationId: _cmdlet.IsParameterBound(c => c.CapacityReservationGroupId) ? _cmdlet.CapacityReservationGroupId : null )); }
private async Task <ResourceConfig <VirtualMachineScaleSet> > SimpleParameterSetNormalMode() { ImageAndOsType = await _client.UpdateImageAndOsTypeAsync( ImageAndOsType, _cmdlet.ResourceGroupName, _cmdlet.ImageName, Location); // generate a domain name label if it's not specified. _cmdlet.DomainNameLabel = await PublicIPAddressStrategy.UpdateDomainNameLabelAsync( domainNameLabel : _cmdlet.DomainNameLabel, name : _cmdlet.VMScaleSetName, location : Location, client : _client); var resourceGroup = ResourceGroupStrategy.CreateResourceGroupConfig(_cmdlet.ResourceGroupName); var noZones = _cmdlet.Zone == null || _cmdlet.Zone.Count == 0; var publicIpAddress = resourceGroup.CreatePublicIPAddressConfig( name: _cmdlet.PublicIpAddressName, edgeZone: _cmdlet.EdgeZone, domainNameLabel: _cmdlet.DomainNameLabel, allocationMethod: _cmdlet.AllocationMethod, //sku.Basic is not compatible with multiple placement groups sku: (noZones && _cmdlet.SinglePlacementGroup.IsPresent) ? PublicIPAddressStrategy.Sku.Basic : PublicIPAddressStrategy.Sku.Standard, zones: null); var virtualNetwork = resourceGroup.CreateVirtualNetworkConfig( name: _cmdlet.VirtualNetworkName, edgeZone: _cmdlet.EdgeZone, addressPrefix: _cmdlet.VnetAddressPrefix); var subnet = virtualNetwork.CreateSubnet( _cmdlet.SubnetName, _cmdlet.SubnetAddressPrefix); var loadBalancer = resourceGroup.CreateLoadBalancerConfig( name: _cmdlet.LoadBalancerName, //sku.Basic is not compatible with multiple placement groups sku: (noZones && _cmdlet.SinglePlacementGroup.IsPresent) ? LoadBalancerStrategy.Sku.Basic : LoadBalancerStrategy.Sku.Standard); var frontendIpConfiguration = loadBalancer.CreateFrontendIPConfiguration( name: _cmdlet.FrontendPoolName, publicIpAddress: publicIpAddress); var backendAddressPool = loadBalancer.CreateBackendAddressPool( name: _cmdlet.BackendPoolName); if (_cmdlet.BackendPort != null) { var loadBalancingRuleName = _cmdlet.LoadBalancerName; foreach (var backendPort in _cmdlet.BackendPort) { loadBalancer.CreateLoadBalancingRule( name: loadBalancingRuleName + backendPort.ToString(), fronendIpConfiguration: frontendIpConfiguration, backendAddressPool: backendAddressPool, frontendPort: backendPort, backendPort: backendPort); } } _cmdlet.NatBackendPort = ImageAndOsType.UpdatePorts(_cmdlet.NatBackendPort); var inboundNatPoolName = _cmdlet.VMScaleSetName; var PortRangeSize = _cmdlet.InstanceCount * 2; var ports = _cmdlet .NatBackendPort ?.Select((port, i) => Tuple.Create( port, FirstPortRangeStart + i * 2000)) .ToList(); var inboundNatPools = ports ?.Select(p => loadBalancer.CreateInboundNatPool( name: inboundNatPoolName + p.Item1.ToString(), frontendIpConfiguration: frontendIpConfiguration, frontendPortRangeStart: p.Item2, frontendPortRangeEnd: p.Item2 + PortRangeSize, backendPort: p.Item1)) .ToList(); var networkSecurityGroup = noZones ? null : resourceGroup.CreateNetworkSecurityGroupConfig( _cmdlet.VMScaleSetName, _cmdlet.NatBackendPort.Concat(_cmdlet.BackendPort).ToList()); var proximityPlacementGroup = resourceGroup.CreateProximityPlacementGroupSubResourceFunc(_cmdlet.ProximityPlacementGroupId); var hostGroup = resourceGroup.CreateDedicatedHostGroupSubResourceFunc(_cmdlet.HostGroupId); if (_cmdlet.IsParameterBound(c => c.UserData)) { if (!ValidateBase64EncodedString.ValidateStringIsBase64Encoded(_cmdlet.UserData)) { _cmdlet.UserData = ValidateBase64EncodedString.EncodeStringToBase64(_cmdlet.UserData); _cmdlet.WriteInformation(ValidateBase64EncodedString.UserDataEncodeNotification, new string[] { "PSHOST" }); } } Dictionary <string, List <string> > auxAuthHeader = null; if (!string.IsNullOrEmpty(_cmdlet.ImageReferenceId)) { var resourceId = ResourceId.TryParse(_cmdlet.ImageReferenceId); if (string.Equals(ComputeStrategy.Namespace, resourceId?.ResourceType?.Namespace, StringComparison.OrdinalIgnoreCase) && string.Equals("galleries", resourceId?.ResourceType?.Provider, StringComparison.OrdinalIgnoreCase) && !string.Equals(_cmdlet.ComputeClient?.ComputeManagementClient?.SubscriptionId, resourceId?.SubscriptionId, StringComparison.OrdinalIgnoreCase)) { List <string> resourceIds = new List <string>(); resourceIds.Add(_cmdlet.ImageReferenceId); var auxHeaderDictionary = _cmdlet.GetAuxilaryAuthHeaderFromResourceIds(resourceIds); if (auxHeaderDictionary != null && auxHeaderDictionary.Count > 0) { auxAuthHeader = new Dictionary <string, List <string> >(auxHeaderDictionary); } } } return(resourceGroup.CreateVirtualMachineScaleSetConfig( name: _cmdlet.VMScaleSetName, subnet: subnet, backendAdressPool: backendAddressPool, inboundNatPools: inboundNatPools, networkSecurityGroup: networkSecurityGroup, imageAndOsType: ImageAndOsType, adminUsername: _cmdlet.Credential.UserName, adminPassword: new NetworkCredential(string.Empty, _cmdlet.Credential.Password).Password, vmSize: _cmdlet.VmSize, instanceCount: _cmdlet.InstanceCount, upgradeMode: _cmdlet.MyInvocation.BoundParameters.ContainsKey(nameof(UpgradePolicyMode)) ? _cmdlet.UpgradePolicyMode : (UpgradeMode?)null, dataDisks: _cmdlet.DataDiskSizeInGb, zones: _cmdlet.Zone, ultraSSDEnabled: _cmdlet.EnableUltraSSD.IsPresent, identity: _cmdlet.GetVmssIdentityFromArgs(), singlePlacementGroup: _cmdlet.SinglePlacementGroup.IsPresent, proximityPlacementGroup: proximityPlacementGroup, hostGroup: hostGroup, priority: _cmdlet.Priority, evictionPolicy: _cmdlet.EvictionPolicy, maxPrice: _cmdlet.IsParameterBound(c => c.MaxPrice) ? _cmdlet.MaxPrice : (double?)null, scaleInPolicy: _cmdlet.ScaleInPolicy, doNotRunExtensionsOnOverprovisionedVMs: _cmdlet.SkipExtensionsOnOverprovisionedVMs.IsPresent, encryptionAtHost: _cmdlet.EncryptionAtHost.IsPresent, platformFaultDomainCount: _cmdlet.IsParameterBound(c => c.PlatformFaultDomainCount) ? _cmdlet.PlatformFaultDomainCount : (int?)null, edgeZone: _cmdlet.EdgeZone, orchestrationMode: _cmdlet.IsParameterBound(c => c.OrchestrationMode) ? _cmdlet.OrchestrationMode : null, capacityReservationId: _cmdlet.IsParameterBound(c => c.CapacityReservationGroupId) ? _cmdlet.CapacityReservationGroupId : null, userData: _cmdlet.IsParameterBound(c => c.UserData) ? _cmdlet.UserData : null, imageReferenceId: _cmdlet.IsParameterBound(c => c.ImageReferenceId) ? _cmdlet.ImageReferenceId : null, auxAuthHeader: auxAuthHeader )); }
public async Task <ResourceConfig <VirtualMachineScaleSet> > CreateConfigAsync() { ImageAndOsType = await _client.UpdateImageAndOsTypeAsync( ImageAndOsType, _cmdlet.ResourceGroupName, _cmdlet.ImageName, Location); // generate a domain name label if it's not specified. _cmdlet.DomainNameLabel = await PublicIPAddressStrategy.UpdateDomainNameLabelAsync( domainNameLabel : _cmdlet.DomainNameLabel, name : _cmdlet.VMScaleSetName, location : Location, client : _client); var resourceGroup = ResourceGroupStrategy.CreateResourceGroupConfig(_cmdlet.ResourceGroupName); var noZones = _cmdlet.Zone == null || _cmdlet.Zone.Count == 0; var publicIpAddress = resourceGroup.CreatePublicIPAddressConfig( name: _cmdlet.PublicIpAddressName, domainNameLabel: _cmdlet.DomainNameLabel, allocationMethod: _cmdlet.AllocationMethod, //sku.Basic is not compatible with multiple placement groups sku: (noZones && _cmdlet.SinglePlacementGroup.IsPresent) ? PublicIPAddressStrategy.Sku.Basic : PublicIPAddressStrategy.Sku.Standard, zones: null); var virtualNetwork = resourceGroup.CreateVirtualNetworkConfig( name: _cmdlet.VirtualNetworkName, addressPrefix: _cmdlet.VnetAddressPrefix); var subnet = virtualNetwork.CreateSubnet( _cmdlet.SubnetName, _cmdlet.SubnetAddressPrefix); var loadBalancer = resourceGroup.CreateLoadBalancerConfig( name: _cmdlet.LoadBalancerName, //sku.Basic is not compatible with multiple placement groups sku: (noZones && _cmdlet.SinglePlacementGroup.IsPresent) ? LoadBalancerStrategy.Sku.Basic : LoadBalancerStrategy.Sku.Standard); var frontendIpConfiguration = loadBalancer.CreateFrontendIPConfiguration( name: _cmdlet.FrontendPoolName, publicIpAddress: publicIpAddress); var backendAddressPool = loadBalancer.CreateBackendAddressPool( name: _cmdlet.BackendPoolName); if (_cmdlet.BackendPort != null) { var loadBalancingRuleName = _cmdlet.LoadBalancerName; foreach (var backendPort in _cmdlet.BackendPort) { loadBalancer.CreateLoadBalancingRule( name: loadBalancingRuleName + backendPort.ToString(), fronendIpConfiguration: frontendIpConfiguration, backendAddressPool: backendAddressPool, frontendPort: backendPort, backendPort: backendPort); } } _cmdlet.NatBackendPort = ImageAndOsType.UpdatePorts(_cmdlet.NatBackendPort); var inboundNatPoolName = _cmdlet.VMScaleSetName; var PortRangeSize = _cmdlet.InstanceCount * 2; var ports = _cmdlet .NatBackendPort ?.Select((port, i) => Tuple.Create( port, FirstPortRangeStart + i * 2000)) .ToList(); var inboundNatPools = ports ?.Select(p => loadBalancer.CreateInboundNatPool( name: inboundNatPoolName + p.Item1.ToString(), frontendIpConfiguration: frontendIpConfiguration, frontendPortRangeStart: p.Item2, frontendPortRangeEnd: p.Item2 + PortRangeSize, backendPort: p.Item1)) .ToList(); var networkSecurityGroup = noZones ? null : resourceGroup.CreateNetworkSecurityGroupConfig( _cmdlet.VMScaleSetName, _cmdlet.NatBackendPort.Concat(_cmdlet.BackendPort).ToList()); var proximityPlacementGroup = resourceGroup.CreateProximityPlacementGroupSubResourceFunc(_cmdlet.ProximityPlacementGroup); return(resourceGroup.CreateVirtualMachineScaleSetConfig( name: _cmdlet.VMScaleSetName, subnet: subnet, backendAdressPool: backendAddressPool, inboundNatPools: inboundNatPools, networkSecurityGroup: networkSecurityGroup, imageAndOsType: ImageAndOsType, adminUsername: _cmdlet.Credential.UserName, adminPassword: new NetworkCredential(string.Empty, _cmdlet.Credential.Password).Password, vmSize: _cmdlet.VmSize, instanceCount: _cmdlet.InstanceCount, upgradeMode: _cmdlet.MyInvocation.BoundParameters.ContainsKey(nameof(UpgradePolicyMode)) ? _cmdlet.UpgradePolicyMode : (UpgradeMode?)null, dataDisks: _cmdlet.DataDiskSizeInGb, zones: _cmdlet.Zone, ultraSSDEnabled: _cmdlet.EnableUltraSSD.IsPresent, identity: _cmdlet.GetVmssIdentityFromArgs(), singlePlacementGroup: _cmdlet.SinglePlacementGroup.IsPresent, proximityPlacementGroup: proximityPlacementGroup, priority: _cmdlet.Priority, evictionPolicy: _cmdlet.EvictionPolicy, maxPrice: _cmdlet.IsParameterBound(c => c.MaxPrice) ? _cmdlet.MaxPrice : (double?)null, scaleInPolicy: _cmdlet.ScaleInPolicy, doNotRunExtensionsOnOverprovisionedVMs: _cmdlet.SkipExtensionsOnOverprovisionedVMs.IsPresent )); }