Skip to content

Commit d17d1e7

Browse files
vinisotoVini Soto
andauthored
[AppService] Fix - bug that prevented changing Container settings in Set-AzWebApp and Set-AzWebAppSlot (#12107)
* Fixed bug that prevented changing Container settings in `Set-AzWebApp` and `Set-AzWebAppSlot` * Adding tests and fixingTest-CreateNewWebAppHyperV false positive Co-authored-by: Vini Soto <[email protected]>
1 parent 54327cc commit d17d1e7

File tree

11 files changed

+6862
-315
lines changed

11 files changed

+6862
-315
lines changed

src/Websites/Websites.Test/ScenarioTests/WebAppTests.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ public void TestCreateNewWebAppHyperV()
4545
WebsitesController.NewInstance.RunPsTest(_logger, "Test-CreateNewWebAppHyperV");
4646
}
4747

48+
[Fact]
49+
[Trait(Category.AcceptanceType, Category.CheckIn)]
50+
public void TestSetWebAppHyperVCredentials()
51+
{
52+
WebsitesController.NewInstance.RunPsTest(_logger, "Test-SetWebAppHyperVCredentials");
53+
}
54+
4855
[Fact]
4956
[Trait(Category.AcceptanceType, Category.CheckIn)]
5057
public void TestEnableContainerContinuousDeploymentAndGetUrl()

src/Websites/Websites.Test/ScenarioTests/WebAppTests.ps1

Lines changed: 127 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -506,13 +506,12 @@ function Test-CreateNewWebAppHyperV
506506
"DOCKER_REGISTRY_SERVER_USERNAME" = $containerRegistryUser;
507507
"DOCKER_REGISTRY_SERVER_PASSWORD" = $pass;}
508508

509-
foreach($nvp in $webApp.SiteConfig.AppSettings)
509+
foreach($nvp in $result.SiteConfig.AppSettings)
510510
{
511511
Assert-True { $appSettings.Keys -contains $nvp.Name }
512-
Assert-True { $appSettings[$nvp.Name] -match $nvp.Value }
512+
Assert-AreEqual $appSettings[$nvp.Name] $nvp.Value
513513
}
514514

515-
516515
}
517516
finally
518517
{
@@ -523,6 +522,131 @@ function Test-CreateNewWebAppHyperV
523522
}
524523
}
525524

