Scale-AzPostgressFlex.ps1

# Example
# Scale-AzPostgressFlex -ResourceGroupName 'POC-CSI-Demo' -Sku 'Standard_B1ms' -Name 'mytestpostgress'
# Stop-AzPostgressFlex -ResourceGroupName 'POC-CSI-Demo' -Stop '*' -Name 'mytestpostgress'
# Start-AzPostgressFlex -ResourceGroupName 'POC-CSI-Demo' -Start '*' -Name 'mytestpostgress'

# param ([string] $AzureRunAsConnection, [string] $ResourceGroupName, [string] $Name, [string] $Sku, [string] $Start, [string] $Stop)


Function Scale-AzPostgressFlex {
    param ([string] $AzureRunAsConnection, [string] $ResourceGroupName, [string] $Name, [string] $Sku, [string] $Start, [string] $Stop)

    filter timestamp { "[$(Get-Date -Format G)]: $_" }
    Write-Output 'Script started.' | timestamp
    # Available SKU
    $t = @'
 
+----------+--------------------+------------------+
| SKU | SKU_Name | Tier |
+----------+--------------------+------------------+
| B1ms | Standard_B1ms | Burstable |
| B2s | Standard_B2s | Burstable |
| B2ms | Standard_B2ms | Burstable |
| B4ms | Standard_B4ms | Burstable |
| B8ms | Standard_B8ms | Burstable |
| B16ms | Standard_B16ms | Burstable |
| B20ms | Standard_B20ms | Burstable |
+----------+--------------------+------------------+
| D2s_v3 | Standard_D2s_v3 | General Purpose |
| D2ds_v4 | Standard_D2ds_v4 | General Purpose |
| D2ds_v5 | Standard_D2ds_v5 | General Purpose |
| D4s_v3 | Standard_D4s_v3 | General Purpose |
| D4ds_v4 | Standard_D4ds_v4 | General Purpose |
| D4ds_v5 | Standard_D4ds_v5 | General Purpose |
| D8s_v3 | Standard_D8s_v3 | General Purpose |
| D8ds_v4 | Standard_D8ds_v4 | General Purpose |
| D8ds_v5 | Standard_D8ds_v5 | General Purpose |
| D16s_v3 | Standard_D16s_v3 | General Purpose |
| D16ds_v4 | Standard_D16ds_v4 | General Purpose |
| D16ds_v5 | Standard_D16ds_v5 | General Purpose |
| D32s_v3 | Standard_D32s_v3 | General Purpose |
| D32ds_v4 | Standard_D32ds_v4 | General Purpose |
| D32ds_v5 | Standard_D32ds_v5 | General Purpose |
| D64s_v3 | Standard_D64s_v3 | General Purpose |
| D64ds_v4 | Standard_D64ds_v4 | General Purpose |
| D64ds_v5 | Standard_D64ds_v5 | General Purpose |
| D96ds_v5 | Standard_D96ds_v5 | General Purpose |
+----------+--------------------+------------------+
| E2s_v3 | Standard_E2s_v3 | Memory Optimized |
| E2ds_v4 | Standard_E2ds_v4 | Memory Optimized |
| E2ds_v5 | Standard_E2ds_v5 | Memory Optimized |
| E4s_v3 | Standard_E4s_v3 | Memory Optimized |
| E4ds_v4 | Standard_E4ds_v4 | Memory Optimized |
| E4ds_v5 | Standard_E4ds_v5 | Memory Optimized |
| E8s_v3 | Standard_E8s_v3 | Memory Optimized |
| E8ds_v4 | Standard_E8ds_v4 | Memory Optimized |
| E8ds_v5 | Standard_E8ds_v5 | Memory Optimized |
| E16s_v3 | Standard_E16s_v3 | Memory Optimized |
| E16ds_v4 | Standard_E16ds_v4 | Memory Optimized |
| E16ds_v5 | Standard_E16ds_v5 | Memory Optimized |
| E20ds_v4 | Standard_E20ds_v4 | Memory Optimized |
| E20ds_v5 | Standard_E20ds_v5 | Memory Optimized |
| E32s_v3 | Standard_E32s_v3 | Memory Optimized |
| E32ds_v4 | Standard_E32ds_v4 | Memory Optimized |
| E32ds_v5 | Standard_E32ds_v5 | Memory Optimized |
| E48s_v3 | Standard_E48s_v3 | Memory Optimized |
| E48ds_v4 | Standard_E48ds_v4 | Memory Optimized |
| E48ds_v5 | Standard_E48ds_v5 | Memory Optimized |
| E64s_v3 | Standard_E64s_v3 | Memory Optimized |
| E64ds_v4 | Standard_E64ds_v4 | Memory Optimized |
| E64ds_v5 | Standard_E64ds_v5 | Memory Optimized |
| E96ds_v5 | Standard_E96ds_v5 | Memory Optimized |
+----------+--------------------+------------------+
 
'@


    # Connect using a Managed Service Identity
    try {
        $AzureContext = (Connect-AzAccount -Identity).context
    }
    catch {
        Write-Output 'There is no system-assigned user identity. Aborting. Setu the same or try using RunAs account automation method.' | timestamp
    }

    $pgsqlflex = Get-AzPostgreSqlFlexibleServer -ResourceGroup $ResourceGroupName -ServerName $Name -ErrorAction Stop

    function Green {
        process { Write-Host $_ -ForegroundColor Green }
    }
    function Red {
        process { Write-Host $_ -ForegroundColor Red }
    }
    Write-Output ('AzureRunAsConnection: {0} ResourceGroupName: {1} Name: {2} SKU: {3} Start: {4} Stop: {5}' -F $AzureRunAsConnection, $ResourceGroupName, $Name, $Sku, $Start, $Stop) | timestamp

    if ($Start) {
        Start-AzPostgressFlex -ResourceGroupName $ResourceGroupName -Name $Name -ErrorAction Stop
    }
    if ($Stop) {
        Stop-AzPostgressFlex -ResourceGroupName $ResourceGroupName -Name $Name -ErrorAction Stop
    }
    if ($Sku) {
        # Scaling logic starts here
        $pgsqlflex = (Get-AzPostgreSqlFlexibleServer -ResourceGroup $ResourceGroupName -ServerName $Name -ErrorAction Stop)
        Write-Output "State for $($Name) - $($pgsqlflex.State)" | timestamp
        if (($pgsqlflex.SkuName -ne $Sku) -and (-not [System.String]::IsNullOrEmpty($Sku))) {
            if ($pgsqlflex.State -eq 'Ready') {
                try {
                    $t
                    ('-' * 75)
                    Write-Output "Initiating scaling for $($Name)" | timestamp
                    ('-' * 75)
                    $UpdateOperation = Update-AzPostgreSqlFlexibleServer -ResourceGroup $ResourceGroupName -ServerName $Name -Sku $Sku
                    if ($UpdateOperation) {
                        Write-Output ('Resource "{0}" successfully scaled from SKU "{1}" to "{2}"' -F $Name, $pgsqlflex.SkuName, $Sku) | timestamp #| Green
                    }
                }
                catch {
                    Write-Output ('Resource "{0}" ERROR scaling from SKU "{1}" to "{2}"' -F $Name, $pgsqlflex.SkuName, $Sku) | timestamp #| Red
                }
            }
        }
    }
    else {
        Write-Output ('Resource "{0}" cannot scaled from SKU "{1}" to "{2}" as it is in {3} state.' -F $Name, "$($pgsqlflex.SkuName)", $Sku, "$($pgsqlflex.State)") | timestamp #| Red
    }
}


# Function Call
# Scale-AzPostgressFlex -ResourceGroupName $ResourceGroupName -Name $Name -Sku $Sku -Start $Start -Stop $Stop