253 lines
7.9 KiB
Bash
253 lines
7.9 KiB
Bash
#!/bin/bash
|
|
# Kubernetes Service Group Definitions
|
|
# File: service-groups.sh
|
|
|
|
# Service group definitions
|
|
declare -A SERVICE_GROUPS
|
|
|
|
# Infrastructure services (Redis, MinIO)
|
|
SERVICE_GROUPS[infrastructure]="redis minio"
|
|
|
|
# Application services (all EveAI apps)
|
|
SERVICE_GROUPS[apps]="eveai-app eveai-api eveai-chat-client eveai-workers eveai-chat-workers eveai-beat eveai-entitlements"
|
|
|
|
# Static files and ingress
|
|
SERVICE_GROUPS[static]="static-files eveai-ingress"
|
|
|
|
# Monitoring services
|
|
SERVICE_GROUPS[monitoring]="prometheus grafana flower"
|
|
|
|
# All services combined
|
|
SERVICE_GROUPS[all]="redis minio eveai-app eveai-api eveai-chat-client eveai-workers eveai-chat-workers eveai-beat eveai-entitlements static-files eveai-ingress prometheus grafana flower"
|
|
|
|
# Service to YAML file mapping
|
|
declare -A SERVICE_YAML_FILES
|
|
|
|
# Infrastructure services
|
|
SERVICE_YAML_FILES[redis]="redis-minio-services.yaml"
|
|
SERVICE_YAML_FILES[minio]="redis-minio-services.yaml"
|
|
|
|
# Application services
|
|
SERVICE_YAML_FILES[eveai-app]="eveai-services.yaml"
|
|
SERVICE_YAML_FILES[eveai-api]="eveai-services.yaml"
|
|
SERVICE_YAML_FILES[eveai-chat-client]="eveai-services.yaml"
|
|
SERVICE_YAML_FILES[eveai-workers]="eveai-services.yaml"
|
|
SERVICE_YAML_FILES[eveai-chat-workers]="eveai-services.yaml"
|
|
SERVICE_YAML_FILES[eveai-beat]="eveai-services.yaml"
|
|
SERVICE_YAML_FILES[eveai-entitlements]="eveai-services.yaml"
|
|
|
|
# Static and ingress services
|
|
SERVICE_YAML_FILES[static-files]="static-files-service.yaml"
|
|
SERVICE_YAML_FILES[eveai-ingress]="eveai-ingress.yaml"
|
|
|
|
# Monitoring services
|
|
SERVICE_YAML_FILES[prometheus]="monitoring-services.yaml"
|
|
SERVICE_YAML_FILES[grafana]="monitoring-services.yaml"
|
|
SERVICE_YAML_FILES[flower]="monitoring-services.yaml"
|
|
|
|
# Service deployment order (for dependencies)
|
|
declare -A SERVICE_DEPLOY_ORDER
|
|
|
|
# Infrastructure first (order 1)
|
|
SERVICE_DEPLOY_ORDER[redis]=1
|
|
SERVICE_DEPLOY_ORDER[minio]=1
|
|
|
|
# Core apps next (order 2)
|
|
SERVICE_DEPLOY_ORDER[eveai-app]=2
|
|
SERVICE_DEPLOY_ORDER[eveai-api]=2
|
|
SERVICE_DEPLOY_ORDER[eveai-chat-client]=2
|
|
SERVICE_DEPLOY_ORDER[eveai-entitlements]=2
|
|
|
|
# Workers after core apps (order 3)
|
|
SERVICE_DEPLOY_ORDER[eveai-workers]=3
|
|
SERVICE_DEPLOY_ORDER[eveai-chat-workers]=3
|
|
SERVICE_DEPLOY_ORDER[eveai-beat]=3
|
|
|
|
# Static files and ingress (order 4)
|
|
SERVICE_DEPLOY_ORDER[static-files]=4
|
|
SERVICE_DEPLOY_ORDER[eveai-ingress]=4
|
|
|
|
# Monitoring last (order 5)
|
|
SERVICE_DEPLOY_ORDER[prometheus]=5
|
|
SERVICE_DEPLOY_ORDER[grafana]=5
|
|
SERVICE_DEPLOY_ORDER[flower]=5
|
|
|
|
# Service health check endpoints
|
|
declare -A SERVICE_HEALTH_ENDPOINTS
|
|
|
|
SERVICE_HEALTH_ENDPOINTS[eveai-app]="/healthz/ready:5001"
|
|
SERVICE_HEALTH_ENDPOINTS[eveai-api]="/healthz/ready:5003"
|
|
SERVICE_HEALTH_ENDPOINTS[eveai-chat-client]="/healthz/ready:5004"
|
|
SERVICE_HEALTH_ENDPOINTS[redis]="ping"
|
|
SERVICE_HEALTH_ENDPOINTS[minio]="ready"
|
|
|
|
# Get services in a group
|
|
get_services_in_group() {
|
|
local group=$1
|
|
if [[ -n "${SERVICE_GROUPS[$group]}" ]]; then
|
|
echo "${SERVICE_GROUPS[$group]}"
|
|
else
|
|
log_operation "ERROR" "Unknown service group: $group"
|
|
local available_groups=("${!SERVICE_GROUPS[@]}")
|
|
echo "Available groups: ${available_groups[*]}"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Get YAML file for a service
|
|
get_yaml_file_for_service() {
|
|
local service=$1
|
|
if [[ -n "${SERVICE_YAML_FILES[$service]}" ]]; then
|
|
echo "${SERVICE_YAML_FILES[$service]}"
|
|
else
|
|
log_operation "ERROR" "No YAML file defined for service: $service"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Get deployment order for a service
|
|
get_service_deploy_order() {
|
|
local service=$1
|
|
echo "${SERVICE_DEPLOY_ORDER[$service]:-999}"
|
|
}
|
|
|
|
# Get health check endpoint for a service
|
|
get_service_health_endpoint() {
|
|
local service=$1
|
|
echo "${SERVICE_HEALTH_ENDPOINTS[$service]:-}"
|
|
}
|
|
|
|
# Sort services by deployment order
|
|
sort_services_by_deploy_order() {
|
|
local services=("$@")
|
|
local sorted_services=()
|
|
|
|
# Create array of service:order pairs
|
|
local service_orders=()
|
|
for service in "${services[@]}"; do
|
|
local order=$(get_service_deploy_order "$service")
|
|
service_orders+=("$order:$service")
|
|
done
|
|
|
|
# Sort by order and extract service names
|
|
IFS=$'\n' sorted_services=($(printf '%s\n' "${service_orders[@]}" | sort -n | cut -d: -f2))
|
|
echo "${sorted_services[@]}"
|
|
}
|
|
|
|
# Get services that should be deployed before a given service
|
|
get_service_dependencies() {
|
|
local target_service=$1
|
|
local target_order=$(get_service_deploy_order "$target_service")
|
|
local dependencies=()
|
|
|
|
# Find all services with lower deployment order
|
|
for service in "${!SERVICE_DEPLOY_ORDER[@]}"; do
|
|
local service_order="${SERVICE_DEPLOY_ORDER[$service]}"
|
|
if [[ "$service_order" -lt "$target_order" ]]; then
|
|
dependencies+=("$service")
|
|
fi
|
|
done
|
|
|
|
echo "${dependencies[@]}"
|
|
}
|
|
|
|
# Check if a service belongs to a group
|
|
is_service_in_group() {
|
|
local service=$1
|
|
local group=$2
|
|
local group_services="${SERVICE_GROUPS[$group]}"
|
|
|
|
if [[ " $group_services " =~ " $service " ]]; then
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Get all unique YAML files for a group
|
|
get_yaml_files_for_group() {
|
|
local group=$1
|
|
local services
|
|
services=$(get_services_in_group "$group")
|
|
|
|
if [[ $? -ne 0 ]]; then
|
|
return 1
|
|
fi
|
|
|
|
local yaml_files=()
|
|
local unique_files=()
|
|
|
|
for service in $services; do
|
|
local yaml_file=$(get_yaml_file_for_service "$service")
|
|
if [[ -n "$yaml_file" ]]; then
|
|
yaml_files+=("$yaml_file")
|
|
fi
|
|
done
|
|
|
|
# Remove duplicates
|
|
IFS=$'\n' unique_files=($(printf '%s\n' "${yaml_files[@]}" | sort -u))
|
|
echo "${unique_files[@]}"
|
|
}
|
|
|
|
# Display service group information
|
|
show_service_groups() {
|
|
echo "📋 Available Service Groups:"
|
|
echo "============================"
|
|
|
|
for group in "${!SERVICE_GROUPS[@]}"; do
|
|
echo ""
|
|
echo "🔹 $group:"
|
|
local services="${SERVICE_GROUPS[$group]}"
|
|
for service in $services; do
|
|
local order=$(get_service_deploy_order "$service")
|
|
local yaml_file=$(get_yaml_file_for_service "$service")
|
|
echo " • $service (order: $order, file: $yaml_file)"
|
|
done
|
|
done
|
|
}
|
|
|
|
# Validate service group configuration
|
|
validate_service_groups() {
|
|
local errors=0
|
|
|
|
echo "🔍 Validating service group configuration..."
|
|
|
|
# Check if all services have YAML files defined
|
|
for group in "${!SERVICE_GROUPS[@]}"; do
|
|
local services="${SERVICE_GROUPS[$group]}"
|
|
for service in $services; do
|
|
if [[ -z "${SERVICE_YAML_FILES[$service]}" ]]; then
|
|
log_operation "ERROR" "Service '$service' in group '$group' has no YAML file defined"
|
|
((errors++))
|
|
fi
|
|
done
|
|
done
|
|
|
|
# Check if YAML files exist
|
|
if [[ -n "$K8S_CONFIG_DIR" ]]; then
|
|
for yaml_file in "${SERVICE_YAML_FILES[@]}"; do
|
|
if [[ ! -f "$K8S_CONFIG_DIR/$yaml_file" ]]; then
|
|
log_operation "WARNING" "YAML file '$yaml_file' not found in $K8S_CONFIG_DIR"
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [[ $errors -eq 0 ]]; then
|
|
log_operation "SUCCESS" "Service group configuration is valid"
|
|
return 0
|
|
else
|
|
log_operation "ERROR" "Found $errors configuration errors"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Export functions for use in other scripts
|
|
if [[ -n "$ZSH_VERSION" ]]; then
|
|
typeset -f get_services_in_group get_yaml_file_for_service get_service_deploy_order > /dev/null
|
|
typeset -f get_service_health_endpoint sort_services_by_deploy_order get_service_dependencies > /dev/null
|
|
typeset -f is_service_in_group get_yaml_files_for_group show_service_groups validate_service_groups > /dev/null
|
|
else
|
|
export -f get_services_in_group get_yaml_file_for_service get_service_deploy_order
|
|
export -f get_service_health_endpoint sort_services_by_deploy_order get_service_dependencies
|
|
export -f is_service_in_group get_yaml_files_for_group show_service_groups validate_service_groups
|
|
fi |