Skip to content

Commit 2075329

Browse files
authored
Merge pull request Azure#3313 from anilyela/dev
New parameters in New-AzureRmVMSqlServerAutoBackupConfig cmdlet to support Auto Backup for SQL Server 2016 VMs.
2 parents 64d54f7 + 74defc4 commit 2075329

24 files changed

+6659
-986
lines changed

src/ResourceManager/Compute/AzureRM.Compute.psd1

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,10 @@ CmdletsToExport = 'Remove-AzureRmAvailabilitySet', 'Get-AzureRmAvailabilitySet',
144144
# VariablesToExport = @()
145145

146146
# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export.
147-
AliasesToExport = @()
147+
AliasesToExport = @(
148+
'New-AzureRmVMSqlServerAutoBackupConfig',
149+
'New-AzureRmVMSqlServerAutoPatchingConfig',
150+
'New-AzureRmVMSqlServerKeyVaultCredentialConfig')
148151

149152
# DSC resources to export from this module
150153
# DscResourcesToExport = @()

src/ResourceManager/Compute/ChangeLog.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@
1818
- Additional information about change #1
1919
-->
2020
## Current Release
21+
* New parameters in New-AzureRmVMSqlServerAutoBackupConfig cmdlet to support Auto Backup for SQL Server 2016 VMs.
22+
- BackupSystemDbs : Specifies if system databases should be added to Sql Server Managed Backup.
23+
- BackupScheduleType : Specifies the type of managed backup schedule, manual or automated. If it's manual, schedule settings need to be specified.
24+
- FullBackupFrequency : Specifies the frequency of Full Backup, daily or weekly.
25+
- FullBackupStartHour : Specifies the hour of the day when the Sql Server Full Backup should start.
26+
- FullBackupWindowInHours : Specifies the window (in hours) when Sql Server Full Backup should occur.
27+
- LogBackupFrequencyInMinutes : Specifies the frequency of Sql Server Log Backup.
28+
* New-AzureVMSqlServer* cmdlets are renamed to New-AzureRmVMSqlServer* now. Old ones will continue to work however.
2129

2230
## Version 2.4.0
2331
* Add Remove-AzureRmVMSecret cmdlet.

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,9 @@
368368
<None Include="SessionRecords\Microsoft.Azure.Commands.Compute.Test.ScenarioTests.SqlIaaSExtensionTests\TestSqlIaaSExtension.json">
369369
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
370370
</None>
371+
<None Include="SessionRecords\Microsoft.Azure.Commands.Compute.Test.ScenarioTests.SqlIaaSExtensionTests\TestSqlIaaSExtensionWith2016Image.json">
372+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
373+
</None>
371374
<None Include="SessionRecords\Microsoft.Azure.Commands.Compute.Test.ScenarioTests.VirtualMachineBootDiagnosticsTests\TestLinuxVirtualMachineBootDiagnostics.json">
372375
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
373376
</None>

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,11 @@ public void TestSqlIaaSAKVExtension()
2626
ComputeTestController.NewInstance.RunPsTest(_logger, "Test-SetAzureRmVMSqlServerAKVExtension");
2727
}
2828

29+
[Fact]
30+
[Trait(Category.AcceptanceType, Category.CheckIn)]
31+
public void TestSqlIaaSExtensionWith2016Image()
32+
{
33+
ComputeTestController.NewInstance.RunPsTest(_logger, "Test-SetAzureRmVMSqlServerExtensionWith2016Image");
34+
}
2935
}
3036
}

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

Lines changed: 149 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -76,30 +76,32 @@ function Test-SetAzureRmVMSqlServerAKVExtension
7676

7777
#Do actual changes and work here
7878

79-
$extensionName = "Microsoft.SqlServer.Management.SqlIaaSAgent";
79+
$extensionName = "SqlIaaSExtension";
8080

8181
# 1) Installs the SqlIaaS extension by calling Set-AzureRmVMSqlServerExtension cmdlet on a VM.
8282

8383
$securepfxpwd = ConvertTo-SecureString –String "Amu6y/RzJcc7JBzdAdRVv6mk=" –AsPlainText –Force;
84-
$aps_akv = New-AzureVMSqlServerKeyVaultCredentialConfig -ResourceGroupName $rgname -Enable -CredentialName "CredentialTesting" -AzureKeyVaultUrl "https://Testkeyvault.vault.azure.net/" -ServicePrincipalName "0326921f-bf005595337c" -ServicePrincipalSecret $securepfxpwd;
84+
$aps_akv = New-AzureRmVMSqlServerKeyVaultCredentialConfig -ResourceGroupName $rgname -Enable -CredentialName "CredentialTesting" -AzureKeyVaultUrl "https://Testkeyvault.vault.azure.net/" -ServicePrincipalName "0326921f-bf005595337c" -ServicePrincipalSecret $securepfxpwd;
8585
Set-AzureRmVMSqlServerExtension -KeyVaultCredentialSettings $aps_akv -ResourceGroupName $rgname -VMName $vmname -Version "1.2" -Verbose;
8686

