205 lines
5.5 KiB
Bash
205 lines
5.5 KiB
Bash
#!/bin/bash
|
|
# Docker utility functions shared across helper scripts
|
|
|
|
# Color codes
|
|
export RED='\033[0;31m'
|
|
export GREEN='\033[0;32m'
|
|
export YELLOW='\033[1;33m'
|
|
export BLUE='\033[0;34m'
|
|
export NC='\033[0m' # No Color
|
|
|
|
# Check if Docker is running
|
|
check_docker_running() {
|
|
if ! docker info > /dev/null 2>&1; then
|
|
echo -e "${RED}Error: Docker is not running${NC}"
|
|
echo "Please start Docker Desktop or Docker Engine"
|
|
return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
# Check if a container exists
|
|
container_exists() {
|
|
local container_name=$1
|
|
docker ps -a --format '{{.Names}}' | grep -q "^${container_name}$"
|
|
}
|
|
|
|
# Check if a container is running
|
|
container_running() {
|
|
local container_name=$1
|
|
docker ps --format '{{.Names}}' | grep -q "^${container_name}$"
|
|
}
|
|
|
|
# Pull Docker image with retry logic
|
|
pull_image() {
|
|
local image=$1
|
|
local max_retries=3
|
|
local retry_count=0
|
|
|
|
echo -e "${BLUE}Pulling image: $image${NC}"
|
|
|
|
while [ $retry_count -lt $max_retries ]; do
|
|
if docker pull "$image"; then
|
|
echo -e "${GREEN}✓ Successfully pulled $image${NC}"
|
|
return 0
|
|
fi
|
|
|
|
retry_count=$((retry_count + 1))
|
|
if [ $retry_count -lt $max_retries ]; then
|
|
echo -e "${YELLOW}Retry $retry_count/$max_retries...${NC}"
|
|
sleep 2
|
|
fi
|
|
done
|
|
|
|
echo -e "${RED}✗ Failed to pull $image after $max_retries attempts${NC}"
|
|
return 1
|
|
}
|
|
|
|
# Load authentication token from secret file
|
|
load_auth_token() {
|
|
local product=$1
|
|
local token_var_name=$2
|
|
|
|
local secret_file="$HOME/.env.influxdb3-${product}-admin-token"
|
|
|
|
if [ -f "$secret_file" ] && [ -s "$secret_file" ]; then
|
|
local token=$(cat "$secret_file")
|
|
eval "export $token_var_name='$token'"
|
|
return 0
|
|
else
|
|
echo -e "${YELLOW}Warning: No token found in $secret_file${NC}"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Start container if not running
|
|
ensure_container_running() {
|
|
local container_name=$1
|
|
local service_name=${2:-$container_name}
|
|
|
|
if ! container_running "$container_name"; then
|
|
echo -e "${YELLOW}Starting $container_name...${NC}"
|
|
|
|
if docker compose up -d "$service_name"; then
|
|
# Wait for container to be ready
|
|
local max_wait=30
|
|
local waited=0
|
|
|
|
while [ $waited -lt $max_wait ]; do
|
|
if container_running "$container_name"; then
|
|
echo -e "${GREEN}✓ $container_name is running${NC}"
|
|
return 0
|
|
fi
|
|
sleep 1
|
|
waited=$((waited + 1))
|
|
done
|
|
|
|
echo -e "${RED}✗ Timeout waiting for $container_name to start${NC}"
|
|
return 1
|
|
else
|
|
echo -e "${RED}✗ Failed to start $container_name${NC}"
|
|
return 1
|
|
fi
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
# Execute command in container
|
|
exec_in_container() {
|
|
local container_name=$1
|
|
shift
|
|
local command="$@"
|
|
|
|
if ! container_running "$container_name"; then
|
|
echo -e "${RED}Error: Container $container_name is not running${NC}"
|
|
return 1
|
|
fi
|
|
|
|
docker exec "$container_name" $command
|
|
}
|
|
|
|
# Get container health status
|
|
container_health() {
|
|
local container_name=$1
|
|
|
|
if ! container_exists "$container_name"; then
|
|
echo "not_found"
|
|
return
|
|
fi
|
|
|
|
local status=$(docker inspect --format='{{.State.Status}}' "$container_name" 2>/dev/null)
|
|
echo "${status:-unknown}"
|
|
}
|
|
|
|
# Wait for container to be healthy
|
|
wait_for_healthy() {
|
|
local container_name=$1
|
|
local timeout=${2:-60}
|
|
|
|
echo -e "${BLUE}Waiting for $container_name to be healthy...${NC}"
|
|
|
|
local elapsed=0
|
|
while [ $elapsed -lt $timeout ]; do
|
|
local health=$(docker inspect --format='{{.State.Health.Status}}' "$container_name" 2>/dev/null || echo "no_health_check")
|
|
|
|
if [ "$health" = "healthy" ] || [ "$health" = "no_health_check" ]; then
|
|
echo -e "${GREEN}✓ $container_name is ready${NC}"
|
|
return 0
|
|
fi
|
|
|
|
sleep 2
|
|
elapsed=$((elapsed + 2))
|
|
echo -n "."
|
|
done
|
|
|
|
echo -e "\n${RED}✗ Timeout waiting for $container_name to be healthy${NC}"
|
|
return 1
|
|
}
|
|
|
|
# Validate Docker image tag format
|
|
validate_image_tag() {
|
|
local product=$1
|
|
local version=$2
|
|
|
|
# Check version format
|
|
if [[ ! "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] && [ "$version" != "local" ]; then
|
|
echo -e "${RED}Error: Invalid version format: $version${NC}"
|
|
echo "Expected format: X.Y.Z (e.g., 3.2.0) or 'local'"
|
|
return 1
|
|
fi
|
|
|
|
# Check product name
|
|
case "$product" in
|
|
core|enterprise|clustered|cloud-dedicated)
|
|
return 0
|
|
;;
|
|
*)
|
|
echo -e "${RED}Error: Invalid product: $product${NC}"
|
|
echo "Valid products: core, enterprise, clustered, cloud-dedicated"
|
|
return 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Get the correct Docker image name for a product
|
|
get_docker_image() {
|
|
local product=$1
|
|
local version=$2
|
|
|
|
case "$product" in
|
|
core|enterprise)
|
|
echo "influxdb:${version}-${product}"
|
|
;;
|
|
clustered)
|
|
echo "us-docker.pkg.dev/influxdb2-artifacts/clustered/influxdb:${version}"
|
|
;;
|
|
cloud-dedicated)
|
|
# Cloud Dedicated typically uses the same image as clustered
|
|
echo "us-docker.pkg.dev/influxdb2-artifacts/clustered/influxdb:${version}"
|
|
;;
|
|
*)
|
|
return 1
|
|
;;
|
|
esac
|
|
} |