Skip to content

Commit b749989

Browse files
Merge pull request #131 from cubewise-code/fix/use-keyring-tm1-integration
Fix use_keyring support in build command and TM1 integration
2 parents 4b55eaf + cbda118 commit b749989

4 files changed

Lines changed: 41 additions & 12 deletions

File tree

src/rushti/commands.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from TM1py import TM1Service
2323

2424
from rushti.settings import load_settings
25+
from rushti.tm1_integration import resolve_tm1_params
2526
from rushti.stats import create_stats_database
2627
from rushti.taskfile import TaskfileSource
2728
from rushti.taskfile_ops import (
@@ -106,8 +107,7 @@ def run_build_command(argv: list) -> None:
106107

107108
print(f"Connecting to TM1 instance: {args.tm1_instance}")
108109
try:
109-
params = dict(config[args.tm1_instance])
110-
params.pop("session_context", None)
110+
params = resolve_tm1_params(config, args.tm1_instance)
111111
tm1 = TM1Service(**params)
112112
except Exception as e:
113113
print(f"Error connecting to TM1: {e}")

src/rushti/execution.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@
2222
from pathlib import Path
2323
from typing import Dict, List, Optional, Tuple, TYPE_CHECKING
2424

25-
import keyring
2625
from TM1py import TM1Service
2726
from TM1py.Exceptions import TM1pyTimeout
2827

2928
from rushti.task import Task, OptimizedTask
3029
from rushti.dag import DAG
30+
from rushti.tm1_integration import resolve_tm1_params
3131
from rushti.messages import (
3232
MSG_PROCESS_EXECUTE,
3333
MSG_PROCESS_SUCCESS,
@@ -174,11 +174,6 @@ def setup_tm1_services(
174174
# handle default values from configparser
175175
if tm1_server_name != config.default_section:
176176
try:
177-
use_keyring = config.getboolean(tm1_server_name, "use_keyring", fallback=False)
178-
if use_keyring:
179-
password = keyring.get_password(tm1_server_name, params.get("user"))
180-
params["password"] = password
181-
182177
connection_file = config.get(tm1_server_name, "connection_file", fallback=None)
183178

184179
# restore connection from file. In practice faster than creating a new one
@@ -199,9 +194,9 @@ def setup_tm1_services(
199194

200195
# case no connection file provided or connection file expired
201196
if tm1_server_name not in tm1_services:
202-
params.pop("session_context", None)
197+
resolved_params = resolve_tm1_params(config, tm1_server_name)
203198
tm1_services[tm1_server_name] = TM1Service(
204-
**params,
199+
**resolved_params,
205200
session_context=session_context,
206201
connection_pool_size=max_workers,
207202
)

src/rushti/tm1_integration.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,39 @@
7171
]
7272

7373

74+
def resolve_tm1_params(config: configparser.ConfigParser, instance_name: str) -> dict:
75+
"""Resolve TM1 connection params from config, handling use_keyring and cleanup.
76+
77+
Reads the raw config section, resolves the password via keyring if
78+
``use_keyring`` is enabled, and strips non-TM1Service params so the
79+
result can be passed directly to ``TM1Service(**params)``.
80+
81+
:param config: Parsed ConfigParser with TM1 instance sections
82+
:param instance_name: Section name in the config
83+
:return: Clean dict of kwargs suitable for TM1Service
84+
"""
85+
params = dict(config[instance_name])
86+
87+
use_keyring_flag = config.getboolean(instance_name, "use_keyring", fallback=False)
88+
if use_keyring_flag:
89+
import keyring
90+
91+
password = keyring.get_password(instance_name, params.get("user"))
92+
if password:
93+
params["password"] = password
94+
else:
95+
logger.warning(
96+
f"use_keyring is enabled for '{instance_name}' but no password found in keyring"
97+
)
98+
99+
# Remove params that are not TM1Service kwargs
100+
params.pop("use_keyring", None)
101+
params.pop("session_context", None)
102+
params.pop("connection_file", None)
103+
104+
return params
105+
106+
74107
def connect_to_tm1_instance(
75108
instance_name: str,
76109
config_path: str,
@@ -96,8 +129,7 @@ def connect_to_tm1_instance(
96129
)
97130

98131
try:
99-
params = dict(config[instance_name])
100-
params.pop("session_context", None)
132+
params = resolve_tm1_params(config, instance_name)
101133
tm1 = TM1Service(**params)
102134
logger.info(f"Connected to TM1 instance: {instance_name}")
103135
return tm1

tests/unit/test_tm1_integration.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ def test_connect_success(self, mock_tm1_service, mock_config_parser):
124124
"user": "admin",
125125
"password": "apple",
126126
}
127+
mock_config.getboolean.return_value = False
128+
mock_config.get.return_value = None
127129
mock_config_parser.return_value = mock_config
128130

129131
# Setup mock TM1Service

0 commit comments

Comments
 (0)