Private/Update-Infratstructure.ps1

function Update-Infrastructure {
    param(
        $SubscriptionId,
        $DestContext,
        $ResourceGroupName,
        $StorageAcccountName,
        $AppServiceName,
        $SelectedVersion
    )
    $updateDictionary = Get-UpdateDictionary -AppServiceName $AppServiceName -ResourceGroupName $ResourceGroupName

    # Sort the keys based on dependencies
    $updateSteps = Get-UpdateStepKeysInOrderByDependency -UpdateDictionary $updateDictionary
    Set-AzStorageAccount -ResourceGroup $ResourceGroupName -Name $StorageAcccountName -AllowSharedKeyAccess $true | out-null
    Start-Sleep -Seconds 20 # Wait for the storage account to be updated
    $timeout = (Get-Date).AddMinutes(10)

    while (-not ((Get-AzStorageAccount -ResourceGroup $ResourceGroupName -Name $StorageAcccountName).AllowSharedKeyAccess) -and (Get-Date) -lt $timeout) {
        Start-Sleep -Seconds 5
    }

    if ($null -eq (Get-AzStorageTable -Table $Script:tableName  -Context $DestContext -ErrorAction SilentlyContinue)) {
        New-AzStorageTable -Name $Script:tableName -Context $DestContext | Out-Null
    }
    $timeout = (Get-Date).AddMinutes(10)
    while ((Get-Date) -lt $timeout) {
        
        $AzureTable = Get-AzTableTable -TableName $Script:tableName -ResourceGroup $ResourceGroupName -StorageAccountName $StorageAcccountName
        if ($null -ne $AzureTable) {
            break
        }
        Start-Sleep -Seconds 5
    }
    
    foreach ($updateStep in $updateSteps) {
        if ($null -eq (Get-AzTableRow -table $AzureTable -partitionKey $Script:partitionKey -rowKey $updateStep) -and (Compare-SemVer $SelectedVersion $updateDictionary[$updateStep].MinVersion)) {
            foreach ($dependency in $updateDictionary[$updateStep].Dependencies) {
                if ($null -eq (Get-AzTableRow -table $AzureTable -partitionKey $Script:partitionKey -rowKey $dependency)) {
                    throw "Update step $updateStep has not been executed because dependency $dependency has not been executed"
                    exit 1;
                }
            }
            $checkAllowSharedKeyAccess = $true
            $tryCount = 0
            while ($checkAllowSharedKeyAccess) {
                try {
                    $tryCount++
                    Invoke-Command -ScriptBlock $updateDictionary[$updateStep].Function -ArgumentList $updateDictionary[$updateStep].Parameters
                    Add-AzTableRow -table  $AzureTable -partitionKey $Script:partitionKey -rowKey $updateStep | Out-Null
                    $checkAllowSharedKeyAccess = $false
                }
                catch [System.Management.Automation.MethodInvocationException] {
                    if ($tryCount -gt 5) {
                        Write-Error "Update step $updateStep failed Error: $_" -ErrorAction 'Continue'
                        throw "Update step $updateStep failed Error: $_"
                        exit 1;
                    }
                    Start-Sleep -Seconds 30
                }
                catch {
                    Write-Error "Update step $updateStep failed Error: $_" -ErrorAction 'Continue'
                    throw "Update step $updateStep failed Error: $_"
                    exit 1;
                }
            }
        }
    }
}