test(06-01): create test infrastructure for Lab 05 Database & RDS

Test Scripts (7 files, 1000+ lines):
- 01-database-creation-test.sh: PostgreSQL creation and initialization
- 02-private-network-test.sh: Private network isolation (INF-02)
- 03-persistence-test.sh: Data persistence verification (INF-04)
- 04-security-test.sh: Security compliance (INF-01, INF-02, INF-03)
- 99-final-verification.sh: End-to-end student verification
- run-all-tests.sh: Test orchestration with fail-fast
- quick-test.sh: Quick validation (< 30s)

Tests verify:
- PostgreSQL in private network → RDS in VPC
- Named volume → EBS volume
- Resource limits → DB instance class
- All INF requirements (01-04)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Luca Sacchi Ricciardi
2026-04-03 17:39:58 +02:00
parent 2f56df4dc3
commit cfbdb1efc8
7 changed files with 1143 additions and 0 deletions

View File

@@ -0,0 +1,151 @@
#!/bin/bash
# Lab 05 - Database & RDS
# Test 02: Private Network Isolation
# Verifica che il database sia in una rete privata e non sia accessibile dall'host
set -euo pipefail
# Colori per output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# Contatori
pass_count=0
fail_count=0
skip_count=0
# Funzioni helper
inc_pass() { ((pass_count++)) || true; }
inc_fail() { ((fail_count++)) || true; }
inc_skip() { ((skip_count++)) || true; }
echo "=========================================="
echo "Lab 05 - Test 02: Private Network Isolation"
echo "=========================================="
echo ""
# Verifica che docker-compose.yml esista
echo -n "[TEST] Verifica docker-compose.yml esista... "
if [ -f "docker-compose.yml" ]; then
echo -e "${GREEN}PASS${NC}"
inc_pass
else
echo -e "${YELLOW}SKIP${NC} (docker-compose.yml non trovato)"
inc_skip
echo ""
echo "Risultato: $pass_count PASS, $fail_count FAIL, $skip_count SKIP"
exit 0
fi
# Verifica che il database sia in una rete privata
echo -n "[TEST] Verifica database in rete 'vpc-private'... "
if grep -A 10 "database:" docker-compose.yml | grep -q "vpc-private"; then
echo -e "${GREEN}PASS${NC}"
inc_pass
else
echo -e "${RED}FAIL${NC} (database non in rete vpc-private)"
inc_fail
echo "Il database deve essere nella rete privata per simulare RDS in VPC"
fi
# Verifica che la rete privata sia configurata come internal
echo -n "[TEST] Verifica rete 'vpc-private' con flag internal... "
if grep -A 5 "vpc-private:" docker-compose.yml | grep -q "internal: true"; then
echo -e "${GREEN}PASS${NC}"
inc_pass
else
echo -e "${YELLOW}WARN${NC} (rete privata senza flag internal)"
inc_skip
fi
# Verifica che NON ci siano porte esposte per il database (INF-02)
echo -n "[TEST] Verifica NESSUNA porta esposta per database (INF-02)... "
if grep -A 20 "database:" docker-compose.yml | grep -q "ports:"; then
# Se ci sono porte, verifica che siano solo 127.0.0.1
if grep -A 20 "database:" docker-compose.yml | grep "ports:" -A 1 | grep -q "127.0.0.1"; then
echo -e "${YELLOW}WARN${NC} (porta su 127.0.0.1 - database RDS reale non espone porte)"
inc_skip
else
echo -e "${RED}FAIL${NC} (porta esposta su host - INF-02 violation)"
inc_fail
echo "RDS in VPC privata NON espone porte sull'host"
fi
else
echo -e "${GREEN}PASS${NC} (nessuna porta esposta)"
inc_pass
fi
# Se i container non sono in esecuzione, skip i test dinamici
echo ""
echo -n "[TEST] Verifica container database in esecuzione... "
if ! docker ps --format '{{{{Names}}}}' | grep -q "^lab05-db$"; then
echo -e "${YELLOW}SKIP${NC} (container non in esecuzione)"
inc_skip
echo -e "${YELLOW}Avviare i container con: docker-compose up -d${NC}"
echo ""
echo "Risultato: $pass_count PASS, $fail_count FAIL, $skip_count SKIP"
exit 0
fi
echo -e "${GREEN}PASS${NC}"
inc_pass
# Verifica che il database NON sia accessibile dall'host
echo ""
echo "[TEST] Verifica database NON accessibile dall'host..."
# Ottieni porta se esposta
db_port=$(docker port lab05-db 5432 2>/dev/null || echo "")
if [ -z "$db_port" ]; then
echo -e " ${GREEN}PASS${NC} (nessuna porta mappata su host)"
inc_pass
else
echo -e " ${RED}FAIL${NC} (porta $db_port mappata su host)"
inc_fail
echo " RDS in VPC privata NON deve essere accessibile dall'host"
fi
# Verifica che il container sia nella rete privata
echo -n "[TEST] Verifica container connesso a rete vpc-private... "
if docker inspect lab05-db --format '{{range $net, $conf := .NetworkSettings.Networks}}{{$net}}{{end}}' | grep -q "lab05-vpc-private"; then
echo -e "${GREEN}PASS${NC}"
inc_pass
else
echo -e "${RED}FAIL${NC} (container non in rete vpc-private)"
inc_fail
fi
# Verifica isolamento - container in rete pubblica NON può connettersi
echo ""
echo "[TEST] Verifica isolamento tra reti..."
# Cerca container in rete pubblica
public_container=$(docker ps --format '{{{{Names}}}}' | grep -E "lab05-(web|app|test)" | head -1)
if [ -n "$public_container" ]; then
echo -n "[TEST] Container pubblico $public_container può connettersi al database... "
if docker exec $public_container pg_isready -h lab05-db -U lab05_user &>/dev/null; then
echo -e "${GREEN}PASS${NC} (connessione consentita - multi-homed app scenario)"
inc_pass
else
echo -e "${YELLOW}SKIP${NC} (connessione fallita - potrebbe essere corretta isolazione)"
inc_skip
fi
else
echo -e "${YELLOW}SKIP${NC} (nessun container pubblico trovato)"
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