Skip to content

Commit 7fdd943

Browse files
authored
Merge pull request #6861 from vermashi/ade-get-status-removed-extension-fix
Added a fix and test for the removed-extension scenario for the Get-AzureDiskEncryptionStatus cmdlet
2 parents d099e9f + 44a7753 commit 7fdd943

File tree

12 files changed

+16514
-2773
lines changed

12 files changed

+16514
-2773
lines changed

src/ResourceManager/Common/Commands.ScenarioTests.ResourceManager.Common/EnvironmentSetupHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@ public virtual Collection<PSObject> RunPowerShellTest(params string[] scripts)
602602
d.Add("Microsoft.Features", null);
603603
d.Add("Microsoft.Authorization", null);
604604
d.Add("Microsoft.Compute", null);
605-
d.Add("Microsoft.Azure.Management.KeyVault", null);
605+
d.Add("Microsoft.KeyVault", null);
606606
var providersToIgnore = new Dictionary<string, string>();
607607
providersToIgnore.Add("Microsoft.Azure.Management.Resources.ResourceManagementClient", "2016-02-01");
608608
HttpMockServer.Matcher = new PermissiveRecordMatcherWithApiExclusion(true, d, providersToIgnore);

src/ResourceManager/Compute/Commands.Compute.Test/Commands.Compute.Test.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
</Reference>
7272
<Reference Include="Microsoft.Azure.Management.KeyVault, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
7373
<SpecificVersion>False</SpecificVersion>
74-
<HintPath>..\..\..\packages\Microsoft.Azure.Management.KeyVault.2.3.0-preview\lib\net452\Microsoft.Azure.Management.KeyVault.dll</HintPath>
74+
<HintPath>..\..\..\packages\Microsoft.Azure.Management.KeyVault.2.4.1-alpha\lib\net452\Microsoft.Azure.Management.KeyVault.dll</HintPath>
7575
</Reference>
7676
<Reference Include="Microsoft.Azure.Management.Storage, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
7777
<SpecificVersion>False</SpecificVersion>
@@ -405,6 +405,8 @@
405405
<None Include="SessionRecords\Microsoft.Azure.Commands.Compute.Test.ScenarioTests.VirtualMachineExtensionTests\TestAzureDiskEncryptionExtensionSinglePass.json">
406406
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
407407
</None>
408+
<None Include="SessionRecords\Microsoft.Azure.Commands.Compute.Test.ScenarioTests.VirtualMachineExtensionTests\TestAzureDiskEncryptionExtensionSinglePassDisableAndRemove.json" />
409+
<None Include="SessionRecords\Microsoft.Azure.Commands.Compute.Test.ScenarioTests.VirtualMachineExtensionTests\TestAzureDiskEncryptionExtensionSinglePassRemove.json" />
408410
<None Include="Templates\azuredeploy.json">
409411
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
410412
</None>

src/ResourceManager/Compute/Commands.Compute.Test/Common/ComputeTestController.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
using System.IO;
2525
using System.Linq;
2626
using Microsoft.Azure.Management.Network;
27+
using Microsoft.Azure.Management.KeyVault;
2728
#if NETSTANDARD
2829
using Microsoft.Azure.Management.ResourceManager;
2930
#else
@@ -47,6 +48,8 @@ public sealed class ComputeTestController : RMTestBase
4748

4849
public ComputeManagementClient ComputeManagementClient { get; private set; }
4950

51+
public KeyVaultManagementClient KeyVaultManagementClient { get; private set; }
52+
5053
public NetworkManagementClient NetworkManagementClient { get; private set; }
5154

