#!/bin/bash # Integration Test 03: Architecture Validation # Verifica architettura multi-tier corretta set -euo pipefail # Colori RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' pass_count=0 fail_count=0 skip_count=0 inc_pass() { ((pass_count++)) || true; } inc_fail() { ((fail_count++)) || true; } inc_skip() { ((skip_count++)) || true; } echo "==========================================" echo "Integration Test 03: Architecture Validation" echo "==========================================" echo "" # Verifica architettura Lab 05 (multi-tier completa) echo "[TEST] Verifica architettura Lab 05 (multi-tier)..." if [ -f "labs/lab-05-database/docker-compose.yml" ]; then cd labs/lab-05-database # Verifica presenza servizi key echo -n " Servizio 'app' presente... " if grep -q "^ app:" docker-compose.yml; then echo -e "${GREEN}PASS${NC}" inc_pass else echo -e "${RED}FAIL${NC}" inc_fail fi echo -n " Servizio 'db' presente... " if grep -q "^ db:" docker-compose.yml; then echo -e "${GREEN}PASS${NC}" inc_pass else echo -e "${RED}FAIL${NC}" inc_fail fi # Verifica networking corretto echo "" echo "[TEST] Verifica networking multi-tier..." echo -n " App in multi-home (public + private)... " if grep -A 15 "^ app:" docker-compose.yml | grep -q "vpc-public" && \ grep -A 15 "^ app:" docker-compose.yml | grep -q "vpc-private"; then echo -e "${GREEN}PASS${NC}" inc_pass else echo -e "${RED}FAIL${NC}" inc_fail fi echo -n " Database solo in private network... " if grep -A 15 "^ db:" docker-compose.yml | grep -q "vpc-private" && \ ! grep -A 15 "^ db:" docker-compose.yml | grep -q "vpc-public"; then echo -e "${GREEN}PASS${NC}" inc_pass else echo -e "${RED}FAIL${NC}" inc_fail fi # Verifica dipendenze echo "" echo "[TEST] Verifica dipendenze servizi..." echo -n " App depends on db... " if grep -A 20 "^ app:" docker-compose.yml | grep -q "depends_on:" && \ grep -A 25 "^ app:" docker-compose.yml | grep -A 5 "depends_on:" | grep -q "db:"; then echo -e "${GREEN}PASS${NC}" inc_pass else echo -e "${YELLOW}WARN${NC} (nessuna dipendenza configurata)" inc_skip fi # Verifica resource allocation per tier echo "" echo "[TEST] Verifica allocazione risorse per tier..." echo -n " Database ha più risorse di app... " app_mem=$(grep -A 30 "^ app:" docker-compose.yml | grep "memory:" | sed 's/.*memory: //' | sed 's/[^0-9MG]//g') db_mem=$(grep -A 30 "^ db:" docker-compose.yml | grep "memory:" | sed 's/.*memory: //' | sed 's/[^0-9MG]//g') if [ -n "$app_mem" ] && [ -n "$db_mem" ]; then # Confronta (semplificato - assumes G) if [ "${db_mem%G}" -ge "${app_mem%G}" ]; then echo -e "${GREEN}PASS${NC} (app: ${app_mem}, db: ${db_mem})" inc_pass else echo -e "${RED}FAIL${NC} (db dovrebbe avere più risorse)" inc_fail fi else echo -e "${YELLOW}SKIP${NC} (impossibile confrontare)" inc_skip fi cd - > /dev/null else echo -e "${YELLOW}SKIP${NC} (Lab 05 non trovato)" inc_skip fi echo "" echo "=== Verifica segregazione rete ===" # Verifica che reti private siano isolate private_networks=$(docker network ls --format '{{{{.Name}}}}' | grep "private" | grep -v "bridge" || true) if [ -n "$private_networks" ]; then echo -n "[TEST] Reti private hanno flag internal... " internal_count=0 for network in $private_networks; do if docker network inspect "$network" --format '{{.Internal}}' | grep -q "true"; then ((internal_count++)) || true fi done if [ $internal_count -gt 0 ]; then echo -e "${GREEN}PASS${NC} ($internal_count/$( echo "$private_networks" | wc -w ) reti isolate)" inc_pass else echo -e "${YELLOW}WARN${NC} (nessuna rete isolata)" inc_skip fi else echo -e "${YELLOW}SKIP${NC} (nessuna rete privata trovata)" inc_skip fi echo "" echo "=== Verifica data flow ===" # Verifica che i dati possano fluire attraverso i tier if docker ps --format '{{{{Names}}}}' | grep -q "lab05-app" && \ docker ps --format '{{{{Names}}}}' | grep -q "lab05-db"; then echo "[TEST] Verifica flusso dati app → db..." echo -n " App può scrivere nel database... " if docker exec lab05-app psql -h db -U lab05_user -d lab05_db -c " CREATE TABLE IF NOT EXISTS flow_test (id SERIAL, data TEXT); INSERT INTO flow_test (data) VALUES ('test'); " &>/dev/null; then echo -e "${GREEN}PASS${NC}" inc_pass echo -n " App può leggere dal database... " if docker exec lab05-app psql -h db -U lab05_user -d lab05_db -t -c " SELECT COUNT(*) FROM flow_test; " &>/dev/null | grep -q "[1-9]"; then echo -e "${GREEN}PASS${NC}" inc_pass else echo -e "${RED}FAIL${NC}" inc_fail fi else echo -e "${RED}FAIL${NC}" inc_fail fi else echo -e "${YELLOW}SKIP${NC} (container non in esecuzione)" inc_skip fi echo "" echo "==========================================" echo "Risultato: $pass_count PASS, $fail_count FAIL, $skip_count SKIP" echo "==========================================" if [ $fail_count -gt 0 ]; then exit 1 fi exit 0