Podman API
## Configuration
### Config
Configuration class that loads settings from environment variables.
- MAX_WORKERS: Thread pool size (default: 10)
- DEBUG: Enable debug mode (default: False)
- REQUEST_TIMEOUT: Operation timeout in seconds (default: 30)
## Custom Exceptions
**PodmanAPIError(message, status_code=500)**
Custom exception for API errors with HTTP status codes.
## Decorators
**@handle_errors**
Decorator that catches exceptions and converts them to PodmanAPIError:
- Catches asyncio.TimeoutError → 408 Timeout
- Catches "not found" errors → 404 Not Found
- Catches other exceptions → 500 Internal Server Error
**@validate_json(required_fields=None)**
Decorator that validates JSON request data:
- Ensures request contains valid JSON
- Checks for required fields
- Returns 400 Bad Request if validation fails
### Core API Class
**PodmanAPI.__init__()**
Initializes the API with a thread pool executor.
**PodmanAPI._get_client()**
Returns a new Podman client instance.
**PodmanAPI._run_async(func, timeout=30)**
Executes a function asynchronously in the thread pool with timeout.
**PodmanAPI._handle_exec_result(result)**
Helper that normalizes exec_run results to (exit_code, output_string).
## Container Management
**create_container(config)**
Creates and starts a new container.
- Input: {image, name, command?, environment?, ports?, volumes?, user?}
- Returns: {id, name, status}
**start_container(name)**
Starts an existing container.
- Input: Container name
- Returns: {name, status}
**stop_container(name)**
Stops a running container.
- Input: Container name
- Returns: {name, status}
**remove_container(name, force=False)**
Removes a container.
- Input: Container name, force flag
- Returns: {name, removed}
**list_containers()**
Lists all containers (running and stopped).
- Returns: Array of {id, name, status, image}
**get_container_logs(name, tail=100)**
Retrieves container logs.
- Input: Container name, number of lines
- Returns: {logs}
Host Operations
**add_user(container_name, user_config)**
Creates a user inside a container.
- Input: Container name, {username, password?, shell?}
- Returns: {username, created}
**add_file(container_name, file_config)**
Creates a file inside a container.
- Input: Container name, {dest_path, content}
- Returns: {dest_path, size}
**execute_command(container_name, command, user=None)**
Executes a command inside a container.
- Input: Container name, command string, optional user
- Returns: {exit_code, output, success}
**shutdown()**
Gracefully shuts down the thread pool executor.
## Error Handlers
**handle_podman_error(error)**
Flask error handler for PodmanAPIError exceptions.
- Returns structured JSON error response with timestamp
**handle_internal_error(error)**
Flask error handler for 500 Internal Server Error.
- Logs error and returns generic error response
## API Routes
**POST /api/v1/containers**
Creates a new container. Requires image and name fields.
**POST /api/v1/containers/<name>/start**
Starts the specified container.
**POST /api/v1/containers/<name>/stop**
Stops the specified container.
**DELETE /api/v1/containers/<name>?force=bool**
Removes the specified container. Optional force parameter.
**GET /api/v1/containers**
Lists all containers.
**GET /api/v1/containers/<name>/logs?tail=int**
Gets container logs. Optional tail parameter (default: 100).
**POST /api/v1/containers/<name>/users**
Adds a user to the container. Requires username field.
**POST /api/v1/containers/<name>/files**
Adds a file to the container. Requires dest_path and content fields.
**POST /api/v1/containers/<name>/exec**
Executes a command in the container. Requires command field.
**GET /api/v1/health**
Health check endpoint. Returns Podman connection status.
**GET /api/v1/metrics**
Returns API metrics including uptime and thread pool status.
## Signal Handlers
**shutdown_handler(sig, frame)**
Handles SIGINT and SIGTERM signals for graceful shutdown.
- Logs signal details including source file and line number
- Shuts down thread pool and exits cleanly
## Response Format
Successful requests will look like this:
```
{
"success": true,
"container|user|file|execution": { ... },
"timestamp": "ISO-8601-timestamp"
}
```
Errors will look like this:
```
{
"success": false,
"error": {
"message": "Error description",
"code": 400,
"type": "ErrorType"
},
"timestamp": "ISO-8601-timestamp"
}
```