5255
public NetworkManagementClientInternal NetworkManagementClientInternal { get; private set; }
@@ -99,6 +102,7 @@ public void RunPsTestWorkflow(
99102
d.Add("Microsoft.Authorization", null);
100103
d.Add("Microsoft.Compute", null);
101104
d.Add("Microsoft.Network", null);
105+
d.Add("Microsoft.KeyVault", null);
102106
d.Add("Microsoft.Storage", null);
103107

104108
var providersToIgnore = new Dictionary<string, string>();
@@ -126,6 +130,7 @@ public void RunPsTestWorkflow(
126130
_helper.RMStorageModule,
127131
_helper.GetRMModulePath("AzureRM.Compute.psd1"),
128132
_helper.GetRMModulePath("AzureRM.Network.psd1"),
133+
_helper.GetRMModulePath("AzureRM.KeyVault.psd1"),
129134
"AzureRM.Storage.ps1",
130135
"AzureRM.Resources.ps1");
131136

@@ -151,6 +156,7 @@ private void SetupManagementClients(MockContext context)
151156
ComputeManagementClient = GetComputeManagementClient(context);
152157
NetworkManagementClient = GetNetworkManagementClient(context);
153158
NetworkManagementClientInternal = GetNetworkManagementClientInternal(context);
159+
KeyVaultManagementClient = GetKeyVaultManagementClient(context);
154160
ResourceManagementClient = GetResourceManagementClient(context);
155161
InternalResourceManagementClient = GetResourceManagementClientInternal(context);
156162

@@ -159,6 +165,7 @@ private void SetupManagementClients(MockContext context)
159165
ComputeManagementClient,
160166
NetworkManagementClient,
161167
NetworkManagementClientInternal,
168+
KeyVaultManagementClient,
162169
ResourceManagementClient,
163170
InternalResourceManagementClient);
164171
}
@@ -182,6 +189,11 @@ private static StorageManagementClient GetStorageManagementClient(MockContext co
182189
return context.GetServiceClient<StorageManagementClient>(TestEnvironmentFactory.GetTestEnvironment());
183190
}
184191

192+
private static KeyVaultManagementClient GetKeyVaultManagementClient(MockContext context)
193+
{
194+
return context.GetServiceClient<KeyVaultManagementClient>(TestEnvironmentFactory.GetTestEnvironment());
195+
}
196+
185197
private static NetworkManagementClient GetNetworkManagementClient(MockContext context)
186198
{
187199
return context.GetServiceClient<NetworkManagementClient>(TestEnvironmentFactory.GetTestEnvironment());

src/ResourceManager/Compute/Commands.Compute.Test/ScenarioTests/ComputeTestCommon.ps1

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,96 @@ function Create-VirtualMachine
242242
return $vm
243243
}
244244

