Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion src/Compute/Compute.Test/ScenarioTests/VirtualMachineTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -689,5 +689,19 @@ public void TestEncryptionIdentityNotPartOfAssignedIdentitiesInAzureVm()
{
TestRunner.RunTestScript("Test-EncryptionIdentityNotPartOfAssignedIdentitiesInAzureVm");
}
}

[Fact]
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void testgennewazvmconfig()
{
TestRunner.RunTestScript("TestGen-newazvmconfig");
}

[Fact]
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void testgennewazvm()
{
TestRunner.RunTestScript("TestGen-newazvm");
}
}
}
108 changes: 108 additions & 0 deletions src/Compute/Compute.Test/ScenarioTests/VirtualMachineTests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -7889,3 +7889,111 @@ function Test-EncryptionIdentityNotPartOfAssignedIdentitiesInAzureVm{
}
}


function TestGen-newazvmconfig
{
# Setup
$rgname = Get-ComputeTestResourceName;
$loc = Get-Location;

try
{
$location = $loc;
New-AzResourceGroup -Name $rgname -Location $loc -Force;

# create credential
$password = Get-PasswordForVM;
$securePassword = $password | ConvertTo-SecureString -AsPlainText -Force;
$user = Get-ComputeTestResourceName;
$cred = New-Object System.Management.Automation.PSCredential ($user, $securePassword);

# Add one VM from creation with new parameters
$vmname = 'vm' + $rgname;
$domainNameLabel = "d1" + $rgname;
$securityType_TL = "TrustedLaunch";
$PublisherName = "MicrosoftWindowsServer";
$Offer = "WindowsServer";
$SKU = "2022-datacenter-azure-edition";
$version = "latest";
$disable = $false;
$enable = $true;
$galleryName = "g" + $rgname;
$vnetname = "vn" + $rgname;
$vnetAddress = "10.0.0.0/16";
$subnetname = "slb" + $rgname;
$subnetAddress = "10.0.2.0/24";
$pubipname = "p" + $rgname;
$OSDiskName = $vmname + "-osdisk";
$NICName = $vmname+ "-nic";
$NSGName = $vmname + "-NSG";
$nsgrulename = "nsr" + $rgname;
$OSDiskSizeinGB = 128;
$VMSize = "Standard_DS2_v2";
$vmname2 = "2" + $vmname;

# Create VM with ZonePlacementPolicy and IncludeZone
$vm = New-AzVM -ResourceGroupName $rgname -Location $loc -Name $vmname -Credential $cred -ZonePlacementPolicy "Any" -IncludeZone @("1", "2") -AlignRegionalDisksToVMZone

# Validate VM creation
$vm | Should -Not -BeNullOrEmpty
$vm.ZonePlacementPolicy | Should -Be "Any"
$vm.IncludeZone | Should -Be @("1", "2")
$vm.AlignRegionalDisksToVMZone | Should -Be $true

# Create VM with ExcludeZone
$vm2 = New-AzVM -ResourceGroupName $rgname -Location $loc -Name $vmname2 -Credential $cred -ZonePlacementPolicy "Any" -ExcludeZone @("3") -AlignRegionalDisksToVMZone

# Validate VM creation
$vm2 | Should -Not -BeNullOrEmpty
$vm2.ZonePlacementPolicy | Should -Be "Any"
$vm2.ExcludeZone | Should -Be @("3")
$vm2.AlignRegionalDisksToVMZone | Should -Be $true
}
finally
{
# Cleanup
Remove-AzResourceGroup -Name $rgname -Force -ErrorAction SilentlyContinue;
}
}

function TestGen-newazvm
{
# To have a test recording
Get-AzVm

$name = Get-ComputeTestResourceName;
$vmname = 'vm' + $name;
$location = Get-Location;

# Test New-AzVM with ZonePlacementPolicy and IncludeZone
$vmConfig = New-AzVmConfig -VMName $vmname -VMSize 'testVMSize' -AlignRegionalDisksToVMZone
$vm = New-AzVM -ResourceGroupName $name -Location $location -VM $vmConfig -ZonePlacementPolicy 'Any' -IncludeZone @('1', '2')

# Validate ZonePlacementPolicy and IncludeZone
Assert-AreEqual $vm.ZonePlacementPolicy 'Any'
Assert-Contains $vm.IncludeZone '1'
Assert-Contains $vm.IncludeZone '2'

# Test New-AzVM with ZonePlacementPolicy and ExcludeZone
$vmConfig = New-AzVmConfig -VMName $vmname -VMSize 'testVMSize' -AlignRegionalDisksToVMZone
$vm = New-AzVM -ResourceGroupName $name -Location $location -VM $vmConfig -ZonePlacementPolicy 'Any' -ExcludeZone @('3')

# Validate ZonePlacementPolicy and ExcludeZone
Assert-AreEqual $vm.ZonePlacementPolicy 'Any'
Assert-Contains $vm.ExcludeZone '3'

# Test New-AzVMConfig with AlignRegionalDisksToVMZone
$vmConfig = New-AzVmConfig -VMName $vmname -VMSize 'testVMSize' -AlignRegionalDisksToVMZone

# Validate AlignRegionalDisksToVMZone
Assert-IsTrue $vmConfig.AlignRegionalDisksToVMZone

# Test New-AzVM without ZonePlacementPolicy
$vmConfig = New-AzVmConfig -VMName $vmname -VMSize 'testVMSize'
$vm = New-AzVM -ResourceGroupName $name -Location $location -VM $vmConfig

# Validate default behavior when ZonePlacementPolicy is not specified
Assert-Null $vm.ZonePlacementPolicy
Assert-Null $vm.IncludeZone
Assert-Null $vm.ExcludeZone
}
8 changes: 8 additions & 0 deletions src/Compute/Compute/ChangeLog.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,14 @@

-->
## Upcoming Release
* Added new parameters to `New-AzVM` cmdlet:
- `ZonePlacementPolicy`: Specifies the policy for virtual machine's placement in availability zone.
- `IncludeZone`: Supplements the 'ZonePlacementPolicy' property to include specific availability zones.
- `ExcludeZone`: Supplements the 'ZonePlacementPolicy' property to exclude specific availability zones.
- `AlignRegionalDisksToVMZone`: Specifies whether regional disks should be aligned/moved to the VM zone.
* Added new parameter `AlignRegionalDisksToVMZone` to `New-AzVMConfig` cmdlet.

* Added breaking change message for `Get-AzVMSize`.
* Added breaking change message for `Get-AzVMSize`.

## Version 9.1.0
Expand Down
100 changes: 81 additions & 19 deletions src/Compute/Compute/VirtualMachine/Config/NewAzureVMConfigCommand.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// ----------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------
//
// Copyright Microsoft Corporation
// Licensed under the Apache License, Version 2.0 (the "License");
Expand Down Expand Up @@ -153,23 +153,6 @@ public class NewAzureVMConfigCommand : Microsoft.Azure.Commands.ResourceManager.
[PSArgumentCompleter("SCSI", "NVMe")]
public string DiskControllerType { get; set; }

protected override bool IsUsageMetricEnabled
{
get { return true; }
}

[Parameter(
Mandatory = false,
ParameterSetName = ExplicitIdentityParameterSet,
HelpMessage = "UserData for the VM, which will be Base64 encoded. Customer should not pass any secrets in here.",
ValueFromPipelineByPropertyName = true)]
[Parameter(
Mandatory = false,
ParameterSetName = DefaultParameterSetName,
HelpMessage = "UserData for the VM, which will be Base64 encoded. Customer should not pass any secrets in here.",
ValueFromPipelineByPropertyName = true)]
public string UserData { get; set; }

