Skip to content

Commit a259f88

Browse files
author
Maddie Clayton
authored
Merge pull request #7165 from Nking92/webapps-undelete
Webapps undelete commands
2 parents 593705f + a4ea039 commit a259f88

25 files changed

+7278
-33
lines changed

src/ResourceManager/Profile/Commands.Profile/AzureRmAlias/Mappings.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// ----------------------------------------------------------------------------------
1+
// ----------------------------------------------------------------------------------
22
//
33
// Copyright Microsoft Corporation
44
// Licensed under the Apache License, Version 2.0 (the 'License');
@@ -768,7 +768,9 @@ public static Dictionary<string, object> GetCaseInsensitiveMapping()
768768
'New-AzWebAppDatabaseBackupSetting': 'New-AzureRmWebAppDatabaseBackupSetting',
769769
'Get-AzWebAppSSLBinding': 'Get-AzureRmWebAppSSLBinding',
770770
'Get-AzWebAppSlot': 'Get-AzureRmWebAppSlot',
771-
'New-AzWebApp': 'New-AzureRmWebApp'
771+
'New-AzWebApp': 'New-AzureRmWebApp',
772+
'Restore-AzDeletedWebApp': 'Restore-AzureRmDeletedWebApp',
773+
'Get-AzDeletedWebApp': 'Get-AzureRmDeletedWebApp'
772774
},
773775
'Az.Maps': {
774776
'Get-AzMapsAccountKey': 'Get-AzureRmMapsAccountKey',
@@ -2383,6 +2385,7 @@ public static Dictionary<string, object> GetCaseInsensitiveMapping()
23832385
'Remove-AzNotificationHubsNamespace': 'Remove-AzureRmNotificationHubsNamespace'
23842386
}
23852387
}
2388+
23862389
";
23872390
}
23882391
}

src/ResourceManager/Websites/Commands.Websites.Test/Commands.Websites.Test.csproj

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@
125125
<None Include="SessionRecords\Microsoft.Azure.Commands.Websites.Test.ScenarioTests.WebAppBackupRestoreTests\TestEditAndGetWebAppBackupConfigurationPiping.json">
126126
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
127127
</None>
128+
<None Include="SessionRecords\Microsoft.Azure.Commands.Websites.Test.ScenarioTests.WebAppBackupRestoreTests\TestGetDeletedWebApp.json" />
128129
<None Include="SessionRecords\Microsoft.Azure.Commands.Websites.Test.ScenarioTests.WebAppBackupRestoreTests\TestGetWebAppBackup.json">
129130
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
130131
</None>
@@ -134,6 +135,8 @@
134135
<None Include="SessionRecords\Microsoft.Azure.Commands.Websites.Test.ScenarioTests.WebAppBackupRestoreTests\TestGetWebAppSnapshot.json">
135136
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
136137
</None>
138+
<None Include="SessionRecords\Microsoft.Azure.Commands.Websites.Test.ScenarioTests.WebAppBackupRestoreTests\TestRestoreDeletedWebAppToExisting.json" />
139+
<None Include="SessionRecords\Microsoft.Azure.Commands.Websites.Test.ScenarioTests.WebAppBackupRestoreTests\TestRestoreDeletedWebAppToNew.json" />
137140
<None Include="SessionRecords\Microsoft.Azure.Commands.Websites.Test.ScenarioTests.WebAppBackupRestoreTests\TestRestoreWebAppSnapshot.json">
138141
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
139142
</None>
@@ -191,6 +194,15 @@
191194
<None Include="SessionRecords\Microsoft.Azure.Commands.Websites.Test.ScenarioTests.WebAppTests\TestWebAppPublishingProfile.json">
192195
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
193196
</None>
197+
<None Include="SessionRecords\Microsoft.Azure.Commands.Websites.Test.ScenarioTests.WebAppBackupRestoreTests\TestGetDeletedWebApp.json">
198+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
199+
</None>
200+
<None Include="SessionRecords\Microsoft.Azure.Commands.Websites.Test.ScenarioTests.WebAppBackupRestoreTests\TestRestoreDeletedWebAppToExisting.json">
201+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
202+
</None>
203+
<None Include="SessionRecords\Microsoft.Azure.Commands.Websites.Test.ScenarioTests.WebAppBackupRestoreTests\TestRestoreDeletedWebAppToNew.json">
204+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
205+
</None>
194206
</ItemGroup>
195207
<ItemGroup>
196208
<ProjectReference Include="..\..\..\Storage\Commands.Storage\Commands.Storage.csproj">
@@ -206,4 +218,4 @@
206218
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
207219
</ItemGroup>
208220
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
209-
</Project>
221+
</Project>

