Skip to content

Added support for multiple user-specified applications to be run in integration tests - #168

Merged
bieryAtFnal merged 43 commits into
developfrom
kbiery/multi_ctrl_proc_support
Aug 21, 2026
Merged

Added support for multiple user-specified applications to be run in integration tests#168
bieryAtFnal merged 43 commits into
developfrom
kbiery/multi_ctrl_proc_support

Conversation

@bieryAtFnal

@bieryAtFnal bieryAtFnal commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Description

In response to a request from Emir for the ability to start a drunc-process-manager instance in addition to the drunc-unified-shell instance in an integration test, functionality has been added to the integrationtest infrastructure to support user-specified applications.

This new functionality is controlled by a new special variable that developers can include in their integtests. This new special variable is described in a new document in this repository. This document will eventually describe all of the special variables that can/should be used in integtests, and it can be viewed here.

These changes have been made in a largely backward-compatible way, so most existing regression/integration tests will not need to be changed. However, the status information that is passed back to the integtest/pytest "tests" now has information about all of the control applications that were run in the DAQ session, so integtests that inspect those results will now need to loop over the list of results instead of simply looking at a single status object.

The console output that users will see when they run an integtest with these changes is largely unchanged, but at a verbosity level of 4 or greater, users will now see information about the processes that are started and the commands that are sent to them.

These changes are correlated with the ones in DUNE-DAQ/drunc#997. The changes in the drunc repo include a new integtest that demonstrates multiple user-specified applications that are run in the DAQ session for the test.

One of the reasons for creating this PR in "draft" mode is that there are still some changes needed in the drunc/process_manager_test.py in order to get it to work.

Here are suggested commands for testing these changes:

DATE_PREFIX=`date '+%d%b'`
TIME_SUFFIX=`date '+%H%M'`

source /cvmfs/dunedaq.opensciencegrid.org/setup_dunedaq.sh
setup_dbt latest
dbt-create -n NFD_DEV_260805_A9 ${DATE_PREFIX}FDDevTest_${TIME_SUFFIX}
cd ${DATE_PREFIX}FDDevTest_${TIME_SUFFIX}/sourcecode

git clone https://github.com/DUNE-DAQ/daqsystemtest.git -b kbiery/multi_ctrl_proc_support

cd ..

cd pythoncode
git clone https://github.com/DUNE-DAQ/integrationtest.git -b kbiery/multi_ctrl_proc_support
git clone https://github.com/DUNE-DAQ/drunc.git -b kbiery/multi_ctrl_proc_support
cd ..

. ./env.sh
dbt-build -j 12
dbt-workarea-env

dunedaq_integtest_bundle.sh --verb 4 -r drunc

echo ""
echo -e "\U1F535 \U2705 Note that the new basic_multiapp_test integtest worked, but the process_manager_test did not. \U2705 \U1F535"
echo ""
echo ""

Type of change

  • New feature or enhancement (non-breaking change which adds functionality)

Testing checklist

  • Unit tests pass (e.g. dbt-build --unittest)
  • Minimal system quicktest passes (pytest -s minimal_system_quick_test.py)
  • Full set of integration tests pass (dunedaq_integtest_bundle.sh)

Further checks

  • Code is commented where needed, particularly in hard-to-understand areas

Kurt Biery and others added 27 commits July 26, 2026 14:24
…le_exclusions' into kbiery/multi_ctrl_proc_support
…grationtest_commandline.py (we now have full run control console output stored in log files).
… to help make their meaning and use more clear; also cleaned up the code and comments a little bit.
…cts like filenames, preferring names of applications instead, since they are more durable.
…sed to all apps that support them, not just the unified shell.
…culating parameterization combinations; removed the unneeded call to check_system_resources in create_config_files
Updated links and added code snippets for DAQ session ingredients.
…strings to InformationAboutSpecialVariables.md.
Comment on lines +90 to +92
cmd_set_1 = DAQCommandSet("drunc", dunerc_commands_1, CommandWaitParameters(style=CommandWaitStyle.ECHO))
cmd_set_2 = DAQCommandSet("pmshell", pmshell_command, CommandWaitParameters(style=CommandWaitStyle.TIME))
cmd_set_3 = DAQCommandSet("drunc", dunerc_commands_2, CommandWaitParameters(style=CommandWaitStyle.ECHO))

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you say a few words in the docs about what DAQCommandSet does and what CommandWaitParaameters refer to and their purpose? the command set looks quite self explanatory from the example but I'm still not sure what the CommandWaitParameters are for, especially the difference between ECHO and TIME

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added some explanation about CommandWaitParameters in the InformationAboutSpecialVariables.md documentation. Please let me know if this helps.

@PawelPlesniak

PawelPlesniak commented Aug 14, 2026

Copy link
Copy Markdown

I ran the tests with today's nightly, and the tests behaved as expected. The PM passed, but will be followed up with your PR

🔵 Starting test 1 of 11... 🔵
⮕ Running drunc/basic_multiapp_test.py ⬅
============================= test session starts ==============================
platform linux -- Python 3.12.12, pytest-9.0.2, pluggy-1.6.0
rootdir: /nfs/home/pplesnia/nightlyDev/NFD_DEV_260814_A9
plugins: anyio-4.12.1, integrationtest-4.0.0
collected 3 items

.venv/lib/python3.12/site-packages/drunc/integtest/basic_multiapp_test.py 

DEBUG: CPU count is 64, required number is 4, recommended number is 8
DEBUG: Free memory is 163.83 GB, required amount is 4, recommended amount is 6
DEBUG: Free disk space on "/tmp" is 19.340557098388672 GB, required amount is 1

----------------------------------------
*** Messages related to configuration generation have been suppressed ***
----------------------------------------


[integtest_proc_mgmt 11:46:17Z] Starting "['drunc-process-manager', 'ssh-standalone', '51957']" with process name "pm"...

[integtest_proc_mgmt 11:46:19Z] Starting "['drunc-process-manager-shell', 'grpc://localhost:51957']" with process name "pmshell"...

[integtest_proc_mgmt 11:46:21Z] Starting "['drunc-unified-shell', 'grpc://localhost:51957', '/tmp/pytest-of-pplesnia/pytest-468/config0/integtest-session-resolved.data.xml', 'smallfootprint', 'smallfootprint']" with process name "drunc"...

[integtest_proc_mgmt 11:46:23Z] Started 3 process(es).

