Private/Invoke-AzLocalUpdatePrepare.ps1

function Invoke-AzLocalUpdatePrepare {
    [CmdletBinding()]
    [OutputType([bool])]
    param(
        [Parameter(Mandatory = $true)]
        [string]$ClusterResourceId,

        [Parameter(Mandatory = $true)]
        [string]$UpdateName
    )

    if (-not (Test-AzLocalClusterResourceInGlobalScope -ClusterResourceId $ClusterResourceId)) {
        throw "GlobalFilterMismatch: cluster '$ClusterResourceId' does not match the configured scope.clusterTagFilters policy. No update preparation was started."
    }

    Test-AzCliAvailable | Out-Null

    $uri = "https://management.azure.com$ClusterResourceId/updates/$UpdateName/prepare?api-version=2026-04-30"
    Write-Verbose "Preparing update via POST to: $uri"

    # The prepare action has no request body.
    $result = az rest --method POST --uri $uri --only-show-errors 2>&1
    $resultText = ($result | Out-String).Trim()

    if ($LASTEXITCODE -eq 0) {
        return $true
    }
    elseif ($resultText -match '202|Accepted') {
        return $true
    }

    Write-Verbose "Prepare result: $(ConvertTo-ScrubbedCliOutput -Text $resultText)"
    return $false
}