Skip to content

Commit d1d1e3c

Browse files
Merge pull request microsoft#76 from microsoft/task/ci-pipeline-quota-check-macae
ci: implement quota check in CI Pipeline to ensure resource availability in supported region
2 parents 8eba271 + bef8d24 commit d1d1e3c

File tree

2 files changed

+139
-2
lines changed

2 files changed

+139
-2
lines changed

.github/workflows/deploy.yml

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,48 @@ jobs:
1414
- name: Checkout Code
1515
uses: actions/checkout@v3
1616

17+
- name: Run Quota Check
18+
id: quota-check
19+
run: |
20+
export AZURE_CLIENT_ID=${{ secrets.AZURE_CLIENT_ID }}
21+
export AZURE_TENANT_ID=${{ secrets.AZURE_TENANT_ID }}
22+
export AZURE_CLIENT_SECRET=${{ secrets.AZURE_CLIENT_SECRET }}
23+
export AZURE_SUBSCRIPTION_ID="${{ secrets.AZURE_SUBSCRIPTION_ID }}"
24+
export GPT_MIN_CAPACITY="130"
25+
26+
chmod +x deploy/scripts/checkquota.sh
27+
if ! deploy/scripts/checkquota.sh; then
28+
# If quota check fails due to insufficient quota, set the flag
29+
if grep -q "No region with sufficient quota found" deploy/scripts/checkquota.sh; then
30+
echo "QUOTA_FAILED=true" >> $GITHUB_ENV
31+
fi
32+
exit 1 # Fail the pipeline if any other failure occurs
33+
fi
34+
35+
- name: Send Notification on Quota Failure
36+
if: env.QUOTA_FAILED == 'true'
37+
run: |
38+
RUN_URL="https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
39+
EMAIL_BODY=$(cat <<EOF
40+
{
41+
"body": "<p>Dear Team,</p><p>The quota check has failed, and the pipeline cannot proceed.</p><p><strong>Build URL:</strong> ${RUN_URL}</p><p>Please take necessary action.</p><p>Best regards,<br>Your Automation Team</p>"
42+
}
43+
EOF
44+
)
45+
46+
curl -X POST "${{ secrets.AUTO_LOGIC_APP_URL }}" \
47+
-H "Content-Type: application/json" \
48+
-d "$EMAIL_BODY" || echo "Failed to send notification"
49+
50+
- name: Fail Pipeline if Quota Check Fails
51+
if: env.QUOTA_FAILED == 'true'
52+
run: exit 1
53+
54+
- name: Set Deployment Region
55+
run: |
56+
echo "Selected Region: $VALID_REGION"
57+
echo "AZURE_LOCATION=$VALID_REGION" >> $GITHUB_ENV
58+
1759
- name: Setup Azure CLI
1860
run: |
1961
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
@@ -45,7 +87,7 @@ jobs:
4587
rg_exists=$(az group exists --name ${{ env.RESOURCE_GROUP_NAME }})
4688
if [ "$rg_exists" = "false" ]; then
4789
echo "Resource group does not exist. Creating..."
48-
az group create --name ${{ env.RESOURCE_GROUP_NAME }} --location eastus || { echo "Error creating resource group"; exit 1; }
90+
az group create --name ${{ env.RESOURCE_GROUP_NAME }} --location ${{ env.AZURE_LOCATION }} || { echo "Error creating resource group"; exit 1; }
4991
else
5092
echo "Resource group already exists."
5193
fi
@@ -58,7 +100,7 @@ jobs:
58100
az deployment group create \
59101
--resource-group ${{ env.RESOURCE_GROUP_NAME }} \
60102
--template-file deploy/macae.bicep \
61-
--parameters azureOpenAILocation=eastus cosmosLocation=eastus2
103+
--parameters azureOpenAILocation=${{env.AZURE_LOCATION }} cosmosLocation=${{env.AZURE_LOCATION }}
62104
63105
64106
- name: Send Notification on Failure

