Files
eveAI/k8s/k8s_env_switch.sh
Josako 4c00d33bc3 - Check-in voordat we aan bugfix beginnen te werken.
- Introductie van static-files serving met standaard nginx (niet ons docker nginx image), en een rsync service om static files te synchroniseren. Nog niet volledig afgewerkt!
2025-08-21 05:48:03 +02:00

517 lines
16 KiB
Bash

#!/usr/bin/env zsh
# Function to display usage information
usage() {
echo "Usage: source $0 <environment> [version]"
echo " environment: The environment to use (dev, test, bugfix, integration, prod)"
echo " version : (Optional) Specific release version to deploy"
echo " If not specified, uses 'latest' (except for dev environment)"
}
# Check if the script is sourced - improved for both bash and zsh
is_sourced() {
if [[ -n "$ZSH_VERSION" ]]; then
# In zsh, check if we're in a sourced context
[[ "$ZSH_EVAL_CONTEXT" =~ "(:file|:cmdsubst)" ]] || [[ "$0" != "$ZSH_ARGZERO" ]]
else
# In bash, compare BASH_SOURCE with $0
[[ "${BASH_SOURCE[0]}" != "${0}" ]]
fi
}
if ! is_sourced; then
echo "Error: This script must be sourced, not executed directly."
echo "Please run: source $0 <environment> [version]"
if [[ -n "$ZSH_VERSION" ]]; then
return 1 2>/dev/null || exit 1
else
exit 1
fi
fi
# Check if an environment is provided
if [ $# -eq 0 ]; then
usage
return 1
fi
ENVIRONMENT=$1
VERSION=${2:-latest} # Default to latest if not specified
# Check if required tools are available
if ! command -v kubectl &> /dev/null; then
echo "Error: kubectl is not installed or not in PATH"
echo "Please install kubectl first"
return 1
fi
if ! command -v kind &> /dev/null; then
echo "Error: kind is not installed or not in PATH"
echo "Please install kind first"
return 1
fi
echo "Using kubectl: $(command -v kubectl)"
echo "Using kind: $(command -v kind)"
# Set variables based on the environment
case $ENVIRONMENT in
dev)
K8S_CLUSTER="kind-eveai-dev-cluster"
K8S_NAMESPACE="eveai-dev"
K8S_CONFIG_DIR="$PWD/k8s/dev"
VERSION="latest" # Always use latest for dev
;;
test)
K8S_CLUSTER="kind-eveai-test-cluster"
K8S_NAMESPACE="eveai-test"
K8S_CONFIG_DIR="$PWD/k8s/test"
;;
bugfix)
K8S_CLUSTER="kind-eveai-bugfix-cluster"
K8S_NAMESPACE="eveai-bugfix"
K8S_CONFIG_DIR="$PWD/k8s/bugfix"
;;
integration)
K8S_CLUSTER="kind-eveai-integration-cluster"
K8S_NAMESPACE="eveai-integration"
K8S_CONFIG_DIR="$PWD/k8s/integration"
;;
prod)
K8S_CLUSTER="kind-eveai-prod-cluster"
K8S_NAMESPACE="eveai-prod"
K8S_CONFIG_DIR="$PWD/k8s/prod"
;;
*)
echo "Invalid environment: $ENVIRONMENT"
usage
return 1
;;
esac
# Set up logging directories
LOG_DIR="$HOME/k8s-logs/$ENVIRONMENT"
mkdir -p "$LOG_DIR"
# Check if config directory exists
if [[ ! -d "$K8S_CONFIG_DIR" ]]; then
echo "Warning: Config directory '$K8S_CONFIG_DIR' does not exist."
if [[ "$ENVIRONMENT" != "dev" && -d "$PWD/k8s/dev" ]]; then
echo -n "Do you want to create it based on dev environment? (y/n): "
read -r CREATE_DIR
if [[ "$CREATE_DIR" == "y" || "$CREATE_DIR" == "Y" ]]; then
mkdir -p "$K8S_CONFIG_DIR"
cp -r "$PWD/k8s/dev/"* "$K8S_CONFIG_DIR/"
echo "Created $K8S_CONFIG_DIR with dev environment templates."
echo "Please review and modify the configurations for $ENVIRONMENT environment."
else
echo "Cannot proceed without a valid config directory."
return 1
fi
else
echo "Cannot create $K8S_CONFIG_DIR: dev environment not found."
return 1
fi
fi
# Set cluster context
echo "Setting kubectl context to $K8S_CLUSTER..."
if kubectl config use-context "$K8S_CLUSTER" &>/dev/null; then
echo "✅ Using cluster context: $K8S_CLUSTER"
else
echo "⚠️ Warning: Failed to switch to context $K8S_CLUSTER"
echo " Make sure the cluster is running: kind get clusters"
fi
# Set environment variables
export K8S_ENVIRONMENT=$ENVIRONMENT
export K8S_VERSION=$VERSION
export K8S_CLUSTER=$K8S_CLUSTER
export K8S_NAMESPACE=$K8S_NAMESPACE
export K8S_CONFIG_DIR=$K8S_CONFIG_DIR
export K8S_LOG_DIR=$LOG_DIR
echo "Set K8S_ENVIRONMENT to $ENVIRONMENT"
echo "Set K8S_VERSION to $VERSION"
echo "Set K8S_CLUSTER to $K8S_CLUSTER"
echo "Set K8S_NAMESPACE to $K8S_NAMESPACE"
echo "Set K8S_CONFIG_DIR to $K8S_CONFIG_DIR"
echo "Set K8S_LOG_DIR to $LOG_DIR"
# Source supporting scripts
SCRIPT_DIR="$(dirname "${BASH_SOURCE[0]:-$0}")"
if [[ -f "$SCRIPT_DIR/scripts/k8s-functions.sh" ]]; then
source "$SCRIPT_DIR/scripts/k8s-functions.sh"
else
echo "Warning: k8s-functions.sh not found, some functions may not work"
fi
if [[ -f "$SCRIPT_DIR/scripts/service-groups.sh" ]]; then
source "$SCRIPT_DIR/scripts/service-groups.sh"
else
echo "Warning: service-groups.sh not found, service groups may not be defined"
fi
if [[ -f "$SCRIPT_DIR/scripts/dependency-checks.sh" ]]; then
source "$SCRIPT_DIR/scripts/dependency-checks.sh"
else
echo "Warning: dependency-checks.sh not found, dependency checking disabled"
fi
if [[ -f "$SCRIPT_DIR/scripts/logging-utils.sh" ]]; then
source "$SCRIPT_DIR/scripts/logging-utils.sh"
else
echo "Warning: logging-utils.sh not found, logging may be limited"
fi
# Core service management functions (similar to pc* functions)
kup() {
local group=${1:-all}
log_operation "INFO" "Starting service group: $group"
deploy_service_group "$group"
}
kdown() {
local group=${1:-all}
log_operation "INFO" "Stopping service group: $group (keeping data)"
stop_service_group "$group" --keep-data
}
kstop() {
local group=${1:-all}
log_operation "INFO" "Stopping service group: $group (without removal)"
stop_service_group "$group" --stop-only
}
kstart() {
local group=${1:-all}
log_operation "INFO" "Starting stopped service group: $group"
start_service_group "$group"
}
kps() {
echo "🔍 Service Status Overview for $K8S_ENVIRONMENT:"
echo "=================================================="
kubectl get pods,services,ingress -n "$K8S_NAMESPACE" 2>/dev/null || echo "Namespace $K8S_NAMESPACE not found or no resources"
}
klogs() {
local service=$1
if [[ -z "$service" ]]; then
echo "Available services in $K8S_ENVIRONMENT:"
kubectl get deployments -n "$K8S_NAMESPACE" --no-headers 2>/dev/null | awk '{print " " $1}' || echo " No deployments found"
return 1
fi
log_operation "INFO" "Viewing logs for service: $service"
kubectl logs -f deployment/$service -n "$K8S_NAMESPACE"
}
krefresh() {
local group=${1:-all}
log_operation "INFO" "Refreshing service group: $group"
stop_service_group "$group" --stop-only
sleep 5
deploy_service_group "$group"
}
# Structured deployment of all services (like deploy-all-services.sh)
kup-all-structured() {
log_operation "INFO" "Starting structured deployment of all services"
deploy_all_structured
}
# Test connectivity to all services
ktest() {
log_operation "INFO" "Testing service connectivity"
test_connectivity_ingress
}
# Show connection information
kinfo() {
log_operation "INFO" "Showing connection information"
show_connection_info
}
# Individual service management functions for apps group
kup-app() {
log_operation "INFO" "Starting eveai-app"
check_infrastructure_ready
deploy_individual_service "eveai-app" "apps"
}
kdown-app() {
log_operation "INFO" "Stopping eveai-app"
stop_individual_service "eveai-app" --keep-data
}
kstop-app() {
log_operation "INFO" "Stopping eveai-app (without removal)"
stop_individual_service "eveai-app" --stop-only
}
kstart-app() {
log_operation "INFO" "Starting stopped eveai-app"
start_individual_service "eveai-app"
}
kup-api() {
log_operation "INFO" "Starting eveai-api"
check_infrastructure_ready
deploy_individual_service "eveai-api" "apps"
}
kdown-api() {
log_operation "INFO" "Stopping eveai-api"
stop_individual_service "eveai-api" --keep-data
}
kstop-api() {
log_operation "INFO" "Stopping eveai-api (without removal)"
stop_individual_service "eveai-api" --stop-only
}
kstart-api() {
log_operation "INFO" "Starting stopped eveai-api"
start_individual_service "eveai-api"
}
kup-chat-client() {
log_operation "INFO" "Starting eveai-chat-client"
check_infrastructure_ready
deploy_individual_service "eveai-chat-client" "apps"
}
kdown-chat-client() {
log_operation "INFO" "Stopping eveai-chat-client"
stop_individual_service "eveai-chat-client" --keep-data
}
kstop-chat-client() {
log_operation "INFO" "Stopping eveai-chat-client (without removal)"
stop_individual_service "eveai-chat-client" --stop-only
}
kstart-chat-client() {
log_operation "INFO" "Starting stopped eveai-chat-client"
start_individual_service "eveai-chat-client"
}
kup-workers() {
log_operation "INFO" "Starting eveai-workers"
check_app_dependencies "eveai-workers"
deploy_individual_service "eveai-workers" "apps"
}
kdown-workers() {
log_operation "INFO" "Stopping eveai-workers"
stop_individual_service "eveai-workers" --keep-data
}
kstop-workers() {
log_operation "INFO" "Stopping eveai-workers (without removal)"
stop_individual_service "eveai-workers" --stop-only
}
kstart-workers() {
log_operation "INFO" "Starting stopped eveai-workers"
start_individual_service "eveai-workers"
}
kup-chat-workers() {
log_operation "INFO" "Starting eveai-chat-workers"
check_app_dependencies "eveai-chat-workers"
deploy_individual_service "eveai-chat-workers" "apps"
}
kdown-chat-workers() {
log_operation "INFO" "Stopping eveai-chat-workers"
stop_individual_service "eveai-chat-workers" --keep-data
}
kstop-chat-workers() {
log_operation "INFO" "Stopping eveai-chat-workers (without removal)"
stop_individual_service "eveai-chat-workers" --stop-only
}
kstart-chat-workers() {
log_operation "INFO" "Starting stopped eveai-chat-workers"
start_individual_service "eveai-chat-workers"
}
kup-beat() {
log_operation "INFO" "Starting eveai-beat"
check_app_dependencies "eveai-beat"
deploy_individual_service "eveai-beat" "apps"
}
kdown-beat() {
log_operation "INFO" "Stopping eveai-beat"
stop_individual_service "eveai-beat" --keep-data
}
kstop-beat() {
log_operation "INFO" "Stopping eveai-beat (without removal)"
stop_individual_service "eveai-beat" --stop-only
}
kstart-beat() {
log_operation "INFO" "Starting stopped eveai-beat"
start_individual_service "eveai-beat"
}
kup-entitlements() {
log_operation "INFO" "Starting eveai-entitlements"
check_infrastructure_ready
deploy_individual_service "eveai-entitlements" "apps"
}
kdown-entitlements() {
log_operation "INFO" "Stopping eveai-entitlements"
stop_individual_service "eveai-entitlements" --keep-data
}
kstop-entitlements() {
log_operation "INFO" "Stopping eveai-entitlements (without removal)"
stop_individual_service "eveai-entitlements" --stop-only
}
kstart-entitlements() {
log_operation "INFO" "Starting stopped eveai-entitlements"
start_individual_service "eveai-entitlements"
}
# Static files management functions
kdeploy-static() {
local dry_run=""
if [[ "$1" == "--dry-run" ]]; then
dry_run="--dry-run"
fi
echo "🚀 Deploying static files to $K8S_ENVIRONMENT environment..."
"$K8S_CONFIG_DIR/../deploy-static-files.sh" "$K8S_ENVIRONMENT" "$dry_run"
}
kstatic-status() {
echo "📊 Static Files Status for $K8S_ENVIRONMENT:"
echo "============================================="
kubectl get pvc static-files-pvc -n "$K8S_NAMESPACE" 2>/dev/null || echo "PVC not found"
kubectl get pods -l app=static-files -n "$K8S_NAMESPACE" 2>/dev/null || echo "No static-files pods found"
echo ""
echo "💾 PVC Usage:"
kubectl describe pvc static-files-pvc -n "$K8S_NAMESPACE" 2>/dev/null | grep -E "(Capacity|Used)" || echo "Usage info not available"
}
# Cluster management functions
cluster-start() {
log_operation "INFO" "Starting cluster: $K8S_CLUSTER"
if kind get clusters | grep -q "${K8S_CLUSTER#kind-}"; then
echo "✅ Cluster $K8S_CLUSTER is already running"
else
echo "❌ Cluster $K8S_CLUSTER is not running"
echo "Use setup script to create cluster: $K8S_CONFIG_DIR/setup-${ENVIRONMENT}-cluster.sh"
fi
}
cluster-stop() {
log_operation "INFO" "Stopping cluster: $K8S_CLUSTER"
echo "⚠️ Note: Kind clusters cannot be stopped, only deleted"
echo "Use 'cluster-delete' to remove the cluster completely"
}
cluster-delete() {
log_operation "INFO" "Deleting cluster: $K8S_CLUSTER"
echo -n "Are you sure you want to delete cluster $K8S_CLUSTER? (y/n): "
read -r CONFIRM
if [[ "$CONFIRM" == "y" || "$CONFIRM" == "Y" ]]; then
kind delete cluster --name "${K8S_CLUSTER#kind-}"
echo "✅ Cluster $K8S_CLUSTER deleted"
else
echo "❌ Cluster deletion cancelled"
fi
}
cluster-status() {
echo "🔍 Cluster Status for $K8S_ENVIRONMENT:"
echo "======================================"
echo "Cluster: $K8S_CLUSTER"
echo "Namespace: $K8S_NAMESPACE"
echo ""
if kind get clusters | grep -q "${K8S_CLUSTER#kind-}"; then
echo "✅ Cluster is running"
echo ""
echo "Nodes:"
kubectl get nodes 2>/dev/null || echo " Unable to get nodes"
echo ""
echo "Namespaces:"
kubectl get namespaces 2>/dev/null || echo " Unable to get namespaces"
else
echo "❌ Cluster is not running"
fi
}
# Export functions - handle both bash and zsh
if [[ -n "$ZSH_VERSION" ]]; then
# In zsh, functions are automatically available in subshells
# But we can make them available globally with typeset
typeset -f kup kdown kstop kstart kps klogs krefresh > /dev/null
typeset -f kup-all-structured ktest kinfo > /dev/null
typeset -f kup-app kdown-app kstop-app kstart-app > /dev/null
typeset -f kup-api kdown-api kstop-api kstart-api > /dev/null
typeset -f kup-chat-client kdown-chat-client kstop-chat-client kstart-chat-client > /dev/null
typeset -f kup-workers kdown-workers kstop-workers kstart-workers > /dev/null
typeset -f kup-chat-workers kdown-chat-workers kstop-chat-workers kstart-chat-workers > /dev/null
typeset -f kup-beat kdown-beat kstop-beat kstart-beat > /dev/null
typeset -f kup-entitlements kdown-entitlements kstop-entitlements kstart-entitlements > /dev/null
typeset -f cluster-start cluster-stop cluster-delete cluster-status > /dev/null
else
# Bash style export
export -f kup kdown kstop kstart kps klogs krefresh
export -f kup-all-structured ktest kinfo
export -f kup-app kdown-app kstop-app kstart-app
export -f kup-api kdown-api kstop-api kstart-api
export -f kup-chat-client kdown-chat-client kstop-chat-client kstart-chat-client
export -f kup-workers kdown-workers kstop-workers kstart-workers
export -f kup-chat-workers kdown-chat-workers kstop-chat-workers kstart-chat-workers
export -f kup-beat kdown-beat kstop-beat kstart-beat
export -f kup-entitlements kdown-entitlements kstop-entitlements kstart-entitlements
export -f cluster-start cluster-stop cluster-delete cluster-status
fi
echo "✅ Kubernetes environment switched to $ENVIRONMENT with version $VERSION"
echo "🏗️ Cluster: $K8S_CLUSTER"
echo "📁 Config Dir: $K8S_CONFIG_DIR"
echo "📝 Log Dir: $LOG_DIR"
echo ""
echo "Available commands:"
echo " Service Groups:"
echo " kup [group] - start service group (infrastructure|apps|static|monitoring|all)"
echo " kdown [group] - stop service group, keep data"
echo " kstop [group] - stop service group without removal"
echo " kstart [group] - start stopped service group"
echo " krefresh [group] - restart service group"
echo ""
echo " Structured Deployment:"
echo " kup-all-structured - deploy all services in structured order (like deploy-all-services.sh)"
echo ""
echo " Individual App Services:"
echo " kup-app - start eveai-app"
echo " kup-api - start eveai-api"
echo " kup-chat-client - start eveai-chat-client"
echo " kup-workers - start eveai-workers"
echo " kup-chat-workers - start eveai-chat-workers"
echo " kup-beat - start eveai-beat"
echo " kup-entitlements - start eveai-entitlements"
echo " (and corresponding kdown-, kstop-, kstart- functions)"
echo ""
echo " Status & Testing:"
echo " kps - show service status"
echo " klogs [service] - view service logs"
echo " ktest - test service connectivity"
echo " kinfo - show connection information"
echo ""
echo " Cluster Management:"
echo " cluster-start - start cluster"
echo " cluster-stop - stop cluster"
echo " cluster-delete - delete cluster"
echo " cluster-status - show cluster status"