Files
eveAI/k8s/scripts/service-groups.sh
2025-08-18 11:44:23 +02:00

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