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 Connection object 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 Connection instance 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:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →