Skip to content

Commit cf2b0ea

Browse files
committed
Fix Set-AzVMCustomScriptExtension cmdlet for managed disk VM
1 parent 7388caa commit cf2b0ea

File tree

6 files changed

+11570
-1
lines changed

6 files changed

+11570
-1
lines changed

VirtualMachineCustomScriptExtensionManagedDisk.json

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

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,13 @@ public void TestVirtualMachineCustomScriptExtensionLinuxVM()
8080
TestRunner.RunTestScript("Test-VirtualMachineCustomScriptExtensionLinuxVM");
8181
}
8282

83+
[Fact]
84+
[Trait(Category.AcceptanceType, Category.CheckIn)]
85+
public void TestVirtualMachineCustomScriptExtensionManagedDisk()
86+
{
87+
TestRunner.RunTestScript("Test-VirtualMachineCustomScriptExtensionManagedDisk");
88+
}
89+
8390
[Fact]
8491
[Trait(Category.AcceptanceType, Category.CheckIn)]
8592
public void TestVirtualMachineAccessExtension()

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

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,6 +1026,157 @@ function Test-VirtualMachineCustomScriptExtensionLinuxVM
10261026
}
10271027
}
10281028

1029+
<#
1030+
.SYNOPSIS
1031+
Test Virtual Machine Custom Script Extensions with Managed Disk VM
1032+
#>
1033+
function Test-VirtualMachineCustomScriptExtensionManagedDisk
1034+
{
1035+
# Setup
1036+
$rgname = Get-ComputeTestResourceName;
1037+
1038+
try
1039+
{
1040+
# Common
1041+
$loc = (Get-ComputeVMLocation).ToLower().Replace(" ", "");
1042+
New-AzResourceGroup -Name $rgname -Location $loc -Force;
1043+
1044+
# Create a VM with managed disk
1045+
$vmname0 = $rgname + "v0";
1046+
$username = "admin01";
1047+
$password = Get-PasswordForVM | ConvertTo-SecureString -AsPlainText -Force;
1048+
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $password;
1049+
[string]$domainNameLabel = "$vmname0-$vmname0".tolower();
1050+
1051+
$imgversion = Get-VMImageVersion -Publisher "MicrosoftWindowsServer" -Offer "WindowsServer" -Sku "2016-Datacenter";
1052+
$x = New-AzVM `
1053+
-ResourceGroupName $rgname `
1054+
-Name $vmname0 `
1055+
-Location $loc `
1056+
-Credential $cred `
1057+
-DomainNameLabel $domainNameLabel `
1058+
-ImageName ("MicrosoftWindowsServer:WindowsServer:2016-Datacenter:" + $imgversion);
1059+
1060+
# Get a managed disk from the stopped VM.
1061+
$vm = Get-AzVM -ResourceGroupName $rgname -Name $vmname0;
1062+
Stop-AzVM -ResourceGroupName $rgname -Name $vmname0 -Force;
1063+
$managedDisk = Get-AzDisk -ResourceGroupName $rgname -DiskName $vm.StorageProfile.OsDisk.Name;
1064+
1065+
# Create a managed OS disk by copying the OS disk of the stopped VM.
1066+
$diskname = $rgname + "disk";
1067+
$diskConfig = New-AzDiskConfig -SourceResourceId $managedDisk.Id -Location $loc -CreateOption Copy;
1068+
New-AzDisk -ResourceGroupName $rgname -DiskName $diskname -Disk $diskConfig;
1069+
$disk = Get-AzDisk -ResourceGroupName $rgname -DiskName $diskname;
1070+
1071+
Assert-AreEqual $diskname $disk.Name;
1072+
Assert-AreEqual $managedDisk.DiskSizeGB $disk.DiskSizeGB;
1073+
Assert-AreEqual $managedDisk.OsType $disk.OsType;
1074+
1075+
# VM Profile & Hardware
1076+
$vmsize = 'Standard_D2s_v3';
1077+
$vmname1 = $rgname + "v1";
1078+
$p = New-AzVMConfig -VMName $vmname1 -VMSize $vmsize;
1079+
1080+
# NRP
1081+
$subnet = New-AzVirtualNetworkSubnetConfig -Name ('subnet' + $rgname) -AddressPrefix "10.0.0.0/24";
1082+
$vnet = New-AzVirtualNetwork -Force -Name ('vnet' + $rgname) -ResourceGroupName $rgname -Location $loc -AddressPrefix "10.0.0.0/16" -Subnet $subnet;
1083+
$vnet = Get-AzVirtualNetwork -Name ('vnet' + $rgname) -ResourceGroupName $rgname;
1084+
$subnetId = $vnet.Subnets[0].Id;
1085+
$pubip = New-AzPublicIpAddress -Force -Name ('pubip' + $rgname) -ResourceGroupName $rgname -Location $loc -AllocationMethod Dynamic -DomainNameLabel ('pubip' + $rgname);
1086+
$pubip = Get-AzPublicIpAddress -Name ('pubip' + $rgname) -ResourceGroupName $rgname;
1087+
$pubipId = $pubip.Id;
1088+
$nic = New-AzNetworkInterface -Force -Name ('nic' + $rgname) -ResourceGroupName $rgname -Location $loc -SubnetId $subnetId -PublicIpAddressId $pubip.Id;
1089+
$nic = Get-AzNetworkInterface -Name ('nic' + $rgname) -ResourceGroupName $rgname;
1090+
$nicId = $nic.Id;
1091+
$p = Add-AzVMNetworkInterface -VM $p -Id $nicId;
1092+
1093+
# Set the OS disk from the managed OS disk.
1094+
$osDiskCaching = 'ReadWrite';
1095+
$osDiskType = 'Premium_LRS';
1096+
$p = Set-AzVMOSDisk -VM $p -Windows -Name $disk.Name -Caching $osDiskCaching -CreateOption Attach -StorageAccountType $osDiskType -ManagedDiskId $disk.Id -DiskSizeInGB $disk.DiskSizeGB;
1097+
1098+
Assert-AreEqual $osDiskCaching $p.StorageProfile.OSDisk.Caching;
1099+
Assert-AreEqual $osDiskType $p.StorageProfile.OSDisk.ManagedDisk.StorageAccountType;
1100+
Assert-AreEqual $disk.Name $p.StorageProfile.OSDisk.Name;
1101+
Assert-AreEqual $disk.Id $p.StorageProfile.OSDisk.ManagedDisk.Id;
1102+
Assert-AreEqual $disk.DiskSizeGB $p.StorageProfile.OSDisk.DiskSizeGB;
1103+
Assert-AreEqual $disk.OsType $p.StorageProfile.OSDisk.OsType;
1104+
1105+
# Create a VM using the managed OS disk.
1106+
New-AzVM -ResourceGroupName $rgname -Location $loc -VM $p;
1107+
$vm = Get-AzVM -ResourceGroupName $rgname -Name $vmname1;
1108+
Assert-Null $vm.OSProfile;
1109+
1110+
# Storage Account (SA)
1111+
$stoname = 'sto' + $rgname;
1112+
$stotype = 'Standard_GRS';
1113+
New-AzStorageAccount -ResourceGroupName $rgname -Name $stoname -Location $loc -Type $stotype;
1114+
Retry-IfException { $global:stoaccount = Get-AzStorageAccount -ResourceGroupName $rgname -Name $stoname; };
1115+
$stokey = (Get-AzStorageAccountKey -ResourceGroupName $rgname -Name $stoname)[0].Value;
1116+
1117+
# Virtual Machine Extension
1118+
$extname = $rgname + 'ext';
1119+
$extver = '1.1';
1120+
$publisher = 'Microsoft.Compute';
1121+
$exttype = 'CustomScriptExtension';
1122+
$fileToExecute = 'a.exe';
1123+
$containerName = 'script';
1124+
1125+
# Set custom script extension
1126+
Assert-ThrowsContains { `
1127+
Set-AzVMCustomScriptExtension -ResourceGroupName $rgname -Location $loc -VMName $vmname1 `
1128+
-Name $extname -TypeHandlerVersion $extver -StorageAccountName $stoname -StorageAccountKey $stokey `
1129+
-FileName $fileToExecute -ContainerName $containerName; } `
1130+
"Failed to download all specified files";
1131+
1132+
# Get VM Extension
1133+
$ext = Get-AzVMCustomScriptExtension -ResourceGroupName $rgname -VMName $vmname1 -Name $extname;
1134+
1135+
$expCommand = 'powershell -ExecutionPolicy Unrestricted -file ' + $fileToExecute + ' ';
1136+
Assert-AreEqual $ext.ResourceGroupName $rgname;
1137+
Assert-AreEqual $ext.Name $extname;
1138+
Assert-AreEqual $ext.Publisher $publisher;
1139+
Assert-AreEqual $ext.ExtensionType $exttype;
1140+
Assert-AreEqual $ext.TypeHandlerVersion $extver;
1141+
Assert-AreEqual $ext.CommandToExecute $expCommand;
1142+
Assert-NotNull $ext.ProvisioningState;
1143+
1144+
$ext = Get-AzVMCustomScriptExtension -ResourceGroupName $rgname -VMName $vmname1 -Name $extname -Status;
1145+
Assert-AreEqual $ext.ResourceGroupName $rgname;
1146+
Assert-AreEqual $ext.Name $extname;
1147+
Assert-AreEqual $ext.Publisher $publisher;
1148+
Assert-AreEqual $ext.ExtensionType $exttype;
1149+
Assert-AreEqual $ext.TypeHandlerVersion $extver;
1150+
Assert-AreEqual $ext.CommandToExecute $expCommand;
1151+
Assert-NotNull $ext.ProvisioningState;
1152+
Assert-NotNull $ext.Statuses;
1153+
1154+
# Get VM
1155+
$vm1 = Get-AzVM -ResourceGroupName $rgname -Name $vmname1;
1156+
Assert-AreEqual $vm1.Name $vmname1;
1157+
Assert-AreEqual $vm1.NetworkProfile.NetworkInterfaces.Count 1;
1158+
Assert-AreEqual $vm1.NetworkProfile.NetworkInterfaces[0].Id $nicId;
1159+
1160+
Assert-AreEqual $vm1.OSProfile.AdminUsername $user;
1161+
Assert-AreEqual $vm1.OSProfile.ComputerName $computerName;
1162+
Assert-AreEqual $vm1.HardwareProfile.VmSize $vmsize;
1163+
1164+
# Check Extensions in VM
1165+
Assert-AreEqual $vm1.Extensions.Count 2;
1166+
Assert-AreEqual $vm1.Extensions[1].Name $extname;
1167+
Assert-AreEqual $vm1.Extensions[1].Type 'Microsoft.Compute/virtualMachines/extensions';
1168+
Assert-AreEqual $vm1.Extensions[1].Publisher $publisher;
1169+
Assert-AreEqual $vm1.Extensions[1].VirtualMachineExtensionType $exttype;
1170+
Assert-AreEqual $vm1.Extensions[1].TypeHandlerVersion $extver;
1171+
Assert-NotNull $vm1.Extensions[1].Settings;
1172+
}
1173+
finally
1174+
{
1175+
# Cleanup
1176+
Clean-ResourceGroup $rgname
1177+
}
1178+
}
1179+
10291180
<#
10301181
.SYNOPSIS
10311182
Test Virtual Machine Access Extensions

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

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

src/Compute/Compute/ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
- Additional information about change #1
2020
-->
2121
## Upcoming Release
22+
* Fix Set-AzVMCustomScriptExtension cmdlet for a VM with managed OD disk which does not have OS profile.
2223

2324
## Version 3.2.0
2425
* Add ProximityPlacementGroupId parameter to the following cmdlets:

src/Compute/Compute/Extension/CustomScript/SetAzureVMCustomScriptExtensionCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ public override void ExecuteCmdlet()
349349
this.VMName
350350
).GetAwaiter().GetResult();
351351

352-
if (vmResponse.Body.OsProfile.LinuxConfiguration != null)
352+
if (vmResponse.Body.OsProfile?.LinuxConfiguration != null)
353353
{
354354
ThrowTerminatingError(new ErrorRecord(new ArgumentException(
355355
string.Format(CultureInfo.CurrentUICulture, "The current VM is a Linux VM. Custom script extension can be set only to Windows VM.")),

0 commit comments

Comments
 (0)