readiness.ps1 (83 lines of code) (raw):

param ( [string] $customLocationResourceId, [string] $kubernetesVersion = "", [string] $osSku ) $ErrorActionPreference = "Stop" while ($true) { if ($env:ACTIONS_ID_TOKEN_REQUEST_TOKEN) { $resp = Invoke-WebRequest -Uri "$env:ACTIONS_ID_TOKEN_REQUEST_URL&audience=api://AzureADTokenExchange" -Headers @{"Authorization" = "bearer $env:ACTIONS_ID_TOKEN_REQUEST_TOKEN"} $token = (echo $resp.Content | ConvertFrom-Json).value az login --federated-token $token --tenant $env:ARM_TENANT_ID -u $env:ARM_CLIENT_ID --service-principal az account set --subscription $env:ARM_SUBSCRIPTION_ID } # delete the default version to avoid unsynchronized state between ARM and on-prem $accessToken = $(az account get-access-token --query accessToken -o tsv) $url = "https://management.azure.com${customLocationResourceId}/providers/Microsoft.HybridContainerService/kubernetesVersions/default?api-version=2024-01-01" echo "Deleting default version to keep sync: $url" az rest --headers "Authorization=Bearer $accessToken" "Content-Type=application/json;charset=utf-8" --uri $url --method DELETE while ($true) { $state = az rest --headers "Authorization=Bearer $accessToken" "Content-Type=application/json;charset=utf-8" --uri $url --method GET if (-not $state) { break } sleep 5 } Write-Host "After deleting, puting..." $requestBody = "{'extendedLocation':{'type':'CustomLocation','name':'$customLocationResourceId'}}" az rest --headers "Authorization=Bearer $accessToken" "Content-Type=application/json;charset=utf-8" ` --uri $url ` --method PUT ` --body $requestBody sleep 300 echo "Getting versions" $state = az rest --headers "Authorization=Bearer $accessToken" "Content-Type=application/json;charset=utf-8" --uri $url --method GET $state = "$state".Replace("`n", "").Replace("`r", "").Replace("`t", "").Replace(" ", "") echo $state $pos = $state.IndexOf("{") $state = $state.Substring($pos) $quotePos = $state.IndexOf('"') # Workaround for warning messages in the CLI if ($quotePos -gt 1) { echo "workaround for warning messages in the CLI" $state = $state.Substring($quotePos) $state = "{$state" } $ready = $false # Default to the latest version if ($kubernetesVersion -eq "[PLACEHOLDER]") { $json = $state | ConvertFrom-Json $latestPatchVersion = $json.properties.values | ForEach-Object { $_.patchVersions.PSObject.Properties | ForEach-Object { [PSCustomObject]@{ Version = [version]$_.Name Patch = $_.Name } } } | Sort-Object Version -Descending | Select-Object -First 1 Write-Verbose "Using kubernetes version = $($latestPatchVersion.Patch)" -Verbose $kubernetesVersion = $latestPatchVersion.Patch } foreach ($version in (echo $state | ConvertFrom-Json).properties.values) { if (!$kubernetesVersion.StartsWith($version.version)) { continue } if ($version.patchVersions.PSobject.Properties.name -notcontains $kubernetesVersion) { break } foreach ($readiness in $version.patchVersions.$kubernetesVersion.readiness) { if ($readiness.osSku -eq $osSku) { $ready = $readiness.ready } } } if ($ready) { echo "Kubernetes version $kubernetesVersion is ready for osSku $osSku." break } echo "Kubernetes version $kubernetesVersion is not ready yet for osSku $osSku. Retrying in 10 seconds." sleep 10 }