OpenStack Connection Caching Strategy in connection.py: Performance and Implementation Guide
The connection caching strategy in mcp-openstack-ops uses a global, lazy-loaded cache to reuse OpenStack SDK Connection objects, eliminating redundant Keystone authentication and reducing API latency by 2–5× in long-running scripts.
The call518/mcp-openstack-ops repository implements a sophisticated connection caching strategy in src/mcp_openstack_ops/connection.py to optimize interactions with OpenStack clouds. By maintaining a single, validated Connection object across multiple operations, the library avoids the expensive overhead of repeated token requests and service catalog lookups that typically plague OpenStack SDK usage.
How the Connection Caching Strategy Works in connection.py
The implementation relies on a module-level singleton pattern combined with proactive token validation to ensure both performance and reliability.
Global Cache Declaration
At the module level, the code declares a private variable to hold the cached connection instance:
_connection_cache: Optional[connection.Connection] = None
This global variable in src/mcp_openstack_ops/connection.py serves as the single source of truth for the OpenStack connection throughout the process lifetime.
Cache Hit and Validation Logic
When get_openstack_connection() is invoked, the function first checks for an existing cached connection:
if _connection_cache is not None:
try:
_connection_cache.identity.get_token()
return _connection_cache
except Exception:
_connection_cache = None
The strategy validates the cached connection by calling identity.get_token(). If the token expired or the connection became invalid, the exception handler clears _connection_cache to None, triggering a fresh connection on the next iteration. This ensures the connection caching strategy gracefully handles token expiration without manual intervention.
Lazy Connection Creation
When the cache is empty or invalidated, the function performs a full connection setup:
_connection_cache = connection.Connection(
auth_url=os.environ["OS_AUTH_URL"],
username=os.environ["OS_USERNAME"],
password=os.environ["OS_PASSWORD"],
project_name=os.environ["OS_PROJECT_NAME"],
user_domain_name=os.environ["OS_USER_DOMAIN_NAME"],
project_domain_name=os.environ["OS_PROJECT_DOMAIN_NAME"],
)
This lazy initialization pattern ensures that expensive network operations only occur when absolutely necessary, and the resulting connection is immediately stored in the global cache for subsequent reuse.
Explicit Cache Reset
For testing scenarios or credential rotation, the module provides reset_connection_cache():
def reset_connection_cache():
global _connection_cache
_connection_cache = None
This helper allows developers to force a fresh connection without restarting the process, maintaining the flexibility of the caching strategy while preserving its performance benefits during normal operations.
Performance Impact of the Connection Caching Strategy
The connection caching strategy in connection.py delivers substantial performance improvements through several mechanisms:
- Eliminates redundant Keystone authentication – Creating a new
Connectionobject triggers a full authentication flow against the OpenStack Identity service, including token generation and service catalog retrieval. The cache reduces this to a single operation per process lifetime. - Reduces API call latency – Subsequent service operations (compute, network, volume) reuse the existing HTTP session and authentication headers from the cached connection, eliminating the setup overhead for every API interaction.
- Decreases Identity service load – By minimizing token requests, the strategy reduces load on the OpenStack Keystone service, which is particularly beneficial in scripts that iterate over hundreds of resources.
- Automatic recovery from expiration – The built-in token validation ensures that expired credentials trigger a fresh connection without requiring error-handling logic in calling code, preventing cascading failures in long-running applications.
In production scenarios, scripts that interact with multiple OpenStack services typically experience a 2–5× speedup compared to implementations that instantiate new connections for each operation.
Practical Code Examples
Basic Usage with Automatic Caching
The cache operates transparently during normal usage:
from mcp_openstack_ops.connection import get_openstack_connection
# First call: authenticates with Keystone and caches the connection
conn = get_openstack_connection()
# Subsequent calls: returns cached instance instantly
conn2 = get_openstack_connection()
assert conn is conn2 # True - same object returned
Forcing a Connection Refresh
When credentials change or for testing purposes:
from mcp_openstack_ops.connection import (
get_openstack_connection,
reset_connection_cache
)
# Clear the existing cache
reset_connection_cache()
# Next call creates a fresh connection with current environment variables
new_conn = get_openstack_connection()
Handling Token Expiration
The caching strategy automatically handles expired tokens:
from mcp_openstack_ops.connection import get_openstack_connection
# This works even if the previous token expired hours ago
conn = get_openstack_connection()
servers = list(conn.compute.servers()) # Automatically re-authenticates if needed
The internal validation logic in get_openstack_connection() checks token validity before returning the cached object, ensuring seamless recovery from authentication expiration without manual intervention.
Summary
The connection caching strategy in src/mcp_openstack_ops/connection.py implements a global, lazy-loaded singleton pattern that significantly optimizes OpenStack SDK interactions:
- Global module-level cache stores a single
Connectioninstance in_connection_cache - Token validation ensures cached connections are live before reuse, with automatic invalidation on expiration
- Lazy initialization defers expensive Keystone authentication until the first API call
- Explicit reset capability via
reset_connection_cache()enables testing and credential rotation - Performance gains of 2–5× in multi-operation scripts by eliminating redundant authentication overhead
Frequently Asked Questions
What happens when the OpenStack token expires?
When get_openstack_connection() detects an expired token, the internal validation logic catches the exception from identity.get_token(), sets _connection_cache to None, and creates a fresh connection with new credentials. This happens transparently without requiring the calling code to handle authentication errors.
How do I force a new connection in mcp-openstack-ops?
Call reset_connection_cache() to clear the global cache variable. The next invocation of get_openstack_connection() will instantiate a new Connection object using the current environment variables, allowing you to switch credentials or test different authentication scenarios without restarting your process.
Is the connection cache thread-safe?
The current implementation uses a simple global variable without explicit locking mechanisms. For multi-threaded applications, you should implement external synchronization or instantiate separate connections per thread, as the global cache pattern assumes single-threaded usage or external coordination.
Where is the connection caching strategy implemented?
The strategy is implemented in src/mcp_openstack_ops/connection.py within the call518/mcp-openstack-ops repository. This module defines the _connection_cache variable, the get_openstack_connection() function with token validation logic, and the reset_connection_cache() helper for cache management.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →