`InfrastructureProvider.execute_command_parallel` (`providers/base.py`) has no `ignore_errors` parameter, unlike `execute_command`. `CloudLabProvider`'s implementation never surfaces remote failures here anyway (`utils.run_on_cloudlab_nodes_in_parallel` calls `.wait()` on each SSH `Popen` without checking the return code), so callers like `DeathstarService.stop()` / `FlinkService.stop_all_jobs()` rely on this being implicitly always-ignore — they call `.stop()` unconditionally as best-effort teardown regardless of whether that component was ever used in the run.
`LocalProvider.execute_command`'s `popen=True` branch (#424) currently swallows `OSError` (e.g. missing `cmd_dir`) unconditionally to match that implicit behavior, since there's no parameter to gate it on. Once this is fixed, that swallow should become conditional on the new `ignore_errors` parameter (mirroring the `popen=False` branch) instead of always-on.
Add `ignore_errors: bool = False` to `execute_command_parallel`'s signature, wire it through `CloudLabProvider`/`LocalProvider`/`CloudLabLocalProvider`, and update `LocalProvider.execute_command`'s `popen=True` exception handling to respect it.
`InfrastructureProvider.execute_command_parallel` (`providers/base.py`) has no `ignore_errors` parameter, unlike `execute_command`. `CloudLabProvider`'s implementation never surfaces remote failures here anyway (`utils.run_on_cloudlab_nodes_in_parallel` calls `.wait()` on each SSH `Popen` without checking the return code), so callers like `DeathstarService.stop()` / `FlinkService.stop_all_jobs()` rely on this being implicitly always-ignore — they call `.stop()` unconditionally as best-effort teardown regardless of whether that component was ever used in the run.
`LocalProvider.execute_command`'s `popen=True` branch (#424) currently swallows `OSError` (e.g. missing `cmd_dir`) unconditionally to match that implicit behavior, since there's no parameter to gate it on. Once this is fixed, that swallow should become conditional on the new `ignore_errors` parameter (mirroring the `popen=False` branch) instead of always-on.
Add `ignore_errors: bool = False` to `execute_command_parallel`'s signature, wire it through `CloudLabProvider`/`LocalProvider`/`CloudLabLocalProvider`, and update `LocalProvider.execute_command`'s `popen=True` exception handling to respect it.