525+
<#
526+
.SYNOPSIS
527+
Tests changing registry credentials for a Windows Container app
528+
.DESCRIPTION
529+
SmokeTest
530+
#>
531+
function Test-SetWebAppHyperVCredentials
532+
{
533+
# Setup
534+
$rgname = Get-ResourceGroupName
535+
$wname = Get-WebsiteName
536+
$location = Get-WebLocation
537+
$whpName = Get-WebHostPlanName
538+
$tier = "PremiumContainer"
539+
$apiversion = "2015-08-01"
540+
$resourceType = "Microsoft.Web/sites"
541+
$containerImageName = "pstestacr.azurecr.io/tests/iis:latest"
542+
$containerRegistryUrl = "https://pstestacr.azurecr.io"
543+
$containerRegistryUser = "pstestacr"
544+
$pass = "cYK4qnENExflnnOkBN7P+gkmBG0sqgIv"
545+
$containerRegistryPassword = ConvertTo-SecureString -String $pass -AsPlainText -Force
546+
$dockerPrefix = "DOCKER|"
547+
548+
549+
try
550+
{
551+
#Setup
552+
New-AzResourceGroup -Name $rgname -Location $location
553+
$serverFarm = New-AzAppServicePlan -ResourceGroupName $rgname -Name $whpName -Location $location -Tier $tier -WorkerSize Small -HyperV
554+
555+
# Create new web app
556+
$job = New-AzWebApp -ResourceGroupName $rgname -Name $wname -Location $location -AppServicePlan $whpName -ContainerImageName $containerImageName -ContainerRegistryUrl $containerRegistryUrl -ContainerRegistryUser $containerRegistryUser -ContainerRegistryPassword $containerRegistryPassword -AsJob
557+
$job | Wait-Job
558+
$actual = $job | Receive-Job
559+
560+
# Assert
561+
Assert-AreEqual $wname $actual.Name
562+
Assert-AreEqual $serverFarm.Id $actual.ServerFarmId
563+
564+
# Get new web app
565+
$result = Get-AzWebApp -ResourceGroupName $rgname -Name $wname
566+
567+
# Assert
568+
Assert-AreEqual $wname $result.Name
569+
Assert-AreEqual $serverFarm.Id $result.ServerFarmId
570+
Assert-AreEqual $true $result.IsXenon
571+
Assert-AreEqual ($dockerPrefix + $containerImageName) $result.SiteConfig.WindowsFxVersion
572+
573+
$appSettings = @{
574+
"DOCKER_REGISTRY_SERVER_URL" = $containerRegistryUrl;
575+
"DOCKER_REGISTRY_SERVER_USERNAME" = $containerRegistryUser;
576+
"DOCKER_REGISTRY_SERVER_PASSWORD" = $pass;}
577+
578+
foreach($nvp in $result.SiteConfig.AppSettings)
579+
{
580+
Assert-True { $appSettings.Keys -contains $nvp.Name }
581+
Assert-AreEqual $appSettings[$nvp.Name] $nvp.Value
582+
}
583+
584+
$updatedContainerImageName = "microsoft/iis:latest"
585+
586+
# Change the webapp's container image to a public image and remove the credentials
587+
$updateJob = Set-AzWebApp -ResourceGroupName $rgname -Name $wname -ContainerImageName $updatedContainerImageName -ContainerRegistryUrl '' -ContainerRegistryUser '' -ContainerRegistryPassword $null -AsJob
588+
$updateJob | Wait-Job
589+
$updated = $updateJob | Receive-Job
590+
591+
# Get updated web app
592+
$updatedWebApp = Get-AzWebApp -ResourceGroupName $rgname -Name $wname
593+
594+
# Assert that container image has been updated
595+
Assert-AreEqual ($dockerPrefix + $updatedContainerImageName) $updatedWebApp.SiteConfig.WindowsFxVersion
596+
597+
# Assert that registry credentials have been removed
598+
foreach($nvp in $updatedWebApp.SiteConfig.AppSettings)
599+
{
600+
Assert-False { $appSettings.Keys -contains $nvp.Name}
601+
}
602+
603+
# Create a slot
604+
$slotName = "stagingslot"
605+
$slotJob = New-AzWebAppSlot -ResourceGroupName $rgname -AppServicePlan $whpName -Name $wname -slot $slotName -ContainerImageName $containerImageName -ContainerRegistryUrl $containerRegistryUrl -ContainerRegistryUser $containerRegistryUser -ContainerRegistryPassword $containerRegistryPassword -AsJob
606+
$slotJob | Wait-Job
607+
$actualSlot = $slotJob | Receive-Job
608+
609+
# Assert
610+
$appWithSlotName = "$wname/$slotName"
611+
Assert-AreEqual $appWithSlotName $actualSlot.Name
612+
613+
# Get deployment slot
614+
$slot = Get-AzWebAppSlot -ResourceGroupName $rgname -Name $wname -Slot $slotName
615+
616+
# Assert app settings in slot
617+
foreach($nvp in $slot.SiteConfig.AppSettings)
618+
{
619+
Assert-True { $appSettings.Keys -contains $nvp.Name }
620+
Assert-AreEqual $appSettings[$nvp.Name] $nvp.Value
621+
}
622+
623+
# Change the slot's container image to a public image and remove the credentials
624+
$updateSlotJob = Set-AzWebAppSlot -ResourceGroupName $rgname -Name $wname -Slot $slotName -ContainerImageName $updatedContainerImageName -ContainerRegistryUrl '' -ContainerRegistryUser '' -ContainerRegistryPassword $null -AsJob
625+
$updateSlotJob | Wait-Job
626+
$updatedSlot = $updateSlotJob | Receive-Job
627+
628+
# Get updated slot
629+
$updatedWebAppSlot = Get-AzWebAppSlot -ResourceGroupName $rgname -Name $wname -Slot $slotName
630+
631+
# Assert that container image has been updated
632+
Assert-AreEqual ($dockerPrefix + $updatedContainerImageName) $updatedWebAppSlot.SiteConfig.WindowsFxVersion
633+
634+
# Assert that registry credentials have been removed from the slot
635+
foreach($nvp in $updatedWebAppSlot.SiteConfig.AppSettings)
636+
{
637+
Assert-False { $appSettings.Keys -contains $nvp.Name}
638+
}
639+
640+
}
641+
finally
642+
{
643+
# Cleanup
644+
Remove-AzWebApp -ResourceGroupName $rgname -Name $wname -Force
645+
Remove-AzAppServicePlan -ResourceGroupName $rgname -Name $whpName -Force
646+
Remove-AzResourceGroup -Name $rgname -Force
647+
}
648+
}
649+
526650
<#
527651
.SYNOPSIS
528652
Tests enagbling continuous deployment for container and getting continuous deployment url.

