mirror of
https://github.com/bahdotsh/wrkflw.git
synced 2025-12-16 19:57:44 +01:00
Add Podman as a new container runtime option alongside Docker and emulation modes, enabling workflow execution in rootless containers for enhanced security and compatibility in restricted environments. Features: - New PodmanRuntime implementing ContainerRuntime trait - CLI --runtime flag with docker/podman/emulation options - TUI runtime cycling (e → Docker → Podman → Emulation) - Full container lifecycle management (run, pull, build, cleanup) - Container preservation support with --preserve-containers-on-failure - Automatic fallback to emulation when Podman unavailable - Rootless container execution without privileged daemon Implementation: - crates/executor/src/podman.rs: Complete Podman runtime implementation - crates/executor/src/engine.rs: Runtime type enum and initialization - crates/ui/: TUI integration with runtime switching and status display - crates/wrkflw/src/main.rs: CLI argument parsing for runtime selection Testing & Documentation: - TESTING_PODMAN.md: Comprehensive testing guide - test-podman-basic.sh: Automated verification script - test-preserve-containers.sh: Container preservation testing - MANUAL_TEST_CHECKLIST.md: Manual verification checklist - README.md: Complete Podman documentation and usage examples Benefits: - Organizations restricting Docker installation can use Podman - Enhanced security through daemonless, rootless architecture - Drop-in compatibility with existing Docker-based workflows - Consistent container execution across different environments Closes: Support for rootless container execution in restricted environments
216 lines
7.0 KiB
Bash
Executable File
216 lines
7.0 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Basic Podman Support Test Script for WRKFLW
|
|
# This script performs quick verification of Podman integration
|
|
|
|
set -e # Exit on any error
|
|
|
|
echo "🚀 WRKFLW Podman Support - Basic Test Script"
|
|
echo "============================================="
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Function to print colored output
|
|
print_status() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
print_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
}
|
|
|
|
print_warning() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
}
|
|
|
|
print_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
# Check if wrkflw binary exists
|
|
print_status "Checking if wrkflw is built..."
|
|
if [ ! -f "./target/release/wrkflw" ]; then
|
|
print_warning "Release binary not found. Building wrkflw..."
|
|
cargo build --release
|
|
if [ $? -eq 0 ]; then
|
|
print_success "Build completed successfully"
|
|
else
|
|
print_error "Build failed"
|
|
exit 1
|
|
fi
|
|
else
|
|
print_success "Found wrkflw binary"
|
|
fi
|
|
|
|
# Test 1: Check CLI help shows runtime options
|
|
print_status "Test 1: Checking CLI runtime options..."
|
|
HELP_OUTPUT=$(./target/release/wrkflw run --help 2>&1)
|
|
if echo "$HELP_OUTPUT" | grep -q "runtime.*podman"; then
|
|
print_success "CLI shows Podman runtime option"
|
|
else
|
|
print_error "CLI does not show Podman runtime option"
|
|
exit 1
|
|
fi
|
|
|
|
# Test 2: Check invalid runtime rejection
|
|
print_status "Test 2: Testing invalid runtime rejection..."
|
|
if ./target/release/wrkflw run --runtime invalid test-workflows/example.yml 2>&1 | grep -q "invalid value"; then
|
|
print_success "Invalid runtime properly rejected"
|
|
else
|
|
print_error "Invalid runtime not properly rejected"
|
|
exit 1
|
|
fi
|
|
|
|
# Test 3: Check Podman availability detection
|
|
print_status "Test 3: Testing Podman availability detection..."
|
|
if command -v podman &> /dev/null; then
|
|
print_success "Podman is installed and available"
|
|
PODMAN_VERSION=$(podman version --format json | python3 -c "import sys, json; print(json.load(sys.stdin)['Client']['Version'])" 2>/dev/null || echo "unknown")
|
|
print_status "Podman version: $PODMAN_VERSION"
|
|
|
|
# Test basic podman functionality
|
|
if podman info > /dev/null 2>&1; then
|
|
print_success "Podman daemon is responsive"
|
|
PODMAN_AVAILABLE=true
|
|
else
|
|
print_warning "Podman installed but not responsive (may need podman machine start)"
|
|
PODMAN_AVAILABLE=false
|
|
fi
|
|
else
|
|
print_warning "Podman not installed - will test fallback behavior"
|
|
PODMAN_AVAILABLE=false
|
|
fi
|
|
|
|
# Create a simple test workflow
|
|
print_status "Creating test workflow..."
|
|
cat > test-basic-workflow.yml << 'EOF'
|
|
name: Basic Test Workflow
|
|
on: [workflow_dispatch]
|
|
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
container: ubuntu:20.04
|
|
steps:
|
|
- name: Basic test
|
|
run: |
|
|
echo "Testing basic container execution"
|
|
echo "Current user: $(whoami)"
|
|
echo "Working directory: $(pwd)"
|
|
echo "Container test completed"
|
|
|
|
- name: Environment test
|
|
env:
|
|
TEST_VAR: "test-value"
|
|
run: |
|
|
echo "Environment variable TEST_VAR: $TEST_VAR"
|
|
echo "GitHub workspace: $GITHUB_WORKSPACE"
|
|
EOF
|
|
|
|
# Test 4: Test emulation mode (should always work)
|
|
print_status "Test 4: Testing emulation mode..."
|
|
if ./target/release/wrkflw run --runtime emulation test-basic-workflow.yml > /dev/null 2>&1; then
|
|
print_success "Emulation mode works correctly"
|
|
else
|
|
print_error "Emulation mode failed"
|
|
exit 1
|
|
fi
|
|
|
|
# Test 5: Test Podman mode
|
|
print_status "Test 5: Testing Podman mode..."
|
|
if [ "$PODMAN_AVAILABLE" = true ]; then
|
|
print_status "Running test workflow with Podman runtime..."
|
|
if ./target/release/wrkflw run --runtime podman --verbose test-basic-workflow.yml > podman-test.log 2>&1; then
|
|
print_success "Podman mode executed successfully"
|
|
|
|
# Check if it actually used Podman
|
|
if grep -q "Podman: Running container" podman-test.log; then
|
|
print_success "Confirmed Podman was used for container execution"
|
|
elif grep -q "Podman is not available.*emulation" podman-test.log; then
|
|
print_warning "Podman fell back to emulation mode"
|
|
else
|
|
print_warning "Could not confirm Podman usage in logs"
|
|
fi
|
|
else
|
|
print_error "Podman mode failed to execute"
|
|
echo "Error log:"
|
|
tail -10 podman-test.log
|
|
exit 1
|
|
fi
|
|
else
|
|
print_status "Testing Podman fallback behavior..."
|
|
if ./target/release/wrkflw run --runtime podman test-basic-workflow.yml 2>&1 | grep -q "emulation.*instead"; then
|
|
print_success "Podman correctly falls back to emulation when unavailable"
|
|
else
|
|
print_error "Podman fallback behavior not working correctly"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Test 6: Test Docker mode (if available)
|
|
print_status "Test 6: Testing Docker mode for comparison..."
|
|
if command -v docker &> /dev/null && docker info > /dev/null 2>&1; then
|
|
print_status "Docker is available, testing for comparison..."
|
|
if ./target/release/wrkflw run --runtime docker test-basic-workflow.yml > /dev/null 2>&1; then
|
|
print_success "Docker mode works correctly"
|
|
else
|
|
print_warning "Docker mode failed (this is okay for Podman testing)"
|
|
fi
|
|
else
|
|
print_warning "Docker not available - skipping Docker comparison test"
|
|
fi
|
|
|
|
# Test 7: Test TUI compilation (basic check)
|
|
print_status "Test 7: Testing TUI startup..."
|
|
timeout 5s ./target/release/wrkflw tui --help > /dev/null 2>&1 || true
|
|
print_success "TUI help command works"
|
|
|
|
# Test 8: Runtime switching in TUI (simulate)
|
|
print_status "Test 8: Checking TUI runtime parameter..."
|
|
if ./target/release/wrkflw tui --runtime podman --help > /dev/null 2>&1; then
|
|
print_success "TUI accepts runtime parameter"
|
|
else
|
|
print_error "TUI does not accept runtime parameter"
|
|
exit 1
|
|
fi
|
|
|
|
# Cleanup
|
|
print_status "Cleaning up test files..."
|
|
rm -f test-basic-workflow.yml podman-test.log
|
|
|
|
echo ""
|
|
echo "🎉 Basic Podman Support Test Summary:"
|
|
echo "======================================"
|
|
|
|
if [ "$PODMAN_AVAILABLE" = true ]; then
|
|
print_success "✅ Podman is available and working"
|
|
print_success "✅ WRKFLW can execute workflows with Podman"
|
|
else
|
|
print_warning "⚠️ Podman not available, but fallback works correctly"
|
|
fi
|
|
|
|
print_success "✅ CLI runtime selection works"
|
|
print_success "✅ Error handling works"
|
|
print_success "✅ TUI integration works"
|
|
print_success "✅ Basic container execution works"
|
|
|
|
echo ""
|
|
print_status "🔍 For comprehensive testing, run: ./TESTING_PODMAN.md"
|
|
print_status "📋 To install Podman: https://podman.io/getting-started/installation"
|
|
|
|
if [ "$PODMAN_AVAILABLE" = false ]; then
|
|
echo ""
|
|
print_warning "💡 To test full Podman functionality:"
|
|
echo " 1. Install Podman for your system"
|
|
echo " 2. Initialize Podman (if on macOS/Windows): podman machine init && podman machine start"
|
|
echo " 3. Re-run this test script"
|
|
fi
|
|
|
|
echo ""
|
|
print_success "🎯 Basic Podman support test completed successfully!"
|