[integtest_proc_mgmt 11:46:25Z] Sent command to pm: help
[integtest_proc_mgmt 11:46:27Z] Sent command to pmshell: help
[integtest_proc_mgmt 11:46:29Z] Sent command to drunc: help
[integtest_proc_mgmt 11:46:31Z] Sent command to drunc: boot
[integtest_proc_mgmt 11:46:31Z] Sent command to drunc: conf
[integtest_proc_mgmt 11:46:31Z] Sent command to drunc: start --run-number 101
[integtest_proc_mgmt 11:46:31Z] Sent command to drunc: wait 1
[integtest_proc_mgmt 11:46:31Z] Sent command to drunc: enable-triggers
[integtest_proc_mgmt 11:46:31Z] Sent command to drunc: wait 20
[integtest_proc_mgmt 11:46:31Z] Sent command to drunc: disable-triggers
[integtest_proc_mgmt 11:46:31Z] Sent command to drunc: echo '*** COMMAND HAS COMPLETED ***'
++++++++++ DAQ Session BEGIN ++++++++++
[drunc] [2026/08/14 11:46:31 UTC] INFO       process_manager_driver.py:123            drunc.process_manager_driver                       Booting session smallfootprint
[drunc] [2026/08/14 11:46:41 UTC] INFO       shell_utils.py:612                       drunc.controller.iface.shell_utils                 Running transition 'conf' on controller 'root-controller', targeting: 'root-controller'
[drunc] [2026/08/14 11:46:41 UTC] INFO       shell_utils.py:612                       drunc.controller.iface.shell_utils                 Running transition 'start' on controller 'root-controller', targeting: 'root-controller'
[drunc] [2026/08/14 11:46:42 UTC] INFO       commands.py:52                           drunc.controller.iface                             Command wait running for 1 seconds.
[drunc] [2026/08/14 11:46:43 UTC] INFO       shell_utils.py:612                       drunc.controller.iface.shell_utils                 Running transition 'enable_triggers' on controller 'root-controller', targeting: 'root-controller'
[drunc] [2026/08/14 11:46:44 UTC] INFO       shell_utils.py:281                       drunc.utils.ShellContext                           Current FSM status is running. Available transitions are disable-triggers, change-rate. Available sequence commands are shutdown, stop-run.
[drunc] [2026/08/14 11:46:44 UTC] INFO       commands.py:52                           drunc.controller.iface                             Command wait running for 20 seconds.
[drunc] [2026/08/14 11:47:04 UTC] INFO       shell_utils.py:612                       drunc.controller.iface.shell_utils                 Running transition 'disable_triggers' on controller 'root-controller', targeting: 'root-controller'
[integtest_proc_mgmt 11:47:04Z] Sent command to pmshell: ps
[integtest_proc_mgmt 11:47:06Z] Sent command to drunc: drain-dataflow
[integtest_proc_mgmt 11:47:06Z] Sent command to drunc: stop-trigger-sources
[integtest_proc_mgmt 11:47:06Z] Sent command to drunc: stop
[integtest_proc_mgmt 11:47:06Z] Sent command to drunc: wait 2
[integtest_proc_mgmt 11:47:06Z] Sent command to drunc: scrap
[integtest_proc_mgmt 11:47:06Z] Sent command to drunc: terminate
[integtest_proc_mgmt 11:47:06Z] Sent command to drunc: echo '*** COMMAND HAS COMPLETED ***'
[drunc] [2026/08/14 11:47:06 UTC] INFO       shell_utils.py:612                       drunc.controller.iface.shell_utils                 Running transition 'drain_dataflow' on controller 'root-controller', targeting: 'root-controller'
[drunc] [2026/08/14 11:47:06 UTC] INFO       shell_utils.py:612                       drunc.controller.iface.shell_utils                 Running transition 'stop_trigger_sources' on controller 'root-controller', targeting: 'root-controller'
[drunc] [2026/08/14 11:47:07 UTC] INFO       shell_utils.py:612                       drunc.controller.iface.shell_utils                 Running transition 'stop' on controller 'root-controller', targeting: 'root-controller'
[drunc] [2026/08/14 11:47:07 UTC] INFO       commands.py:52                           drunc.controller.iface                             Command wait running for 2 seconds.
[drunc] [2026/08/14 11:47:09 UTC] INFO       shell_utils.py:612                       drunc.controller.iface.shell_utils                 Running transition 'scrap' on controller 'root-controller', targeting: 'root-controller'
[drunc] [2026/08/14 11:47:11 UTC] INFO       shell_utils.py:281                       drunc.utils.ShellContext                           Current FSM status is initial. Available transitions are conf. Available sequence commands are start-run.
[pm] [2026/08/14 11:47:22 UTC] INFO       ssh_process_manager.py:324               drunc.process_manager.SSH_SHELL_process_manager    Process 'mlt' (session: 'smallfootprint', user: 'pplesnia') was terminated by the process manager through the remote pid. Reported exit code: 0.
[pm] [2026/08/14 11:47:22 UTC] INFO       ssh_process_manager.py:324               drunc.process_manager.SSH_SHELL_process_manager    Process 'dfo-01' (session: 'smallfootprint', user: 'pplesnia') was terminated by the process manager through the remote pid. Reported exit code: 0.
[pm] [2026/08/14 11:47:22 UTC] INFO       ssh_process_manager.py:324               drunc.process_manager.SSH_SHELL_process_manager    Process 'ru-det-conn-0' (session: 'smallfootprint', user: 'pplesnia') was terminated by the process manager through the remote pid. Reported exit code: 0.
[pm] [2026/08/14 11:47:22 UTC] INFO       ssh_process_manager.py:324               drunc.process_manager.SSH_SHELL_process_manager    Process 'df-01' (session: 'smallfootprint', user: 'pplesnia') was terminated by the process manager through the remote pid. Reported exit code: 0.
[pm] [2026/08/14 11:47:22 UTC] INFO       ssh_process_manager.py:324               drunc.process_manager.SSH_SHELL_process_manager    Process 'hsi-01' (session: 'smallfootprint', user: 'pplesnia') was terminated by the process manager through the remote pid. Reported exit code: 0.
[pm] [2026/08/14 11:47:22 UTC] INFO       ssh_process_manager.py:324               drunc.process_manager.SSH_SHELL_process_manager    Process 'hsi-to-tc-app' (session: 'smallfootprint', user: 'pplesnia') was terminated by the process manager through the remote pid. Reported exit code: 0.
[pm] [2026/08/14 11:47:22 UTC] INFO       ssh_process_manager.py:324               drunc.process_manager.SSH_SHELL_process_manager    Process 'df-controller' (session: 'smallfootprint', user: 'pplesnia') was terminated by the process manager through the remote pid. Reported exit code: 0.
[pm] [2026/08/14 11:47:22 UTC] INFO       ssh_process_manager.py:324               drunc.process_manager.SSH_SHELL_process_manager    Process 'ru-controller' (session: 'smallfootprint', user: 'pplesnia') was terminated by the process manager through the remote pid. Reported exit code: 0.
[pm] [2026/08/14 11:47:22 UTC] INFO       ssh_process_manager.py:324               drunc.process_manager.SSH_SHELL_process_manager    Process 'hsi-controller' (session: 'smallfootprint', user: 'pplesnia') was terminated by the process manager through the remote pid. Reported exit code: 0.
[pm] [2026/08/14 11:47:22 UTC] INFO       ssh_process_manager.py:324               drunc.process_manager.SSH_SHELL_process_manager    Process 'trg-controller' (session: 'smallfootprint', user: 'pplesnia') was terminated by the process manager through the remote pid. Reported exit code: 0.
[pm] [2026/08/14 11:47:22 UTC] INFO       ssh_process_manager.py:324               drunc.process_manager.SSH_SHELL_process_manager    Process 'root-controller' (session: 'smallfootprint', user: 'pplesnia') was terminated by the process manager through the remote pid. Reported exit code: 0.
[integtest_proc_mgmt 11:47:22Z] Sent command to pm: exit
[integtest_proc_mgmt 11:47:24Z] Sent command to pmshell: exit
[integtest_proc_mgmt 11:47:26Z] Sent command to drunc: exit

The only comments I have are on the definition on some of the variables - I struggled to follow some of them. I will give an abridged discussion below.

For DAQSessionApp - I found this name somewhat confusing. This is currently used to specify the various control applications only. Is it likely to have a different application being deployed using this class? If not, I suggest renaming this to e.g. DAQControlApplication, as we already have a lot of ambiguous use of the term "session".

For CommandWaitParameters and CommandWaitStyle, I struggled to understand the use of these dataclasses, and how they are applied. Could you point me to the relevant information, and include it in the documentation?

Otherwise thank you for this, it looks like it will be very useful.

Kurt Biery and others added 10 commits August 16, 2026 17:50
…ability of the use of the exit command (sent to the apps).
…roc_mgmt.py, plus a couple nice-to-have changes.
Clarified the explanation of the ECHO wait style and its usage in command sets. Added details about the motivation for the CommandWaitParameters class and its supported wait styles.
Corrected spelling of 'strictly' and improved clarity in the explanation of the 'CommandWaitParameters' class.
added python code type for code snippets
Expanded explanation of CommandWaitParameters and wait styles in integration tests.
@bieryAtFnal

Copy link
Copy Markdown
Contributor Author

@PawelPlesniak , I've added some text about CommandWaitParameters in this section of the new document. Please let me know if that helps.
I'll look into the variable re-naming that you mentioned.
Thanks

@bieryAtFnal
bieryAtFnal marked this pull request as ready for review August 18, 2026 21:13
@bieryAtFnal

Copy link
Copy Markdown
Contributor Author

Here are updated instructions for testing these changes:

DATE_PREFIX=`date '+%d%b'`
TIME_SUFFIX=`date '+%H%M'`

source /cvmfs/dunedaq.opensciencegrid.org/setup_dunedaq.sh
setup_dbt latest
dbt-create -n NFD_DEV_260818_A9 ${DATE_PREFIX}FDDevTest_${TIME_SUFFIX}
cd ${DATE_PREFIX}FDDevTest_${TIME_SUFFIX}/sourcecode

git clone https://github.com/DUNE-DAQ/daqsystemtest.git -b kbiery/multi_ctrl_proc_support

cd ..

cd pythoncode
git clone https://github.com/DUNE-DAQ/integrationtest.git -b kbiery/multi_ctrl_proc_support
git clone https://github.com/DUNE-DAQ/drunc.git -b kbiery/multi_ctrl_proc_support
cd ..

. ./env.sh
dbt-build -j 12
dbt-workarea-env

source $DBT_AREA_ROOT/pythoncode/drunc/scripts/setup_drunc_config_path.sh

dunedaq_integtest_bundle.sh --verb 4 -r drunc

echo ""
echo -e "\U1F535 \U2705 Note that the drunc integtests worked, including the new basic_multiapp_test. \U2705 \U1F535"
echo ""
echo ""

@eflumerf

Copy link
Copy Markdown
Member

Does this preempt #167? Can similar functionality be performed with the CommandSets? (e.g. wait 20 seconds for the run to start, find a daq_application by its label, and send a kill SIGSTOP to it)

@bieryAtFnal

Copy link
Copy Markdown
Contributor Author

My sense is that this functionality does not overlap with #167...

This functionality is focused on sending application-supported commands into running instances of the applications. At the moment, it doesn't support the running of Linux-system-level commands like kill. I haven't thought about whether it could be tweaked to support that sort of thing...

@bieryAtFnal

Copy link
Copy Markdown
Contributor Author

@PawelPlesniak , I've renamed DAQSessionApp to DAQControlApplication...

@emmuhamm emmuhamm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this Kurt! I've left a couple of comments mainly targetted towards readability, but feature wise it all works as expected :)

I'll go through this again and the other PR I haven't gone through tomorrow as well

Comment thread src/integrationtest/async_proc_mgmt.py Outdated
Comment thread src/integrationtest/async_proc_mgmt.py Outdated
trimmed_line = decoded_line.strip()
if len(trimmed_line) == 0:
continue
if "ocumented" in trimmed_line:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this meant to be ocumented?

Comment thread src/integrationtest/async_proc_mgmt.py Outdated
should_be_printed = verbosity_level >= IntegtestVerbosityLevels.full_output

# check for errors and warnings for all verbosity levels
if should_be_printed == False:

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if should_be_printed == False:
if not should_be_printed:

Pythonic :) (very minor feel free to ignore)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In other news, there are several

if should_be_printed == False:
    ...
if should_be_printed == False:
    ...
if should_be_printed == False:
    ...

Should these be condensed into a single if statement instead?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually going through the code again, the logic is a tad bit tangled for my taste.

There is

  1. is checking if should_be_printed is above a level
  2. Several checks to flip the boolean
  3. Finally running the print if the boolean is true.

I think it can be separated more cleanly. One way to do this is to have several variables so that

check_1_pass = is printed above a certain level
check_2_pass = stuff in string
...

should_be_printed = any(check_1_pass, check_2_pass)

^^^ the above is pseudocode, theres a pythonic way of doing this.

But at least this way we can see that the logic is separated out and is easily extendable.

Of course theres other ways to refactorise this but this is one i can think of off the top of my head

