Workflow log gui tab - #14246
Conversation
There was a problem hiding this comment.
Pull request overview
Adds live workflow output to the experiment run dialog.
Changes:
- Adds an iteration-grouped workflow log with stdout, stderr, and status.
- Integrates a persistent Workflows tab into run monitoring.
- Adds unit and GUI workflow tests.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
src/ert/gui/experiments/run_dialog.py |
Handles workflow events and tab placement. |
src/ert/gui/experiments/view/__init__.py |
Exports the workflow widget. |
src/ert/gui/experiments/view/workflow_log.py |
Implements the workflow log UI. |
tests/ert/unit_tests/gui/experiments/test_run_dialog.py |
Tests run-dialog integration. |
tests/ert/unit_tests/gui/experiments/view/test_workflow_log_widget.py |
Tests widget behavior. |
tests/ert/ui_tests/gui/test_workflow_log_tab.py |
Tests the end-to-end GUI workflow. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| if isinstance(widget, WorkflowLogWidget): | ||
| return widget | ||
| workflow_log_widget = WorkflowLogWidget(self) | ||
| self._tab_widget.addTab(workflow_log_widget, "Workflows") |
|
Screenshots differ from baselines. A baseline update PR has been prepared: equinor/ert-testdata#91 |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## cancel-running-workflow #14246 +/- ##
=========================================================
Coverage 91.81% 91.81%
=========================================================
Files 486 487 +1
Lines 34908 35089 +181
=========================================================
+ Hits 32051 32218 +167
- Misses 2857 2871 +14
Flags with carried forward coverage won't be shown. Click here to find out more.
|
|
Screenshot tests now pass. The baseline update PR equinor/ert-testdata#91 has been closed. |
|
|
||
| self._iteration_selector = QComboBox(self) | ||
| self._iteration_selector.setObjectName("workflow_log_iteration_selector") | ||
| self._iteration_selector.currentIndexChanged.connect(self._on_iteration_changed) |
There was a problem hiding this comment.
why do we need a name here?
| @@ -0,0 +1,226 @@ | |||
| from __future__ import annotations | |||
There was a problem hiding this comment.
perhaps name the file workflow_log_widget?
There was a problem hiding this comment.
all the entries in this folder drop the widget suffix, so that is fine.
The question for me is whether to call it rather WorkflowLogInfoWidget -> workflow_log_info since workflow_log might not convey the exact info.
There was a problem hiding this comment.
Not all entries do. disk_space_widget.py, progress_widget.py ..
|
How does the screenshot look on redhat? |
4fb418c to
d8733ab
Compare
|
Screenshots differ from baselines. A baseline update PR has been prepared: equinor/ert-testdata#99 |
| # If the current tab is the last dynamic tab, | ||
| # we want to keep it selected after adding a new tab. | ||
| last_index = self._tab_widget.count() - 1 | ||
| was_on_latest_dynamic_tab = ( |
There was a problem hiding this comment.
Not sure I understand what was_on_latest_dynamic_tab means?
d8733ab to
7f80532
Compare
|
Screenshot tests now pass. The baseline update PR equinor/ert-testdata#99 has been closed. |
7f80532 to
47fbfe5
Compare
47fbfe5 to
4b1d0a8
Compare
4b1d0a8 to
952730b
Compare
952730b to
9f19b27
Compare
Workflow stdout/stderr is captured and emitted as WorkflowEvent, but so far it could only be read from the log files on disk. WorkflowLogWidget renders those events as one row per job invocation, filtered by an iteration selector, with the full stdout and stderr of the selected job shown below the table. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The run dialog now consumes WorkflowEvent and lazily adds a Workflows tab on the first event, so experiments without workflows are unaffected. The tab is not brought to the front, to avoid interrupting a user watching realization progress. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Drop five setObjectName calls in WorkflowLogWidget that nothing reads (unlike progress_widget's, which test_legend.py looks up), and the object_name parameter that only existed to support them. Rename was_on_latest_dynamic_tab to follow_new_tab and fix its comment, which claimed we "keep it selected" while the code actually selects the newly added tab. Document the live Workflows tab in the run dialog, which was the one part of this feature with no user-facing docs. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
9f19b27 to
58ae7fc
Compare

Issue
Resolves #14091
Approach
Create new tab in run experiment view for showing workflow output. Aligned with iteration selector, with dropdown for selecting groups of workflows
Consumes workflow events
(Screenshot of new behavior in GUI if applicable)

git rebase -i main --exec 'just rapid-tests')When applicable
merge screenshot-PR in ert-testdata before merging this PR.