8787
# 2) Calls Get-AzureRmVMSqlServerExtension cmdlet to check the status of the extension installation.
8888
$extension = Get-AzureRmVMSqlServerExtension -ResourceGroupName $rgname -VmName $vmName -Name $extensionName;
8989

9090
# 3) Verifies settings are correct given input
9191

92-
Assert-AreEqual $extension.KeyVaultCredentialSettings.CredentialName "CredentialTesting";
92+
Assert-AreEqual $extension.KeyVaultCredentialSettings.Credentials.Count 1;
93+
Assert-AreEqual $extension.KeyVaultCredentialSettings.Credentials[0].CredentialName "CredentialTesting"
9394

9495
# 4) Update extension values
9596

96-
$aps_akv = New-AzureVMSqlServerKeyVaultCredentialConfig -ResourceGroupName $rgname -Enable -CredentialName "CredentialTest" -AzureKeyVaultUrl "https://Testkeyvault.vault.azure.net/" -ServicePrincipalName "0326921f-82af-4ab3-9d46-bf005595337c" -ServicePrincipalSecret $securepfxpwd;
97+
$aps_akv = New-AzureRmVMSqlServerKeyVaultCredentialConfig -ResourceGroupName $rgname -Enable -CredentialName "CredentialTest" -AzureKeyVaultUrl "https://Testkeyvault.vault.azure.net/" -ServicePrincipalName "0326921f-82af-4ab3-9d46-bf005595337c" -ServicePrincipalSecret $securepfxpwd;
9798
Set-AzureRmVMSqlServerExtension -KeyVaultCredentialSettings $aps_akv -ResourceGroupName $rgname -VMName $vmname -Version "1.2" -Verbose;
9899

99100
# 5) Verify changes
100101
$extension = Get-AzureRmVMSqlServerExtension -ResourceGroupName $rgname -VmName $vmName -Name $extensionName;
101-
102-
Assert-AreEqual $extension.KeyVaultCredentialSettings.CredentialName "CredentialTest"
102+
103+
Assert-AreEqual $extension.KeyVaultCredentialSettings.Credentials.Count 2;
104+
Assert-AreEqual $extension.KeyVaultCredentialSettings.Credentials[1].CredentialName "CredentialTest"
103105

104106
# 6) Test with correct Name and Version
105107

@@ -183,11 +185,131 @@ function Test-SetAzureRmVMSqlServerExtension
183185

184186
#Do actual changes and work here
185187

