From 4ec3fdfdc0611aca55e26db98fbb49cd6b86455d Mon Sep 17 00:00:00 2001 From: kent paik Date: Fri, 15 Aug 2025 10:52:42 +0900 Subject: [PATCH 1/2] Fix: enforce singleton patten openstack connection --- src/openstack_mcp_server/tools/base.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/openstack_mcp_server/tools/base.py b/src/openstack_mcp_server/tools/base.py index 2ef633b..bc5f0e7 100644 --- a/src/openstack_mcp_server/tools/base.py +++ b/src/openstack_mcp_server/tools/base.py @@ -1,3 +1,5 @@ +import atexit + import openstack from openstack import connection @@ -10,18 +12,26 @@ class OpenStackConnectionManager: _connection: connection.Connection | None = None - # TODO: Try/Catch disconnection by token expired case @classmethod def get_connection(cls) -> connection.Connection: - """OpenStack Connection)""" + """OpenStack Connection""" if cls._connection is None: openstack.enable_logging(debug=config.MCP_DEBUG_MODE) cls._connection = openstack.connect(cloud=config.MCP_CLOUD_NAME) + atexit.register(cls._cleanup) return cls._connection - # TODO: Close connection + @classmethod + def _cleanup(cls) -> None: + """Cleanup method called at program exit""" + if cls._connection is not None: + cls._connection.close() + cls._connection = None + + +_openstack_connection_manager = OpenStackConnectionManager() def get_openstack_conn(): """Get OpenStack Connection""" - return OpenStackConnectionManager.get_connection() + return _openstack_connection_manager.get_connection() From cb7b285afec5f92f0f8192331d3f31cb90126610 Mon Sep 17 00:00:00 2001 From: kent paik Date: Tue, 19 Aug 2025 00:21:30 +0900 Subject: [PATCH 2/2] Remove: connection cleanup(Already support in opsntack SDK) --- src/openstack_mcp_server/tools/base.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/openstack_mcp_server/tools/base.py b/src/openstack_mcp_server/tools/base.py index bc5f0e7..03333ad 100644 --- a/src/openstack_mcp_server/tools/base.py +++ b/src/openstack_mcp_server/tools/base.py @@ -1,5 +1,3 @@ -import atexit - import openstack from openstack import connection @@ -18,16 +16,8 @@ def get_connection(cls) -> connection.Connection: if cls._connection is None: openstack.enable_logging(debug=config.MCP_DEBUG_MODE) cls._connection = openstack.connect(cloud=config.MCP_CLOUD_NAME) - atexit.register(cls._cleanup) return cls._connection - @classmethod - def _cleanup(cls) -> None: - """Cleanup method called at program exit""" - if cls._connection is not None: - cls._connection.close() - cls._connection = None - _openstack_connection_manager = OpenStackConnectionManager()