-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvalidate.sh
More file actions
292 lines (250 loc) · 8.21 KB
/
Copy pathvalidate.sh
File metadata and controls
292 lines (250 loc) · 8.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
#!/bin/bash
# =============================================================================
# ACI Vacation Planner - Validation Script
#
# Verifies that all Azure resources were deployed successfully and exercises
# the full ACI lifecycle: create, get, list, logs, exec, stop, start, restart.
# =============================================================================
# Variables (must match deploy.sh)
PREFIX='local'
LOCATION='eastus'
RESOURCE_GROUP_NAME="${PREFIX}-aci-rg"
STORAGE_ACCOUNT_NAME="${PREFIX}acistorage"
KEY_VAULT_NAME="${PREFIX}acikv"
ACR_NAME="${PREFIX}aciacr"
ACI_GROUP_NAME="${PREFIX}-aci-planner"
PASS_COUNT=0
FAIL_COUNT=0
check() {
local description="$1"
local command="$2"
echo -n " Checking $description... "
eval "$command" &>/dev/null
if [ $? -eq 0 ]; then
echo "OK"
PASS_COUNT=$((PASS_COUNT + 1))
else
echo "FAIL"
FAIL_COUNT=$((FAIL_COUNT + 1))
fi
}
check_output() {
local description="$1"
local command="$2"
local expected="$3"
echo -n " Checking $description... "
OUTPUT=$(eval "$command" 2>/dev/null)
if echo "$OUTPUT" | grep -q "$expected"; then
echo "OK"
PASS_COUNT=$((PASS_COUNT + 1))
else
echo "FAIL (expected '$expected')"
FAIL_COUNT=$((FAIL_COUNT + 1))
fi
}
echo "============================================================"
echo "Validating ACI Vacation Planner Deployment"
echo "============================================================"
echo ""
# =============================================================================
# Part 1: Infrastructure Resources
# =============================================================================
echo "--- Part 1: Infrastructure Resources ---"
echo ""
# 1. Resource Group
echo "[1/5] Resource Group"
check "resource group exists" "az group show --name $RESOURCE_GROUP_NAME"
echo ""
# 2. Storage Account
echo "[2/5] Storage Account"
check "storage account exists" "az storage account show --name $STORAGE_ACCOUNT_NAME --resource-group $RESOURCE_GROUP_NAME"
echo ""
# 3. Key Vault
echo "[3/5] Key Vault"
check "key vault exists" "az keyvault show --name $KEY_VAULT_NAME --resource-group $RESOURCE_GROUP_NAME"
check "secret exists" "az keyvault secret show --vault-name $KEY_VAULT_NAME --name storage-conn"
echo ""
# 4. Container Registry
echo "[4/5] Container Registry"
check "ACR exists" "az acr show --name $ACR_NAME --resource-group $RESOURCE_GROUP_NAME"
echo ""
# 5. Container Instance - Get
echo "[5/5] Container Instance"
check "ACI container group exists" "az container show --name $ACI_GROUP_NAME --resource-group $RESOURCE_GROUP_NAME"
echo ""
# Wait for the container group to reach Running state before testing operations
echo -n " Waiting for container group to be Running... "
for i in $(seq 1 20); do
STATE=$(az container show --name "$ACI_GROUP_NAME" --resource-group "$RESOURCE_GROUP_NAME" --query 'instanceView.state' --output tsv 2>/dev/null)
if [[ "$STATE" == "Running" ]]; then
break
fi
sleep 3
done
if [[ "$STATE" == "Running" ]]; then
echo "OK"
else
echo "WARN (state: ${STATE:-unknown}, continuing anyway)"
fi
echo ""
# =============================================================================
# Part 2: ACI Operations
# =============================================================================
echo "--- Part 2: ACI Operations ---"
echo ""
# Check FQDN is set (after wait, so async creation has completed)
check_output "FQDN is set" \
"az container show --name $ACI_GROUP_NAME --resource-group $RESOURCE_GROUP_NAME --query 'ipAddress.fqdn' --output tsv" \
"azurecontainer.io"
# 6. List container groups
echo "[6] List Container Groups"
check_output "list returns our group" \
"az container list --resource-group $RESOURCE_GROUP_NAME --query '[].name' --output tsv" \
"$ACI_GROUP_NAME"
echo ""
# 7. Container Logs
echo "[7] Container Logs"
echo -n " Checking container logs for Flask startup... "
# Wait for Flask to start (container may need a few seconds to initialize)
for i in $(seq 1 15); do
LOGS=$(az container logs \
--name "$ACI_GROUP_NAME" \
--resource-group "$RESOURCE_GROUP_NAME" 2>/dev/null)
if [ -z "$LOGS" ]; then
# Fallback: try docker logs directly
CONTAINER_ID=$(docker ps -q --filter "name=ls-aci-${ACI_GROUP_NAME}" 2>/dev/null | head -1)
if [ -n "$CONTAINER_ID" ]; then
LOGS=$(docker logs "$CONTAINER_ID" 2>&1)
fi
fi
if echo "$LOGS" | grep -q "Running on"; then
break
elif echo "$LOGS" | grep -q "Serving Flask app"; then
break
fi
sleep 2
done
if echo "$LOGS" | grep -q "Running on"; then
echo "OK (Flask is running)"
PASS_COUNT=$((PASS_COUNT + 1))
elif echo "$LOGS" | grep -q "Serving Flask app"; then
echo "OK (Flask is serving)"
PASS_COUNT=$((PASS_COUNT + 1))
else
echo "FAIL (expected Flask startup message not found)"
FAIL_COUNT=$((FAIL_COUNT + 1))
if [ -n "$LOGS" ]; then
echo " Last few lines of logs:"
echo "$LOGS" | tail -5 | sed 's/^/ /'
else
echo " No logs available."
fi
fi
echo ""
# 8. Container Exec
echo "[8] Container Exec"
echo -n " Executing command inside container... "
EXEC_OUTPUT=$(az container exec \
--name "$ACI_GROUP_NAME" \
--resource-group "$RESOURCE_GROUP_NAME" \
--container-name "$ACI_GROUP_NAME" \
--exec-command "echo hello-from-exec" 2>/dev/null)
if [ $? -eq 0 ]; then
echo "OK"
PASS_COUNT=$((PASS_COUNT + 1))
else
echo "FAIL"
FAIL_COUNT=$((FAIL_COUNT + 1))
fi
echo ""
# =============================================================================
# Part 3: ACI Lifecycle (Stop / Start / Restart)
# =============================================================================
echo "--- Part 3: ACI Lifecycle ---"
echo ""
# 9. Stop
echo "[9] Stop Container Group"
echo -n " Stopping container group... "
az container stop \
--name "$ACI_GROUP_NAME" \
--resource-group "$RESOURCE_GROUP_NAME" \
--only-show-errors 2>/dev/null
if [ $? -eq 0 ]; then
echo "OK"
PASS_COUNT=$((PASS_COUNT + 1))
else
echo "FAIL"
FAIL_COUNT=$((FAIL_COUNT + 1))
fi
# Verify stopped state
check_output "state is Stopped" \
"az container show --name $ACI_GROUP_NAME --resource-group $RESOURCE_GROUP_NAME --query 'instanceView.state' --output tsv" \
"Stopped"
echo ""
# 10. Start
echo "[10] Start Container Group"
echo -n " Starting container group... "
az container start \
--name "$ACI_GROUP_NAME" \
--resource-group "$RESOURCE_GROUP_NAME" \
--only-show-errors 2>/dev/null
if [ $? -eq 0 ]; then
echo "OK"
PASS_COUNT=$((PASS_COUNT + 1))
else
echo "FAIL"
FAIL_COUNT=$((FAIL_COUNT + 1))
fi
# Wait a moment for containers to start
sleep 3
check_output "state is Running" \
"az container show --name $ACI_GROUP_NAME --resource-group $RESOURCE_GROUP_NAME --query 'instanceView.state' --output tsv" \
"Running"
echo ""
# 11. Restart
echo "[11] Restart Container Group"
echo -n " Restarting container group... "
az container restart \
--name "$ACI_GROUP_NAME" \
--resource-group "$RESOURCE_GROUP_NAME" \
--only-show-errors 2>/dev/null
if [ $? -eq 0 ]; then
echo "OK"
PASS_COUNT=$((PASS_COUNT + 1))
else
echo "FAIL"
FAIL_COUNT=$((FAIL_COUNT + 1))
fi
# Wait for restart to complete
sleep 3
check_output "state is Running after restart" \
"az container show --name $ACI_GROUP_NAME --resource-group $RESOURCE_GROUP_NAME --query 'instanceView.state' --output tsv" \
"Running"
echo ""
# =============================================================================
# Summary
# =============================================================================
echo "============================================================"
echo "Validation Results: $PASS_COUNT passed, $FAIL_COUNT failed"
echo "============================================================"
# Show the app URL if a host port is mapped
HOST_PORT=$(docker port "$(docker ps -q --filter "name=ls-aci-${ACI_GROUP_NAME}" | head -1)" 80/tcp 2>/dev/null | head -1 | sed 's/.*://')
FQDN=$(az container show --name "$ACI_GROUP_NAME" --resource-group "$RESOURCE_GROUP_NAME" --query 'ipAddress.fqdn' --output tsv 2>/dev/null)
if [ -n "$HOST_PORT" ] || [ -n "$FQDN" ]; then
echo ""
echo "--- App Access ---"
if [ -n "$HOST_PORT" ]; then
echo "Local URL: http://localhost:$HOST_PORT"
fi
if [ -n "$FQDN" ]; then
echo "FQDN: http://$FQDN"
fi
fi
echo ""
if [ $FAIL_COUNT -eq 0 ]; then
echo "PASS: All checks passed. Vacation Planner is running on ACI."
exit 0
else
echo "FAIL: Some checks failed. Review the output above."
exit 1
fi