Files
proxmox/smom-dbis-138-proxmox/lib/parallel-deploy.sh

108 lines
3.1 KiB
Bash
Executable File

#!/usr/bin/env bash
# Parallel deployment utilities
# Provides functions for parallel container deployment
# Deploy containers in parallel (with limit)
# Usage: parallel_deploy_containers "function_name" "array_of_args" max_parallel
parallel_deploy_containers() {
local deploy_func="$1"
local -n args_array="$2" # Name reference to array
local max_parallel="${3:-3}"
local pids=()
local results=()
local failed=0
log_info "Deploying ${#args_array[@]} containers with max $max_parallel parallel..."
local i=0
while [[ $i -lt ${#args_array[@]} ]]; do
# Wait for slot if we've reached max parallel
while [[ ${#pids[@]} -ge $max_parallel ]]; do
for pid_idx in "${!pids[@]}"; do
local pid="${pids[$pid_idx]}"
if ! kill -0 "$pid" 2>/dev/null; then
# Process finished, wait for it and check result
wait "$pid"
local exit_code=$?
if [[ $exit_code -ne 0 ]]; then
log_error "Deployment failed with exit code $exit_code"
failed=$((failed + 1))
fi
unset pids[$pid_idx]
fi
done
# Rebuild array to remove gaps
pids=("${pids[@]}")
sleep 0.5
done
# Start new deployment
local args="${args_array[$i]}"
log_info "Starting deployment $((i + 1))/${#args_array[@]}: $args"
# Call deploy function in background
$deploy_func $args &
local pid=$!
pids+=("$pid")
i=$((i + 1))
done
# Wait for all remaining processes
for pid in "${pids[@]}"; do
wait "$pid"
local exit_code=$?
if [[ $exit_code -ne 0 ]]; then
log_error "Deployment failed with exit code $exit_code"
failed=$((failed + 1))
fi
done
if [[ $failed -gt 0 ]]; then
log_error "$failed deployment(s) failed"
return 1
fi
log_success "All ${#args_array[@]} deployments completed successfully"
return 0
}
# Check if parallel deployment is enabled
is_parallel_enabled() {
[[ "${PARALLEL_DEPLOY:-false}" == "true" ]] && [[ "${MAX_PARALLEL:-0}" -gt 0 ]]
}
# Get max parallel deployments (default: 3)
get_max_parallel() {
echo "${MAX_PARALLEL:-3}"
}
# Get max parallel for specific operation type
get_max_parallel_for_op() {
local op_type="$1"
case "$op_type" in
create)
echo "${MAX_PARALLEL_CREATE:-${MAX_PARALLEL:-10}}"
;;
packages|package)
echo "${MAX_PARALLEL_PACKAGES:-8}"
;;
start)
echo "${MAX_PARALLEL_START:-15}"
;;
template)
echo "${MAX_PARALLEL_TEMPLATE:-15}"
;;
ccip)
echo "${MAX_PARALLEL_CCIP:-8}"
;;
besu)
echo "${MAX_PARALLEL_BESU:-12}"
;;
*)
echo "${MAX_PARALLEL:-10}"
;;
esac
}