# Test Environment Management # Nushell integration for containerized test environments use lib_provisioning * const DEFAULT_ORCHESTRATOR = "http://localhost:8080" # Create test environment export def "test env create" [ config: record # Test environment configuration --infra (-i): string # Infrastructure context --auto-start # Auto-start tests after creation --auto-cleanup # Auto-cleanup after completion --orchestrator: string = $DEFAULT_ORCHESTRATOR ]: nothing -> record { let request = { config: $config, infra: $infra, auto_start: $auto_start, auto_cleanup: $auto_cleanup } let response = (http post $"($orchestrator)/test/environments/create" --content-type "application/json" ($request | to json)) if $response.success { _print $"โœ… Test environment created: ($response.environment_id)" $response } else { _print $"๐Ÿ›‘ Failed to create environment: ($response.message)" $response } } # Create single taskserv test environment export def "test env single" [ taskserv: string # Taskserv name --base-image: string = "ubuntu:22.04" --cpu: int = 1000 # CPU millicores --memory: int = 2048 # Memory MB --infra (-i): string --auto-start --auto-cleanup ]: nothing -> record { let config = { type: "single_taskserv", taskserv: $taskserv, base_image: $base_image, environment: {}, resources: { cpu_millicores: $cpu, memory_mb: $memory, disk_gb: null } } test env create $config --infra $infra --auto-start=$auto_start --auto-cleanup=$auto_cleanup } # Create server simulation test environment export def "test env server" [ server_name: string # Server name taskservs: list # List of taskservs --base-image: string = "ubuntu:22.04" --cpu: int = 2000 --memory: int = 4096 --infra (-i): string --auto-start --auto-cleanup ]: nothing -> record { let config = { type: "server_simulation", server_name: $server_name, taskservs: $taskservs, base_image: $base_image, auto_resolve_dependencies: true, environment: {}, resources: { cpu_millicores: $cpu, memory_mb: $memory, disk_gb: null } } test env create $config --infra $infra --auto-start=$auto_start --auto-cleanup=$auto_cleanup } # Create cluster topology test environment export def "test env cluster" [ cluster_type: string # Cluster type (kubernetes, etcd) topology: record # Topology configuration --infra (-i): string --auto-start --auto-cleanup ]: nothing -> record { let config = { type: "cluster_topology", ...$topology } test env create $config --infra $infra --auto-start=$auto_start --auto-cleanup=$auto_cleanup } # List test environments export def "test env list" [ --orchestrator: string = $DEFAULT_ORCHESTRATOR ]: nothing -> table { let response = (http get $"($orchestrator)/test/environments") if $response.success { $response.data | select id env_type status created_at containers } else { [] } } # Get test environment details export def "test env get" [ env_id: string --orchestrator: string = $DEFAULT_ORCHESTRATOR ]: nothing -> record { let response = (http get $"($orchestrator)/test/environments/($env_id)") if $response.success { $response.data } else { error make {msg: $"Environment ($env_id) not found"} } } # Run tests in environment export def "test env run" [ env_id: string --tests: list = [] --timeout: int --orchestrator: string = $DEFAULT_ORCHESTRATOR ]: nothing -> table { let request = { tests: $tests, timeout_seconds: $timeout } let response = (http post $"($orchestrator)/test/environments/($env_id)/run" --content-type "application/json" ($request | to json)) if $response.success { _print $"\n(_ansi cyan_bold)Test Results(_ansi reset)" let results = $response.data let passed = ($results | where passed == true | length) let total = ($results | length) for result in $results { let icon = if $result.passed { $"(_ansi green)โœ“(_ansi reset)" } else { $"(_ansi red)โœ—(_ansi reset)" } _print $"($icon) ($result.name): ($result.duration_ms)ms" if not $result.passed and ($result.error | is-not-empty) { _print $" Error: ($result.error)" } } _print $"\n($passed)/($total) tests passed" $results } else { error make {msg: "Failed to run tests"} } } # Get environment logs export def "test env logs" [ env_id: string --orchestrator: string = $DEFAULT_ORCHESTRATOR ]: nothing -> list { let response = (http get $"($orchestrator)/test/environments/($env_id)/logs") if $response.success { $response.data } else { [] } } # Cleanup test environment export def "test env cleanup" [ env_id: string --orchestrator: string = $DEFAULT_ORCHESTRATOR ]: nothing -> nothing { let response = (http delete $"($orchestrator)/test/environments/($env_id)") if $response.success { _print $"โœ… Environment ($env_id) cleaned up" } else { _print $"๐Ÿ›‘ Failed to cleanup environment" } } # Show environment status export def "test env status" [ env_id: string --orchestrator: string = $DEFAULT_ORCHESTRATOR ]: nothing -> nothing { let env = (test env get $env_id --orchestrator $orchestrator) _print $"\n(_ansi cyan_bold)Test Environment Status(_ansi reset)" _print $"ID: ($env.id)" _print $"Type: ($env.env_type)" _print $"Status: ($env.status)" _print $"Created: ($env.created_at)" _print $"\n(_ansi cyan)Containers:(_ansi reset)" for container in $env.containers { _print $" โ€ข ($container.container_name) - ($container.status)" if ($container.ip_address | is-not-empty) { _print $" IP: ($container.ip_address)" } } if ($env.test_results | length) > 0 { _print $"\n(_ansi cyan)Test Results:(_ansi reset)" let passed = ($env.test_results | where passed == true | length) let total = ($env.test_results | length) _print $" ($passed)/($total) tests passed" } } # Load topology template export def "test topology load" [ template_name: string ]: nothing -> record { let config_path = $"($env.PROVISIONING_PATH?)/config/test-topologies.toml" if not ($config_path | path exists) { error make {msg: $"Topology templates not found: ($config_path)"} } let topologies = (open $config_path) if $template_name in ($topologies | columns) { $topologies | get $template_name } else { error make {msg: $"Topology template ($template_name) not found"} } } # List available topology templates export def "test topology list" []: nothing -> table { let config_path = $"($env.PROVISIONING_PATH?)/config/test-topologies.toml" if not ($config_path | path exists) { return [] } let topologies = (open $config_path) $topologies | transpose name config | select name } # Quick test - create, run, and cleanup export def "test quick" [ taskserv: string --infra (-i): string ]: nothing -> nothing { _print $"๐Ÿงช Quick test for ($taskserv)" let env_response = (test env single $taskserv --infra $infra --auto-start) if not $env_response.success { _print $"๐Ÿ›‘ Failed to create environment" return } let env_id = $env_response.environment_id _print $"โณ Waiting for environment to be ready..." sleep 5sec let status = (test env get $env_id) if $status.status == "ready" or $status.status == "running" { _print $"โœ… Environment ready, running tests..." test env run $env_id } _print $"๐Ÿงน Cleaning up..." test env cleanup $env_id _print $"โœ… Quick test completed" }