From b179accbfb1e29673f718b688c0c7cc91978bc67 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 17 Nov 2025 14:40:39 +0000 Subject: [PATCH 1/2] Initial plan From 26b66f2c45dc85f3ce61a89dd41c220b1ece5cc2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 17 Nov 2025 14:50:41 +0000 Subject: [PATCH 2/2] Add Disk Availability Policy support to Az.Compute cmdlets Co-authored-by: audreyttt <225061541+audreyttt@users.noreply.github.com> --- .../Compute.Test/ScenarioTests/DiskRPTests.cs | 7 +++ .../ScenarioTests/DiskRPTests.ps1 | 58 +++++++++++++++++++ src/Compute/Compute/ChangeLog.md | 4 ++ .../Config/NewAzureRmDiskConfigCommand.cs | 10 +++- .../NewAzureRmDiskUpdateConfigCommand.cs | 10 +++- .../Compute/Generated/Models/PSDisk.cs | 1 + .../Compute/Generated/Models/PSDiskUpdate.cs | 1 + 7 files changed, 89 insertions(+), 2 deletions(-) diff --git a/src/Compute/Compute.Test/ScenarioTests/DiskRPTests.cs b/src/Compute/Compute.Test/ScenarioTests/DiskRPTests.cs index 240b600e3daf..227781c5120f 100644 --- a/src/Compute/Compute.Test/ScenarioTests/DiskRPTests.cs +++ b/src/Compute/Compute.Test/ScenarioTests/DiskRPTests.cs @@ -219,5 +219,12 @@ public void TestDiskSupportedSecurityOption() { TestRunner.RunTestScript("Test-SupportedSecurityOption"); } + + [Fact] + [Trait(Category.AcceptanceType, Category.CheckIn)] + public void TestDiskAvailabilityPolicy() + { + TestRunner.RunTestScript("Test-DiskAvailabilityPolicy"); + } } } diff --git a/src/Compute/Compute.Test/ScenarioTests/DiskRPTests.ps1 b/src/Compute/Compute.Test/ScenarioTests/DiskRPTests.ps1 index 67cfeee308f6..0512a92173e3 100644 --- a/src/Compute/Compute.Test/ScenarioTests/DiskRPTests.ps1 +++ b/src/Compute/Compute.Test/ScenarioTests/DiskRPTests.ps1 @@ -1983,3 +1983,61 @@ function Test-SupportedSecurityOption Clean-ResourceGroup $rgname } } + +<# +.SYNOPSIS +Testing disk availability policy +#> +function Test-DiskAvailabilityPolicy +{ + # Setup + $rgname = Get-ComputeTestResourceName; + $diskname = 'disk' + $rgname; + + try + { + # Common + $loc = Get-ComputeVMLocation; + New-AzResourceGroup -Name $rgname -Location $loc -Force; + + # Test disk config with AvailabilityPolicy set to None + $diskconfig = New-AzDiskConfig -Location $loc -DiskSizeGB 5 -SkuName Standard_LRS -OsType Windows -CreateOption Empty -ActionOnDiskDelay 'None'; + Assert-NotNull $diskconfig.AvailabilityPolicy; + Assert-AreEqual 'None' $diskconfig.AvailabilityPolicy.ActionOnDiskDelay; + + # Create disk with AvailabilityPolicy + $job = New-AzDisk -ResourceGroupName $rgname -DiskName $diskname -Disk $diskconfig -AsJob; + $result = $job | Wait-Job; + Assert-AreEqual "Completed" $result.State; + + # Get disk and verify AvailabilityPolicy + $disk = Get-AzDisk -ResourceGroupName $rgname -DiskName $diskname; + Assert-NotNull $disk.AvailabilityPolicy; + Assert-AreEqual 'None' $disk.AvailabilityPolicy.ActionOnDiskDelay; + + # Test update config with AvailabilityPolicy set to AutomaticReattach + $updateconfig = New-AzDiskUpdateConfig -ActionOnDiskDelay 'AutomaticReattach'; + Assert-NotNull $updateconfig.AvailabilityPolicy; + Assert-AreEqual 'AutomaticReattach' $updateconfig.AvailabilityPolicy.ActionOnDiskDelay; + + # Update disk with new AvailabilityPolicy + $job = Update-AzDisk -ResourceGroupName $rgname -DiskName $diskname -Disk $updateconfig -AsJob; + $result = $job | Wait-Job; + Assert-AreEqual "Completed" $result.State; + + # Verify the update + $disk = Get-AzDisk -ResourceGroupName $rgname -DiskName $diskname; + Assert-NotNull $disk.AvailabilityPolicy; + Assert-AreEqual 'AutomaticReattach' $disk.AvailabilityPolicy.ActionOnDiskDelay; + + # Cleanup + Remove-AzDisk -ResourceGroupName $rgname -DiskName $diskname -Force; + Clean-ResourceGroup $rgname + } + finally + { + # Cleanup + Clean-ResourceGroup $rgname + } +} + diff --git a/src/Compute/Compute/ChangeLog.md b/src/Compute/Compute/ChangeLog.md index 3b20e3949f01..a894fcb4afb9 100644 --- a/src/Compute/Compute/ChangeLog.md +++ b/src/Compute/Compute/ChangeLog.md @@ -24,6 +24,10 @@ * Updated Azure.Core from 1.45.0 to 1.47.3 * Added `-EnableAutomaticUpgrade` and `-TreatFailureAsDeploymentFailure` parameters (Bool) to `New-AzVmGalleryApplication` and `New-AzVmssGalleryApplication` cmdlets. * Added `-EnableAutomaticUpgrade` and `-TreatFailureAsDeploymentFailure` parameters (Switch) to `Add-AzVmGalleryApplication` and `Add-AzVmssGalleryApplication` cmdlets. +* Added support for Disk Availability Policy + - Added `ActionOnDiskDelay` parameter to `New-AzDiskConfig` cmdlet to configure disk availability behavior + - Added `ActionOnDiskDelay` parameter to `New-AzDiskUpdateConfig` cmdlet to update disk availability behavior + - Users can now specify how VMs handle disks with slow I/O using values 'None' or 'AutomaticReattach' ## Version 10.5.0 * Added `-Redeploy` switch parameter for `Update-AzHost` cmdlet to enable dedicated host redeployment. diff --git a/src/Compute/Compute/Generated/Disk/Config/NewAzureRmDiskConfigCommand.cs b/src/Compute/Compute/Generated/Disk/Config/NewAzureRmDiskConfigCommand.cs index 856432491e27..454158bc1b51 100644 --- a/src/Compute/Compute/Generated/Disk/Config/NewAzureRmDiskConfigCommand.cs +++ b/src/Compute/Compute/Generated/Disk/Config/NewAzureRmDiskConfigCommand.cs @@ -253,6 +253,13 @@ public partial class NewAzureRmDiskConfigCommand : Microsoft.Azure.Commands.Reso HelpMessage = "Setting this property to true improves reliability and performance of data disks that are frequently (more than 5 times a day) by detached from one virtual machine and attached to another. This property should not be set for disks that are not detached and attached frequently as it causes the disks to not align with the fault domain of the virtual machine.")] public bool? OptimizedForFrequentAttach { get; set; } + [Parameter( + Mandatory = false, + ValueFromPipelineByPropertyName = true, + HelpMessage = "Determines on how to handle disks with slow I/O. Possible values include: 'None', 'AutomaticReattach'. None is the default behavior where the VM restarts upon slow disk I/O. AutomaticReattach will attempt to detach and reattach the disk upon I/O failure or slow response.")] + [PSArgumentCompleter("None", "AutomaticReattach")] + public string ActionOnDiskDelay { get; set; } + [Parameter( Mandatory = false, ValueFromPipelineByPropertyName = true, @@ -534,7 +541,8 @@ private void Run() SupportedCapabilities = vSupportedCapabilities, PublicNetworkAccess = this.IsParameterBound(c => c.PublicNetworkAccess) ? PublicNetworkAccess : null, DataAccessAuthMode = this.IsParameterBound(c => c.DataAccessAuthMode) ? DataAccessAuthMode : null, - OptimizedForFrequentAttach = this.IsParameterBound(c => c.OptimizedForFrequentAttach) ? OptimizedForFrequentAttach : null + OptimizedForFrequentAttach = this.IsParameterBound(c => c.OptimizedForFrequentAttach) ? OptimizedForFrequentAttach : null, + AvailabilityPolicy = this.IsParameterBound(c => c.ActionOnDiskDelay) ? new AvailabilityPolicy { ActionOnDiskDelay = ActionOnDiskDelay } : null }; WriteObject(vDisk); diff --git a/src/Compute/Compute/Generated/Disk/Config/NewAzureRmDiskUpdateConfigCommand.cs b/src/Compute/Compute/Generated/Disk/Config/NewAzureRmDiskUpdateConfigCommand.cs index 70c7380a5f38..8594a7d66ee5 100644 --- a/src/Compute/Compute/Generated/Disk/Config/NewAzureRmDiskUpdateConfigCommand.cs +++ b/src/Compute/Compute/Generated/Disk/Config/NewAzureRmDiskUpdateConfigCommand.cs @@ -172,6 +172,13 @@ public partial class NewAzureRmDiskUpdateConfigCommand : Microsoft.Azure.Command [PSArgumentCompleter("AzureActiveDirectory", "None")] public string DataAccessAuthMode { get; set; } + [Parameter( + Mandatory = false, + ValueFromPipelineByPropertyName = true, + HelpMessage = "Determines on how to handle disks with slow I/O. Possible values include: 'None', 'AutomaticReattach'. None is the default behavior where the VM restarts upon slow disk I/O. AutomaticReattach will attempt to detach and reattach the disk upon I/O failure or slow response.")] + [PSArgumentCompleter("None", "AutomaticReattach")] + public string ActionOnDiskDelay { get; set; } + [Parameter( Mandatory = false, ValueFromPipelineByPropertyName = true, @@ -337,7 +344,8 @@ private void Run() SupportsHibernation = this.IsParameterBound(c => c.SupportsHibernation) ? SupportsHibernation : null, SupportedCapabilities = vSupportedCapabilities, PublicNetworkAccess = this.IsParameterBound(c => c.PublicNetworkAccess) ? PublicNetworkAccess : null, - DataAccessAuthMode = this.IsParameterBound(c => c.DataAccessAuthMode) ? DataAccessAuthMode : null + DataAccessAuthMode = this.IsParameterBound(c => c.DataAccessAuthMode) ? DataAccessAuthMode : null, + AvailabilityPolicy = this.IsParameterBound(c => c.ActionOnDiskDelay) ? new AvailabilityPolicy { ActionOnDiskDelay = ActionOnDiskDelay } : null }; WriteObject(vDiskUpdate); diff --git a/src/Compute/Compute/Generated/Models/PSDisk.cs b/src/Compute/Compute/Generated/Models/PSDisk.cs index d5a82bb38000..45e3583f5126 100644 --- a/src/Compute/Compute/Generated/Models/PSDisk.cs +++ b/src/Compute/Compute/Generated/Models/PSDisk.cs @@ -79,6 +79,7 @@ public string ResourceGroupName public string DataAccessAuthMode { get; set; } public double? CompletionPercent { get; set; } public bool? OptimizedForFrequentAttach { get; set; } + public AvailabilityPolicy AvailabilityPolicy { get; set; } public string SecurityDataUri { get; set; } public string SecurityMetadataUri { get; set; } } diff --git a/src/Compute/Compute/Generated/Models/PSDiskUpdate.cs b/src/Compute/Compute/Generated/Models/PSDiskUpdate.cs index b8869c26d86c..5bfb7b9a63f5 100644 --- a/src/Compute/Compute/Generated/Models/PSDiskUpdate.cs +++ b/src/Compute/Compute/Generated/Models/PSDiskUpdate.cs @@ -57,5 +57,6 @@ public partial class PSDiskUpdate // Gets or sets possible values include: 'Enabled', 'Disabled' public string PublicNetworkAccess { get; set; } public string DataAccessAuthMode { get; set; } + public AvailabilityPolicy AvailabilityPolicy { get; set; } } }