orchestration/scripts/New-Platform.ps1 (193 lines of code) (raw):
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
<#
.SYNOPSIS
The powershell script deploys platform as part of SLZ deployment.
#>
param (
$parAttendedLogin = $true
)
. ".\Invoke-Helper.ps1"
#variables
$varSovereignPlatformBicepFilePath = '..\sovereignPlatform\sovereignPlatform.bicep'
$varPlatformRequiredParams = @('parDeploymentPrefix', 'parDeploymentLocation', 'parManagementSubscriptionId', 'parIdentitySubscriptionId', 'parConnectivitySubscriptionId')
<#
.Description
Deploys resources and resource groups to subscriptions
Parameters:
parPlatformParametersFilePath -> path to the parameter file containing required parameters to deploy platform
varParameters -> hash table containing parameter name and value
modDeployBootstrapOutputs -> hash table containing parameter outputs from bootstrap deployment
#>
function New-Platform {
param($parPlatformParametersFilePath, $parParameters, $parDeployBootstrapOutputs)
if (!$parParameters -and !$parDeployBootstrapOutputs) {
$parParameters = Read-ParametersValue($parPlatformParametersFilePath)
Confirm-Parameters($varPlatformRequiredParams)
Get-DonotRetryErrorCodes
}
if ($parDeployBootstrapOutputs) {
$varConnectivitySubscriptionId = $parDeployBootstrapOutputs.outputs.outConnectivitySubscriptionId.value
$varIdentitySubscriptionId = $parDeployBootstrapOutputs.outputs.outIdentitySubscriptionId.value
$varManagementSubscriptionId = $parDeployBootstrapOutputs.outputs.outManagementSubscriptionId.value
}
else {
$varConnectivitySubscriptionId = $parParameters.parConnectivitySubscriptionId.value
$varIdentitySubscriptionId = $parParameters.parIdentitySubscriptionId.value
$varManagementSubscriptionId = $parParameters.parManagementSubscriptionId.value
}
if ([string]::IsNullOrEmpty($varConnectivitySubscriptionId) -or [string]::IsNullOrEmpty($varIdentitySubscriptionId) -or [string]::IsNullOrEmpty($varManagementSubscriptionId)) {
Write-Error "One or more subscription id is missing. Please rerun the deployment." -ErrorAction stop
}
$modCheckSubscriptionsExistsOutput = Confirm-SubscriptionsExists $varConnectivitySubscriptionId $varManagementSubscriptionId $varIdentitySubscriptionId
if ($modCheckSubscriptionsExistsOutput) {
Write-Information ">>>Subscriptions found" -InformationAction Continue
}
else {
Write-Error "One or more subscription not found. Please rerun the deployment." -ErrorAction stop
}
$parDeploymentPrefix = $parParameters.parDeploymentPrefix.value
$parDeploymentSuffix = $parParameters.parDeploymentSuffix.value
$varManagementGroupId = "$parDeploymentPrefix$parDeploymentSuffix"
$parDeploymentLocation = $parParameters.parDeploymentLocation.value
$parDeployBastion = $parParameters.parDeployBastion.value
$varSubnets = @(
@{
name = "AzureBastionSubnet"
ipAddressRange = $parParameters.parAzureBastionSubnet.value
networkSecurityGroupId = ""
routeTableId = ""
},
@{
name = "GatewaySubnet"
ipAddressRange = $parParameters.parGatewaySubnet.value
networkSecurityGroupId = ""
routeTableId = ""
},
@{
name = "AzureFirewallSubnet"
ipAddressRange = $parParameters.parAzureFirewallSubnet.value
networkSecurityGroupId = ""
routeTableId = ""
}
)
$varCustomSubnets = Convert-ToArray($parParameters.parCustomSubnets.value)
foreach ($subnet in $varCustomSubnets) {
if ($varSubnets.name.Contains($subnet.name)) {
for ($i = 0; $i -lt $varSubnets.Length; $i++) {
if ($varSubnets[$i]["name"] -ne $subnet.name) { continue }
$varSubnets[$i]["ipAddressRange"] = $subnet.ipAddressRange
$varSubnets[$i]["networkSecurityGroupId"] = $subnet.networkSecurityGroupId
$varSubnets[$i]["routeTableId"] = $subnet.routeTableId
}
}
else {
$varSubnet = @{
name = $subnet.name
ipAddressRange = $subnet.ipAddressRange
networkSecurityGroupId = $subnet.networkSecurityGroupId
routeTableId = $subnet.routeTableId
}
$varSubnets += $varSubnet
}
}
Confirm-BastionRequiredValue $parDeployBastion $varSubnets
$deploymentName = "deploy-platform-$vartimeStamp"
$varParams = @{
parConnectivitySubscriptionId = $varConnectivitySubscriptionId
parIdentitySubscriptionId = $varIdentitySubscriptionId
parManagementSubscriptionId = $varManagementSubscriptionId
parDeploymentPrefix = $parParameters.parDeploymentPrefix.value
parDeploymentSuffix = $parParameters.parDeploymentSuffix.value
parDeployDdosProtection = $parParameters.parDeployDdosProtection.value
parDeployHubNetwork = $parParameters.parDeployHubNetwork.value
parUsePremiumFirewall = $parParameters.parUsePremiumFirewall.value
parEnableFirewall = $parParameters.parEnableFirewall.value
parAzFirewallPoliciesEnabled = $parParameters.parAzFirewallPoliciesEnabled.value
parAzFirewallCustomPublicIps = $parParameters.parAzFirewallCustomPublicIps.value
parLogRetentionInDays = $parParameters.parLogRetentionInDays.value
parDeploymentLocation = $parParameters.parDeploymentLocation.value
parHubNetworkAddressPrefix = $parParameters.parHubNetworkAddressPrefix.value
parDeployBastion = $parParameters.parDeployBastion.value
parSubnets = $varSubnets
parExpressGatewaySku = $parParameters.parExpressRouteGatewayConfig.value.sku
parExpressGatewayVpntype = $parParameters.parExpressRouteGatewayConfig.value.vpntype
parExpressGatewayGeneration = $parParameters.parExpressRouteGatewayConfig.value.vpnGatewayGeneration
parExpressGatewayEnableBgp = $parParameters.parExpressRouteGatewayConfig.value.enableBgp
parExpressGatewayActiveActive = $parParameters.parExpressRouteGatewayConfig.value.activeActive
parExpressGatewayEnableBgpRouteTranslationForNat = $parParameters.parExpressRouteGatewayConfig.value.enableBgpRouteTranslationForNat
parExpressGatewayEnableDnsForwarding = $parParameters.parExpressRouteGatewayConfig.value.enableDnsForwarding
parExpressGatewayAsn = [string]::IsNullOrEmpty($parParameters.parExpressRouteGatewayConfig.value.asn) ? 65515 : $parParameters.parExpressRouteGatewayConfig.value.asn
parExpressGatewayBgpPeeringAddress = $parParameters.parExpressRouteGatewayConfig.value.bgpPeeringAddress
parExpressGatewayPeerWeight = [string]::IsNullOrEmpty($parParameters.parExpressRouteGatewayConfig.value.peerWeight) ? 5 : $parParameters.parExpressRouteGatewayConfig.value.peerWeight
parVpnGatewaySku = $parParameters.parVpnGatewayConfig.value.sku
parVpnGatewayVpntype = $parParameters.parVpnGatewayConfig.value.vpntype
parVpnGatewayGeneration = $parParameters.parVpnGatewayConfig.value.generation
parVpnGatewayEnableBgp = $parParameters.parVpnGatewayConfig.value.enableBgp
parVpnGatewayActiveActive = $parParameters.parVpnGatewayConfig.value.activeActive
parVpnGatewayEnableBgpRouteTranslationForNat = $parParameters.parVpnGatewayConfig.value.enableBgpRouteTranslationForNat
parVpnGatewayEnableDnsForwarding = $parParameters.parVpnGatewayConfig.value.enableDnsForwarding
parVpnGatewayAsn = [string]::IsNullOrEmpty($parParameters.parVpnGatewayConfig.value.asn) ? 65515 : $parParameters.parVpnGatewayConfig.value.asn
parVpnGatewayBgpPeeringAddress = $parParameters.parVpnGatewayConfig.value.bgpPeeringAddress
parVpnGatewayPeerWeight = [string]::IsNullOrEmpty($parParameters.parVpnGatewayConfig.value.peerWeight) ? 5 : $parParameters.parVpnGatewayConfig.value.peerWeight
parVpnGatewayClientConfiguration = $parParameters.parVpnGatewayConfig.value.vpnClientConfiguration
parBastionOutboundSshRdpPorts = $parParameters.parBastionOutboundSshRdpPorts.value
parDeployLogAnalyticsWorkspace = $parParameters.parDeployLogAnalyticsWorkspace.value
parTags = Convert-ToHashTable($parParameters.parTags.value)
}
$varLoopCounter = 0;
$varRetry = $true
while ($varRetry -and $varLoopCounter -lt $varMaxRetryAttemptTransientErrorRetry) {
$modDeploySovereignPlatform = $null
try {
Write-Information ">>> Platform deployment started" -InformationAction Continue
$modDeploySovereignPlatform = New-AzManagementGroupDeployment `
-Name $deploymentName `
-Location $parDeploymentLocation `
-TemplateFile $varSovereignPlatformBicepFilePath `
-ManagementGroupId $varManagementGroupId `
-TemplateParameterObject $varParams `
-WarningAction Ignore
if (!$modDeploySovereignPlatform) {
$varRetry = $false
Write-Error "Error while executing platform deployment script" -ErrorAction Stop
}
if ($modDeploySovereignPlatform.ProvisioningState -eq "Failed") {
Write-Error "`n Error while executing platform deployment" -ErrorAction Stop
}
Write-Information ">>> Platform deployment completed`n" -InformationAction Continue
# update parameters
Out-DeploymentParameters "platform" $modDeploySovereignPlatform $varManagementGroupId $parParameters
return $modDeploySovereignPlatform
}
catch {
$varException = $_.Exception
$varErrorDetails = $_.ErrorDetails
$varTrace = $_.ScriptStackTrace
if (!$varRetry) {
Write-Error ">>> Validation error occurred during execution . Please try after addressing the error : $varException \n $varErrorDetails \n $varTrace" -ErrorAction Stop
}
if (!$modDeploySovereignPlatform) {
Write-Error ">>> Error occurred during execution . Please try after addressing the error : $varException \n $varErrorDetails \n $varTrace" -ErrorAction Stop
}
else {
$varDeploymentErrorCodes = Get-FailedDeploymentErrorCodes $varManagementGroupId $deploymentName $varManagementGroupDeployment
if ($null -eq $varDeploymentErrorCodes) {
$varRetry = $false
}
else {
$varLoopCounter++
$varRetry = Confirm-Retry $varDeploymentErrorCodes
if ($varRetry -and $varLoopCounter -lt $varMaxRetryAttemptTransientErrorRetry) {
Write-Information ">>> Retrying deployment after waiting for $varRetryWaitTimeTransientErrorRetry secs" -InformationAction Continue
Start-Sleep -Seconds $varRetryWaitTimeTransientErrorRetry
}
else {
$varRetry = $false
Write-Error ">>> Error occurred in platform deployment. Please try after addressing the above error." -ErrorAction Stop
}
}
}
}
}
}