Files
smom-dbis-138/terraform/phases/phase1/scripts/upload-genesis-to-storage.sh
defiQUG 1fb7266469 Add Oracle Aggregator and CCIP Integration
- Introduced Aggregator.sol for Chainlink-compatible oracle functionality, including round-based updates and access control.
- Added OracleWithCCIP.sol to extend Aggregator with CCIP cross-chain messaging capabilities.
- Created .gitmodules to include OpenZeppelin contracts as a submodule.
- Developed a comprehensive deployment guide in NEXT_STEPS_COMPLETE_GUIDE.md for Phase 2 and smart contract deployment.
- Implemented Vite configuration for the orchestration portal, supporting both Vue and React frameworks.
- Added server-side logic for the Multi-Cloud Orchestration Portal, including API endpoints for environment management and monitoring.
- Created scripts for resource import and usage validation across non-US regions.
- Added tests for CCIP error handling and integration to ensure robust functionality.
- Included various new files and directories for the orchestration portal and deployment scripts.
2025-12-12 14:57:48 -08:00

216 lines
6.7 KiB
Bash
Executable File

#!/bin/bash
# Upload Genesis File to Azure Storage and Deploy to All Besu Nodes
# This script uploads the genesis file to Azure Storage and downloads it to all VMs
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PHASE1_DIR="$SCRIPT_DIR/../"
GENESIS_FILE="$PHASE1_DIR/config/genesis-138.json"
if [ ! -f "$GENESIS_FILE" ]; then
echo "Error: Genesis file not found: $GENESIS_FILE"
exit 1
fi
echo "=========================================="
echo "Upload Genesis File to Azure Storage"
echo "and Deploy to All Besu Nodes"
echo "=========================================="
echo ""
# Get storage account from Terraform output
cd "$PHASE1_DIR"
# Try to get backup storage account from first region, fallback to boot diagnostics
STORAGE_ACCOUNT=$(terraform output -json 2>/dev/null | jq -r '.storage_accounts.value.backups | to_entries[0].value.backup_storage // empty' || echo "")
if [ -z "$STORAGE_ACCOUNT" ]; then
# Fallback to boot diagnostics storage
STORAGE_ACCOUNT=$(terraform output -json 2>/dev/null | jq -r '.storage_accounts.value.boot_diagnostics | to_entries[0].value.name // empty' || echo "")
fi
if [ -z "$STORAGE_ACCOUNT" ]; then
echo "Error: Could not retrieve storage account from Terraform output"
echo "Please ensure Terraform has been applied and outputs are available"
exit 1
fi
echo "Storage Account: $STORAGE_ACCOUNT"
echo "Genesis File: $GENESIS_FILE"
echo ""
# Get storage account key
echo "Getting storage account key..."
STORAGE_KEY=$(az storage account keys list \
--account-name "$STORAGE_ACCOUNT" \
--resource-group az-p-cus-rg-comp-001 \
--query "[0].value" \
--output tsv 2>/dev/null || echo "")
if [ -z "$STORAGE_KEY" ]; then
echo "Error: Could not retrieve storage account key"
echo "Please ensure you have permissions to list storage account keys"
exit 1
fi
# Create container if it doesn't exist
echo "Creating container 'genesis' if it doesn't exist..."
az storage container create \
--name genesis \
--account-name "$STORAGE_ACCOUNT" \
--account-key "$STORAGE_KEY" \
--public-access off \
--output none 2>/dev/null || echo "Container may already exist"
# Upload genesis file
echo "Uploading genesis file..."
az storage blob upload \
--account-name "$STORAGE_ACCOUNT" \
--account-key "$STORAGE_KEY" \
--container-name genesis \
--name genesis-138.json \
--file "$GENESIS_FILE" \
--overwrite
echo ""
echo "=========================================="
echo "Upload Complete! Deploying to VMs..."
echo "=========================================="
echo ""
# Get all region configurations
REGIONS=("cus" "eus" "eus2" "wus" "wus2")
REGION_NAMES=("centralus" "eastus" "eastus2" "westus" "westus2")
# Generate SAS token for download
echo "Generating SAS token..."
SAS_TOKEN=$(az storage container generate-sas \
--name genesis \
--account-name "$STORAGE_ACCOUNT" \
--account-key "$STORAGE_KEY" \
--permissions r \
--expiry $(date -u -d "+1 hour" +%Y-%m-%dT%H:%MZ) \
--output tsv 2>/dev/null || echo "")
if [ -z "$SAS_TOKEN" ]; then
echo "Error: Could not generate SAS token. Cannot download to VMs."
echo "Please ensure you have permissions to generate SAS tokens."
exit 1
fi
BLOB_URL="https://${STORAGE_ACCOUNT}.blob.core.windows.net/genesis/genesis-138.json"
DOWNLOAD_URL="${BLOB_URL}?${SAS_TOKEN}"
echo "Download URL generated (valid for 1 hour)"
echo ""
# Deploy to all VMs
SUCCESS_COUNT=0
FAILED_REGIONS=()
for i in "${!REGIONS[@]}"; do
REGION="${REGIONS[$i]}"
REGION_NAME="${REGION_NAMES[$i]}"
RG="az-p-${REGION}-rg-comp-001"
echo "----------------------------------------"
echo "Deploying to ${REGION_NAME} (${REGION})..."
echo "----------------------------------------"
# Get VM name
VM=$(az vm list --resource-group "$RG" --query "[0].name" -o tsv 2>/dev/null || echo "")
if [ -z "$VM" ]; then
echo " ⚠️ VM not found in resource group: $RG"
FAILED_REGIONS+=("$REGION")
continue
fi
echo " VM: $VM"
# Download genesis file to VM
echo " Downloading genesis file..."
# Create script file and execute it
SCRIPT_CONTENT="curl -s -f '${DOWNLOAD_URL}' -o /tmp/genesis-138.json
if [ \$? -eq 0 ] && [ -f /tmp/genesis-138.json ]; then
FILE_SIZE=\$(wc -c < /tmp/genesis-138.json)
if [ \$FILE_SIZE -gt 1000 ]; then
sudo mv /tmp/genesis-138.json /opt/besu/config/genesis.json
sudo chmod 644 /opt/besu/config/genesis.json
sudo chown besuadmin:besuadmin /opt/besu/config/genesis.json
echo SUCCESS: Genesis file installed \$FILE_SIZE bytes
ls -lh /opt/besu/config/genesis.json
else
echo ERROR: File too small \$FILE_SIZE bytes
exit 1
fi
else
echo ERROR: Download failed
exit 1
fi"
# Base64 encode the script to avoid escaping issues
ENCODED_SCRIPT=$(echo "$SCRIPT_CONTENT" | base64 -w 0)
RESULT=$(az vm run-command invoke \
--resource-group "$RG" \
--name "$VM" \
--command-id RunShellScript \
--scripts "echo '${ENCODED_SCRIPT}' | base64 -d | bash" \
2>&1 | grep -E '(stdout|SUCCESS|ERROR|bytes|genesis|config)' | head -10 || echo "ERROR")
if echo "$RESULT" | grep -q "SUCCESS"; then
echo " ✅ Genesis file downloaded successfully"
# Restart Besu container
echo " Restarting Besu container..."
az vm run-command invoke \
--resource-group "$RG" \
--name "$VM" \
--command-id RunShellScript \
--scripts "cd /opt/besu && sudo docker compose restart besu" \
--output none 2>&1 | grep -v "Enable succeeded" || true
echo " ✅ Besu container restarted"
((SUCCESS_COUNT++))
else
echo " ❌ Failed to download genesis file"
echo " Result: $RESULT"
FAILED_REGIONS+=("$REGION")
fi
echo ""
done
echo "=========================================="
echo "Deployment Summary"
echo "=========================================="
echo "Successfully deployed: $SUCCESS_COUNT/${#REGIONS[@]} regions"
echo ""
if [ ${#FAILED_REGIONS[@]} -gt 0 ]; then
echo "Failed regions:"
for REGION in "${FAILED_REGIONS[@]}"; do
echo " - $REGION"
done
echo ""
fi
if [ $SUCCESS_COUNT -eq ${#REGIONS[@]} ]; then
echo "✅ All genesis files deployed successfully!"
echo ""
echo "Waiting 30 seconds for Besu containers to start..."
sleep 30
echo ""
echo "You can now test RPC endpoints:"
echo " curl -X POST https://rpc.d-bis.org \\"
echo " -H 'Content-Type: application/json' \\"
echo " --data '{\"jsonrpc\":\"2.0\",\"method\":\"eth_chainId\",\"params\":[],\"id\":1}'"
echo ""
else
echo "⚠️ Some deployments failed. Please check the errors above."
exit 1
fi