Podman API: Difference between revisions
Created page with "<nowiki>##</nowiki> Configuration <nowiki>###</nowiki> 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) <nowiki>##</nowiki> Custom Exceptions <nowiki>**</nowiki>PodmanAPIError(message, status_code=500)** Custom exception for API errors with HTTP status codes. <nowiki>##</nowiki> Decorato..." |
No edit summary |
||
| Line 1: | Line 1: | ||
< | <span id="configuration"></span> | ||
== Configuration == | |||
< | <span id="config"></span> | ||
=== Config === | |||
Configuration class that loads settings from environment variables. | 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) | ||
- | <span id="custom-exceptions"></span> | ||
== Custom Exceptions == | |||
'''PodmanAPIError(message, status_code=500)''' Custom exception for API errors with HTTP status codes. | |||
<span id="decorators"></span> | |||
== 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 | |||
<span id="core-api-class"></span> | |||
=== 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). | |||
- | <span id="container-management"></span> | ||
== 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} | |||
Retrieves container logs. | |||
- Input: Container name, number of lines | |||
- Returns: {logs} | |||
Host Operations | Host Operations | ||
'''add_user(container_name, user_config)''' Creates a user inside a container. - Input: Container name, {username, password?, shell?} - Returns: {username, created} | |||
Creates a user inside a container. | |||
- Input: Container name, {username, password?, shell?} | |||
- Returns: {username, created} | |||
Creates a | '''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. | |||
< | <span id="error-handlers"></span> | ||
== 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 | |||
<span id="api-routes"></span> | |||
== 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. | |||
Adds a file to the container. Requires dest_path and content fields. | '''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. | |||
<span id="signal-handlers"></span> | |||
== 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 | |||
<span id="response-format"></span> | |||
== Response Format == | |||
< | |||
Successful requests will look like this: | Successful requests will look like this: | ||
<pre>{ | |||
"success": true, | |||
{ | "container|user|file|execution": { ... }, | ||
"timestamp": "ISO-8601-timestamp" | |||
}</pre> | |||
} | |||
Errors will look like this: | Errors will look like this: | ||
<pre>{ | |||
"success": false, | |||
{ | "error": { | ||
"message": "Error description", | |||
"code": 400, | |||
"type": "ErrorType" | |||
}, | |||
"timestamp": "ISO-8601-timestamp" | |||
}</pre> | |||
} | |||
Revision as of 13:28, 19 July 2025
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"
}