deploy/scripts/checkquota.sh

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
#!/bin/bash
2+
3+
# List of Azure regions to check for quota (update as needed)
4+
REGIONS=("eastus" "westus" "northcentralus" "uksouth" "swedencentral")
5+
6+
SUBSCRIPTION_ID="${AZURE_SUBSCRIPTION_ID}"
7+
GPT_MIN_CAPACITY="${GPT_MIN_CAPACITY}"
8+
AZURE_CLIENT_ID="${AZURE_CLIENT_ID}"
9+
AZURE_TENANT_ID="${AZURE_TENANT_ID}"
10+
AZURE_CLIENT_SECRET="${AZURE_CLIENT_SECRET}"
11+
12+
# Authenticate using Managed Identity
13+
echo "Authentication using Managed Identity..."
14+
if ! az login --service-principal -u "$AZURE_CLIENT_ID" -p "$AZURE_CLIENT_SECRET" --tenant "$AZURE_TENANT_ID"; then
15+
echo "❌ Error: Failed to login using Managed Identity."
16+
exit 1
17+
fi
18+
19+
echo "🔄 Validating required environment variables..."
20+
if [[ -z "$SUBSCRIPTION_ID" || -z "$GPT_MIN_CAPACITY" ]]; then
21+
echo "❌ ERROR: Missing required environment variables."
22+
exit 1
23+
fi
24+
25+
echo "🔄 Setting Azure subscription..."
26+
if ! az account set --subscription "$SUBSCRIPTION_ID"; then
27+
echo "❌ ERROR: Invalid subscription ID or insufficient permissions."
28+
exit 1
29+
fi
30+
echo "✅ Azure subscription set successfully."
31+
32+
# Define models and their minimum required capacities
33+
declare -A MIN_CAPACITY=(
34+
["OpenAI.Standard.gpt-4o"]=$GPT_MIN_CAPACITY
35+
)
36+
37+
VALID_REGION=""
38+
for REGION in "${REGIONS[@]}"; do
39+
echo "----------------------------------------"
40+
echo "🔍 Checking region: $REGION"
41+
42+
QUOTA_INFO=$(az cognitiveservices usage list --location "$REGION" --output json)
43+
if [ -z "$QUOTA_INFO" ]; then
44+
echo "⚠️ WARNING: Failed to retrieve quota for region $REGION. Skipping."
45+
continue
46+
fi
47+
48+
INSUFFICIENT_QUOTA=false
49+
for MODEL in "${!MIN_CAPACITY[@]}"; do
50+
MODEL_INFO=$(echo "$QUOTA_INFO" | awk -v model="\"value\": \"$MODEL\"" '
51+
BEGIN { RS="},"; FS="," }
52+
$0 ~ model { print $0 }
53+
')
54+
55+
if [ -z "$MODEL_INFO" ]; then
56+
echo "⚠️ WARNING: No quota information found for model: $MODEL in $REGION. Skipping."
57+
continue
58+
fi
59+
60+
CURRENT_VALUE=$(echo "$MODEL_INFO" | awk -F': ' '/"currentValue"/ {print $2}' | tr -d ',' | tr -d ' ')
61+
LIMIT=$(echo "$MODEL_INFO" | awk -F': ' '/"limit"/ {print $2}' | tr -d ',' | tr -d ' ')
62+
63+
CURRENT_VALUE=${CURRENT_VALUE:-0}
64+
LIMIT=${LIMIT:-0}
65+
66+
CURRENT_VALUE=$(echo "$CURRENT_VALUE" | cut -d'.' -f1)
67+
LIMIT=$(echo "$LIMIT" | cut -d'.' -f1)
68+
69+
AVAILABLE=$((LIMIT - CURRENT_VALUE))
70+
71+
echo "✅ Model: $MODEL | Used: $CURRENT_VALUE | Limit: $LIMIT | Available: $AVAILABLE"
72+
73+
if [ "$AVAILABLE" -lt "${MIN_CAPACITY[$MODEL]}" ]; then
74+
echo "❌ ERROR: $MODEL in $REGION has insufficient quota."
75+
INSUFFICIENT_QUOTA=true
76+
break
77+
fi
78+
done
79+
80+
if [ "$INSUFFICIENT_QUOTA" = false ]; then
81+
VALID_REGION="$REGION"
82+
break
83+
fi
84+
85+
done
86+
87+
if [ -z "$VALID_REGION" ]; then
88+
echo "❌ No region with sufficient quota found. Blocking deployment."
89+
echo "QUOTA_FAILED=true" >> "$GITHUB_ENV"
90+
exit 0
91+
else
92+
echo "✅ Final Region: $VALID_REGION"
93+
echo "VALID_REGION=$VALID_REGION" >> "$GITHUB_ENV"
94+
exit 0
95+
fi

0 commit comments

Comments
 (0)