Files
Sankofa/scripts/test-deployment.sh
defiQUG 9daf1fd378 Apply Composer changes: comprehensive API updates, migrations, middleware, and infrastructure improvements
- Add comprehensive database migrations (001-024) for schema evolution
- Enhance API schema with expanded type definitions and resolvers
- Add new middleware: audit logging, rate limiting, MFA enforcement, security, tenant auth
- Implement new services: AI optimization, billing, blockchain, compliance, marketplace
- Add adapter layer for cloud integrations (Cloudflare, Kubernetes, Proxmox, storage)
- Update Crossplane provider with enhanced VM management capabilities
- Add comprehensive test suite for API endpoints and services
- Update frontend components with improved GraphQL subscriptions and real-time updates
- Enhance security configurations and headers (CSP, CORS, etc.)
- Update documentation and configuration files
- Add new CI/CD workflows and validation scripts
- Implement design system improvements and UI enhancements
2025-12-12 18:01:35 -08:00

219 lines
6.7 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
# Deployment Testing Script
# Tests all deployment components and verifies functionality
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
PASSED=0
FAILED=0
SKIPPED=0
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[PASS]${NC} $1"
((PASSED++))
}
log_error() {
echo -e "${RED}[FAIL]${NC} $1"
((FAILED++))
}
log_skip() {
echo -e "${YELLOW}[SKIP]${NC} $1"
((SKIPPED++))
}
test_command() {
local name=$1
local command=$2
log_info "Testing: $name"
if eval "$command" &>/dev/null; then
log_success "$name"
return 0
else
log_error "$name"
return 1
fi
}
test_http() {
local name=$1
local url=$2
local expected_status=${3:-200}
log_info "Testing: $name"
status=$(curl -s -o /dev/null -w "%{http_code}" "$url" || echo "000")
if [ "$status" = "$expected_status" ]; then
log_success "$name"
return 0
else
log_error "$name (got status $status, expected $expected_status)"
return 1
fi
}
test_graphql() {
local name=$1
local query=$2
local url=${3:-https://api.sankofa.nexus/graphql}
local token=${4:-}
log_info "Testing: $name"
headers=(-H "Content-Type: application/json")
if [ -n "$token" ]; then
headers+=(-H "Authorization: Bearer $token")
fi
response=$(curl -s "${headers[@]}" -d "{\"query\":\"$query\"}" "$url" || echo "{}")
if echo "$response" | jq -e '.errors' > /dev/null 2>&1; then
log_error "$name (GraphQL errors)"
return 1
elif echo "$response" | jq -e '.data' > /dev/null 2>&1; then
log_success "$name"
return 0
else
log_error "$name (invalid response)"
return 1
fi
}
# Main test suite
main() {
log_info "Starting deployment tests..."
echo ""
# Prerequisites
log_info "=== Prerequisites ==="
test_command "kubectl available" "kubectl version --client"
test_command "helm available" "helm version"
test_command "jq available" "jq --version"
test_command "curl available" "curl --version"
echo ""
# Kubernetes Cluster
log_info "=== Kubernetes Cluster ==="
test_command "Cluster accessible" "kubectl cluster-info"
test_command "API server reachable" "kubectl get nodes"
echo ""
# Namespaces
log_info "=== Namespaces ==="
test_command "API namespace exists" "kubectl get namespace api"
test_command "Portal namespace exists" "kubectl get namespace portal"
test_command "Keycloak namespace exists" "kubectl get namespace keycloak"
test_command "Monitoring namespace exists" "kubectl get namespace monitoring"
echo ""
# API Deployment
log_info "=== API Deployment ==="
test_command "API deployment exists" "kubectl get deployment api -n api"
test_command "API pods running" "kubectl get pods -n api -l app=api --field-selector=status.phase=Running --no-headers | wc -l | grep -q '[1-9]'"
test_command "API service exists" "kubectl get service api -n api"
test_command "API ingress exists" "kubectl get ingress api -n api"
echo ""
# Portal Deployment
log_info "=== Portal Deployment ==="
test_command "Portal deployment exists" "kubectl get deployment portal -n portal"
test_command "Portal pods running" "kubectl get pods -n portal -l app=portal --field-selector=status.phase=Running --no-headers | wc -l | grep -q '[1-9]'"
echo ""
# Keycloak Deployment
log_info "=== Keycloak Deployment ==="
test_command "Keycloak deployment exists" "kubectl get deployment keycloak -n keycloak"
test_command "Keycloak pods running" "kubectl get pods -n keycloak -l app=keycloak --field-selector=status.phase=Running --no-headers | wc -l | grep -q '[1-9]'"
test_command "Keycloak service exists" "kubectl get service keycloak -n keycloak"
echo ""
# Database
log_info "=== Database ==="
if kubectl get deployment postgres -n api &>/dev/null || kubectl get statefulset postgres -n api &>/dev/null; then
test_command "PostgreSQL exists" "kubectl get deployment postgres -n api || kubectl get statefulset postgres -n api"
test_command "PostgreSQL pods running" "kubectl get pods -n api -l app=postgres --field-selector=status.phase=Running --no-headers | wc -l | grep -q '[1-9]'"
else
log_skip "PostgreSQL (external database)"
fi
echo ""
# Crossplane
log_info "=== Crossplane ==="
test_command "Crossplane installed" "kubectl get deployment crossplane -n crossplane-system"
test_command "Proxmox provider installed" "kubectl get deployment crossplane-provider-proxmox -n crossplane-system"
echo ""
# Monitoring
log_info "=== Monitoring ==="
if kubectl get deployment prometheus -n monitoring &>/dev/null || kubectl get statefulset prometheus -n monitoring &>/dev/null; then
test_command "Prometheus installed" "kubectl get deployment prometheus -n monitoring || kubectl get statefulset prometheus -n monitoring"
else
log_skip "Prometheus (not deployed)"
fi
if kubectl get deployment grafana -n monitoring &>/dev/null; then
test_command "Grafana installed" "kubectl get deployment grafana -n monitoring"
else
log_skip "Grafana (not deployed)"
fi
echo ""
# Health Checks
log_info "=== Health Checks ==="
API_URL="${API_URL:-https://api.sankofa.nexus}"
KEYCLOAK_URL="${KEYCLOAK_URL:-https://keycloak.sankofa.nexus}"
if [ -n "$API_URL" ]; then
test_http "API health endpoint" "$API_URL/health" 200
test_graphql "GraphQL health query" "{ health { status } }" "$API_URL/graphql"
else
log_skip "API health check (API_URL not set)"
fi
if [ -n "$KEYCLOAK_URL" ]; then
test_http "Keycloak health endpoint" "$KEYCLOAK_URL/health/ready" 200
else
log_skip "Keycloak health check (KEYCLOAK_URL not set)"
fi
echo ""
# Secrets
log_info "=== Secrets ==="
test_command "Keycloak credentials secret" "kubectl get secret keycloak-credentials -n keycloak"
test_command "Keycloak client secrets" "kubectl get secret keycloak-client-secrets -n keycloak"
echo ""
# Summary
echo ""
log_info "=== Test Summary ==="
echo -e "${GREEN}Passed:${NC} $PASSED"
echo -e "${RED}Failed:${NC} $FAILED"
echo -e "${YELLOW}Skipped:${NC} $SKIPPED"
echo ""
if [ $FAILED -eq 0 ]; then
log_success "All tests passed!"
exit 0
else
log_error "Some tests failed. Please review the output above."
exit 1
fi
}
main "$@"