From 8c88ac74d6c47829b86a5d9f93bd7380a0ebe29f Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Wed, 6 Mar 2024 12:57:07 +0200 Subject: [PATCH 1/4] Add Availability Zones Bicep Parameter --- .../Add-AvailabilityZonesBicepParameters.ps1 | 51 +++++++++++++++++++ src/ALZ/Private/New-ALZEnvironmentBicep.ps1 | 1 + 2 files changed, 52 insertions(+) create mode 100644 src/ALZ/Private/Add-AvailabilityZonesBicepParameters.ps1 diff --git a/src/ALZ/Private/Add-AvailabilityZonesBicepParameters.ps1 b/src/ALZ/Private/Add-AvailabilityZonesBicepParameters.ps1 new file mode 100644 index 0000000..38a4c60 --- /dev/null +++ b/src/ALZ/Private/Add-AvailabilityZonesBicepParameters.ps1 @@ -0,0 +1,51 @@ +function Add-AvailabilityZonesBicepParameter { + [CmdletBinding(SupportsShouldProcess = $true)] + param ( + [Parameter(Mandatory = $true)] + [Alias("Output")] + [Alias("OutputDirectory")] + [Alias("O")] + [string] $alzEnvironmentDestination, + + [Parameter(Mandatory = $true)] + [PSCustomObject]$configFile + ) + + $parametersConfig = @( + [pscustomobject]@{ + source = "hubNetworking.parameters.all.json"; + parameters = "parAzErGatewayAvailabilityZones,parAzVpnGatewayAvailabilityZones,parAzFirewallAvailabilityZones" + } + [pscustomobject]@{ + source = "vwanConnectivity.parameters.all.json"; + parameters = "parAzFirewallAvailabilityZones" + } + ) + + foreach ($parametersFile in $parametersConfig) { + $parametersFilePath = Join-Path -Path $alzEnvironmentDestination "config\custom-parameters\$($parametersFile.source)" + $region = (Get-Content $parametersFilePath | ConvertFrom-Json).parameters.parLocation.Value + $zones = ($configFile.PsObject.Properties["zonesSupport"].Value | Where-Object { $_.region -eq $region }).zones + $parametersFileJsonContent = Get-Content -Path $parametersFilePath -Raw + $jsonObject = $parametersFileJsonContent | ConvertFrom-Json + $parametersFile.parameters.Split(",") | ForEach-Object { + $parameter = $_ + try { + if ($null -eq $jsonObject.parameters.$parameter.value) { + $jsonObject.parameters.$parameter.value = @($zones) + } + + else { + $jsonObject.parameters.$parameter.value = $zones + } + + } + + catch { + Write-Error -Message "The parameter $parameter does not exist in the file $parametersFilePath" + } + } + $parametersFileJsonContent = $jsonObject | ConvertTo-Json -Depth 10 + Set-Content -Path $parametersFilePath -Value $parametersFileJsonContent + } +} \ No newline at end of file diff --git a/src/ALZ/Private/New-ALZEnvironmentBicep.ps1 b/src/ALZ/Private/New-ALZEnvironmentBicep.ps1 index fc17493..13400f7 100644 --- a/src/ALZ/Private/New-ALZEnvironmentBicep.ps1 +++ b/src/ALZ/Private/New-ALZEnvironmentBicep.ps1 @@ -49,6 +49,7 @@ function New-ALZEnvironmentBicep { Set-ComputedConfiguration -configuration $configuration | Out-String | Write-Verbose Edit-ALZConfigurationFilesInPlace -alzEnvironmentDestination $alzEnvironmentDestination -configuration $configuration | Out-String | Write-Verbose Build-ALZDeploymentEnvFile -configuration $configuration -Destination $alzEnvironmentDestination -version $releaseTag | Out-String | Write-Verbose + Add-AvailabilityZonesBicepParameter -alzEnvironmentDestination $alzEnvironmentDestination -configFile $bicepConfig| Out-String | Write-Verbose $isGitRepo = Test-ALZGitRepository -alzEnvironmentDestination $alzEnvironmentDestination if (-not $isGitRepo) { From 88c19aa4122548a65ce27fd50fb37b11b5dd37fd Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 14 Mar 2024 14:08:15 +0200 Subject: [PATCH 2/4] add unit test --- ...AvailabilityZonesBicepParameters.Tests.ps1 | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/Tests/Unit/Private/Add-AvailabilityZonesBicepParameters.Tests.ps1 diff --git a/src/Tests/Unit/Private/Add-AvailabilityZonesBicepParameters.Tests.ps1 b/src/Tests/Unit/Private/Add-AvailabilityZonesBicepParameters.Tests.ps1 new file mode 100644 index 0000000..919c823 --- /dev/null +++ b/src/Tests/Unit/Private/Add-AvailabilityZonesBicepParameters.Tests.ps1 @@ -0,0 +1,49 @@ +#------------------------------------------------------------------------- +Set-Location -Path $PSScriptRoot +#------------------------------------------------------------------------- +$ModuleName = 'ALZ' +$PathToManifest = [System.IO.Path]::Combine('..', '..', '..', $ModuleName, "$ModuleName.psd1") +#------------------------------------------------------------------------- +if (Get-Module -Name $ModuleName -ErrorAction 'SilentlyContinue') { + #if the module is already in memory, remove it + Remove-Module -Name $ModuleName -Force +} +Import-Module $PathToManifest -Force +#------------------------------------------------------------------------- + +InModuleScope 'ALZ' { + Describe "Add-AvailabilityZonesBicepParameter" { + Context "When adding availability zones" { + BeforeAll { + $alzEnvironmentDestination = "TestDrive:\" + $hubParametersPath = "https://raw.githubusercontent.com/Azure/ALZ-Bicep/main/infra-as-code/bicep/modules/hubNetworking/parameters/hubNetworking.parameters.all.json" + # Downloading parameters files + Invoke-WebRequest -Uri $hubParametersPath -OutFile "$alzEnvironmentDestination\hubNetworking.parameters.all.json" + Mock -CommandName Join-Path -MockWith { + $alzEnvironmentDestination + "\hubNetworking.parameters.all.json" + } + + Mock -CommandName Get-Content -ParameterFilter { $Path -contains 'parametersFilePath' } -MockWith { + Get-Content -Path "TestDrive:\hubNetworking.parameters.all.json" + } + } + It "Should add the correct zones per region" { + Add-AvailabilityZonesBicepParameter -alzEnvironmentDestination $alzEnvironmentDestination -configFile ([PSCustomObject]@{ + zonesSupport = @( + [PSCustomObject]@{ + region = "eastus" + zones = @("1", "2", "3") + } + ) + }) + + $parametersFileJsonContent = Get-Content -Path "TestDrive:\hubNetworking.parameters.all.json" -Raw + $jsonObject = $parametersFileJsonContent | ConvertFrom-Json + $jsonObject.parameters.parAzErGatewayAvailabilityZones.value | Should -Be @("1", "2", "3") + $jsonObject.parameters.parAzVpnGatewayAvailabilityZones.value | Should -Be @("1", "2", "3") + $jsonObject.parameters.parAzFirewallAvailabilityZones.value | Should -Be @("1", "2", "3") + } + } + } + +} \ No newline at end of file From 621877721cd3fb42316f377f447e8287cb01cd9e Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 14 Mar 2024 14:09:14 +0200 Subject: [PATCH 3/4] Refactor availability zones parameter context --- .../Unit/Private/Add-AvailabilityZonesBicepParameters.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tests/Unit/Private/Add-AvailabilityZonesBicepParameters.Tests.ps1 b/src/Tests/Unit/Private/Add-AvailabilityZonesBicepParameters.Tests.ps1 index 919c823..64c625e 100644 --- a/src/Tests/Unit/Private/Add-AvailabilityZonesBicepParameters.Tests.ps1 +++ b/src/Tests/Unit/Private/Add-AvailabilityZonesBicepParameters.Tests.ps1 @@ -13,7 +13,7 @@ Import-Module $PathToManifest -Force InModuleScope 'ALZ' { Describe "Add-AvailabilityZonesBicepParameter" { - Context "When adding availability zones" { + Context "Adding availability zones to parameters file" { BeforeAll { $alzEnvironmentDestination = "TestDrive:\" $hubParametersPath = "https://raw.githubusercontent.com/Azure/ALZ-Bicep/main/infra-as-code/bicep/modules/hubNetworking/parameters/hubNetworking.parameters.all.json" From 44e35164ba134a933310e399a8d1ca1e2120e557 Mon Sep 17 00:00:00 2001 From: Seif Bassem <38246040+sebassem@users.noreply.github.com> Date: Thu, 14 Mar 2024 19:14:09 +0200 Subject: [PATCH 4/4] Add availability zones to hub networking parameters --- ...AvailabilityZonesBicepParameters.Tests.ps1 | 45 +++++++++++++++---- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/src/Tests/Unit/Private/Add-AvailabilityZonesBicepParameters.Tests.ps1 b/src/Tests/Unit/Private/Add-AvailabilityZonesBicepParameters.Tests.ps1 index 64c625e..ae75d99 100644 --- a/src/Tests/Unit/Private/Add-AvailabilityZonesBicepParameters.Tests.ps1 +++ b/src/Tests/Unit/Private/Add-AvailabilityZonesBicepParameters.Tests.ps1 @@ -13,21 +13,21 @@ Import-Module $PathToManifest -Force InModuleScope 'ALZ' { Describe "Add-AvailabilityZonesBicepParameter" { - Context "Adding availability zones to parameters file" { + BeforeAll { + $alzEnvironmentDestination = "TestDrive:\" + $hubParametersPath = "https://raw.githubusercontent.com/Azure/ALZ-Bicep/main/infra-as-code/bicep/modules/hubNetworking/parameters/hubNetworking.parameters.all.json" + Invoke-WebRequest -Uri $hubParametersPath -OutFile "$alzEnvironmentDestination\hubNetworking.parameters.all.json" + } + Context "Hub networking parameters availability zones check" { BeforeAll { - $alzEnvironmentDestination = "TestDrive:\" - $hubParametersPath = "https://raw.githubusercontent.com/Azure/ALZ-Bicep/main/infra-as-code/bicep/modules/hubNetworking/parameters/hubNetworking.parameters.all.json" - # Downloading parameters files - Invoke-WebRequest -Uri $hubParametersPath -OutFile "$alzEnvironmentDestination\hubNetworking.parameters.all.json" Mock -CommandName Join-Path -MockWith { $alzEnvironmentDestination + "\hubNetworking.parameters.all.json" } - Mock -CommandName Get-Content -ParameterFilter { $Path -contains 'parametersFilePath' } -MockWith { Get-Content -Path "TestDrive:\hubNetworking.parameters.all.json" } } - It "Should add the correct zones per region" { + It "Should add 3 availability zones for hub networking parameters" { Add-AvailabilityZonesBicepParameter -alzEnvironmentDestination $alzEnvironmentDestination -configFile ([PSCustomObject]@{ zonesSupport = @( [PSCustomObject]@{ @@ -36,13 +36,42 @@ InModuleScope 'ALZ' { } ) }) - $parametersFileJsonContent = Get-Content -Path "TestDrive:\hubNetworking.parameters.all.json" -Raw $jsonObject = $parametersFileJsonContent | ConvertFrom-Json $jsonObject.parameters.parAzErGatewayAvailabilityZones.value | Should -Be @("1", "2", "3") $jsonObject.parameters.parAzVpnGatewayAvailabilityZones.value | Should -Be @("1", "2", "3") $jsonObject.parameters.parAzFirewallAvailabilityZones.value | Should -Be @("1", "2", "3") } + It "Should add 2 availability zones for hub networking parameters" { + Add-AvailabilityZonesBicepParameter -alzEnvironmentDestination $alzEnvironmentDestination -configFile ([PSCustomObject]@{ + zonesSupport = @( + [PSCustomObject]@{ + region = "eastus" + zones = @("1", "2") + } + ) + }) + $parametersFileJsonContent = Get-Content -Path "TestDrive:\hubNetworking.parameters.all.json" -Raw + $jsonObject = $parametersFileJsonContent | ConvertFrom-Json + $jsonObject.parameters.parAzErGatewayAvailabilityZones.value | Should -Be @("1", "2") + $jsonObject.parameters.parAzVpnGatewayAvailabilityZones.value | Should -Be @("1", "2") + $jsonObject.parameters.parAzFirewallAvailabilityZones.value | Should -Be @("1", "2") + } + It "Should add 0 availability zones for hub networking parameters" { + Add-AvailabilityZonesBicepParameter -alzEnvironmentDestination $alzEnvironmentDestination -configFile ([PSCustomObject]@{ + zonesSupport = @( + [PSCustomObject]@{ + region = "eastus" + zones = @() + } + ) + }) + $parametersFileJsonContent = Get-Content -Path "TestDrive:\hubNetworking.parameters.all.json" -Raw + $jsonObject = $parametersFileJsonContent | ConvertFrom-Json + $jsonObject.parameters.parAzErGatewayAvailabilityZones.value | Should -Be @() + $jsonObject.parameters.parAzVpnGatewayAvailabilityZones.value | Should -Be @() + $jsonObject.parameters.parAzFirewallAvailabilityZones.value | Should -Be @() + } } }