#\!/bin/bash set -e set -o pipefail # Usage function usage() { echo "Usage: wild-cluster-services-up [options] [service...]" echo "" echo "Install cluster services from generated setup files." echo "" echo "Arguments:" echo " service Specific service(s) to install (optional)" echo "" echo "Options:" echo " -h, --help Show this help message" echo " --list List available services" echo " --dry-run Show what would be installed without running" echo "" echo "Examples:" echo " wild-cluster-services-up # Install all services" echo " wild-cluster-services-up metallb traefik # Install specific services" echo "" echo "Available services (when setup files exist):" echo " metallb, longhorn, traefik, coredns, cert-manager," echo " externaldns, kubernetes-dashboard, nfs, docker-registry" echo "" echo "Requirements:" echo " - Must be run from a wild-cloud directory" echo " - Cluster services must be generated first (wild-cluster-services-generate)" echo " - Kubernetes cluster must be running and kubectl configured" } # Parse arguments DRY_RUN=false LIST_SERVICES=false SPECIFIC_SERVICES=() while [[ $# -gt 0 ]]; do case $1 in -h|--help) usage exit 0 ;; --dry-run) DRY_RUN=true shift ;; -*) echo "Unknown option $1" usage exit 1 ;; *) SPECIFIC_SERVICES+=("$1") shift ;; esac done # Initialize Wild Cloud environment if [ -z "${WC_ROOT}" ]; then print "WC_ROOT is not set." exit 1 else source "${WC_ROOT}/scripts/common.sh" init_wild_env fi CLUSTER_SETUP_DIR="${WC_HOME}/setup/cluster-services" # Check if cluster setup directory exists if [ ! -d "$CLUSTER_SETUP_DIR" ]; then print_error "Cluster services setup directory not found: $CLUSTER_SETUP_DIR" print_info "Run 'wild-cluster-services-generate' first to generate setup files" exit 1 fi # ============================================================================= # CLUSTER SERVICES INSTALLATION # ============================================================================= print_header "Cluster Services Installation" # Check kubectl connectivity if [ "$DRY_RUN" = false ]; then print_info "Checking Kubernetes cluster connectivity..." if ! kubectl cluster-info >/dev/null 2>&1; then print_error "kubectl is not configured or cluster is not accessible" print_info "Make sure your cluster is running and kubeconfig is set up" print_info "You can get kubeconfig with: talosctl kubeconfig" exit 1 fi print_success "Cluster is accessible" fi # Get list of services to install if [ ${#SPECIFIC_SERVICES[@]} -gt 0 ]; then SERVICES_TO_INSTALL=("${SPECIFIC_SERVICES[@]}") print_info "Installing specific services: ${SERVICES_TO_INSTALL[*]}" else # Install all available services in a specific order for dependencies SERVICES_TO_INSTALL=( "metallb" "longhorn" "traefik" "coredns" "cert-manager" "externaldns" "kubernetes-dashboard" "nfs" "docker-registry" ) print_info "Installing all available services" fi print_info "Services to install: ${SERVICES_TO_INSTALL[*]}" if [ "$DRY_RUN" = true ]; then print_info "DRY RUN - would install the following services:" for service in "${SERVICES_TO_INSTALL[@]}"; do print_info " - $service: $CLUSTER_SETUP_DIR/$service/install.sh" done exit 0 fi # Install services cd "$CLUSTER_SETUP_DIR" INSTALLED_COUNT=0 FAILED_COUNT=0 SOURCE_DIR="${WC_ROOT}/setup/cluster-services" for service in "${SERVICES_TO_INSTALL[@]}"; do echo "" print_header "Installing $service" # Copy templates source_service_dir="$SOURCE_DIR/$service" dest_service_dir="$CLUSTER_SETUP_DIR/$service" print_info "Processing service: $service" mkdir -p "$dest_service_dir" # FIXME: Template compilation needs to be AFTER the configuration steps in the install.sh scripts! for item in "$source_service_dir"/*; do item_name=$(basename "$item") if [ "$item_name" = "kustomize.template" ]; then if [ -d "$item" ]; then print_info " Compiling kustomize templates for $service" wild-compile-template-dir --clean "$item" "$dest_service_dir/kustomize" fi else if [ -f "$item" ]; then if grep -q "{{" "$item" 2>/dev/null; then print_info " Compiling: ${item_name}" wild-compile-template < "$item" > "$dest_service_dir/$item_name" else cp "$item" "$dest_service_dir/$item_name" fi elif [ -d "$item" ]; then cp -r "$item" "$dest_service_dir/" fi fi done # Run installation script. if [ -f "./$service/install.sh" ]; then print_info "Running $service installation..." if ./"$service"/install.sh; then print_success "$service installed successfully" INSTALLED_COUNT=$((INSTALLED_COUNT + 1)) else print_error "$service installation failed" FAILED_COUNT=$((FAILED_COUNT + 1)) fi else print_warning "$service install script not found" FAILED_COUNT=$((FAILED_COUNT + 1)) fi done cd - >/dev/null # Summary echo "" print_header "Installation Summary" print_success "Successfully installed: $INSTALLED_COUNT services" if [ $FAILED_COUNT -gt 0 ]; then print_warning "Failed to install: $FAILED_COUNT services" fi if [ $INSTALLED_COUNT -gt 0 ]; then echo "" print_info "Next steps:" echo " 1. Verify installations with: kubectl get pods --all-namespaces" echo " 2. Check service status with: kubectl get services --all-namespaces" # Service-specific next steps if [[ " ${SERVICES_TO_INSTALL[*]} " =~ " kubernetes-dashboard " ]]; then INTERNAL_DOMAIN=$(wild-config cloud.internalDomain 2>/dev/null || echo "your-internal-domain") echo " 3. Access dashboard at: https://dashboard.${INTERNAL_DOMAIN}" echo " 4. Get dashboard token with: ${WC_ROOT}/bin/dashboard-token" fi if [[ " ${SERVICES_TO_INSTALL[*]} " =~ " cert-manager " ]]; then echo " 3. Check cert-manager: kubectl get clusterissuers" fi fi if [ $FAILED_COUNT -eq 0 ]; then print_success "All cluster services installed successfully!" else print_warning "Some services failed to install. Check the output above for details." exit 1 fi