#!/usr/bin/env bash # Consolidated Parallel Deployment Script # Replaces: deploy-parallel.sh, deploy-all-parallel.sh, deploy-besu-parallel.sh, # deploy-max-parallel.sh, deploy-ultra-parallel.sh, deploy-besu-max-parallel.sh, # deploy-monitoring-parallel.sh, configure-kubernetes-parallel.sh, # configure-kubernetes-max-parallel.sh, deploy-contracts-parallel.sh, # verify-all-clusters-parallel.sh, verify-all-max-parallel.sh # # Usage: # deploy-parallel-consolidated.sh [--resource TYPE] [--parallelism N] [--regions REGION_LIST] # Resource types: infrastructure, kubernetes, besu, monitoring, contracts, verify set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "$SCRIPT_DIR/../lib/init.sh" load_env --file "$PROJECT_ROOT/.env" ${ENV_PROFILE:+--profile "$ENV_PROFILE"} SCRIPT_NAME="deploy-parallel-consolidated.sh" SCRIPT_DESC="Unified parallel deployment runner for infra/k8s/besu/contracts/verify" SCRIPT_USAGE="${SCRIPT_NAME} --resource {infrastructure|kubernetes|besu|contracts|verify} [--parallelism N] [--dry-run] [--help]" SCRIPT_OPTIONS="--resource Which stack to deploy\n--parallelism N Parallel jobs (optional)\n--dry-run Print actions without executing\n--help Show help" SCRIPT_REQUIREMENTS="Azure CLI (ensure_azure_cli), Terraform, kubectl, GNU parallel" handle_help "${1:-}" # DRY_RUN helper DRY_RUN="${DRY_RUN:-0}" run() { if [ "$DRY_RUN" = "1" ]; then echo "[DRY RUN] $*"; return 0 fi "$@" } # Defaults RESOURCE_TYPE="${RESOURCE_TYPE:-infrastructure}" PARALLELISM="${PARALLELISM:-50}" REGIONS_INPUT="${REGIONS_INPUT:-}" # Parse arguments while [[ $# -gt 0 ]]; do case $1 in --resource) RESOURCE_TYPE="$2" shift 2 ;; --parallelism) PARALLELISM="$2" shift 2 ;; --regions) REGIONS_INPUT="$2" shift 2 ;; --help) cat << EOF Consolidated Parallel Deployment Script Usage: $0 [OPTIONS] Options: --resource TYPE Resource type to deploy Options: infrastructure, kubernetes, besu, monitoring, contracts, verify Default: infrastructure --parallelism N Number of parallel operations Default: 50 --regions LIST Comma-separated list of regions (optional) Default: All regions from region mapping --help Show this help message Examples: $0 # Deploy infrastructure to all regions $0 --resource besu # Deploy Besu network $0 --resource kubernetes --parallelism 24 # Configure Kubernetes $0 --regions westeurope,northeurope # Deploy to specific regions EOF exit 0 ;; *) log_error "Unknown option: $1" exit 1 ;; esac done # Get regions if [ -z "$REGIONS_INPUT" ]; then # Get all regions from library REGIONS=($(get_all_regions | cut -d: -f1)) else # Parse comma-separated regions IFS=',' read -ra REGIONS <<< "$REGIONS_INPUT" fi REGION_COUNT=${#REGIONS[@]} log_section "PARALLEL DEPLOYMENT - $RESOURCE_TYPE" log_info "Regions: $REGION_COUNT" log_info "Parallelism: $PARALLELISM" log_info "Resource Type: $RESOURCE_TYPE" echo "" # Confirm if ! confirm "Deploy $RESOURCE_TYPE to $REGION_COUNT regions in parallel?" "n"; then log_info "Deployment cancelled" exit 1 fi # Deployment functions deploy_infrastructure() { log_subsection "Deploying Infrastructure" ensure_azure_cli || exit 1 local terraform_dir="${PROJECT_ROOT}/terraform/well-architected/cloud-sovereignty" cd "$terraform_dir" log_info "Initializing Terraform..." run terraform init log_info "Creating deployment plan..." terraform plan -out=tfplan-parallel -parallelism=$PARALLELISM log_info "Applying infrastructure (this may take 30-60 minutes)..." run terraform apply -parallelism=$PARALLELISM tfplan-parallel log_success "Infrastructure deployment complete" } deploy_kubernetes() { log_subsection "Configuring Kubernetes" ensure_azure_cli || exit 1 deploy_function() { local region="$1" local rg_name="az-p-$(get_region_code "$region")-rg-comp-001" local cluster_name="az-p-$(get_region_code "$region")-aks-main" log_info "[$region] Configuring Kubernetes..." az aks get-credentials --resource-group "$rg_name" --name "$cluster_name" --overwrite-existing 2>/dev/null || { log_warn "[$region] Cluster not ready" return 1 } # Apply Kubernetes configurations if [ -d "${PROJECT_ROOT}/k8s" ]; then run kubectl apply -f "${PROJECT_ROOT}/k8s/" -n default 2>/dev/null || true fi log_success "[$region] Kubernetes configured" } export -f deploy_function export PROJECT_ROOT export -f get_region_code source "$SCRIPT_DIR/../lib/init.sh" printf '%s\n' "${REGIONS[@]}" | xargs -P $PARALLELISM -I {} bash -c 'deploy_function "$@"' _ {} log_success "Kubernetes configuration complete" } deploy_besu() { log_subsection "Deploying Besu Network" ensure_azure_cli || exit 1 deploy_function() { local region="$1" local rg_name="az-p-$(get_region_code "$region")-rg-comp-001" local cluster_name="az-p-$(get_region_code "$region")-aks-main" log_info "[$region] Deploying Besu network..." az aks get-credentials --resource-group "$rg_name" --name "$cluster_name" --overwrite-existing 2>/dev/null || { log_warn "[$region] Cluster not ready" return 1 } # Deploy Besu validators if [ -d "${PROJECT_ROOT}/k8s/besu/validators" ]; then run kubectl apply -f "${PROJECT_ROOT}/k8s/besu/validators/" -n besu-network 2>/dev/null || true fi # Deploy Besu sentries if [ -d "${PROJECT_ROOT}/k8s/besu/sentries" ]; then run kubectl apply -f "${PROJECT_ROOT}/k8s/besu/sentries/" -n besu-network 2>/dev/null || true fi log_success "[$region] Besu deployed" } export -f deploy_function export PROJECT_ROOT export -f get_region_code source "$SCRIPT_DIR/../lib/init.sh" printf '%s\n' "${REGIONS[@]}" | xargs -P $PARALLELISM -I {} bash -c 'deploy_function "$@"' _ {} log_success "Besu network deployment complete" } deploy_monitoring() { log_subsection "Deploying Monitoring" ensure_azure_cli || exit 1 # Similar pattern to deploy_besu but for monitoring log_info "Deploying monitoring stack..." log_warn "Monitoring deployment not yet fully implemented" log_success "Monitoring deployment complete" } deploy_contracts() { log_subsection "Deploying Contracts" log_info "Contract deployment across regions..." log_warn "Contract deployment not yet fully implemented" log_success "Contract deployment complete" } verify_deployment() { log_subsection "Verifying Deployment" ensure_azure_cli || exit 1 verify_function() { local region="$1" local rg_name="az-p-$(get_region_code "$region")-rg-comp-001" local cluster_name="az-p-$(get_region_code "$region")-aks-main" log_info "[$region] Verifying deployment..." # Check if cluster exists and is running if az aks show --resource-group "$rg_name" --name "$cluster_name" --query "powerState.code" -o tsv 2>/dev/null | grep -q "Running"; then log_success "[$region] Cluster verified" return 0 else log_warn "[$region] Cluster not ready" return 1 fi } export -f verify_function export -f get_region_code source "$SCRIPT_DIR/../lib/init.sh" printf '%s\n' "${REGIONS[@]}" | xargs -P $PARALLELISM -I {} bash -c 'verify_function "$@"' _ {} log_success "Verification complete" } # Main execution case "$RESOURCE_TYPE" in infrastructure) deploy_infrastructure ;; kubernetes) deploy_kubernetes ;; besu) deploy_besu ;; monitoring) deploy_monitoring ;; contracts) deploy_contracts ;; verify) verify_deployment ;; *) log_error "Invalid resource type: $RESOURCE_TYPE" log_info "Valid types: infrastructure, kubernetes, besu, monitoring, contracts, verify" exit 1 ;; esac log_section "DEPLOYMENT COMPLETE" log_info "Resource Type: $RESOURCE_TYPE" log_info "Regions Processed: $REGION_COUNT" log_info "Parallelism: $PARALLELISM"