60 lines
2.1 KiB
PowerShell
60 lines
2.1 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Wraps an idempotent `az ... show || az ... create` pair with silent
|
|
retries against transient ARM frontend errors.
|
|
.DESCRIPTION
|
|
Mirrors retry-az-create.sh. Runs the show command first (short-circuits
|
|
a partially-succeeded prior attempt and avoids false NameAlreadyExists
|
|
errors). If show fails, runs create. On transient failure (connection
|
|
resets, 429/502/503/504, timeouts) retries up to 2 times with 5s then
|
|
15s backoff. Non-transient failures surface the original error and
|
|
exit 1.
|
|
.PARAMETER ShowCommand
|
|
The full `az ... show ...` command line as a single string.
|
|
.PARAMETER CreateCommand
|
|
The full `az ... create ...` command line as a single string.
|
|
.EXAMPLE
|
|
.\retry-az-create.ps1 `
|
|
-ShowCommand "az group show -n my-rg --only-show-errors" `
|
|
-CreateCommand "az group create -n my-rg -l eastus2"
|
|
.EXAMPLE
|
|
.\retry-az-create.ps1 `
|
|
-ShowCommand "az appservice plan show -n my-plan -g my-rg --only-show-errors" `
|
|
-CreateCommand "az appservice plan create -n my-plan -g my-rg --is-linux --sku P0v3 -l eastus2"
|
|
#>
|
|
param(
|
|
[Parameter(Mandatory)][string]$ShowCommand,
|
|
[Parameter(Mandatory)][string]$CreateCommand
|
|
)
|
|
|
|
$ErrorActionPreference = "Continue"
|
|
|
|
$transient = 'Connection reset|Connection aborted|ConnectionError|Read timed out|BadGatewayConnection|ServiceUnavailable|Max retries exceeded|TooManyRequests|\b429\b|\b50[234]\b'
|
|
$backoff = @(5, 15)
|
|
|
|
for ($attempt = 1; $attempt -le 3; $attempt++) {
|
|
# Try `show` silently first; if it fails, try `create`. Capture both
|
|
# stdout and stderr into $err so we can inspect for transient patterns.
|
|
$err = & {
|
|
$script = "$ShowCommand -o none 2>`$null; if (`$LASTEXITCODE -ne 0) { $CreateCommand -o none }"
|
|
& powershell -NoProfile -Command $script 2>&1
|
|
} | Out-String
|
|
|
|
if ($LASTEXITCODE -eq 0) {
|
|
exit 0
|
|
}
|
|
|
|
if ($err -notmatch $transient) {
|
|
Write-Error $err
|
|
exit 1
|
|
}
|
|
|
|
if ($attempt -eq 3) {
|
|
Write-Error $err
|
|
Write-Error "ARM frontend is returning transient errors — please retry in a few minutes."
|
|
exit 1
|
|
}
|
|
|
|
Start-Sleep -Seconds $backoff[$attempt - 1]
|
|
}
|