Skip to content

chore: Drop quota check validation #143

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jun 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions azure.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,13 @@ hooks:
shell: sh
run: >
chmod u+r+x ./scripts/validate_model_deployment_quota.sh; chmod u+r+x ./scripts/validate_model_quota.sh; ./scripts/validate_model_deployment_quota.sh --SubscriptionId "$AZURE_SUBSCRIPTION_ID" --Location "${AZURE_AISERVICE_LOCATION:-japaneast}" --ModelsParameter "aiModelDeployments"
interactive: true
interactive: false
continueOnError: false

windows:
shell: pwsh
run: >
$location = if ($env:AZURE_AISERVICE_LOCATION) { $env:AZURE_AISERVICE_LOCATION } else { "japaneast" };
./scripts/validate_model_deployment_quota.ps1 -SubscriptionId $env:AZURE_SUBSCRIPTION_ID -Location $location -ModelsParameter "aiModelDeployments"
interactive: true
interactive: false
continueOnError: false
67 changes: 32 additions & 35 deletions scripts/validate_model_deployment_quota.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -4,75 +4,73 @@ param (
[string]$ModelsParameter
)

$AiFoundryName = $env:AZURE_AIFOUNDRY_NAME
# Read from environment variables (do not pass in azure.yaml)
$AiServiceName = $env:AZURE_AISERVICE_NAME
$ResourceGroup = $env:AZURE_RESOURCE_GROUP

# Validate required parameters
$MissingParams = @()

if (-not $SubscriptionId) { $MissingParams += "SubscriptionId" }
if (-not $Location) { $MissingParams += "Location" }
if (-not $ModelsParameter) { $MissingParams += "ModelsParameter" }

if ($MissingParams.Count -gt 0) {
Write-Error "❌ ERROR: Missing required parameters: $($MissingParams -join ', ')"
Write-Host "Usage: validate_model_deployment_quota.ps1 -SubscriptionId <SUBSCRIPTION_ID> -Location <LOCATION> -ModelsParameter <MODELS_PARAMETER>"
Write-Host "Usage: .\validate_model_deployment_quotas.ps1 -SubscriptionId <SUBSCRIPTION_ID> -Location <LOCATION> -ModelsParameter <MODELS_PARAMETER>"
exit 1
}

