- 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
289 lines
9.2 KiB
Bash
Executable File
289 lines
9.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# resolve-blockers.sh
|
|
# Automated script to resolve all remaining blockers
|
|
|
|
set -euo pipefail
|
|
|
|
# Load environment variables
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
if [ -f "${SCRIPT_DIR}/../.env" ]; then
|
|
set -a
|
|
source <(grep -v '^#' "${SCRIPT_DIR}/../.env" | grep -v '^$' | sed 's/^/export /')
|
|
set +a
|
|
fi
|
|
|
|
# Colors
|
|
GREEN='\033[0;32m'
|
|
RED='\033[0;31m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
PASSED=0
|
|
FAILED=0
|
|
SKIPPED=0
|
|
|
|
log() {
|
|
echo -e "${GREEN}[✓]${NC} $1"
|
|
((PASSED++))
|
|
}
|
|
|
|
error() {
|
|
echo -e "${RED}[✗]${NC} $1"
|
|
((FAILED++))
|
|
}
|
|
|
|
warn() {
|
|
echo -e "${YELLOW}[!]${NC} $1"
|
|
((SKIPPED++))
|
|
}
|
|
|
|
info() {
|
|
echo -e "${BLUE}[i]${NC} $1"
|
|
}
|
|
|
|
# Blocker 1: Kubernetes
|
|
setup_kubernetes() {
|
|
info "=== Blocker 1: Kubernetes Cluster Setup ==="
|
|
echo ""
|
|
|
|
# Check kubectl
|
|
if command -v kubectl &> /dev/null; then
|
|
log "kubectl is installed"
|
|
else
|
|
warn "kubectl not installed - install manually: https://kubernetes.io/docs/tasks/tools/"
|
|
return 1
|
|
fi
|
|
|
|
# Check for existing cluster
|
|
if kubectl cluster-info &> /dev/null 2>&1; then
|
|
log "Kubernetes cluster is accessible"
|
|
kubectl get nodes 2>/dev/null && log "Cluster nodes are ready" || warn "Cluster accessible but nodes not ready"
|
|
return 0
|
|
fi
|
|
|
|
# Check Docker for kind/minikube
|
|
if ! docker info &> /dev/null; then
|
|
warn "Docker is not running - required for kind/minikube"
|
|
warn "Start Docker or use existing Kubernetes cluster"
|
|
return 1
|
|
fi
|
|
|
|
# Try kind
|
|
if command -v kind &> /dev/null; then
|
|
info "kind is installed, creating cluster..."
|
|
if kind create cluster --name sankofa 2>/dev/null; then
|
|
log "kind cluster 'sankofa' created"
|
|
kubectl config use-context kind-sankofa
|
|
return 0
|
|
else
|
|
warn "Failed to create kind cluster (may already exist)"
|
|
if kind get clusters | grep -q sankofa; then
|
|
log "Cluster 'sankofa' already exists"
|
|
kubectl config use-context kind-sankofa
|
|
return 0
|
|
fi
|
|
fi
|
|
else
|
|
warn "kind not installed - install manually or use existing cluster"
|
|
fi
|
|
|
|
# Try minikube
|
|
if command -v minikube &> /dev/null; then
|
|
info "minikube is installed, starting cluster..."
|
|
if minikube start --driver=docker 2>/dev/null; then
|
|
log "minikube cluster started"
|
|
return 0
|
|
else
|
|
warn "Failed to start minikube (may already be running)"
|
|
if minikube status &> /dev/null; then
|
|
log "minikube cluster is running"
|
|
return 0
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
warn "No Kubernetes cluster available - manual setup required"
|
|
return 1
|
|
}
|
|
|
|
install_crossplane() {
|
|
info "Installing Crossplane..."
|
|
|
|
if ! kubectl cluster-info &> /dev/null 2>&1; then
|
|
warn "No Kubernetes cluster - skipping Crossplane installation"
|
|
return 1
|
|
fi
|
|
|
|
# Check if Crossplane is already installed
|
|
if kubectl get namespace crossplane-system &> /dev/null 2>&1; then
|
|
if kubectl get pods -n crossplane-system &> /dev/null 2>&1; then
|
|
log "Crossplane is already installed"
|
|
return 0
|
|
fi
|
|
fi
|
|
|
|
# Check for helm
|
|
if ! command -v helm &> /dev/null; then
|
|
warn "helm not installed - install manually: https://helm.sh/docs/intro/install/"
|
|
return 1
|
|
fi
|
|
|
|
# Install Crossplane
|
|
if helm repo list | grep -q crossplane-stable; then
|
|
log "Crossplane Helm repo already added"
|
|
else
|
|
helm repo add crossplane-stable https://charts.crossplane.io/stable
|
|
helm repo update
|
|
log "Crossplane Helm repo added"
|
|
fi
|
|
|
|
if helm list -n crossplane-system | grep -q crossplane; then
|
|
log "Crossplane is already installed via Helm"
|
|
else
|
|
if helm install crossplane crossplane-stable/crossplane \
|
|
--namespace crossplane-system \
|
|
--create-namespace \
|
|
--wait 2>/dev/null; then
|
|
log "Crossplane installed successfully"
|
|
else
|
|
warn "Failed to install Crossplane - check logs"
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
# Verify
|
|
sleep 5
|
|
if kubectl get pods -n crossplane-system &> /dev/null; then
|
|
log "Crossplane pods are running"
|
|
kubectl get pods -n crossplane-system
|
|
else
|
|
warn "Crossplane pods not ready yet"
|
|
fi
|
|
}
|
|
|
|
# Blocker 2: SSH
|
|
setup_ssh() {
|
|
info "=== Blocker 2: SSH Access Setup ==="
|
|
echo ""
|
|
|
|
SSH_KEY="${SSH_KEY:-$HOME/.ssh/sankofa_proxmox}"
|
|
|
|
# Generate key if not exists
|
|
if [ ! -f "$SSH_KEY" ]; then
|
|
info "Generating SSH key..."
|
|
if ssh-keygen -t ed25519 -C "sankofa-proxmox" -f "$SSH_KEY" -N "" -q; then
|
|
log "SSH key generated: $SSH_KEY"
|
|
else
|
|
error "Failed to generate SSH key"
|
|
return 1
|
|
fi
|
|
else
|
|
log "SSH key already exists: $SSH_KEY"
|
|
fi
|
|
|
|
# Test ML110-01
|
|
info "Testing SSH to ML110-01..."
|
|
if ssh -i "$SSH_KEY" -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@192.168.11.10 'echo "SSH working"' &> /dev/null; then
|
|
log "SSH to ML110-01 works"
|
|
else
|
|
warn "SSH to ML110-01 failed - manual key copy required"
|
|
info "Run: ssh-copy-id -i $SSH_KEY.pub root@192.168.11.10"
|
|
fi
|
|
|
|
# Test R630-01
|
|
info "Testing SSH to R630-01..."
|
|
if ssh -i "$SSH_KEY" -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@192.168.11.11 'echo "SSH working"' &> /dev/null; then
|
|
log "SSH to R630-01 works"
|
|
else
|
|
warn "SSH to R630-01 failed - manual key copy required"
|
|
info "Run: ssh-copy-id -i $SSH_KEY.pub root@192.168.11.11"
|
|
fi
|
|
}
|
|
|
|
# Blocker 3: Images
|
|
verify_images() {
|
|
info "=== Blocker 3: Image Verification ==="
|
|
echo ""
|
|
|
|
SSH_KEY="${SSH_KEY:-$HOME/.ssh/sankofa_proxmox}"
|
|
|
|
# Check ML110-01
|
|
info "Checking images on ML110-01..."
|
|
if ssh -i "$SSH_KEY" -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@192.168.11.10 'pveam list local 2>/dev/null | grep -i ubuntu' &> /dev/null; then
|
|
local images=$(ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no root@192.168.11.10 'pveam list local 2>/dev/null | grep -i ubuntu' 2>/dev/null || echo "")
|
|
if [ -n "$images" ]; then
|
|
log "Images found on ML110-01:"
|
|
echo "$images" | head -3 | sed 's/^/ /'
|
|
else
|
|
warn "No Ubuntu images found on ML110-01"
|
|
fi
|
|
else
|
|
warn "Cannot check images on ML110-01 (SSH not configured)"
|
|
fi
|
|
|
|
# Check R630-01
|
|
info "Checking images on R630-01..."
|
|
if ssh -i "$SSH_KEY" -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@192.168.11.11 'pveam list local 2>/dev/null | grep -i ubuntu' &> /dev/null; then
|
|
local images=$(ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no root@192.168.11.11 'pveam list local 2>/dev/null | grep -i ubuntu' 2>/dev/null || echo "")
|
|
if [ -n "$images" ]; then
|
|
log "Images found on R630-01:"
|
|
echo "$images" | head -3 | sed 's/^/ /'
|
|
else
|
|
warn "No Ubuntu images found on R630-01"
|
|
fi
|
|
else
|
|
warn "Cannot check images on R630-01 (SSH not configured)"
|
|
fi
|
|
}
|
|
|
|
main() {
|
|
echo ""
|
|
echo "╔══════════════════════════════════════════════════════════════╗"
|
|
echo "║ Resolving All Remaining Blockers ║"
|
|
echo "╚══════════════════════════════════════════════════════════════╝"
|
|
echo ""
|
|
echo "Priority Order:"
|
|
echo " 1. SSH Access (needed for image verification)"
|
|
echo " 2. Image Verification (needed before VM deployment)"
|
|
echo " 3. Kubernetes Cluster (needed for provider deployment)"
|
|
echo ""
|
|
|
|
# Blocker 2: SSH (PRIORITY 1 - Do this first)
|
|
setup_ssh
|
|
echo ""
|
|
|
|
# Blocker 3: Images (PRIORITY 2 - Depends on SSH)
|
|
verify_images
|
|
echo ""
|
|
|
|
# Blocker 1: Kubernetes (PRIORITY 3 - Can be done in parallel)
|
|
if setup_kubernetes; then
|
|
install_crossplane
|
|
fi
|
|
echo ""
|
|
|
|
# Summary
|
|
echo "╔══════════════════════════════════════════════════════════════╗"
|
|
echo "║ Summary ║"
|
|
echo "╚══════════════════════════════════════════════════════════════╝"
|
|
echo ""
|
|
echo -e "${GREEN}Passed:${NC} ${PASSED}"
|
|
echo -e "${YELLOW}Skipped/Warnings:${NC} ${SKIPPED}"
|
|
echo -e "${RED}Failed:${NC} ${FAILED}"
|
|
echo ""
|
|
|
|
if [ $FAILED -eq 0 ]; then
|
|
log "All automated steps completed!"
|
|
if [ $SKIPPED -gt 0 ]; then
|
|
warn "Some steps require manual intervention (see warnings above)"
|
|
fi
|
|
else
|
|
error "Some steps failed - manual intervention required"
|
|
fi
|
|
echo ""
|
|
}
|
|
|
|
main "$@"
|
|
|