src/ResourceManager/Websites/Commands.Websites.Test/ScenarioTests/WebAppBackupRestoreTests.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,5 +115,26 @@ public void TestRestoreWebAppSnapshot()
115115
{
116116
WebsitesController.NewInstance.RunPsTest(_logger, "Test-RestoreWebAppSnapshot");
117117
}
118+
119+
[Fact]
120+
[Trait(Category.AcceptanceType, Category.CheckIn)]
121+
public void TestGetDeletedWebApp()
122+
{
123+
WebsitesController.NewInstance.RunPsTest(_logger, "Test-GetDeletedWebApp");
124+
}
125+
126+
[Fact]
127+
[Trait(Category.AcceptanceType, Category.CheckIn)]
128+
public void TestRestoreDeletedWebAppToExisting()
129+
{
130+
WebsitesController.NewInstance.RunPsTest(_logger, "Test-RestoreDeletedWebAppToExisting");
131+
}
132+
133+
[Fact]
134+
[Trait(Category.AcceptanceType, Category.CheckIn)]
135+
public void TestRestoreDeletedWebAppToNew()
136+
{
137+
WebsitesController.NewInstance.RunPsTest(_logger, "Test-RestoreDeletedWebAppToNew");
138+
}
118139
}
119140
}

src/ResourceManager/Websites/Commands.Websites.Test/ScenarioTests/WebAppBackupRestoreTests.ps1

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,18 @@ $snapshotRgName = 'onesdksnapshots'
1818
$snapshotAppName = 'onesdkpremapp2'
1919
$snapshotAppSlot = 'staging'
2020

21+
# Restoring a deleted web app requires an app to have a snapshot available.
22+
# Deploy a web app and wait at least an hour for a snapshot.
23+
# Update these global variables to re-record Test-RestoreDeletedWebApp.
24+
$undeleteRgName = 'ps8425'
25+
$undeleteAppName = 'ps1705'
26+
$undeleteSlot = 'testslot'
27+
28+
# !!! Storage keys and SAS URIs will be stored in the backup test recordings !!!
29+
# To find them, open the json files in a text editor and search for "listkeys"
30+
# to find the storage keys. Search for StorageAccountUrl to find the SAS URIs.
31+
# Remove them when re-recording the tests so that secrets are not shared.
32+
2133
function Test-CreateNewWebAppBackup
2234
{
2335
$rgName = Get-ResourceGroupName
@@ -374,6 +386,120 @@ function Test-RestoreWebAppSnapshot
374386
$job | Wait-Job
375387
}
376388