src/Websites/Websites.Test/SessionRecords/Microsoft.Azure.Commands.Websites.Test.ScenarioTests.WebAppTests/TestCreateNewWebAppHyperV.json

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

src/Websites/Websites.Test/SessionRecords/Microsoft.Azure.Commands.Websites.Test.ScenarioTests.WebAppTests/TestSetWebAppHyperVCredentials.json

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

src/Websites/Websites/ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
## Upcoming Release
2121
* Added safeguard to delete created webapp if restore failed in `Restore-AzDeletedWebApp`
2222
* Added "SourceWebApp.Location" for `New-AzWebApp` and `New-AzWebAppSlot`
23+
* Fixed bug that prevented changing Container settings in `Set-AzWebApp` and `Set-AzWebAppSlot`
2324

2425
## Version 1.9.0
2526
* Fixed typo on help of `Update-AzWebAppAccessRestrictionConfig`.

src/Websites/Websites/Cmdlets/DeploymentSlots/NewAzureWebAppSlot.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,15 @@ private Hashtable GetAppSettingsToUpdate()
105105
Hashtable appSettings = new Hashtable();
106106
if (ContainerRegistryUrl != null)
107107
{
108-
appSettings[CmdletHelpers.DocerRegistryServerUrl] = ContainerRegistryUrl;
108+
appSettings[CmdletHelpers.DockerRegistryServerUrl] = ContainerRegistryUrl;
109109
}
110110
if (ContainerRegistryUser != null)
111111
{
112-
appSettings[CmdletHelpers.DocerRegistryServerUserName] = ContainerRegistryUser;
112+
appSettings[CmdletHelpers.DockerRegistryServerUserName] = ContainerRegistryUser;
113113
}
114114
if (ContainerRegistryPassword != null)
115115
{
116-
appSettings[CmdletHelpers.DocerRegistryServerPassword] = ContainerRegistryPassword.ConvertToString();
116+
appSettings[CmdletHelpers.DockerRegistryServerPassword] = ContainerRegistryPassword.ConvertToString();
117117
}
118118
if (EnableContainerContinuousDeployment.IsPresent)
119119
{

src/Websites/Websites/Cmdlets/DeploymentSlots/SetAzureWebAppSlot.cs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,14 @@ public class SetAzureWebAppSlotCmdlet : WebAppSlotBaseCmdlet
9696
public string ContainerImageName { get; set; }
9797

9898
[Parameter(Mandatory = false, HelpMessage = "Private Container Registry Server Url", ParameterSetName = ParameterSet1Name)]
99-
[ValidateNotNullOrEmpty]
99+
[ValidateNotNull]
100100
public string ContainerRegistryUrl { get; set; }
101101

102102
[Parameter(Mandatory = false, HelpMessage = "Private Container Registry Username", ParameterSetName = ParameterSet1Name)]
103-
[ValidateNotNullOrEmpty]
103+
[ValidateNotNull]
104104
public string ContainerRegistryUser { get; set; }
105105

106106
[Parameter(Mandatory = false, HelpMessage = "Private Container Registry Password", ParameterSetName = ParameterSet1Name)]
107-
[ValidateNotNullOrEmpty]
108107
public SecureString ContainerRegistryPassword { get; set; }
109108

110109
[Parameter(Mandatory = false, HelpMessage = "Enables/Disables container continuous deployment webhook", ParameterSetName = ParameterSet1Name)]
@@ -218,15 +217,28 @@ public override void ExecuteCmdlet()
218217

219218
if (ContainerRegistryUrl != null)
220219
{
221-
appSettings[CmdletHelpers.DocerRegistryServerUrl] = ContainerRegistryUrl;
220+
appSettings.Remove(CmdletHelpers.DockerRegistryServerUrl);
221+
if (ContainerRegistryUrl != string.Empty)
222+
{
223+
appSettings[CmdletHelpers.DockerRegistryServerUrl] = ContainerRegistryUrl;
224+
}
222225
}
226+
223227
if (ContainerRegistryUser != null)
224228
{
225-
appSettings[CmdletHelpers.DocerRegistryServerUserName] = ContainerRegistryUser;
229+
appSettings.Remove(CmdletHelpers.DockerRegistryServerUserName);
230+
231+
if (ContainerRegistryUser != string.Empty)
232+
{
233+
appSettings[CmdletHelpers.DockerRegistryServerUserName] = ContainerRegistryUser;
234+
}
226235
}
236+
237+
appSettings.Remove(CmdletHelpers.DockerRegistryServerPassword);
238+
227239
if (ContainerRegistryPassword != null)
228240
{
229-
appSettings[CmdletHelpers.DocerRegistryServerPassword] = ContainerRegistryPassword.ConvertToString();
241+
appSettings[CmdletHelpers.DockerRegistryServerPassword] = ContainerRegistryPassword.ConvertToString();
230242
}
231243

232244
if (parameters.Contains("EnableContainerContinuousDeployment"))

src/Websites/Websites/Cmdlets/WebApps/NewAzureWebApp.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -318,17 +318,17 @@ private SiteConfig GetNewConfig(AppServicePlan appServiceplan)
318318
}
319319
if (_cmdlet.ContainerRegistryUrl != null)
320320
{
321-
siteConfig.AppSettings.Add(new NameValuePair(CmdletHelpers.DocerRegistryServerUrl, _cmdlet.ContainerRegistryUrl));
321+
siteConfig.AppSettings.Add(new NameValuePair(CmdletHelpers.DockerRegistryServerUrl, _cmdlet.ContainerRegistryUrl));
322322
newConfigAdded = true;
323323
}
324324
if (_cmdlet.ContainerRegistryUser != null)
325325
{
326-
siteConfig.AppSettings.Add(new NameValuePair(CmdletHelpers.DocerRegistryServerUserName, _cmdlet.ContainerRegistryUser));
326+
siteConfig.AppSettings.Add(new NameValuePair(CmdletHelpers.DockerRegistryServerUserName, _cmdlet.ContainerRegistryUser));
327327
newConfigAdded = true;
328328
}
329329
if (_cmdlet.ContainerRegistryPassword != null)
330330
{
331-
siteConfig.AppSettings.Add(new NameValuePair(CmdletHelpers.DocerRegistryServerPassword, _cmdlet.ContainerRegistryPassword.ConvertToString()));
331+
siteConfig.AppSettings.Add(new NameValuePair(CmdletHelpers.DockerRegistryServerPassword, _cmdlet.ContainerRegistryPassword.ConvertToString()));
332332
newConfigAdded = true;
333333
}
334334
if (_cmdlet.EnableContainerContinuousDeployment.IsPresent)