# Load model deployments from parameter file
# Load main.parameters.json
$JsonContent = Get-Content -Path "./infra/main.parameters.json" -Raw | ConvertFrom-Json
$aiModelDeployments = $JsonContent.parameters.$ModelsParameter.value
if (-not $aiModelDeployments -or -not ($aiModelDeployments -is [System.Collections.IEnumerable])) {
Write-Error "❌ ERROR: Failed to parse main.parameters.json or missing '$ModelsParameter'"
if (-not $JsonContent) {
Write-Error "❌ ERROR: Failed to parse main.parameters.json. Ensure the JSON file is valid."
exit 1
}

# Try to discover AI Foundry name if not set
if (-not $AiFoundryName -and $ResourceGroup) {
$AiFoundryName = az cognitiveservices account list `
--resource-group $ResourceGroup `
--query "sort_by([?kind=='AIServices'], &name)[0].name" `
-o tsv 2>$null
$aiModelDeployments = $JsonContent.parameters.$ModelsParameter.value
if (-not $aiModelDeployments -or -not ($aiModelDeployments -is [System.Collections.IEnumerable])) {
Write-Error "❌ ERROR: The specified property '$ModelsParameter' does not exist or is not an array."
exit 1
}

# Check if AI Foundry exists
if ($AiFoundryName -and $ResourceGroup) {
# Check if AI resource + all deployments already exist
if ($AiServiceName -and $ResourceGroup) {
$existing = az cognitiveservices account show `
--name $AiFoundryName `
--name $AiServiceName `
--resource-group $ResourceGroup `
--query "name" --output tsv 2>$null

if ($existing) {
# adding into .env
azd env set AZURE_AIFOUNDRY_NAME $existing | Out-Null

$deployedModelsOutput = az cognitiveservices account deployment list `
--name $AiFoundryName `
$deployedModels = az cognitiveservices account deployment list `
--name $AiServiceName `
--resource-group $ResourceGroup `
--query "[].name" --output tsv 2>$null

$deployedModels = @()
if ($deployedModelsOutput -is [string]) {
$deployedModels += $deployedModelsOutput
} elseif ($deployedModelsOutput) {
$deployedModels = $deployedModelsOutput -split "`r?`n"
$requiredDeployments = @()
foreach ($deployment in $aiModelDeployments) {
$requiredDeployments += $deployment.name
}

$requiredDeployments = $aiModelDeployments | ForEach-Object { $_.name }
$missingDeployments = $requiredDeployments | Where-Object { $_ -notin $deployedModels }
$missingDeployments = @()
foreach ($required in $requiredDeployments) {
if ($deployedModels -notcontains $required) {
$missingDeployments += $required
}
}

if ($missingDeployments.Count -eq 0) {
Write-Host "ℹ️ AI Foundry '$AiFoundryName' exists and all required model deployments are already provisioned."
Write-Host "ℹ️ Azure AI service '$AiServiceName' exists and all required model deployments are provisioned."
Write-Host "⏭️ Skipping quota validation."
exit 0
} else {
Write-Host "🔍 AI Foundry exists, but the following model deployments are missing: $($missingDeployments -join ', ')"
Write-Host "🔍 AI service exists, but the following model deployments are missing: $($missingDeployments -join ', ')"
Write-Host "➡️ Proceeding with quota validation for missing models..."
}
}
}

# Run quota validation
# Start quota validation
az account set --subscription $SubscriptionId
Write-Host "🎯 Active Subscription: $(az account show --query '[name, id]' --output tsv)"

Expand All @@ -84,24 +82,23 @@ foreach ($deployment in $aiModelDeployments) {
$type = if ($env:AZURE_ENV_MODEL_DEPLOYMENT_TYPE) { $env:AZURE_ENV_MODEL_DEPLOYMENT_TYPE } else { $deployment.sku.name }
$capacity = if ($env:AZURE_ENV_MODEL_CAPACITY) { $env:AZURE_ENV_MODEL_CAPACITY } else { $deployment.sku.capacity }

Write-Host ""
Write-Host "🔍 Validating model deployment: $name ..."
Write-Host "`n🔍 Validating model deployment: $name ..."
& .\scripts\validate_model_quota.ps1 -Location $Location -Model $model -Capacity $capacity -DeploymentType $type
$exitCode = $LASTEXITCODE

if ($exitCode -ne 0) {
if ($exitCode -eq 2) {
exit 1
exit 1 # already printed, graceful
}
Write-Error "❌ ERROR: Quota validation failed for model deployment: $name"
$QuotaAvailable = $false
}
}

if (-not $QuotaAvailable) {
Write-Error "❌ ERROR: One or more model deployments failed quota validation."
Write-Error "❌ ERROR: One or more model deployments failed validation."
exit 1
} else {
Write-Host "✅ All model deployments passed quota validation successfully."
exit 0
}
}
71 changes: 32 additions & 39 deletions scripts/validate_model_deployment_quota.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,6 @@ while [[ $# -gt 0 ]]; do
esac
done

AIFOUNDRY_NAME="${AZURE_AIFOUNDRY_NAME}"
RESOURCE_GROUP="${AZURE_RESOURCE_GROUP}"

# Validate required parameters
MISSING_PARAMS=()
[[ -z "$SUBSCRIPTION_ID" ]] && MISSING_PARAMS+=("SubscriptionId")
Expand All @@ -40,55 +37,51 @@ if [[ ${#MISSING_PARAMS[@]} -ne 0 ]]; then
exit 1
fi

# Load model definitions
aiModelDeployments=$(jq -c ".parameters.$MODELS_PARAMETER.value[]" ./infra/main.parameters.json 2>/dev/null)
if [[ $? -ne 0 || -z "$aiModelDeployments" ]]; then
echo "❌ ERROR: Failed to parse main.parameters.json or missing '$MODELS_PARAMETER'"
exit 1
fi

# Try to discover AI Foundry name if not set
if [[ -z "$AIFOUNDRY_NAME" && -n "$RESOURCE_GROUP" ]]; then
AIFOUNDRY_NAME=$(az cognitiveservices account list --resource-group "$RESOURCE_GROUP" \
--query "sort_by([?kind=='AIServices'], &name)[0].name" -o tsv 2>/dev/null)
fi

# Check if AI Foundry exists
if [[ -n "$AIFOUNDRY_NAME" && -n "$RESOURCE_GROUP" ]]; then
existing=$(az cognitiveservices account show --name "$AIFOUNDRY_NAME" \
--resource-group "$RESOURCE_GROUP" --query "name" --output tsv 2>/dev/null)
# Read from environment
AISERVICE_NAME="${AZURE_AISERVICE_NAME}"
RESOURCE_GROUP="${AZURE_RESOURCE_GROUP}"

# Check service and deployment existence
if [[ -n "$AISERVICE_NAME" && -n "$RESOURCE_GROUP" ]]; then
existing=$(az cognitiveservices account show --name "$AISERVICE_NAME" --resource-group "$RESOURCE_GROUP" --query "name" --output tsv 2>/dev/null)
if [[ -n "$existing" ]]; then
# adding into .env
azd env set AZURE_AIFOUNDRY_NAME "$existing" > /dev/null
echo "ℹ️ Found Azure AI service: $AISERVICE_NAME"

# Check model deployments
existing_deployments=$(az cognitiveservices account deployment list \
--name "$AIFOUNDRY_NAME" \
--resource-group "$RESOURCE_GROUP" \
--query "[].name" --output tsv 2>/dev/null)
existing_deployments=$(az cognitiveservices account deployment list --name "$AISERVICE_NAME" --resource-group "$RESOURCE_GROUP" --query "[].name" --output tsv 2>/dev/null)

required_models=$(jq -r ".parameters.$MODELS_PARAMETER.value[].name" ./infra/main.parameters.json)
# Extract required model names
required_models=$(jq -r ".parameters.$MODELS_PARAMETER.value[].name" ./infra/main.parameters.json 2>/dev/null)

missing_models=()
if [[ -z "$required_models" ]]; then
echo "❌ ERROR: Failed to extract required model names from main.parameters.json"
exit 1
fi

all_present=true
for model in $required_models; do
if ! grep -q -w "$model" <<< "$existing_deployments"; then
missing_models+=("$model")
all_present=false
break
fi
done

if [[ ${#missing_models[@]} -eq 0 ]]; then
echo "ℹ️ AI Foundry '$AIFOUNDRY_NAME' exists and all required model deployments are already provisioned."
if [[ "$all_present" == "true" ]]; then
echo "✅ All required model deployments already exist in AI service '$AISERVICE_NAME'."
echo "⏭️ Skipping quota validation."
exit 0
else
echo "🔍 AI Foundry exists, but the following model deployments are missing: ${missing_models[*]}"
echo "➡️ Proceeding with quota validation for missing models..."
echo "🔍 AI service exists but some model deployments are missing — proceeding with quota validation."
fi
fi
fi

# Run quota validation
# If we reach here, continue with normal quota checks
aiModelDeployments=$(jq -c ".parameters.$MODELS_PARAMETER.value[]" ./infra/main.parameters.json)
if [[ $? -ne 0 ]]; then
echo "❌ ERROR: Failed to parse main.parameters.json. Ensure jq is installed and the JSON is valid."
exit 1
fi

az account set --subscription "$SUBSCRIPTION_ID"
echo "🎯 Active Subscription: $(az account show --query '[name, id]' --output tsv)"

Expand All @@ -100,13 +93,13 @@ while IFS= read -r deployment; do
type=${AZURE_ENV_MODEL_DEPLOYMENT_TYPE:-$(echo "$deployment" | jq -r '.sku.name')}
capacity=${AZURE_ENV_MODEL_CAPACITY:-$(echo "$deployment" | jq -r '.sku.capacity')}

echo ""
echo "🔍 Validating model deployment: $name ..."
./scripts/validate_model_quota.sh --location "$LOCATION" --model "$model" --capacity "$capacity" --deployment-type "$type"
exit_code=$?

exit_code=$?
if [[ $exit_code -ne 0 ]]; then
if [[ $exit_code -eq 2 ]]; then
# Quota validation handled inside script — stop immediately
exit 1
fi
echo "❌ ERROR: Quota validation failed for model deployment: $name"
Expand All @@ -115,9 +108,9 @@ while IFS= read -r deployment; do
done <<< "$(echo "$aiModelDeployments")"

if [[ "$quotaAvailable" = false ]]; then
echo "❌ ERROR: One or more model deployments failed quota validation."
echo "❌ ERROR: One or more model deployments failed validation."
exit 1
else
echo "✅ All model deployments passed quota validation successfully."
exit 0
fi
fi
Loading