389+
function Test-GetDeletedWebApp
390+
{
391+
# Setup
392+
$rgname = Get-ResourceGroupName
393+
$wname = Get-WebsiteName
394+
$slotName = "staging"
395+
$location = Get-WebLocation
396+
$whpName = Get-WebHostPlanName
397+
$tier = "Standard"
398+
399+
try
400+
{
401+
#Setup
402+
New-AzureRmResourceGroup -Name $rgname -Location $location
403+
New-AzureRmAppServicePlan -ResourceGroupName $rgname -Name $whpName -Location $location -Tier $tier
404+
New-AzureRmWebApp -ResourceGroupName $rgname -Name $wname -Location $location -AppServicePlan $whpName
405+
New-AzureRmWebAppSlot -ResourceGroupName $rgname -Name $wname -Slot $slotName -AppServicePlan $planName
406+
Remove-AzureRmWebAppSlot -ResourceGroupName $rgname -Name $wname -Slot $slotName -Force
407+
Remove-AzureRmWebApp -ResourceGroupName $rgname -Name $wname -Force
408+
409+
$deletedApp = Get-AzureRmDeletedWebApp -ResourceGroupName $rgname -Name $wname -Slot "Production"
410+
Assert-NotNull $deletedApp
411+
Assert-AreEqual $rgname $deletedApp.ResourceGroupName
412+
Assert-AreEqual $wname $deletedApp.Name
413+
414+
$deletedSlot = Get-AzureRmDeletedWebApp -ResourceGroupName $rgname -Name $wname -Slot $slotName
415+
Assert-NotNull $deletedSlot
416+
Assert-AreEqual $rgname $deletedSlot.ResourceGroupName
417+
Assert-AreEqual $wname $deletedSlot.Name
418+
Assert-AreEqual $slotName $deletedSlot.Slot
419+
}
420+
finally
421+
{
422+
# Cleanup
423+
Remove-AzureRmAppServicePlan -ResourceGroupName $rgname -Name $whpName -Force
424+
Remove-AzureRmResourceGroup -Name $rgname -Force
425+
}
426+
}
427+
428+
function Test-RestoreDeletedWebAppToExisting
429+
{
430+
# Setup
431+
$rgname = Get-ResourceGroupName
432+
$wname = Get-WebsiteName
433+
$slotName = "staging"
434+
$appWithSlotName = "$wname/$slotName"
435+
$location = Get-WebLocation
436+
$whpName = Get-WebHostPlanName
437+
$tier = "Standard"
438+
439+
try
440+
{
441+
New-AzureRmResourceGroup -Name $rgname -Location $location
442+
New-AzureRmAppServicePlan -ResourceGroupName $rgname -Name $whpName -Location $location -Tier $tier
443+
New-AzureRmWebApp -ResourceGroupName $rgname -Name $wname -Location $location -AppServicePlan $whpName
444+
New-AzureRmWebAppSlot -ResourceGroupName $rgname -Name $wname -Slot $slotName -AppServicePlan $planName
445+
446+
$deletedApp = Get-AzureRmDeletedWebApp -ResourceGroupName $undeleteRgName -Name $undeleteAppName -Slot "Production"
447+
# Test the InputObject parameter set
448+
$restoredApp = Restore-AzureRmDeletedWebApp $deletedApp -TargetResourceGroupName $rgname -TargetName $wname -Force
449+
# Test the FromDeletedResourceName parameter set
450+
$restoredSlot = Restore-AzureRmDeletedWebApp -ResourceGroupName $undeleteRgName -Name $undeleteAppName -Slot $undeleteSlot -TargetResourceGroupName $rgname -TargetName $wname -TargetSlot $slotName -Force
451+
452+
Assert-NotNull $restoredApp
453+
Assert-AreEqual $rgname $restoredApp.ResourceGroup
454+
Assert-AreEqual $wname $restoredApp.Name
455+
456+
Assert-NotNull $restoredSlot
457+
Assert-AreEqual $rgname $restoredSlot.ResourceGroup
458+
Assert-AreEqual $appWithSlotName $restoredSlot.Name
459+
}
460+
finally
461+
{
462+
# Cleanup
463+
Remove-AzureRmWebAppSlot -ResourceGroupName $rgname -Name $wname -Slot $slotName -Force
464+
Remove-AzureRmWebApp -ResourceGroupName $rgname -Name $wname -Force
465+
Remove-AzureRmAppServicePlan -ResourceGroupName $rgname -Name $whpName -Force
466+
Remove-AzureRmResourceGroup -Name $rgname -Force
467+
}
468+
}
469+
470+
function Test-RestoreDeletedWebAppToNew
471+
{
472+
# Setup
473+
$rgname = Get-ResourceGroupName
474+
$location = Get-WebLocation
475+
$whpName = Get-WebHostPlanName
476+
$tier = "Standard"
477+
478+
try
479+
{
480+
#Setup
481+
New-AzureRmResourceGroup -Name $rgname -Location $location
482+
New-AzureRmAppServicePlan -ResourceGroupName $rgname -Name $whpName -Location $location -Tier $tier
483+
$deletedApp = Get-AzureRmDeletedWebApp -ResourceGroupName $undeleteRgName -Name $undeleteAppName -Slot "Production"
484+
# Test piping the deleted app
485+
$job = $deletedApp | Restore-AzureRmDeletedWebApp -TargetResourceGroupName $rgname -TargetAppServicePlanName $whpName -Force -AsJob
486+
$result = $job | Wait-Job
487+
Assert-AreEqual "Completed" $result.State;
488+
489+
$restoredApp = $job | Receive-Job
490+
Assert-NotNull $restoredApp
491+
Assert-AreEqual $rgname $restoredApp.ResourceGroup
492+
Assert-AreEqual $undeleteAppName $restoredApp.Name
493+
}
494+
finally
495+
{
496+
# Cleanup
497+
Remove-AzureRmWebApp -ResourceGroupName $rgname -Name $undeleteAppName -Force
498+
Remove-AzureRmAppServicePlan -ResourceGroupName $rgname -Name $whpName -Force
499+
Remove-AzureRmResourceGroup -Name $rgname -Force
500+
}
501+
}
502+
377503
# Utility functions
378504

379505
# Creates a new web app