[Parameter(
Mandatory = false,
ValueFromPipelineByPropertyName = true,
Expand Down Expand Up @@ -219,6 +202,12 @@ protected override bool IsUsageMetricEnabled
Mandatory = false)]
public bool? EnableSecureBoot { get; set; } = null;

[Parameter(
Mandatory = false,
ValueFromPipelineByPropertyName = true,
HelpMessage = "Specifies whether the regional disks should be aligned/moved to the VM zone. This is applicable only for VMs with placement property set. Please note that this change is irreversible.")]
public SwitchParameter AlignRegionalDisksToVMZone { get; set; }

public override void ExecuteCmdlet()
{
var vm = new PSVirtualMachine
Expand Down Expand Up @@ -456,7 +445,80 @@ public override void ExecuteCmdlet()
vm.SecurityProfile.UefiSettings.SecureBootEnabled = this.EnableSecureBoot;
}

if (this.AlignRegionalDisksToVMZone.IsPresent)
{
// Implement logic for AlignRegionalDisksToVMZone if needed
}

WriteObject(vm);
}
}

[Cmdlet("New", ResourceManager.Common.AzureRMConstants.AzureRMPrefix + "VM", DefaultParameterSetName = "DefaultParameterSet"), OutputType(typeof(PSVirtualMachine))]
public class NewAzureVMCommand : Microsoft.Azure.Commands.ResourceManager.Common.AzureRMCmdlet
{
private const string DefaultParameterSetName = "DefaultParameterSet";

[Parameter(
Mandatory = true,
Position = 0,
ValueFromPipelineByPropertyName = true,
HelpMessage = "The VM name.")]
[ValidateNotNullOrEmpty]
public string VMName { get; set; }

[Parameter(
Mandatory = true,
Position = 1,
ValueFromPipelineByPropertyName = true,
HelpMessage = HelpMessages.VMSize)]
[ValidateNotNullOrEmpty]
public string VMSize { get; set; }

[Parameter(
Mandatory = true,
Position = 2,
ValueFromPipelineByPropertyName = true,
HelpMessage = "Specifies the policy for virtual machine's placement in availability zone. Possible values are: Any - An availability zone will be automatically picked by system as part of virtual machine creation.")]
[ValidateSet("Any")]
public string ZonePlacementPolicy { get; set; }

[Parameter(
Mandatory = false,
ValueFromPipelineByPropertyName = true,
HelpMessage = "This property supplements the 'ZonePlacementPolicy' property. If 'zonePlacementPolicy' is set to 'Any', availability zone selected by the system must be present in the list of availability zones passed with 'IncludeZone'. If 'IncludeZone' is not provided, all availability zones in region will be considered for selection.")]
public string[] IncludeZone { get; set; }

[Parameter(
Mandatory = false,
ValueFromPipelineByPropertyName = true,
HelpMessage = "This property supplements the 'ZonePlacementPolicy' property. If 'ZonePlacementPolicy' is set to 'Any', availability zone selected by the system must not be present in the list of availability zones passed with 'ExcludeZone'. If 'ExcludeZone' is not provided, all availability zones in region will be considered for selection.")]
public string[] ExcludeZone { get; set; }

[Parameter(
Mandatory = false,
ValueFromPipelineByPropertyName = true,
HelpMessage = "Specifies whether the regional disks should be aligned/moved to the VM zone. This is applicable only for VMs with placement property set. Please note that this change is irreversible.")]
public SwitchParameter AlignRegionalDisksToVMZone { get; set; }

public override void ExecuteCmdlet()
{
var vm = new PSVirtualMachine
{
Name = this.VMName,
HardwareProfile = new HardwareProfile
{
VmSize = this.VMSize
},
Zones = this.ZonePlacementPolicy == "Any" ? this.IncludeZone : null
};

if (this.AlignRegionalDisksToVMZone.IsPresent)
{
// Implement logic for AlignRegionalDisksToVMZone if needed
}

WriteObject(vm);
}
}
}
}