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:
272
labs/lab-05-database/tests/99-final-verification.sh
Executable file
272
labs/lab-05-database/tests/99-final-verification.sh
Executable file
@@ -0,0 +1,272 @@
|
||||
#!/bin/bash
|
||||
# Lab 05 - Database & RDS
|
||||
# Test 99: Final Verification (Double Check)
|
||||
# Verifica finale end-to-end per studenti
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Colori per output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
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 - Final Verification (Double Check)"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "Verifica completa: Lab 05 - Database & RDS"
|
||||
echo "Parallelo: PostgreSQL in Docker ↔ RDS in AWS VPC"
|
||||
echo ""
|
||||
|
||||
# Verifica file docker-compose.yml
|
||||
echo -n "[CHECK] Verifica docker-compose.yml esista... "
|
||||
if [ -f "docker-compose.yml" ]; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC}"
|
||||
inc_fail
|
||||
echo "ERRORE: docker-compose.yml non trovato"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=== VERIFICA CONFIGURAZIONE ==="
|
||||
|
||||
# Verifica servizio database
|
||||
echo -n "[CHECK] Servizio 'database' definito... "
|
||||
if grep -q "database:" docker-compose.yml; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC}"
|
||||
inc_fail
|
||||
fi
|
||||
|
||||
# Verifica immagine PostgreSQL
|
||||
echo -n "[CHECK] Immagine PostgreSQL... "
|
||||
if grep -q "image: postgres" docker-compose.yml; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC}"
|
||||
inc_fail
|
||||
fi
|
||||
|
||||
# Verifica credenziali
|
||||
echo -n "[CHECK] Credenziali PostgreSQL configurate... "
|
||||
if grep -q "POSTGRES_DB:" docker-compose.yml && \
|
||||
grep -q "POSTGRES_USER:" docker-compose.yml && \
|
||||
grep -q "POSTGRES_PASSWORD:" docker-compose.yml; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC}"
|
||||
inc_fail
|
||||
fi
|
||||
|
||||
# Verifica volume
|
||||
echo -n "[CHECK] Volume 'db-data' configurato... "
|
||||
if grep -q "db-data:" docker-compose.yml; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC}"
|
||||
inc_fail
|
||||
fi
|
||||
|
||||
# Verifica rete privata
|
||||
echo -n "[CHECK] Database in rete 'vpc-private'... "
|
||||
if grep -A 20 "database:" docker-compose.yml | grep -q "vpc-private"; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC}"
|
||||
inc_fail
|
||||
fi
|
||||
|
||||
# Verifica nessuna porta esposta
|
||||
echo -n "[CHECK] NESSUNA porta esposta (INF-02)... "
|
||||
if grep -A 30 "database:" docker-compose.yml | grep -q "ports:"; then
|
||||
echo -e "${YELLOW}WARN${NC} (porte configurate - RDS non espone porte)"
|
||||
inc_skip
|
||||
else
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
fi
|
||||
|
||||
# Verifica limiti risorse
|
||||
echo -n "[CHECK] Limiti risorse configurati (INF-03)... "
|
||||
if grep -A 30 "database:" docker-compose.yml | grep -q "cpus:" && \
|
||||
grep -A 30 "database:" docker-compose.yml | grep -q "memory:"; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC}"
|
||||
inc_fail
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=== VERIFICA ESECUZIONE ==="
|
||||
|
||||
# Verifica container in esecuzione
|
||||
echo -n "[CHECK] Container 'lab05-db' in esecuzione... "
|
||||
if docker ps --format '{{{{Names}}}}' | grep -q "^lab05-db$"; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC}"
|
||||
inc_fail
|
||||
echo "Avviare i container: docker-compose up -d"
|
||||
echo ""
|
||||
echo "Risultato: $pass_count PASS, $fail_count FAIL, $skip_count SKIP"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Verifica healthcheck
|
||||
echo -n "[CHECK] Healthcheck configurato... "
|
||||
health_status=$(docker inspect lab05-db --format '{{.State.Health.Status}}' 2>/dev/null || echo "unknown")
|
||||
if [ "$health_status" != "unknown" ]; then
|
||||
echo -e "${GREEN}OK${NC} ($health_status)"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${YELLOW}WARN${NC} (nessun healthcheck)"
|
||||
inc_skip
|
||||
fi
|
||||
|
||||
# Verifica pg_isready
|
||||
echo -n "[CHECK] PostgreSQL pronto (pg_isready)... "
|
||||
if docker exec lab05-db pg_isready &>/dev/null; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${YELLOW}WARN${NC} (PostgreSQL non ancora pronto)"
|
||||
inc_skip
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=== VERIFICA SICUREZZA ==="
|
||||
|
||||
# INF-01: Non-root
|
||||
echo -n "[CHECK] Container NON gira come root (INF-01)... "
|
||||
container_user=$(docker exec lab05-db whoami 2>/dev/null || echo "unknown")
|
||||
if [ "$container_user" = "postgres" ]; then
|
||||
echo -e "${GREEN}OK${NC} ($container_user)"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC} ($container_user)"
|
||||
inc_fail
|
||||
fi
|
||||
|
||||
# INF-02: No host ports
|
||||
echo -n "[CHECK] NESSUNA porta su host (INF-02)... "
|
||||
db_port=$(docker port lab05-db 5432 2>/dev/null || echo "")
|
||||
if [ -z "$db_port" ]; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC} (porta $db_port)"
|
||||
inc_fail
|
||||
fi
|
||||
|
||||
# INF-03: Resource limits
|
||||
echo -n "[CHECK] Limiti risorsa applicati (INF-03)... "
|
||||
if docker inspect lab05-db --format '{{.HostConfig.Memory}}' | grep -q "[1-9]"; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC}"
|
||||
inc_fail
|
||||
fi
|
||||
|
||||
# INF-04: Volume persistence
|
||||
echo -n "[CHECK] Volume persistenza (INF-04)... "
|
||||
if docker volume ls --format '{{{{.Name}}}}' | grep -q "^lab05_db-data$"; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC}"
|
||||
inc_fail
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=== VERIFICA FUNZIONALITÀ ==="
|
||||
|
||||
# Test connessione database
|
||||
echo -n "[CHECK] Connessione database funziona... "
|
||||
if docker exec lab05-db psql -U lab05_user -d lab05_db -c "SELECT 1;" &>/dev/null; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC}"
|
||||
inc_fail
|
||||
fi
|
||||
|
||||
# Test creazione tabella
|
||||
echo -n "[CHECK] Creazione tabella... "
|
||||
if docker exec lab05-db psql -U lab05_user -d lab05_db -c "CREATE TABLE IF NOT EXISTS verify_test (id SERIAL);" &>/dev/null; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC}"
|
||||
inc_fail
|
||||
fi
|
||||
|
||||
# Test inserimento dati
|
||||
echo -n "[CHECK] Inserimento dati... "
|
||||
if docker exec lab05-db psql -U lab05_user -d lab05_db -c "INSERT INTO verify_test DEFAULT VALUES;" &>/dev/null; then
|
||||
echo -e "${GREEN}OK${NC}"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC}"
|
||||
inc_fail
|
||||
fi
|
||||
|
||||
# Test query dati
|
||||
echo -n "[CHECK] Query dati... "
|
||||
count=$(docker exec lab05-db psql -U lab05_user -d lab05_db -t -c "SELECT COUNT(*) FROM verify_test;" 2>/dev/null | tr -d ' ')
|
||||
if [ -n "$count" ] && [ "$count" -gt 0 ]; then
|
||||
echo -e "${GREEN}OK${NC} ($count righe)"
|
||||
inc_pass
|
||||
else
|
||||
echo -e "${RED}FAIL${NC}"
|
||||
inc_fail
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "RISULTATO FINALE:"
|
||||
echo " $pass_count PASS"
|
||||
echo " $fail_count FAIL"
|
||||
echo " $skip_count SKIP"
|
||||
echo "=========================================="
|
||||
|
||||
if [ $fail_count -eq 0 ]; then
|
||||
echo ""
|
||||
echo -e "${GREEN}✓ LAB 05 COMPLETATO CON SUCCESSO${NC}"
|
||||
echo ""
|
||||
echo "Paralleli confermati:"
|
||||
echo " PostgreSQL container → RDS Instance"
|
||||
echo " Private network → VPC Private Subnet"
|
||||
echo " Named volume → EBS Volume"
|
||||
echo " Resource limits → DB Instance Class"
|
||||
echo ""
|
||||
exit 0
|
||||
else
|
||||
echo ""
|
||||
echo -e "${RED}✗ LAB 05 HA ERRORI - RISOLVERE E RIPETERE${NC}"
|
||||
echo ""
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user