src/ResourceManager/Websites/Commands.Websites.Test/SessionRecords/Microsoft.Azure.Commands.Websites.Test.ScenarioTests.WebAppBackupRestoreTests/TestCreateNewWebAppBackup.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -976,7 +976,7 @@
976976
"Microsoft.Azure.Management.Storage.StorageManagementClient/4.0.0.0"
977977
]
978978
},
979-
"ResponseBody": "{\r\n \"key1\": \"k/PoJV7QPAMDNA2xXzHkJK/2BfCgR8T07WoRDVpcSiPoKzltg4eWHLDiSoCBhA7s/3QQG2tuLOXvf64oNDBAZA==\",\r\n \"key2\": \"bJKvyMT9dnuavEHaQDohobUF9sMtg1hHm7cOKdnWcpD+ZuxCcjyMnKerUqh+bjZLgLJCkH15um3r2jjyqKUZxw==\"\r\n}",
979+
"ResponseBody": "{\r\n \"key1\": \"REDACTED\",\r\n \"key2\": \"REDACTED\"\r\n}",
980980
"ResponseHeaders": {
981981
"Content-Length": [
982982
"197"
@@ -1024,7 +1024,7 @@
10241024
"RequestUri": "/subscriptions/0d3ae56c-deaf-4982-b514-33d016d4a683/resourceGroups/ps1762/providers/Microsoft.Web/sites/ps5041/backup?api-version=2018-02-01",
10251025
"EncodedRequestUri": "L3N1YnNjcmlwdGlvbnMvMGQzYWU1NmMtZGVhZi00OTgyLWI1MTQtMzNkMDE2ZDRhNjgzL3Jlc291cmNlR3JvdXBzL3BzMTc2Mi9wcm92aWRlcnMvTWljcm9zb2Z0LldlYi9zaXRlcy9wczUwNDEvYmFja3VwP2FwaS12ZXJzaW9uPTIwMTgtMDItMDE=",
10261026
"RequestMethod": "POST",
1027-
"RequestBody": "{\r\n \"properties\": {\r\n \"backupName\": \"ps9111\",\r\n \"storageAccountUrl\": \"https://stops1762.blob.core.windows.net/containerps1762?sv=2017-07-29&sr=b&sig=mkK%2F8EY3js5GRaRwYB1kZU7GYhbviev5W%2B9kgi2d6ck%3D&se=2018-08-31T01%3A49%3A25Z&sp=rwdl\"\r\n }\r\n}",
1027+
"RequestBody": "{\r\n \"properties\": {\r\n \"backupName\": \"ps9111\",\r\n \"storageAccountUrl\": \"REDACTED\"\r\n }\r\n}",
10281028
"RequestHeaders": {
10291029
"Content-Type": [
10301030
"application/json; charset=utf-8"
@@ -1045,7 +1045,7 @@
10451045
"Microsoft.Azure.Management.WebSites.WebSiteManagementClient/2.0.0"
10461046
]
10471047
},
1048-
"ResponseBody": "{\r\n \"id\": \"/subscriptions/0d3ae56c-deaf-4982-b514-33d016d4a683/resourceGroups/ps1762/providers/Microsoft.Web/sites/ps5041\",\r\n \"name\": \"ps5041\",\r\n \"type\": \"Microsoft.Web/sites\",\r\n \"location\": \"West US\",\r\n \"properties\": {\r\n \"id\": 183,\r\n \"storageAccountUrl\": \"https://stops1762.blob.core.windows.net/containerps1762?sv=2017-07-29&sr=b&sig=mkK%2F8EY3js5GRaRwYB1kZU7GYhbviev5W%2B9kgi2d6ck%3D&se=2018-08-31T01%3A49%3A25Z&sp=rwdl\",\r\n \"blobName\": \"ps9111\",\r\n \"name\": \"ps9111\",\r\n \"backupName\": \"ps9111\",\r\n \"status\": \"Created\",\r\n \"sizeInBytes\": 0,\r\n \"created\": \"2018-08-30T23:49:26.1425518Z\",\r\n \"log\": null,\r\n \"databases\": null,\r\n \"scheduled\": false,\r\n \"correlationId\": \"c067b16d-2da3-4f46-97f3-8669e7cb3b07\",\r\n \"websiteSizeInBytes\": null\r\n }\r\n}",
1048+
"ResponseBody": "{\r\n \"id\": \"/subscriptions/0d3ae56c-deaf-4982-b514-33d016d4a683/resourceGroups/ps1762/providers/Microsoft.Web/sites/ps5041\",\r\n \"name\": \"ps5041\",\r\n \"type\": \"Microsoft.Web/sites\",\r\n \"location\": \"West US\",\r\n \"properties\": {\r\n \"id\": 183,\r\n \"storageAccountUrl\": \"REDACTED\",\r\n \"blobName\": \"ps9111\",\r\n \"name\": \"ps9111\",\r\n \"backupName\": \"ps9111\",\r\n \"status\": \"Created\",\r\n \"sizeInBytes\": 0,\r\n \"created\": \"2018-08-30T23:49:26.1425518Z\",\r\n \"log\": null,\r\n \"databases\": null,\r\n \"scheduled\": false,\r\n \"correlationId\": \"c067b16d-2da3-4f46-97f3-8669e7cb3b07\",\r\n \"websiteSizeInBytes\": null\r\n }\r\n}",
10491049
"ResponseHeaders": {
10501050
"Content-Length": [
10511051
"658"

0 commit comments

Comments
 (0)