fix: align lab02 and lab03 student verification flows

This commit is contained in:
Luca Sacchi Ricciardi
2026-04-10 13:43:02 +00:00
parent 49e15f7ea2
commit f4764253e4
13 changed files with 105 additions and 65 deletions
@@ -113,11 +113,14 @@ print_header "Section 2: INF-03 Compliance (Resource Limits)"
print_test "Verifying all services have resource limits"
NON_COMPLIANT=0
LIMITS_SUMMARY=""
COMPOSE_CONFIG=$(docker compose config 2>/dev/null)
for service in $SERVICES; do
service_block=$(printf '%s\n' "$COMPOSE_CONFIG" | grep -A 20 "^ $service:")
# Check for resource limits
has_cpu=$(docker compose config 2>/dev/null | grep -A 30 "^$service:" | grep -c "cpus:" || echo "0")
has_memory=$(docker compose config 2>/dev/null | grep -A 30 "^$service:" | grep -c "memory:" || echo "0")
has_cpu=$(printf '%s\n' "$service_block" | grep -c "cpus:" || true)
has_memory=$(printf '%s\n' "$service_block" | grep -c "memory:" || true)
if [[ $has_cpu -eq 0 ]]; then
print_fail " $service: Missing cpus limit"
@@ -126,8 +129,8 @@ for service in $SERVICES; do
print_fail " $service: Missing memory limit"
((NON_COMPLIANT++)) || true
else
cpu_val=$(docker compose config 2>/dev/null | grep -A 30 "^$service:" | grep "cpus:" | sed 's/.*cpus: //' | tr -d ' "')
mem_val=$(docker compose config 2>/dev/null | grep -A 30 "^$service:" | grep "memory:" | sed 's/.*memory: //' | tr -d " '"")
cpu_val=$(printf '%s\n' "$service_block" | grep -m1 "cpus:" | sed 's/.*cpus: //' | tr -d ' "')
mem_val=$(printf '%s\n' "$service_block" | grep -m1 "memory:" | sed 's/.*memory: //' | tr -d ' "')
# Map to EC2 instance type
case "$cpu_val:$mem_val" in
@@ -159,15 +162,20 @@ MISSING_HC=0
HC_SUMMARY=""
for service in $SERVICES; do
has_hc=$(docker compose config 2>/dev/null | grep -A 50 "^$service:" | grep -c "healthcheck:" || echo "0")
service_block=$(printf '%s\n' "$COMPOSE_CONFIG" | grep -A 20 "^ $service:")
has_hc=$(printf '%s\n' "$service_block" | grep -c "healthcheck:" || true)
if [[ $has_hc -eq 0 ]]; then
print_fail " $service: Missing healthcheck"
((MISSING_HC++)) || true
else
interval=$(docker compose config 2>/dev/null | grep -A 60 "^$service:" | grep -A 5 "healthcheck:" | grep "interval:" | sed 's/.*interval: //' | tr -d " '"" || echo "N/A")
timeout=$(docker compose config 2>/dev/null | grep -A 60 "^$service:" | grep -A 5 "healthcheck:" | grep "timeout:" | sed 's/.*timeout: //' | tr -d " '"" || echo "N/A")
retries=$(docker compose config 2>/dev/null | grep -A 60 "^$service:" | grep -A 5 "healthcheck:" | grep "retries:" | sed 's/.*retries: //' | tr -d " '"" || echo "N/A")
interval=$(printf '%s\n' "$service_block" | grep -A 8 "healthcheck:" | grep -m1 "interval:" | sed 's/.*interval: //' | tr -d ' "' || true)
timeout=$(printf '%s\n' "$service_block" | grep -A 8 "healthcheck:" | grep -m1 "timeout:" | sed 's/.*timeout: //' | tr -d ' "' || true)
retries=$(printf '%s\n' "$service_block" | grep -A 8 "healthcheck:" | grep -m1 "retries:" | sed 's/.*retries: //' | tr -d ' "' || true)
interval=${interval:-N/A}
timeout=${timeout:-N/A}
retries=${retries:-N/A}
print_pass " $service: interval=$interval, timeout=$timeout, retries=$retries"
HC_SUMMARY="$HC_SUMMARY\n • $service: interval=$interval, timeout=$timeout, retries=$retries"
@@ -208,10 +216,12 @@ print_test "Checking resource limits are applied"
LIMITS_ENFORCED=0
for service in $SERVICES; do
container_name="lab03-$service"
if docker ps --format '{{.Names}}' | grep -q "$container_name"; then
nano_cpus=$(docker inspect "$container_name" --format '{{.HostConfig.NanoCpus}}' 2>/dev/null || echo "0")
mem_bytes=$(docker inspect "$container_name" --format '{{.HostConfig.Memory}}' 2>/dev/null || echo "0")
container_id=$(docker compose ps -q "$service" 2>/dev/null || echo "")
if [[ -n "$container_id" ]]; then
container_name=$(docker inspect "$container_id" --format '{{.Name}}' 2>/dev/null || echo "$service")
container_name=${container_name#/}
nano_cpus=$(docker inspect "$container_id" --format '{{.HostConfig.NanoCpus}}' 2>/dev/null || echo "0")
mem_bytes=$(docker inspect "$container_id" --format '{{.HostConfig.Memory}}' 2>/dev/null || echo "0")
if [[ $nano_cpus -gt 0 && $mem_bytes -gt 0 ]]; then
cpu_cores=$(echo "scale=2; $nano_cpus / 1000000000" | bc 2>/dev/null || echo "N/A")
@@ -237,7 +247,7 @@ fi
# Test docker stats
print_test "Monitoring resource usage"
echo -e "\n${BLUE}Live Resource Usage:${NC}"
docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" 2>/dev/null || print_fail "docker stats failed"
docker ps --format '{{.Names}}' | grep '^lab03-' | xargs -r docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" 2>/dev/null || print_fail "docker stats failed"
# === SECTION 6: Health Status ===
print_header "Section 6: Health Status Verification"
@@ -246,9 +256,11 @@ print_test "Checking container health status"
HEALTHY=0
for service in $SERVICES; do
container_name="lab03-$service"
if docker ps --format '{{.Names}}' | grep -q "$container_name"; then
health=$(docker inspect "$container_name" --format '{{.State.Health.Status}}' 2>/dev/null || echo "no-healthcheck")
container_id=$(docker compose ps -q "$service" 2>/dev/null || echo "")
if [[ -n "$container_id" ]]; then
container_name=$(docker inspect "$container_id" --format '{{.Name}}' 2>/dev/null || echo "$service")
container_name=${container_name#/}
health=$(docker inspect "$container_id" --format '{{.State.Health.Status}}' 2>/dev/null || echo "no-healthcheck")
if [[ "$health" == "healthy" ]]; then
print_pass " $container_name: healthy ✓"
@@ -264,7 +276,7 @@ done
if [[ $HEALTHY -gt 0 ]]; then
print_pass "$HEALTHY containers are healthy"
else
print_warning "No healthy containers yet (may still be starting)"
print_warning "No healthy containers yet; they may still be starting"
fi
# === SECTION 7: Cloud Parallels ===