# build.func Execution Flows ## Overview This document details the execution flows for different installation modes and scenarios in `build.func`, including variable precedence, decision trees, and workflow patterns. ## Installation Modes ### 1. Default Install Flow **Purpose**: Uses built-in defaults with minimal user interaction **Use Case**: Quick container creation with standard settings ``` Default Install Flow: ├── start() │ ├── Detect execution context │ ├── Capture hard environment variables │ └── Set CT_TYPE="install" ├── install_script() │ ├── Display installation mode menu │ ├── User selects "Default Install" │ └── Proceed with defaults ├── variables() │ ├── base_settings() # Set built-in defaults │ ├── Load app.vars (if exists) │ ├── Load default.vars (if exists) │ └── Apply variable precedence ├── build_container() │ ├── validate_settings() │ ├── check_conflicts() │ └── create_lxc_container() └── default_var_settings() └── Offer to save as defaults ``` **Key Characteristics**: - Minimal user prompts - Uses built-in defaults - Fast execution - Suitable for standard deployments ### 2. Advanced Install Flow **Purpose**: Full interactive configuration via whiptail menus **Use Case**: Custom container configuration with full control ``` Advanced Install Flow: ├── start() │ ├── Detect execution context │ ├── Capture hard environment variables │ └── Set CT_TYPE="install" ├── install_script() │ ├── Display installation mode menu │ ├── User selects "Advanced Install" │ └── Proceed with advanced configuration ├── variables() │ ├── base_settings() # Set built-in defaults │ ├── Load app.vars (if exists) │ ├── Load default.vars (if exists) │ └── Apply variable precedence ├── advanced_settings() │ ├── OS Selection Menu │ ├── Resource Configuration Menu │ ├── Network Configuration Menu │ ├── select_storage() │ │ ├── resolve_storage_preselect() │ │ └── choose_and_set_storage_for_file() │ ├── GPU Configuration Menu │ │ └── detect_gpu_devices() │ └── Feature Flags Menu ├── build_container() │ ├── validate_settings() │ ├── check_conflicts() │ └── create_lxc_container() └── default_var_settings() └── Offer to save as defaults ``` **Key Characteristics**: - Full interactive configuration - Whiptail menus for all options - Complete control over settings - Suitable for custom deployments ### 3. My Defaults Flow **Purpose**: Loads settings from global default.vars file **Use Case**: Using previously saved global defaults ``` My Defaults Flow: ├── start() │ ├── Detect execution context │ ├── Capture hard environment variables │ └── Set CT_TYPE="install" ├── install_script() │ ├── Display installation mode menu │ ├── User selects "My Defaults" │ └── Proceed with loaded defaults ├── variables() │ ├── base_settings() # Set built-in defaults │ ├── Load app.vars (if exists) │ ├── Load default.vars # Load global defaults │ └── Apply variable precedence ├── build_container() │ ├── validate_settings() │ ├── check_conflicts() │ └── create_lxc_container() └── default_var_settings() └── Offer to save as defaults ``` **Key Characteristics**: - Uses global default.vars file - Minimal user interaction - Consistent with previous settings - Suitable for repeated deployments ### 4. App Defaults Flow **Purpose**: Loads settings from app-specific .vars file **Use Case**: Using previously saved app-specific defaults ``` App Defaults Flow: ├── start() │ ├── Detect execution context │ ├── Capture hard environment variables │ └── Set CT_TYPE="install" ├── install_script() │ ├── Display installation mode menu │ ├── User selects "App Defaults" │ └── Proceed with app-specific defaults ├── variables() │ ├── base_settings() # Set built-in defaults │ ├── Load app.vars # Load app-specific defaults │ ├── Load default.vars (if exists) │ └── Apply variable precedence ├── build_container() │ ├── validate_settings() │ ├── check_conflicts() │ └── create_lxc_container() └── default_var_settings() └── Offer to save as defaults ``` **Key Characteristics**: - Uses app-specific .vars file - Minimal user interaction - App-optimized settings - Suitable for app-specific deployments ## Variable Precedence Chain ### Precedence Order (Highest to Lowest) 1. **Hard Environment Variables**: Set before script execution 2. **App-specific .vars file**: `/usr/local/community-scripts/defaults/.vars` 3. **Global default.vars file**: `/usr/local/community-scripts/default.vars` 4. **Built-in defaults**: Set in `base_settings()` function ### Variable Resolution Process ``` Variable Resolution: ├── Capture hard environment variables at start() ├── Load built-in defaults in base_settings() ├── Load global default.vars (if exists) ├── Load app-specific .vars (if exists) └── Apply precedence chain ├── Hard env vars override all ├── App.vars override default.vars and built-ins ├── Default.vars override built-ins └── Built-ins are fallback defaults ``` ## Storage Selection Logic ### Storage Resolution Flow ``` Storage Selection: ├── Check if storage is preselected │ ├── var_template_storage set? → Validate and use │ └── var_container_storage set? → Validate and use ├── Count available storage options │ ├── Only 1 option → Auto-select │ └── Multiple options → Prompt user ├── User selection via whiptail │ ├── Template storage selection │ └── Container storage selection └── Validate selected storage ├── Check availability ├── Check content type support └── Proceed with selection ``` ### Storage Validation ``` Storage Validation: ├── Check storage exists ├── Check storage is online ├── Check content type support │ ├── Template storage: vztmpl support │ └── Container storage: rootdir support ├── Check available space └── Validate permissions ``` ## GPU Passthrough Flow ### GPU Detection and Configuration ``` GPU Passthrough Flow: ├── detect_gpu_devices() │ ├── Scan for Intel GPUs │ │ ├── Check i915 driver │ │ └── Detect devices │ ├── Scan for AMD GPUs │ │ ├── Check AMDGPU driver │ │ └── Detect devices │ └── Scan for NVIDIA GPUs │ ├── Check NVIDIA driver │ ├── Detect devices │ └── Check CUDA support ├── Check GPU passthrough eligibility │ ├── Is app in GPU_APPS list? │ ├── Is container privileged? │ └── Proceed if eligible ├── GPU selection logic │ ├── Single GPU type → Auto-select │ └── Multiple GPU types → Prompt user ├── configure_gpu_passthrough() │ ├── Add GPU device entries │ ├── Configure permissions │ └── Update container config └── fix_gpu_gids() ├── Update GPU group IDs └── Configure access permissions ``` ### GPU Eligibility Check ``` GPU Eligibility: ├── Check app support │ ├── Is APP in GPU_APPS list? │ └── Proceed if supported ├── Check container privileges │ ├── Is ENABLE_PRIVILEGED="true"? │ └── Proceed if privileged └── Check hardware availability ├── Are GPUs detected? └── Proceed if available ``` ## Network Configuration Flow ### Network Setup Process ``` Network Configuration: ├── Basic network settings │ ├── var_net (network interface) │ ├── var_bridge (bridge interface) │ └── var_gateway (gateway IP) ├── IP configuration │ ├── var_ip (IPv4 address) │ ├── var_ipv6 (IPv6 address) │ └── IPV6_METHOD (IPv6 method) ├── Advanced network settings │ ├── var_vlan (VLAN ID) │ ├── var_mtu (MTU size) │ └── var_mac (MAC address) └── Network validation ├── Check IP format ├── Check gateway reachability └── Validate network configuration ``` ## Container Creation Flow ### LXC Container Creation Process ``` Container Creation: ├── create_lxc_container() │ ├── Create basic container │ ├── Configure network │ ├── Set up storage │ ├── Configure features │ ├── Set resource limits │ ├── Configure startup │ └── Start container ├── Post-creation configuration │ ├── Wait for network │ ├── Configure GPU (if enabled) │ ├── Set up SSH keys │ └── Run post-install scripts └── Finalization ├── Display container info ├── Show access details └── Provide next steps ``` ## Error Handling Flows ### Validation Error Flow ``` Validation Error Flow: ├── validate_settings() │ ├── Check configuration validity │ └── Return error if invalid ├── check_conflicts() │ ├── Check for conflicts │ └── Return error if conflicts found ├── Error handling │ ├── Display error message │ ├── cleanup_on_error() │ └── Exit with error code └── User notification ├── Show error details └── Suggest fixes ``` ### Storage Error Flow ``` Storage Error Flow: ├── Storage selection fails ├── Retry storage selection │ ├── Show available options │ └── Allow user to retry ├── Storage validation fails │ ├── Show validation errors │ └── Allow user to fix └── Fallback to default storage ├── Use fallback storage └── Continue with creation ``` ### GPU Error Flow ``` GPU Error Flow: ├── GPU detection fails ├── Fall back to no GPU │ ├── Disable GPU passthrough │ └── Continue without GPU ├── GPU configuration fails │ ├── Show configuration errors │ └── Allow user to retry └── GPU permission errors ├── Fix GPU permissions └── Retry configuration ``` ## Integration Flows ### With Install Scripts ``` Install Script Integration: ├── build.func creates container ├── Container starts successfully ├── Install script execution │ ├── Download and install app │ ├── Configure app settings │ └── Set up services └── Post-installation configuration ├── Verify installation ├── Configure access └── Display completion info ``` ### With Proxmox API ``` Proxmox API Integration: ├── API authentication ├── Container creation via API ├── Configuration updates via API ├── Status monitoring via API └── Error handling via API ``` ## Performance Considerations ### Execution Time Optimization ``` Performance Optimization: ├── Parallel operations where possible ├── Minimal user interaction in default mode ├── Efficient storage selection ├── Optimized GPU detection └── Streamlined validation ``` ### Resource Usage ``` Resource Usage: ├── Minimal memory footprint ├── Efficient disk usage ├── Optimized network usage └── Minimal CPU overhead ```