feat: introduce consolidated Podman module with dual APIs

- Restructure Podman module into sub-files
- Introduce Simple API for quick Podman operations
- Add Podman machine management (init, start, list)
- Enhance Buildah integration with structured errors
- Define specific error types for Podman operations
- Update documentation and add comprehensive demo script
This commit is contained in:
Mahmoud-Emad
2025-08-27 13:10:53 +03:00
parent db9d2b5a0a
commit 9d79b6f2e2
15 changed files with 1723 additions and 886 deletions

239
examples/virt/podman/podman.vsh Executable file
View File

@@ -0,0 +1,239 @@
#!/usr/bin/env -S v -n -w -enable-globals run
import freeflowuniverse.herolib.virt.podman
import freeflowuniverse.herolib.installers.virt.podman as podman_installer
import freeflowuniverse.herolib.ui.console
console.print_header('🐳 Comprehensive Podman Module Demo')
console.print_stdout('This demo showcases both Simple API and Factory API approaches')
console.print_stdout('Note: This demo requires podman to be available or will install it automatically')
// =============================================================================
// SECTION 1: INSTALLATION
// =============================================================================
console.print_header('📦 Section 1: Podman Installation')
console.print_stdout('Installing podman automatically...')
if mut installer := podman_installer.get() {
installer.install() or {
console.print_stdout(' Podman installation failed (may already be installed): ${err}')
}
console.print_stdout(' Podman installation step completed')
} else {
console.print_stdout(' Failed to get podman installer, continuing with demo...')
}
// =============================================================================
// SECTION 2: SIMPLE API DEMONSTRATION
// =============================================================================
console.print_header('🚀 Section 2: Simple API Functions')
console.print_stdout('The Simple API provides direct functions for quick operations')
// Ensure podman machine is available before using Simple API
console.print_stdout('Ensuring podman machine is available...')
podman.ensure_machine_available() or {
console.print_stdout(' Failed to ensure podman machine: ${err}')
console.print_stdout('Continuing with demo - some operations may fail...')
}
// Test 2.1: List existing containers and images
console.print_stdout('\n📋 2.1 Listing existing resources...')
containers := podman.list_containers(true) or {
console.print_stdout(' Failed to list containers: ${err}')
[]podman.PodmanContainer{}
}
console.print_stdout('Found ${containers.len} containers (including stopped)')
images := podman.list_images() or {
console.print_stdout(' Failed to list images: ${err}')
[]podman.PodmanImage{}
}
console.print_stdout('Found ${images.len} images')
// Test 2.2: Run a simple container
console.print_debug('\n🏃 2.2 Running a container with Simple API...')
options := podman.RunOptions{
name: 'simple-demo-container'
detach: true
remove: true // Auto-remove when stopped
env: {
'DEMO_MODE': 'simple_api'
'TEST_VAR': 'hello_world'
}
command: ['echo', 'Hello from Simple API container!']
}
container_id := podman.run_container('alpine:latest', options) or {
console.print_debug(' Failed to run container: ${err}')
console.print_debug('This might be due to podman not being available or image not found')
''
}
if container_id != '' {
console.print_debug(' Container started with ID: ${container_id[..12]}...')
console.print_debug('Waiting for container to complete...')
console.print_debug(' Container completed and auto-removed')
} else {
console.print_debug(' Container creation failed - continuing with demo...')
}
// Test 2.3: Error handling demonstration
console.print_debug('\n 2.3 Error handling demonstration...')
podman.run_container('nonexistent:image', options) or {
match err {
podman.ImageError {
console.print_debug(' Caught image error: ${err.msg()}')
}
podman.ContainerError {
console.print_debug(' Caught container error: ${err.msg()}')
}
else {
console.print_debug(' Caught other error: ${err.msg()}')
}
}
}
// =============================================================================
// SECTION 3: FACTORY API DEMONSTRATION
// =============================================================================
console.print_header('🏭 Section 3: Factory API Pattern')
console.print_debug('The Factory API provides advanced workflows and state management')
// Test 3.1: Create factory
console.print_debug('\n🔧 3.1 Creating PodmanFactory...')
if mut factory := podman.new(install: false, herocompile: false) {
console.print_debug(' PodmanFactory created successfully')
// Test 3.2: Advanced container creation
console.print_debug('\n📦 3.2 Creating container with advanced options...')
if container := factory.container_create(
name: 'factory-demo-container'
image_repo: 'alpine'
image_tag: 'latest'
command: 'sh -c "echo Factory API Demo && sleep 2 && echo Container completed"'
memory: '128m'
cpus: 0.5
env: {
'DEMO_MODE': 'factory_api'
'CONTAINER_TYPE': 'advanced'
}
detach: true
remove_when_done: true
interactive: false
)
{
console.print_debug(' Advanced container created: ${container.name} (${container.id[..12]}...)')
// Test 3.3: Container management
console.print_debug('\n🎛 3.3 Container management operations...')
// Load current state
factory.load() or { console.print_debug(' Failed to load factory state: ${err}') }
// List containers through factory
factory_containers := factory.containers_get(name: '*demo*') or {
console.print_debug(' No demo containers found: ${err}')
[]&podman.Container{}
}
console.print_debug('Found ${factory_containers.len} demo containers through factory')
console.print_debug('Waiting for factory container to complete...')
} else {
console.print_debug(' Failed to create container: ${err}')
}
// Test 3.4: Builder Integration (if available)
console.print_debug('\n🔨 3.4 Builder Integration (Buildah)...')
if mut builder := factory.builder_new(
name: 'demo-app-builder'
from: 'alpine:latest'
delete: true
)
{
console.print_debug(' Builder created: ${builder.containername}')
// Simple build operations
builder.run('apk add --no-cache curl') or {
console.print_debug(' Failed to install packages: ${err}')
}
builder.run('echo "echo Hello from built image" > /usr/local/bin/demo-app') or {
console.print_debug(' Failed to create app: ${err}')
}
builder.run('chmod +x /usr/local/bin/demo-app') or {
console.print_debug(' Failed to make app executable: ${err}')
}
// Configure and commit
builder.set_entrypoint('/usr/local/bin/demo-app') or {
console.print_debug(' Failed to set entrypoint: ${err}')
}
builder.commit('demo-app:latest') or {
console.print_debug(' Failed to commit image: ${err}')
}
console.print_debug(' Image built and committed: demo-app:latest')
// Run container from built image
if built_container_id := factory.create_from_buildah_image('demo-app:latest',
podman.ContainerRuntimeConfig{
name: 'demo-app-container'
detach: true
remove: true
})
{
console.print_debug(' Container running from built image: ${built_container_id[..12]}...')
} else {
console.print_debug(' Failed to run container from built image: ${err}')
}
// Cleanup builder
factory.builder_delete('demo-app-builder') or {
console.print_debug(' Failed to delete builder: ${err}')
}
} else {
console.print_debug(' Failed to create builder (buildah may not be available): ${err}')
}
} else {
console.print_debug(' Failed to create podman factory: ${err}')
console.print_debug('This usually means podman is not installed or not accessible')
console.print_debug('Skipping factory API demonstrations...')
}
// =============================================================================
// DEMO COMPLETION
// =============================================================================
console.print_header('🎉 Demo Completed Successfully!')
console.print_debug('This demo demonstrated the independent podman module:')
console.print_debug(' Automatic podman installation')
console.print_debug(' Simple API functions (run_container, list_containers, list_images)')
console.print_debug(' Factory API pattern (advanced container creation)')
console.print_debug(' Buildah integration (builder creation, image building)')
console.print_debug(' Seamless podman-buildah workflows')
console.print_debug(' Comprehensive error handling with module-specific types')
console.print_debug(' Module independence (no shared dependencies)')
console.print_debug('')
console.print_debug('Key Features:')
console.print_debug(' 🔒 Self-contained module with own error types')
console.print_debug(' 🎯 Two API approaches: Simple functions & Factory pattern')
console.print_debug(' 🔧 Advanced container configuration options')
console.print_debug(' 🏗 Buildah integration for image building')
console.print_debug(' 📦 Ready for open source publication')
console.print_debug('')
console.print_debug('The podman module provides both simple and advanced APIs')
console.print_debug('for all your container management needs! 🐳')