188+
$extensionName = "SqlIaaSExtension";
189+
190+
# 1) Installs the SqlIaaS extension by calling Set-AzureRmVMSqlServerExtension cmdlet on a VM, with auto patching and auto backup settings.
191+
$aps = New-AzureRmVMSqlServerAutoPatchingConfig -Enable -DayOfWeek "Thursday" -MaintenanceWindowStartingHour 20 -MaintenanceWindowDuration 120 -PatchCategory "Important"
192+
$storageBlobUrl = "https://$stoname.blob.core.windows.net";
193+
$storageKey = (Get-AzureRmStorageAccountKey -ResourceGroupName $rgname -Name $stoname).Key1;
194+
$storageKeyAsSecureString = ConvertTo-SecureString -String $storageKey -AsPlainText -Force;
195+
$abs = New-AzureRmVMSqlServerAutoBackupConfig -Enable -RetentionPeriodInDays 5 -ResourceGroupName $rgname -StorageUri $storageBlobUrl -StorageKey $storageKeyAsSecureString
196+
Set-AzureRmVMSqlServerExtension -AutoPatchingSettings $aps -AutoBackupSettings $abs -ResourceGroupName $rgname -VMName $vmname -Version "1.2" -Verbose -Name $extensionName;
197+
198+
# 2) Calls Get-AzureRmVMSqlServerExtension cmdlet to check the status of the extension installation.
199+
$extension = Get-AzureRmVMSqlServerExtension -ResourceGroupName $rgname -VmName $vmName -Name $extensionName;
200+
201+
# 3) Verifies settings are correct given input
202+
Assert-AreEqual $extension.AutoPatchingSettings.DayOfWeek "Thursday"
203+
Assert-AreEqual $extension.AutoPatchingSettings.MaintenanceWindowStartingHour 20
204+
Assert-AreEqual $extension.AutoPatchingSettings.MaintenanceWindowDuration 120
205+
Assert-AreEqual $extension.AutoPatchingSettings.PatchCategory "Important"
206+
207+
Assert-AreEqual $extension.AutoBackupSettings.RetentionPeriod 5
208+
Assert-AreEqual $extension.AutoBackupSettings.Enable $true
209+
210+
# 4) Update extension values
211+
$aps = New-AzureRmVMSqlServerAutoPatchingConfig -Enable -DayOfWeek "Monday" -MaintenanceWindowStartingHour 20 -MaintenanceWindowDuration 120 -PatchCategory "Important"
212+
$abs = New-AzureRmVMSqlServerAutoBackupConfig -Enable -RetentionPeriodInDays 10 -ResourceGroupName $rgname -StorageUri $storageBlobUrl -StorageKey $storageKeyAsSecureString
213+
Set-AzureRmVMSqlServerExtension -AutoPatchingSettings $aps -AutoBackupSettings $abs -ResourceGroupName $rgname -VMName $vmname -Version "1.2" -Verbose -Name $extensionName;
214+
215+
# 5) Verify changes
216+
217+
$extension = Get-AzureRmVMSqlServerExtension -ResourceGroupName $rgname -VmName $vmName -Name $extensionName;
218+
Assert-AreEqual $extension.AutoPatchingSettings.DayOfWeek "Monday"
219+
Assert-AreEqual $extension.AutoBackupSettings.RetentionPeriod 10
220+
221+
# 6) Test with correct Name and Version
222+
Set-AzureRmVMSqlServerExtension -AutoPatchingSettings $aps -AutoBackupSettings $abs -ResourceGroupName $rgname -VMName $vmName -Name $extensionName -Version "1.2"
223+
224+
# 7) Test with correct Name and incorrect Version
225+
Set-AzureRmVMSqlServerExtension -AutoPatchingSettings $aps -AutoBackupSettings $abs -ResourceGroupName $rgname -VMName $vmName -Name $extensionName -Version "1.*"
226+
}
227+
finally
228+
{
229+
# Cleanup
230+
if(Get-AzureRmResourceGroup -Name $rgname -Location $loc)
231+
{
232+
#Remove-AzureRmResourceGroup -Name $rgname -Force;
233+
}
234+
}
235+
}
236+
237+
# Test setting up VM with Sql Server 2016 image. (Includes testing for AutoBackup V2)
238+
function Test-SetAzureRmVMSqlServerExtensionWith2016Image
239+
{
240+
Set-StrictMode -Version latest; $ErrorActionPreference = 'Stop'
241+
242+
# Setup
243+
$rgname = Get-ComputeTestResourceName
244+
$loc = Get-ComputeVMLocation
245+
246+
try
247+
{
248+
# Common
249+
New-AzureRmResourceGroup -Name $rgname -Location $loc -Force;
250+
251+
# VM Profile & Hardware
252+
$vmsize = 'Standard_A2';
253+
$vmname = 'vm' + $rgname;
254+
$p = New-AzureRmVMConfig -VMName $vmname -VMSize $vmsize;
255+
Assert-AreEqual $p.HardwareProfile.VmSize $vmsize;
256+
257+
# NRP
258+
$subnet = New-AzureRmVirtualNetworkSubnetConfig -Name ('subnet' + $rgname) -AddressPrefix "10.0.0.0/24";
259+
$vnet = New-AzureRmVirtualNetwork -Force -Name ('vnet' + $rgname) -ResourceGroupName $rgname -Location $loc -AddressPrefix "10.0.0.0/16" -Subnet $subnet;
260+
$vnet = Get-AzureRmVirtualNetwork -Name ('vnet' + $rgname) -ResourceGroupName $rgname;
261+
$subnetId = $vnet.Subnets[0].Id;
262+
$pubip = New-AzureRmPublicIpAddress -Force -Name ('pubip' + $rgname) -ResourceGroupName $rgname -Location $loc -AllocationMethod Dynamic -DomainNameLabel ('pubip' + $rgname);
263+
$pubip = Get-AzureRmPublicIpAddress -Name ('pubip' + $rgname) -ResourceGroupName $rgname;
264+
$pubipId = $pubip.Id;
265+
$nic = New-AzureRmNetworkInterface -Force -Name ('nic' + $rgname) -ResourceGroupName $rgname -Location $loc -SubnetId $subnetId -PublicIpAddressId $pubip.Id;
266+
$nic = Get-AzureRmNetworkInterface -Name ('nic' + $rgname) -ResourceGroupName $rgname;
267+
$nicId = $nic.Id;
268+
269+
$p = Add-AzureRmVMNetworkInterface -VM $p -Id $nicId;
270+
Assert-AreEqual $p.NetworkProfile.NetworkInterfaces.Count 1;
271+
Assert-AreEqual $p.NetworkProfile.NetworkInterfaces[0].Id $nicId;
272+
273+
# Storage Account
274+
$stoname = 'sto' + $rgname;
275+
$stotype = 'Standard_GRS';
276+
New-AzureRmStorageAccount -ResourceGroupName $rgname -Name $stoname -Location $loc -Type $stotype;
277+
Retry-IfException { $global:stoaccount = Get-AzureRmStorageAccount -ResourceGroupName $rgname -Name $stoname; }
278+
279+
$osDiskName = 'osDisk';
280+
$osDiskCaching = 'ReadWrite';
281+
$osDiskVhdUri = "https://$stoname.blob.core.windows.net/test/os.vhd";
282+
$dataDiskVhdUri1 = "https://$stoname.blob.core.windows.net/test/data1.vhd";
283+
284+
$p = Set-AzureRmVMOSDisk -VM $p -Name $osDiskName -VhdUri $osDiskVhdUri -Caching $osDiskCaching -CreateOption FromImage;
285+
$p = Add-AzureRmVMDataDisk -VM $p -Name 'testDataDisk1' -Caching 'ReadOnly' -DiskSizeInGB 10 -Lun 1 -VhdUri $dataDiskVhdUri1 -CreateOption Empty;
286+
287+
# OS & Image
288+
$user = "localadmin";
289+
$password = $PLACEHOLDER;
290+
$securePassword = ConvertTo-SecureString $password -AsPlainText -Force;
291+
$cred = New-Object System.Management.Automation.PSCredential ($user, $securePassword);
292+
$computerName = 'test';
293+
$vhdContainer = "https://$stoname.blob.core.windows.net/test";
294+
295+
$p = Set-AzureRmVMOperatingSystem -VM $p -Windows -ComputerName $computerName -Credential $cred -ProvisionVMAgent;
296+
$p = Set-AzureRmVMSourceImage -VM $p -PublisherName MicrosoftSQLServer -Offer SQL2016-WS2012R2 -Skus Enterprise -Version "latest"
297+
298+
# Virtual Machine
299+
New-AzureRmVM -ResourceGroupName $rgname -Location $loc -VM $p;
300+
301+
#Do actual changes and work here
302+
186303
$extensionName = "Microsoft.SqlServer.Management.SqlIaaSAgent";
187304

188-
# 1) Installs the SqlIaaS extension by calling Set-AzureRmVMSqlServerExtension cmdlet on a VM.
189-
$aps = New-AzureVMSqlServerAutoPatchingConfig -Enable -DayOfWeek "Thursday" -MaintenanceWindowStartingHour 20 -MaintenanceWindowDuration 120 -PatchCategory "Important"
190-
Set-AzureRmVMSqlServerExtension -AutoPatchingSettings $aps -ResourceGroupName $rgname -VMName $vmname -Version "1.2" -Verbose -Name $extensionName;
305+
# 1) Installs the SqlIaaS extension by calling Set-AzureRmVMSqlServerExtension cmdlet on a VM, with auto patching and auto backup settings.
306+
$aps = New-AzureRmVMSqlServerAutoPatchingConfig -Enable -DayOfWeek "Thursday" -MaintenanceWindowStartingHour 20 -MaintenanceWindowDuration 120 -PatchCategory "Important"
307+
$storageBlobUrl = "https://$stoname.blob.core.windows.net";
308+
$storageKey = (Get-AzureRmStorageAccountKey -ResourceGroupName $rgname -Name $stoname).Key1;
309+
$storageKeyAsSecureString = ConvertTo-SecureString -String $storageKey -AsPlainText -Force;
310+
$abs = New-AzureRmVMSqlServerAutoBackupConfig -Enable -RetentionPeriodInDays 5 -ResourceGroupName $rgname -StorageUri $storageBlobUrl -StorageKey $storageKeyAsSecureString `
311+
-BackupScheduleType Manual -BackupSystemDbs -FullBackupStartHour 10 -FullBackupWindowInHours 5 -FullBackupFrequency Daily -LogBackupFrequencyInMinutes 30
312+
Set-AzureRmVMSqlServerExtension -AutoPatchingSettings $aps -AutoBackupSettings $abs -ResourceGroupName $rgname -VMName $vmname -Version "1.2" -Verbose -Name $extensionName;
191313

192314
# 2) Calls Get-AzureRmVMSqlServerExtension cmdlet to check the status of the extension installation.
193315
$extension = Get-AzureRmVMSqlServerExtension -ResourceGroupName $rgname -VmName $vmName -Name $extensionName;
@@ -198,19 +320,33 @@ function Test-SetAzureRmVMSqlServerExtension
198320
Assert-AreEqual $extension.AutoPatchingSettings.MaintenanceWindowDuration 120
199321
Assert-AreEqual $extension.AutoPatchingSettings.PatchCategory "Important"
200322

323+
Assert-AreEqual $extension.AutoBackupSettings.RetentionPeriod 5
324+
Assert-AreEqual $extension.AutoBackupSettings.Enable $true
325+
Assert-AreEqual $extension.AutoBackupSettings.BackupScheduleType "Manual"
326+
Assert-AreEqual $extension.AutoBackupSettings.FullBackupFrequency "Daily"
327+
Assert-AreEqual $extension.AutoBackupSettings.BackupSystemDbs $true
328+
Assert-AreEqual $extension.AutoBackupSettings.FullBackupStartTime 10
329+
Assert-AreEqual $extension.AutoBackupSettings.FullBackupWindowHours 5
330+
Assert-AreEqual $extension.AutoBackupSettings.LogBackupFrequency 30
331+
201332
# 4) Update extension values
202-
$aps = New-AzureVMSqlServerAutoPatchingConfig -Enable -DayOfWeek "Monday" -MaintenanceWindowStartingHour 20 -MaintenanceWindowDuration 120 -PatchCategory "Important"
203-
Set-AzureRmVMSqlServerExtension -AutoPatchingSettings $aps -ResourceGroupName $rgname -VMName $vmname -Version "1.2" -Verbose -Name $extensionName;
333+
$aps = New-AzureRmVMSqlServerAutoPatchingConfig -Enable -DayOfWeek "Monday" -MaintenanceWindowStartingHour 20 -MaintenanceWindowDuration 120 -PatchCategory "Important"
334+
$abs = New-AzureRmVMSqlServerAutoBackupConfig -Enable -RetentionPeriodInDays 10 -ResourceGroupName $rgname -StorageUri $storageBlobUrl `
335+
-StorageKey $storageKeyAsSecureString -BackupScheduleType Automated
336+
Set-AzureRmVMSqlServerExtension -AutoPatchingSettings $aps -AutoBackupSettings $abs -ResourceGroupName $rgname -VMName $vmname -Version "1.2" -Verbose -Name $extensionName;
204337

205338
# 5) Verify changes
206339
$extension = Get-AzureRmVMSqlServerExtension -ResourceGroupName $rgname -VmName $vmName -Name $extensionName;
207340
Assert-AreEqual $extension.AutoPatchingSettings.DayOfWeek "Monday"
341+
Assert-AreEqual $extension.AutoBackupSettings.RetentionPeriod 10
342+
Assert-AreEqual $extension.AutoBackupSettings.Enable $true
343+
Assert-AreEqual $extension.AutoBackupSettings.BackupScheduleType "Automated"
208344

209345
# 6) Test with correct Name and Version
210-
Set-AzureRmVMSqlServerExtension -AutoPatchingSettings $aps -ResourceGroupName $rgname -VMName $vmName -Name $extensionName -Version "1.2"
346+
Set-AzureRmVMSqlServerExtension -AutoPatchingSettings $aps -AutoBackupSettings $abs -ResourceGroupName $rgname -VMName $vmName -Name $extensionName -Version "1.2"
211347

212348
# 7) Test with correct Name and incorrect Version
213-
Set-AzureRmVMSqlServerExtension -AutoPatchingSettings $aps -ResourceGroupName $rgname -VMName $vmName -Name $extensionName -Version "1.*"
349+
Set-AzureRmVMSqlServerExtension -AutoPatchingSettings $aps -AutoBackupSettings $abs -ResourceGroupName $rgname -VMName $vmName -Name $extensionName -Version "1.*"
214350
}
215351
finally
216352
{

0 commit comments

Comments
 (0)