src/Websites/Websites/Cmdlets/WebApps/SetAzureWebApp.cs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,15 +96,14 @@ public class SetAzureWebAppCmdlet : WebAppBaseCmdlet
9696
public string ContainerImageName { get; set; }
9797

9898
[Parameter(Mandatory = false, HelpMessage = "Private Container Registry Server Url", ParameterSetName = ParameterSet1Name)]
99-
[ValidateNotNullOrEmpty]
99+
[ValidateNotNull]
100100
public string ContainerRegistryUrl { get; set; }
101101

102102
[Parameter(Mandatory = false, HelpMessage = "Private Container Registry Username", ParameterSetName = ParameterSet1Name)]
103-
[ValidateNotNullOrEmpty]
103+
[ValidateNotNull]
104104
public string ContainerRegistryUser { get; set; }
105105

106106
[Parameter(Mandatory = false, HelpMessage = "Private Container Registry Password", ParameterSetName = ParameterSet1Name)]
107-
[ValidateNotNullOrEmpty]
108107
public SecureString ContainerRegistryPassword { get; set; }
109108

110109
[Parameter(Mandatory = false, HelpMessage = "Enables/Disables container continuous deployment webhook", ParameterSetName = ParameterSet1Name)]
@@ -220,18 +219,31 @@ public override void ExecuteCmdlet()
220219
}
221220
}
222221

223-
224222
if (ContainerRegistryUrl != null)
225223
{
226-
appSettings[CmdletHelpers.DocerRegistryServerUrl] = ContainerRegistryUrl;
224+
appSettings.Remove(CmdletHelpers.DockerRegistryServerUrl);
225+
226+
if (ContainerRegistryUrl != string.Empty)
227+
{
228+
appSettings[CmdletHelpers.DockerRegistryServerUrl] = ContainerRegistryUrl;
229+
}
227230
}
231+
228232
if (ContainerRegistryUser != null)
229233
{
230-
appSettings[CmdletHelpers.DocerRegistryServerUserName] = ContainerRegistryUser;
234+
appSettings.Remove(CmdletHelpers.DockerRegistryServerUserName);
235+
236+
if (ContainerRegistryUser != string.Empty)
237+
{
238+
appSettings[CmdletHelpers.DockerRegistryServerUserName] = ContainerRegistryUser;
239+
}
231240
}
241+
242+
appSettings.Remove(CmdletHelpers.DockerRegistryServerPassword);
243+
232244
if (ContainerRegistryPassword != null)
233245
{
234-
appSettings[CmdletHelpers.DocerRegistryServerPassword] = ContainerRegistryPassword.ConvertToString();
246+
appSettings[CmdletHelpers.DockerRegistryServerPassword] = ContainerRegistryPassword.ConvertToString();
235247
}
236248

237249
if (parameters.Contains("EnableContainerContinuousDeployment"))

src/Websites/Websites/Utilities/CmdletHelpers.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ public static NetworkManagementClient networkClient
6767
private const string ApplicationServiceEnvironmentResourceIdFormat =
6868
"/subscriptions/{0}/resourcegroups/{1}/providers/Microsoft.Web/{2}/{3}";
6969

70-
public const string DocerRegistryServerUrl = "DOCKER_REGISTRY_SERVER_URL";
71-
public const string DocerRegistryServerUserName = "DOCKER_REGISTRY_SERVER_USERNAME";
72-
public const string DocerRegistryServerPassword = "DOCKER_REGISTRY_SERVER_PASSWORD";
70+
public const string DockerRegistryServerUrl = "DOCKER_REGISTRY_SERVER_URL";
71+
public const string DockerRegistryServerUserName = "DOCKER_REGISTRY_SERVER_USERNAME";
72+
public const string DockerRegistryServerPassword = "DOCKER_REGISTRY_SERVER_PASSWORD";
7373
public const string DockerEnableCI = "DOCKER_ENABLE_CI";
7474
public const string DockerImagePrefix = "DOCKER|";
7575

src/Websites/Websites/Utilities/WebsitesClient.cs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -539,14 +539,6 @@ public void UpdateWebAppConfiguration(string resourceGroupName, string location,
539539

540540
if (useSlot)
541541
{
542-
if (siteConfig != null)
543-
{
544-
WrappedWebsitesClient.WebApps().UpdateConfigurationSlot(
545-
resourceGroupName,
546-
webSiteName,
547-
siteConfig.ConvertToSiteConfigResource(),
548-
slotName);
549-
}
550542

551543
if (appSettings != null)
552544
{
@@ -557,6 +549,15 @@ public void UpdateWebAppConfiguration(string resourceGroupName, string location,
557549
slotName);
558550
}
559551

552+
if (siteConfig != null)
553+
{
554+
WrappedWebsitesClient.WebApps().UpdateConfigurationSlot(
555+
resourceGroupName,
556+
webSiteName,
557+
siteConfig.ConvertToSiteConfigResource(),
558+
slotName);
559+
}
560+
560561
if (connectionStrings != null)
561562
{
562563
WrappedWebsitesClient.WebApps().UpdateConnectionStringsSlot(
@@ -577,10 +578,6 @@ public void UpdateWebAppConfiguration(string resourceGroupName, string location,
577578
}
578579
else
579580
{
580-
if (siteConfig != null)
581-
{
582-
WrappedWebsitesClient.WebApps().UpdateConfiguration(resourceGroupName, webSiteName, siteConfig.ConvertToSiteConfigResource());
583-
}
584581

585582
if (appSettings != null)
586583
{
@@ -590,6 +587,11 @@ public void UpdateWebAppConfiguration(string resourceGroupName, string location,
590587
new StringDictionary { Properties = appSettings });
591588
}
592589

590+
if (siteConfig != null)
591+
{
592+
WrappedWebsitesClient.WebApps().UpdateConfiguration(resourceGroupName, webSiteName, siteConfig.ConvertToSiteConfigResource());
593+
}
594+
593595
if (connectionStrings != null)
594596
{
595597
WrappedWebsitesClient.WebApps().UpdateConnectionStrings(

0 commit comments

Comments
 (0)