#!/usr/bin/env nu # Info: Script to run Provisioning Batch Workflow Management # Author: JesusPerezLorenzo # Release: 1.0.0 # Date: 29-09-2025 use std log use lib_provisioning * use env.nu * use workflows/batch.nu * # - > Help on Batch Workflows export def "main help" [ --src: string = "" --notitles # not titles --out: string # Print Output format: json, yaml, text (default) ]: nothing -> nothing { if $notitles == null or not $notitles { if (which show_titles | is-not-empty) { show_titles } } print "" print "Batch Workflow Management - Comprehensive batch operations for infrastructure provisioning" print "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" print "" print "USAGE:" print " provisioning batch [arguments] [flags]" print "" print "COMMANDS:" print " validate Validate KCL workflow definition" print " --check-syntax Check syntax only" print " --check-dependencies Validate dependencies" print "" print " submit Submit batch workflow to orchestrator" print " --name Custom workflow name" print " --priority <1-10> Workflow priority (default: 5)" print " --environment Target environment" print " --wait Wait for completion" print " --timeout Timeout (default: 30min)" print "" print " status Get batch workflow status" print " --format Output format (default: table)" print "" print " monitor Real-time workflow monitoring" print " --interval Refresh interval (default: 3sec)" print " --timeout Maximum monitoring time (default: 30min)" print " --quiet Minimal output" print "" print " rollback Rollback failed workflow" print " --checkpoint Rollback to specific checkpoint" print " --force Force without confirmation" print "" print " list List batch workflows" print " --status Filter by status (Running, Failed, Completed)" print " --environment Filter by environment" print " --name Filter by name pattern" print " --limit Maximum results (default: 50)" print " --format Output format" print "" print " cancel Cancel running workflow" print " --reason Cancellation reason" print " --force Force cancellation" print "" print " template [name] Manage workflow templates" print " Actions: list, create, delete, show" print " --from-file Create template from file" print " --description Template description" print "" print " stats Show batch statistics" print " --period <1h|24h|7d|30d> Time period (default: 24h)" print " --environment Filter by environment" print " --detailed Show detailed statistics" print "" print " health Check batch system health" print "" print "GLOBAL FLAGS:" print " --check Check mode, no actual changes" print " --yes Auto-confirm operations" print " --debug Enable debug mode" print " --out Output format" print "" print "EXAMPLES:" print " # Validate a workflow" print " provisioning batch validate workflows/example.k --check-syntax --check-dependencies" print "" print " # Submit and wait for completion" print " provisioning batch submit workflows/deploy.k --wait --environment prod" print "" print " # Monitor workflow in real-time" print " provisioning batch monitor abc123-def456" print "" print " # List all running workflows" print " provisioning batch list --status Running" print "" print " # Check system health" print " provisioning batch health" print "" } # > Batch Workflow Management def main [ ...args: string # Other options, use help to get info -v # Show version -i # Show Info --version (-V) # Show version with title --info (-I) # Show Info with title --about (-a) # Show About --interval: duration = 3sec # Monitoring refresh interval --timeout: duration = 30min # Timeout for wait/monitor operations --status: string = "" # Filter status (Running, Failed, Completed, etc) --format: string = "table" # Output format: table, json, compact --priority: int = 5 # Workflow priority (1-10) --environment: string = "" # Target environment (dev/test/prod) --checkpoint: string = "" # Rollback checkpoint --reason: string = "" # Cancellation reason --period: string = "24h" # Statistics period (1h, 24h, 7d, 30d) --template: string = "" # Template type or name --from-file: string = "" # Source file for template creation --description: string = "" # Template description --name: string = "" # Custom workflow or template name --limit: int = 50 # Maximum results for list --check-syntax (-s) # Check syntax only --check-dependencies (-d) # Validate dependencies --wait (-w) # Wait for completion --check (-c) # Only check mode, no actual changes --yes (-y) # Confirm task --force (-f) # Force operation without confirmation --quiet (-q) # Minimal output --detailed # Show detailed information --debug (-x) # Use Debug mode --xm # Debug with PROVISIONING_METADATA --xld # Log level with DEBUG PROVISIONING_LOG_LEVEL=debug --metadata # Error with metadata (-xm) --notitles # Do not show banner titles --helpinfo (-h) # For more details use options "help" (no dashes) --out: string # Print Output format: json, yaml, text (default) ]: nothing -> nothing { if ($out | is-not-empty) { $env.PROVISIONING_OUT = $out $env.PROVISIONING_NO_TERMINAL = true } provisioning_init $helpinfo "batch" $args if $version or $v { ^$env.PROVISIONING_NAME -v ; exit } if $info or $i { ^$env.PROVISIONING_NAME -i ; exit } if $about { _print (get_about_info) exit } if $debug { $env.PROVISIONING_DEBUG = true } if $metadata { $env.PROVISIONING_METADATA = true } let task = if ($args | length) > 0 { ($args | get 0) } else { "" } let ops = $"($env.PROVISIONING_ARGS? | default "") " | str replace $" ($task) " "" | str trim let workflow_param = if ($ops | is-not-empty) and not ($ops | str starts-with "-") { ($ops | split row " " | get 0) } else { "" } $env.PROVISIONING_MODULE = "batch" match $task { "h" | "help" => { # Redirect to main categorized help system exec $"($env.PROVISIONING_NAME)" help orchestration --notitles }, "validate" => { if ($workflow_param | is-empty) { print "❌ Workflow file path is required" print "Usage: provisioning batch validate [--check-syntax] [--check-dependencies]" exit 1 } print $"🔍 Validating workflow: ($workflow_param)" let result = if $check_syntax and $check_dependencies { batch validate $workflow_param --check-syntax --check-dependencies } else if $check_syntax { batch validate $workflow_param --check-syntax } else if $check_dependencies { batch validate $workflow_param --check-dependencies } else { batch validate $workflow_param } if $result.valid { print "✅ Workflow is valid" } else { print "❌ Workflow validation failed" print $"Errors: ($result.errors | str join '\n ')" } output_result $result $out }, "submit" => { if ($workflow_param | is-empty) { print "❌ Workflow file path is required" print "Usage: provisioning batch submit [--wait] [--check]" exit 1 } if $check { print "🔍 CHECK MODE: Would submit workflow but --check flag is set" let validation = batch validate $workflow_param --check-syntax --check-dependencies if $validation.valid { print "✅ Workflow is valid and ready to submit" } else { print "❌ Workflow validation failed" print $"Errors: ($validation.errors | str join '\n ')" } exit 0 } print $"📤 Submitting workflow: ($workflow_param)" let result = if $wait { batch submit $workflow_param --name $name --priority $priority --environment $environment --wait --timeout $timeout } else { batch submit $workflow_param --name $name --priority $priority --environment $environment } output_result $result $out }, "status" => { if ($workflow_param | is-empty) { print "❌ Workflow ID is required" print "Usage: provisioning batch status " exit 1 } let result = batch status $workflow_param --format $format output_result $result $out }, "monitor" => { if ($workflow_param | is-empty) { print "❌ Workflow ID is required" print "Usage: provisioning batch monitor [--interval 2sec]" exit 1 } if $quiet { batch monitor $workflow_param --interval $interval --timeout $timeout --quiet } else { batch monitor $workflow_param --interval $interval --timeout $timeout } }, "rollback" => { if ($workflow_param | is-empty) { print "❌ Workflow ID is required" print "Usage: provisioning batch rollback [--checkpoint ] [--force]" exit 1 } if $check { print "🔍 CHECK MODE: Would rollback workflow but --check flag is set" print $"Workflow ID: ($workflow_param)" if ($checkpoint | is-not-empty) { print $"Checkpoint: ($checkpoint)" } exit 0 } if not $force and not $yes { let confirm = (input $"⚠️ Rollback workflow ($workflow_param)? This cannot be undone. [y/N]: ") if $confirm != "y" and $confirm != "Y" { print "🚫 Rollback cancelled" exit 0 } } print $"🔄 Rolling back workflow: ($workflow_param)" let result = if ($checkpoint | is-not-empty) { batch rollback $workflow_param --checkpoint $checkpoint --force } else if $force or $yes { batch rollback $workflow_param --force } else { batch rollback $workflow_param } output_result $result $out }, "list" => { let result = batch list --status $status --environment $environment --name $name --limit $limit --format $format output_result $result $out }, "cancel" => { if ($workflow_param | is-empty) { print "❌ Workflow ID is required" print "Usage: provisioning batch cancel [--reason ] [--force]" exit 1 } if $check { print "🔍 CHECK MODE: Would cancel workflow but --check flag is set" print $"Workflow ID: ($workflow_param)" if ($reason | is-not-empty) { print $"Reason: ($reason)" } exit 0 } if not $force and not $yes { let confirm = (input $"⚠️ Cancel workflow ($workflow_param)? [y/N]: ") if $confirm != "y" and $confirm != "Y" { print "🚫 Cancellation aborted" exit 0 } } print $"🚫 Cancelling workflow: ($workflow_param)" let result = if ($reason | is-not-empty) and ($force or $yes) { batch cancel $workflow_param --reason $reason --force } else if ($reason | is-not-empty) { batch cancel $workflow_param --reason $reason } else if ($force or $yes) { batch cancel $workflow_param --force } else { batch cancel $workflow_param } output_result $result $out }, "template" => { let action = if ($workflow_param | is-not-empty) { $workflow_param } else { "list" } let template_name_param = if ($ops | is-not-empty) { let parts = ($ops | split row " ") if ($parts | length) > 1 and not (($parts | get 1) | str starts-with "-") { ($parts | get 1) } else { "" } } else { "" } let result = match $action { "list" => { batch template "list" }, "create" => { if ($template_name_param | is-empty) or ($from_file | is-empty) { print "❌ Template name and --from-file are required" print "Usage: provisioning batch template create --from-file [--description ]" exit 1 } batch template "create" $template_name_param --from-file $from_file --description $description }, "delete" => { if ($template_name_param | is-empty) { print "❌ Template name is required" print "Usage: provisioning batch template delete " exit 1 } if not $force and not $yes { let confirm = (input $"⚠️ Delete template ($template_name_param)? [y/N]: ") if $confirm != "y" and $confirm != "Y" { print "🚫 Deletion cancelled" exit 0 } } batch template "delete" $template_name_param }, "show" => { if ($template_name_param | is-empty) { print "❌ Template name is required" print "Usage: provisioning batch template show " exit 1 } batch template "show" $template_name_param }, _ => { print $"❌ Unknown template action: ($action)" print "Available actions: list, create, delete, show" exit 1 } } output_result $result $out }, "stats" => { let result = if $detailed { batch stats --period $period --environment $environment --detailed } else { batch stats --period $period --environment $environment } output_result $result $out }, "health" => { let result = batch health output_result $result $out }, _ => { print $"❌ Unknown task: ($task)" print "" print "Available commands:" print " validate - Validate KCL workflow definition" print " submit - Submit batch workflow to orchestrator" print " status - Get batch workflow status" print " monitor - Real-time workflow monitoring" print " rollback - Rollback failed workflow" print " list - List batch workflows" print " cancel - Cancel running workflow" print " template [name] - Manage workflow templates" print " stats - Show batch statistics" print " health - Check batch system health" print "" print "Use 'provisioning batch help' for detailed information" exit 1 } } } # Helper function to output results in various formats def output_result [result: any, format: string]: nothing -> nothing { if ($format | is-not-empty) { if $format == "json" { print ($result | to json) } else if $format == "yaml" { print ($result | to yaml) } else { print ($result | table) } } }