Skip to content

Commit 243d44f

Browse files
Merge pull request #65 from DUNE-DAQ/emmuhamm/demonstrator-env-injector
Add safe env injector in logging demonstrator
2 parents 0631190 + 7a33154 commit 243d44f

1 file changed

Lines changed: 79 additions & 12 deletions

File tree

src/daqpytools/apps/logging_demonstrator.py

Lines changed: 79 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22
import os
33
import time
4+
from collections.abc import Mapping
45

56
import click
67
from rich.traceback import install as rich_traceback_install
@@ -40,6 +41,56 @@ def validate_test_configuration(
4041

4142

4243

44+
class EnvInjector:
45+
"""Manage temporary overrides for ERS-related environment variables."""
46+
47+
def __init__(self, ers_envs: Mapping[str, str]) -> None:
48+
"""Initialize handler state and capture original environment values.
49+
50+
Args:
51+
ers_envs (Mapping[str, str]): Environment variables and values to inject.
52+
"""
53+
self.update_ers_envs(ers_envs)
54+
self.update_original_envs()
55+
56+
def return_original_envs(self) -> dict[str, str | None]:
57+
"""Return current values for tracked environment variables.
58+
59+
Returns:
60+
dict[str, str | None]: Mapping of variable names to their current values,
61+
or None if unset.
62+
"""
63+
return {
64+
key: os.environ.get(key)
65+
for key in self.ers_envs
66+
}
67+
68+
def update_original_envs(self) -> None:
69+
"""Store a snapshot of current values for tracked environment variables."""
70+
self.ori_envs = self.return_original_envs()
71+
72+
def update_ers_envs(self, ers_envs: Mapping[str, str]) -> None:
73+
"""Update the environment variables managed by this handler.
74+
75+
Args:
76+
ers_envs (Mapping[str, str]): Variables and values to manage.
77+
"""
78+
self.ers_envs = dict(ers_envs)
79+
80+
def inject_ers_envs(self) -> None:
81+
"""Inject managed environment variable values into process environment."""
82+
for key, value in self.ers_envs.items():
83+
os.environ[key] = value
84+
85+
def restore_original_envs(self) -> None:
86+
"""Restore tracked environment variables to their original values."""
87+
for var_name, original_value in self.ori_envs.items():
88+
if original_value is None:
89+
os.environ.pop(var_name, None)
90+
else:
91+
os.environ[var_name] = original_value
92+
93+
4394
def test_main_functions(main_logger:logging.Logger) -> None:
4495
"""Demonstrates the main functionality of the daqpytools logger.
4596
@@ -193,17 +244,20 @@ def test_handlerconf(main_logger: logging.Logger) -> None:
193244
main_logger.warning("Handlerconf Base", extra=handlerconf.Base)
194245
main_logger.warning("Handlerconf Opmon", extra=handlerconf.Opmon)
195246

196-
#* Interlude: Inject sample environment variables
197-
os.environ["DUNEDAQ_ERS_WARNING"] = "erstrace,throttle,lstdout"
198-
os.environ["DUNEDAQ_ERS_INFO"] = "erstrace,throttle,lstdout"
199-
os.environ["DUNEDAQ_ERS_FATAL"] = "erstrace,lstdout"
200-
os.environ["DUNEDAQ_ERS_ERROR"] = (
201-
"erstrace,"
202-
"throttle,"
203-
"lstdout,"
204-
"protobufstream(monkafka.cern.ch:30092)"
205-
)
206-
247+
ers_envs = {
248+
"DUNEDAQ_ERS_WARNING" : "erstrace,throttle,lstdout",
249+
"DUNEDAQ_ERS_INFO" : "erstrace,throttle,lstdout",
250+
"DUNEDAQ_ERS_FATAL" : "erstrace,lstdout",
251+
"DUNEDAQ_ERS_ERROR" : (
252+
"erstrace,"
253+
"throttle,"
254+
"lstdout,"
255+
"protobufstream(monkafka.cern.ch:30092)"
256+
)
257+
}
258+
env_injector = EnvInjector(ers_envs)
259+
env_injector.inject_ers_envs()
260+
207261
info_out = f"{os.getenv('DUNEDAQ_ERS_ERROR')=}"
208262
main_logger.info(info_out)
209263
critical_out = f"{os.getenv('DUNEDAQ_ERS_CRITICAL')=}"
@@ -226,6 +280,8 @@ def test_handlerconf(main_logger: logging.Logger) -> None:
226280
extra=handlerconf.ERS
227281
)
228282

283+
env_injector.restore_original_envs()
284+
229285

230286
def test_fallback_handlers(log_level: str) -> None:
231287
"""Demonstrate fallback handler behavior for a logger.
@@ -280,6 +336,15 @@ def test_ers_handler_configuration(log_level: str) -> None:
280336
os.environ["DUNEDAQ_ERS_FATAL"] = "lstderr,rich"
281337
os.environ["DUNEDAQ_ERS_ERROR"] = "rich"
282338

339+
ers_envs = {
340+
"DUNEDAQ_ERS_WARNING" : "rich",
341+
"DUNEDAQ_ERS_INFO" : "lstdout",
342+
"DUNEDAQ_ERS_FATAL" : "lstderr,rich",
343+
"DUNEDAQ_ERS_ERROR" : "rich"
344+
}
345+
env_injector = EnvInjector(ers_envs)
346+
env_injector.inject_ers_envs()
347+
283348
ers_logger: logging.Logger = get_daq_logger(
284349
logger_name="ers_logger",
285350
log_level=log_level,
@@ -294,9 +359,11 @@ def test_ers_handler_configuration(log_level: str) -> None:
294359

295360
ers_hc = LogHandlerConf(init_ers=True)
296361
ers_logger.info("ERS Info lstdout ", extra=ers_hc.ERS)
297-
ers_logger.warning("ERS error lstdout", extra=ers_hc.ERS)
362+
ers_logger.warning("ERS error rich", extra=ers_hc.ERS)
298363
ers_logger.critical("ERS critical lstderr + rich", extra=ers_hc.ERS)
299364

365+
env_injector.restore_original_envs()
366+
300367

301368
class AllOptionsCommand(click.Command):
302369
"""Parse the arguments passed and validate they are acceptable, otherwise print the

0 commit comments

Comments
 (0)