245+
# Create a new virtual machine with other necessary resources configured
246+
function Create-VirtualMachineNoDataDisks
247+
{
248+
Param
249+
(
250+
[Parameter(Mandatory=$false, Position=0)]
251+
[string] $rgname,
252+
[Parameter(Mandatory=$false, Position=1)]
253+
[string] $vmname,
254+
[Parameter(Mandatory=$false, Position=2)]
255+
[string] $loc
256+
)
257+
258+
# initialize parameters if needed
259+
if ([string]::IsNullOrEmpty($rgname)) { $rgname = Get-ComputeTestResourceName }
260+
if ([string]::IsNullOrEmpty($vmname)) { $vmname = 'vm' + $rgname }
261+
if ([string]::IsNullOrEmpty($loc)) { $loc = Get-ComputeVMLocation }
262+
263+
# Common
264+
$g = New-AzureRmResourceGroup -Name $rgname -Location $loc -Force;
265+
266+
# VM Profile & Hardware
267+
$vmsize = 'Standard_D2S_V3';
268+
$p = New-AzureRmVMConfig -VMName $vmname -VMSize $vmsize;
269+
Assert-AreEqual $p.HardwareProfile.VmSize $vmsize;
270+
271+
# NRP
272+
$subnet = New-AzureRmVirtualNetworkSubnetConfig -Name ('subnet' + $rgname) -AddressPrefix "10.0.0.0/24";
273+
$vnet = New-AzureRmVirtualNetwork -Force -Name ('vnet' + $rgname) -ResourceGroupName $rgname -Location $loc -AddressPrefix "10.0.0.0/16" -Subnet $subnet;
274+
$vnet = Get-AzureRmVirtualNetwork -Name ('vnet' + $rgname) -ResourceGroupName $rgname;
275+
$subnetId = $vnet.Subnets[0].Id;
276+
$pubip = New-AzureRmPublicIpAddress -Force -Name ('pubip' + $rgname) -ResourceGroupName $rgname -Location $loc -AllocationMethod Dynamic -DomainNameLabel ('pubip' + $rgname);
277+
$pubip = Get-AzureRmPublicIpAddress -Name ('pubip' + $rgname) -ResourceGroupName $rgname;
278+
$pubipId = $pubip.Id;
279+
$nic = New-AzureRmNetworkInterface -Force -Name ('nic' + $rgname) -ResourceGroupName $rgname -Location $loc -SubnetId $subnetId -PublicIpAddressId $pubip.Id;
280+
$nic = Get-AzureRmNetworkInterface -Name ('nic' + $rgname) -ResourceGroupName $rgname;
281+
$nicId = $nic.Id;
282+
283+
$p = Add-AzureRmVMNetworkInterface -VM $p -Id $nicId;
284+
Assert-AreEqual $p.NetworkProfile.NetworkInterfaces.Count 1;
285+
Assert-AreEqual $p.NetworkProfile.NetworkInterfaces[0].Id $nicId;
286+
287+
# Storage Account (SA)
288+
$stoname = 'sto' + $rgname;
289+
$stotype = 'Standard_GRS';
290+
$sa = New-AzureRmStorageAccount -ResourceGroupName $rgname -Name $stoname -Location $loc -Type $stotype;
291+
Retry-IfException { $global:stoaccount = Get-AzureRmStorageAccount -ResourceGroupName $rgname -Name $stoname; }
292+
$stokey = (Get-AzureRmStorageAccountKey -ResourceGroupName $rgname -Name $stoname).Key1;
293+
294+
$osDiskName = 'osDisk';
295+
$osDiskCaching = 'ReadWrite';
296+
$osDiskVhdUri = "https://$stoname.blob.core.windows.net/test/os.vhd";
297+
298+
$p = Set-AzureRmVMOSDisk -VM $p -Name $osDiskName -VhdUri $osDiskVhdUri -Caching $osDiskCaching -CreateOption FromImage;
299+
300+
Assert-AreEqual $p.StorageProfile.OsDisk.Caching $osDiskCaching;
301+
Assert-AreEqual $p.StorageProfile.OsDisk.Name $osDiskName;
302+
Assert-AreEqual $p.StorageProfile.OsDisk.Vhd.Uri $osDiskVhdUri;
303+
Assert-AreEqual $p.StorageProfile.DataDisks.Count 0;
304+
305+
# OS & Image
306+
$user = "Foo12";
307+
$password = $PLACEHOLDER;
308+
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
309+
$cred = New-Object System.Management.Automation.PSCredential ($user, $securePassword);
310+
$computerName = 'test';
311+
$vhdContainer = "https://$stoname.blob.core.windows.net/test";
312+
313+
$p = Set-AzureRmVMOperatingSystem -VM $p -Windows -ComputerName $computerName -Credential $cred -ProvisionVMAgent;
314+
315+
$imgRef = Get-DefaultCRPWindowsImageOffline;
316+
$p = ($imgRef | Set-AzureRmVMSourceImage -VM $p);
317+
318+
Assert-AreEqual $p.OSProfile.AdminUsername $user;
319+
Assert-AreEqual $p.OSProfile.ComputerName $computerName;
320+
Assert-AreEqual $p.OSProfile.AdminPassword $password;
321+
Assert-AreEqual $p.OSProfile.WindowsConfiguration.ProvisionVMAgent $true;
322+
323+
Assert-AreEqual $p.StorageProfile.ImageReference.Offer $imgRef.Offer;
324+
Assert-AreEqual $p.StorageProfile.ImageReference.Publisher $imgRef.PublisherName;
325+
Assert-AreEqual $p.StorageProfile.ImageReference.Sku $imgRef.Skus;
326+
Assert-AreEqual $p.StorageProfile.ImageReference.Version $imgRef.Version;
327+
328+
# Virtual Machine
329+
$v = New-AzureRmVM -ResourceGroupName $rgname -Location $loc -VM $p;
330+
331+
$vm = Get-AzureRmVM -ResourceGroupName $rgname -VMName $vmname
332+
return $vm
333+
}
334+
245335
# Cleans the created resource group
246336
function Clean-ResourceGroup($rgname)
247337
{

src/ResourceManager/Compute/Commands.Compute.Test/ScenarioTests/VirtualMachineExtensionTests.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@ public void TestAzureDiskEncryptionExtension()
128128
[Fact(Skip = "Updated Storage, needs re-recorded")]
129129
[Trait(Category.RunType, Category.DesktopOnly)]
130130
#else
131-
[Fact(Skip = "TODO: only works for live mode due to key vault dependency")]
131+
[Fact]
132132
#endif
133-
[Trait(Category.RunType, Category.LiveOnly)]
133+
[Trait(Category.AcceptanceType, Category.CheckIn)]
134134
public void TestAzureDiskEncryptionExtensionSinglePass()
135135
{
136136
ComputeTestController.NewInstance.RunPsTest(_logger, "Test-AzureDiskEncryptionExtensionSinglePass");
@@ -140,9 +140,21 @@ public void TestAzureDiskEncryptionExtensionSinglePass()
140140
[Fact(Skip = "Updated Storage, needs re-recorded")]
141141
[Trait(Category.RunType, Category.DesktopOnly)]
142142
#else
143-
[Fact(Skip = "TODO: only works for live mode due to key vault dependency")]
143+
[Fact]
144144
#endif
145-
[Trait(Category.RunType, Category.LiveOnly)]
145+
[Trait(Category.AcceptanceType, Category.CheckIn)]
146+
public void TestAzureDiskEncryptionExtensionSinglePassRemove()
147+
{
148+
ComputeTestController.NewInstance.RunPsTest(_logger, "Test-AzureDiskEncryptionExtensionSinglePassRemove");
149+
}
150+
151+
#if NETSTANDARD
152+
[Fact(Skip = "Updated Storage, needs re-recorded")]
153+
[Trait(Category.RunType, Category.DesktopOnly)]
154+
#else
155+
[Fact]
156+
#endif
157+
[Trait(Category.AcceptanceType, Category.CheckIn)]
146158
public void TestAzureDiskEncryptionExtensionSinglePassDisableAndRemove()
147159
{
148160
ComputeTestController.NewInstance.RunPsTest(_logger, "Test-AzureDiskEncryptionExtensionSinglePassDisableAndRemove");

src/ResourceManager/Compute/Commands.Compute.Test/ScenarioTests/VirtualMachineExtensionTests.ps1

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,13 +1052,67 @@ function Test-AzureDiskEncryptionExtensionSinglePass
10521052
$status = Get-AzureRmVmDiskEncryptionStatus -ResourceGroupName $vm.ResourceGroupName -VMName $vm.Name
10531053
Assert-NotNull $status
10541054
Assert-AreEqual $status.OsVolumeEncrypted Encrypted
1055+
# For Native disks we expect the cmdlet to show the data disks as encrypted.
1056+
Assert-AreEqual $status.DataVolumesEncrypted Encrypted
1057+
1058+
# verify encryption settings
1059+
$settings = $status.OsVolumeEncryptionSettings
1060+
Assert-NotNull $settings
1061+
Assert-NotNull $settings.DiskEncryptionKey.SecretUrl
1062+
Assert-AreEqual $settings.DiskEncryptionKey.SourceVault.Id $kv.DiskEncryptionKeyVaultId
1063+
}
1064+
finally
1065+
{
1066+
Clean-ResourceGroup($resourceGroupName)
1067+
}
1068+
}
1069+
1070+
<#
1071+
.SYNOPSIS
1072+
Test the Get-AzureRmVmDiskEncryptionStatus single pass remove scenario
1073+
#>
1074+
function Test-AzureDiskEncryptionExtensionSinglePassRemove
1075+
{
1076+
$resourceGroupName = Get-ComputeTestResourceName
1077+
try
1078+
{
1079+
# create virtual machine and key vault prerequisites
1080+
$vm = Create-VirtualMachineNoDataDisks $resourceGroupName
1081+
$kv = Create-KeyVault $vm.ResourceGroupName $vm.Location
1082+
1083+
# enable encryption with single pass syntax (omits AD parameters)
1084+
Set-AzureRmVMDiskEncryptionExtension `
1085+
-ResourceGroupName $vm.ResourceGroupName `
1086+
-VMName $vm.Name `
1087+
-DiskEncryptionKeyVaultUrl $kv.DiskEncryptionKeyVaultUrl `
1088+
-DiskEncryptionKeyVaultId $kv.DiskEncryptionKeyVaultId `
1089+
-Force
1090+
1091+
# verify encryption state
1092+
$status = Get-AzureRmVmDiskEncryptionStatus -ResourceGroupName $vm.ResourceGroupName -VMName $vm.Name
1093+
Assert-NotNull $status
1094+
Assert-AreEqual $status.OsVolumeEncrypted Encrypted
1095+
Assert-AreEqual $status.DataVolumesEncrypted NoDiskFound
1096+
1097+
# verify encryption settings
1098+
$settings = $status.OsVolumeEncryptionSettings
1099+
Assert-NotNull $settings
1100+
Assert-NotNull $settings.DiskEncryptionKey.SecretUrl
1101+
Assert-AreEqual $settings.DiskEncryptionKey.SourceVault.Id $kv.DiskEncryptionKeyVaultId
1102+
1103+
# remove extension
1104+
Remove-AzureRmVmDiskEncryptionExtension -ResourceGroupName $vm.ResourceGroupName -VMName $vm.Name -Force
1105+
$status = Get-AzureRmVmDiskEncryptionStatus -ResourceGroupName $vm.ResourceGroupName -VMName $vm.Name
1106+
Assert-NotNull $status
1107+
Assert-AreEqual $status.OsVolumeEncrypted Encrypted
10551108
Assert-AreEqual $status.DataVolumesEncrypted NoDiskFound
10561109

10571110
# verify encryption settings
10581111
$settings = $status.OsVolumeEncryptionSettings
10591112
Assert-NotNull $settings
10601113
Assert-NotNull $settings.DiskEncryptionKey.SecretUrl
1061-
Assert-NotNull $settings.DiskEncryptionKey.SourceVault
1114+
Assert-AreEqual $settings.DiskEncryptionKey.SourceVault.Id $kv.DiskEncryptionKeyVaultId
1115+
10621116
}
10631117
finally
10641118
{
@@ -1091,20 +1145,30 @@ function Test-AzureDiskEncryptionExtensionSinglePassDisableAndRemove
10911145
$status = Get-AzureRmVmDiskEncryptionStatus -ResourceGroupName $vm.ResourceGroupName -VMName $vm.Name
10921146
Assert-NotNull $status
10931147
Assert-AreEqual $status.OsVolumeEncrypted Encrypted
1094-
Assert-AreEqual $status.DataVolumesEncrypted NoDiskFound
1148+
Assert-AreEqual $status.DataVolumesEncrypted Encrypted
1149+
1150+
# verify encryption settings
1151+
$settings = $status.OsVolumeEncryptionSettings
1152+
Assert-NotNull $settings
1153+
Assert-NotNull $settings.DiskEncryptionKey.SecretUrl
1154+
Assert-AreEqual $settings.DiskEncryptionKey.SourceVault.Id $kv.DiskEncryptionKeyVaultId
10951155

10961156
# disable encryption
1097-
$status = Disable-AzureRmVmDiskEncryption -ResourceGroupName $vm.ResourceGroupName -VMName $vm.Name
1157+
$status = Disable-AzureRmVmDiskEncryption -ResourceGroupName $vm.ResourceGroupName -VMName $vm.Name -Force
10981158
Assert-NotNull $status
10991159

11001160
# verify encryption state
11011161
$status = Get-AzureRmVmDiskEncryptionStatus -ResourceGroupName $vm.ResourceGroupName -VMName $vm.Name
11021162
Assert-NotNull $status
11031163
Assert-AreEqual $status.OsVolumeEncrypted NotEncrypted
1104-
Assert-AreEqual $status.DataVolumesEncrypted NoDiskFound
1164+
Assert-AreEqual $status.DataVolumesEncrypted NotEncrypted
1165+
1166+
# verify encryption settings
1167+
$settings = $status.OsVolumeEncryptionSettings
1168+
Assert-Null $settings
11051169

11061170
# remove extension
1107-
$status = Remove-AzureRmVmDiskEncryptionExtension -ResourceGroupName $vm.ResourceGroupName -VMName $vm.Name
1171+
$status = Remove-AzureRmVmDiskEncryptionExtension -ResourceGroupName $vm.ResourceGroupName -VMName $vm.Name -Force
11081172
Assert-NotNull $status
11091173
}
11101174
finally

src/ResourceManager/Compute/Commands.Compute.Test/SessionRecords/Microsoft.Azure.Commands.Compute.Test.ScenarioTests.VirtualMachineExtensionTests/TestAzureDiskEncryptionExtensionSinglePass.json

Lines changed: 1274 additions & 2753 deletions
Large diffs are not rendered by default.

src/ResourceManager/Compute/Commands.Compute.Test/SessionRecords/Microsoft.Azure.Commands.Compute.Test.ScenarioTests.VirtualMachineExtensionTests/TestAzureDiskEncryptionExtensionSinglePassDisableAndRemove.json

Lines changed: 7328 additions & 0 deletions
Large diffs are not rendered by default.

src/ResourceManager/Compute/Commands.Compute.Test/SessionRecords/Microsoft.Azure.Commands.Compute.Test.ScenarioTests.VirtualMachineExtensionTests/TestAzureDiskEncryptionExtensionSinglePassRemove.json

Lines changed: 7688 additions & 0 deletions
Large diffs are not rendered by default.

src/ResourceManager/Compute/Commands.Compute.Test/packages.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<package id="Microsoft.Azure.Graph.RBAC" version="3.4.0-preview" targetFramework="net452" />
88
<package id="Microsoft.Azure.Management.Authorization" version="2.0.0" targetFramework="net45" />
99
<package id="Microsoft.Azure.Management.Compute" version="21.0.0" targetFramework="net452" />
10-
<package id="Microsoft.Azure.Management.KeyVault" version="2.3.0-preview" targetFramework="net452" />
10+
<package id="Microsoft.Azure.Management.KeyVault" version="2.4.1-alpha" targetFramework="net452" />
1111
<package id="Microsoft.Azure.Management.Network" version="19.1.0-preview" targetFramework="net452" />
1212
<package id="Microsoft.Azure.Management.Storage" version="4.1.0-preview" targetFramework="net45" />
1313
<package id="Microsoft.Azure.Management.Resources" version="2.20.1-preview" targetFramework="net40" />

src/ResourceManager/Compute/Commands.Compute/ChangeLog.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
* Add EvictionPolicy parameter to New-AzureRmVmssConfig
2424
* Use default location in the `DiskFileParameterSet` of New-AzureRmVm if no Location is specified.
2525
* Fix parameter description in Save-AzureRmVMImage
26+
* Fix Get-AzureRmVMDiskEncryptionStatus cmdlet for certain singlepass related scenarios
2627

2728
## Version 5.4.0
2829
* Fix issue with creating a vm using `DiskFileParameterSet` in `New-AzureRmVm` failing because of `PremiumLRS` storage account type renaming.
@@ -35,7 +36,6 @@
3536
* Updated all help files to include full parameter types and correct input/output types.
3637
* Update description for Set-AzureRmVMOSDisk
3738
* Update Example 1 for Set-AzureRmVMBginfoExtension to correct spelling and prefix.
38-
* Fix Get-AzureRmVMDiskEncryptionStatus cmdlet for certain singlepass related scenarios
3939

4040
## Version 5.3.0
4141
* Add -Tag parameter to Update/New-AzureRmAvailabilitySet

0 commit comments

Comments
 (0)