Skip to content

Commit d609204

Browse files
committed
Enhanced configuration management
1 parent 6ee1b6b commit d609204

File tree

2 files changed

+101
-11
lines changed

2 files changed

+101
-11
lines changed

mpqp/config.py

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@
6363
ibm = None
6464
aws = None
6565
qlm = None
66+
__active_profile: str = ""
67+
68+
69+
class ConfigError(ValueError):
70+
"""Raised any time an error occurs at configuration level."""
6671

6772

6873
def load(configFile: str | None = None):
@@ -100,4 +105,84 @@ def load(configFile: str | None = None):
100105
qlm = data['QLM'] if 'QLM' in data.keys() else None
101106

102107

103-
use_profile = None
108+
def is_loaded(provider: str | None = None):
109+
return (data != None) and (
110+
(provider.upper() in data.keys()) if (provider != None) else True
111+
)
112+
113+
114+
def get_active_profile() -> str:
115+
return __active_profile
116+
117+
118+
def unset_active_profile():
119+
__active_profile = ""
120+
121+
122+
def is_set_active_profile(provider: str | None = None):
123+
if is_loaded(provider) and __active_profile:
124+
if provider != None:
125+
if provider.upper() != __active_profile.split("|")[0]:
126+
raise ConfigError(
127+
"Active profile \"%s\" is not valid for given provider \"%s\""
128+
% (__active_profile, provider.upper())
129+
)
130+
else:
131+
return True
132+
else:
133+
return True
134+
else:
135+
return False
136+
137+
138+
def set_active_profile(profile_name: str, provider: str | None = None) -> None:
139+
global __active_profile
140+
141+
if not is_loaded(provider):
142+
raise ConfigError(
143+
"No configuration file loaded. Try \"config.load()\" at first."
144+
)
145+
146+
if provider is not None:
147+
if (
148+
provider.upper()
149+
not in data.keys() # pyright: ignore[reportOptionalMemberAccess]
150+
):
151+
raise ConfigError("Unknown provider \"%s\"" % provider)
152+
else:
153+
if profile_name not in data[provider.upper()]["profile"]:
154+
raise ConfigError(
155+
"Unknown profile name \"%s\" for provider \"%s\""
156+
% (profile_name, provider)
157+
)
158+
else:
159+
__active_profile = provider.upper() + "|" + profile_name
160+
else:
161+
# If names of profiles are unique across all providers,
162+
# it is enough to give only the profile name.
163+
__active_profile = ""
164+
165+
for key_provider in data.keys(): # pyright: ignore[reportOptionalMemberAccess]
166+
if profile_name in data[key_provider]["profile"].keys():
167+
__active_profile = key_provider + "|" + profile_name
168+
break
169+
170+
if not __active_profile:
171+
raise ConfigError(
172+
"Could not find profile name \"%s\" across all providers \"%s\""
173+
% (
174+
profile_name,
175+
str(data.keys()), # pyright: ignore[reportOptionalMemberAccess]
176+
)
177+
)
178+
__logger.info("Active profile set to \"%s\"" % __active_profile)
179+
180+
181+
def get_active_profile_data():
182+
"""Warning : This function does not perform any check. You are supposed to perform
183+
these checks before : configuration loaded, existing profile and profile
184+
corresponding to desired provider
185+
186+
"""
187+
provider, profile_name = __active_profile.split("|")
188+
return data[provider]["profile"][profile_name]

mpqp/execution/connection/ibm_connection.py

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -116,23 +116,28 @@ def get_QiskitRuntimeService() -> "QiskitRuntimeService":
116116

117117
global Runtime_Service
118118
if Runtime_Service is None:
119-
if get_env_variable("IBM_CONFIGURED") == "False" and config.data == None:
119+
if get_env_variable("IBM_CONFIGURED") == "False" and (
120+
not config.is_loaded("ibm")
121+
):
120122
raise IBMRemoteExecutionError(
121123
"Error when instantiating QiskitRuntimeService. No IBM account configured."
122124
)
123125
try:
124-
proxy = None
125-
126-
if "proxy" in config.ibm[config.use_profile].keys():
127-
proxy = {}
128-
for key in ["urls", "username_ntlm", "password_ntlm"]:
129-
if key in config.ibm[config.use_profile]['proxy'].keys():
130-
proxy[key] = config.ibm[config.use_profile]['proxy'][key]
126+
ibm_profile = (
127+
config.get_active_profile_data()
128+
if config.is_set_active_profile("IBM")
129+
else None
130+
)
131131

132132
Runtime_Service = QiskitRuntimeService(
133133
channel="ibm_quantum",
134-
token=config.ibm[config.use_profile]['token'],
135-
proxies=proxy,
134+
token=ibm_profile['token'],
135+
proxies=(
136+
ibm_profile["proxy"]
137+
if "proxy"
138+
in ibm_profile.keys() # pyright: ignore[reportOptionalMemberAccess]
139+
else None
140+
),
136141
)
137142
except Exception as err:
138143
raise IBMRemoteExecutionError(

0 commit comments

Comments
 (0)