Comment on lines 115 to 123
local_excl_string_map.setdefault("SSH_SHELL_process_manager", []).extend(
["LogLevel=error", r'key:\s+"DUNEDAQ_ERS_',
r"drunc.utils.ConnectivityServiceClient\s+404 Client Error: NOT FOUND for url:"]
)
local_excl_string_map.setdefault("drunc", []).extend(
local_excl_string_map.setdefault("drunc-unified-shell", []).extend(
["LogLevel=error", r'key:\s+"DUNEDAQ_ERS_', r"DUNEDAQ_ERS_.*erstrace", "export DUNEDAQ_ERS_",
r"NewConnectionError.* Failed to establish a new connection: \[Errno 111\] Connection refused",
r"drunc.utils.ConnectivityServiceClient\s+404 Client Error: NOT FOUND for url:"]
)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

some_dict = {
"SSH_SHELL_process_manager" : ["LogLevel=error", r'key:\s+"DUNEDAQ_ERS_',
             r"drunc.utils.ConnectivityServiceClient\s+404 Client Error: NOT FOUND for url:"],

# (and so onfor drunc-unified-shell and drunc-process-manager-shell)
}

...


for app, extensions in some_dict.items():
    local_excl_string_map.setdefault(app, []).extend(extensions)

Mainly because:

  1. its more legible
  2. in the context of making drunc more service-based, I imagine there will be much more apps that will need to be added here when the time comes. Im already aware of the session manager shell slowly coming into existence, and maybe the resource manager, and also the dune rc shell (?), so making this as simple to extend is beneficial

@bieryAtFnal

Copy link
Copy Markdown
Contributor Author

Hi @emmuhamm ,
I have

  • removed the line of code that was commented out
  • improved the checking for lines that have substrings like "Documented commands" or "Undocumented commands" in them
  • improved the tests on the value of the should_be_printed variable, as you suggested.

For the different conditions that can cause a line to be printed, the current logic tries to be efficient and not run subsequent tests once one of the conditions determines that the line should be printed. Using multiple different booleans and or-ing them together at the end would not have the same efficiency. Are there other suggested patterns that preserve the efficiency?

For the suggested change in log_file_checks, are you suggesting that we just key off the short string "drunc" instead of having separate exclusion entries for "drunc-unified-shell" and "drunc-process-manager"?
Thanks,

@emmuhamm

Copy link
Copy Markdown
Member

Hi Kurt,

Thanks for this!

Are there other suggested patterns that preserve the efficiency?

Python or chains short circuit natively, so chaining them together would still retain the efficiency. So something like the following should work?

should_be_printed = (
    verbosity_level >= IntegtestVerbosityLevels.full_output
    or _is_error_or_warning(decoded_line)
    or (verbosity_level >= IntegtestVerbosityLevels.drunc_boot_terminate and _is_boot_terminate_msg(decoded_line))
    or (verbosity_level >= IntegtestVerbosityLevels.drunc_transitions and _is_transition_msg(decoded_line))
)

If the thing in the or block is long, it might be better wrapped in a lambda function / normal function defined elsewhere and called here for legibility.

In any case this is a legibility comment rather than a fundamental logic comment, so I'm happy either way.


For the suggested change in log_file_checks, are you suggesting that we just key off the short string "drunc" instead of having separate exclusion entries for "drunc-unified-shell" and "drunc-process-manager"?

No I dont think so, it might be better if we still have the separate exclusion entries for now until from drunc we're able to say with confidence everything behaves the same. To write the idea I had in more detail in a more pythonic way:

# always-applied exclusions
default_exclusion_map = {
    "drunc-unified-shell": ["Substate.*In error.*Endpoint"],
}

# only needed when DRUNC debug messages are enabled
debug_exclusion_map = {
    "SSH_SHELL_process_manager": [
        "LogLevel=error", r'key:\s+"DUNEDAQ_ERS_',
        r"drunc.utils.ConnectivityServiceClient\s+404 Client Error: NOT FOUND for url:",
    ],
    "drunc-unified-shell": [
        "LogLevel=error", r'key:\s+"DUNEDAQ_ERS_', r"DUNEDAQ_ERS_.*erstrace", "export DUNEDAQ_ERS_",
        r"NewConnectionError.* Failed to establish a new connection: \[Errno 111\] Connection refused",
        r"drunc.utils.ConnectivityServiceClient\s+404 Client Error: NOT FOUND for url:",
    ],
    "drunc-process-manager": [
        "LogLevel=error", r'key:\s+"DUNEDAQ_ERS_', r"DUNEDAQ_ERS_.*erstrace", "export DUNEDAQ_ERS_",
    ],
}

local_excl_string_map = copy.deepcopy(excluded_substring_map)

if verbosity_helper.compare_level(IntegtestVerbosityLevels.drunc_debug):
    for app, extensions in debug_exclusion_map.items():
        local_excl_string_map.setdefault(app, []).extend(extensions)

for app, extensions in default_exclusion_map.items():
    local_excl_string_map.setdefault(app, []).extend(extensions)

@bieryAtFnal

Copy link
Copy Markdown
Contributor Author

@emmuhamm ,
Thanks for the explanations, they definitely helped, and I understand what you are suggesting.

That said, I wonder if you would be OK with me/us leaving the code as it is today, and allowing me to take some time later to think about (and probably confer with others) about the readability of various options. Would that be OK?
Thanks

@emmuhamm emmuhamm left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh yeah of course, happy for this to go in as is!

@bieryAtFnal
bieryAtFnal merged commit 329e55a into develop Aug 21, 2026
@bieryAtFnal
bieryAtFnal deleted the kbiery/multi_ctrl_proc_support branch August 21, 2026 00:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants