Skip to content

Commit 8da8ba1

Browse files
authored
Merge branch 'AcademySoftwareFoundation:master' into master
2 parents e717eae + 21b6c8e commit 8da8ba1

19 files changed

+188
-99
lines changed

.github/workflows/sonar-cloud-pipeline.yml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ jobs:
1414
ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true
1515
steps:
1616
- name: Checkout
17-
uses: actions/checkout@v3
17+
uses: actions/checkout@v4
1818
with:
19-
# Fetch all Git history, otherwise the current version number will
20-
# not be correctly calculated.
19+
fetch-tags: true
2120
fetch-depth: 0
2221

22+
- name: Mark repository as safe (Fix for https://github.com/actions/checkout/issues/1048)
23+
run: git config --global --add safe.directory $GITHUB_WORKSPACE
24+
2325
- name: Generate coverage report
2426
run: ci/python_coverage_report.sh
2527

@@ -37,7 +39,7 @@ jobs:
3739
ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true
3840
steps:
3941
- name: Checkout
40-
uses: actions/checkout@v3
42+
uses: actions/checkout@v4
4143
with:
4244
# Fetch all Git history, otherwise the current version number will
4345
# not be correctly calculated.

ci/python_coverage_report.sh

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,25 @@
22

33
set -e
44

5-
python -m pip install --user -r requirements.txt -r requirements_gui.txt
65
# Requirements for running the tests on the vfx-platform images
76
python -m pip install coverage pytest-xvfb
87

9-
# Protos need to have their Python code generated in order for tests to pass.
10-
python -m grpc_tools.protoc -I=proto/ --python_out=pycue/opencue/compiled_proto --grpc_python_out=pycue/opencue/compiled_proto proto/*.proto
11-
python -m grpc_tools.protoc -I=proto/ --python_out=rqd/rqd/compiled_proto --grpc_python_out=rqd/rqd/compiled_proto proto/*.proto
12-
python ci/fix_compiled_proto.py pycue/opencue/compiled_proto
13-
python ci/fix_compiled_proto.py rqd/rqd/compiled_proto
8+
pip install ./proto[test] \
9+
./pycue[test] \
10+
./pyoutline[test] \
11+
./cueadmin[test] \
12+
./cueman[test] \
13+
./cuegui[test] \
14+
./cuesubmit[test]
1415

1516
# Run coverage for each component individually, but append it all into the same report.
16-
python -m coverage run --source=pycue/opencue/,pycue/FileSequence/ --omit=pycue/opencue/compiled_proto/* pycue/tests/test_suite.py
17-
PYTHONPATH=pycue python -m coverage run -a --source=pyoutline/outline/ pyoutline/setup.py test
18-
PYTHONPATH=pycue python -m coverage run -a --source=cueadmin/cueadmin/ cueadmin/setup.py test
17+
python -m coverage run -m pytest ./pycue
18+
python -m coverage run -m pytest ./pyoutline
19+
python -m coverage run -m pytest ./cueadmin
20+
python -m coverage run -m pytest ./cueman
21+
python -m coverage run -m pytest ./cuesubmit
1922
# TODO: re-enable cuegui tests when xvfb-run gets configured to execute on the new vfx-platform
20-
# PYTHONPATH=pycue xvfb-run -d python -m coverage run -a --source=cuegui/cuegui/ cuegui/setup.py test
21-
PYTHONPATH=pycue:pyoutline python -m coverage run -a --source=cuesubmit/cuesubmit/ cuesubmit/setup.py test
22-
python -m coverage run -a --source=rqd/rqd/ --omit=rqd/rqd/compiled_proto/* rqd/setup.py test
23+
# python -m coverage run -m pytest ./cuegui
2324

2425
# SonarCloud needs the report in XML.
2526
python -m coverage xml

cuegui/cuegui/plugins/MonitorJobsPlugin.py

Lines changed: 30 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -275,59 +275,54 @@ def _buttonSetup(self, layout):
275275
self.grpDependentCb.stateChanged.connect(self.jobMonitor.setGroupDependent)
276276
# pylint: enable=no-member
277277

278-
finishedButton = QtWidgets.QPushButton(QtGui.QIcon(":eject.png"), "Finished")
279-
finishedButton.setToolTip("Unmonitor finished jobs")
280-
finishedButton.setFocusPolicy(QtCore.Qt.NoFocus)
281-
finishedButton.setFlat(True)
282-
layout.addWidget(finishedButton)
283-
finishedButton.clicked.connect(self.jobMonitor.removeFinishedItems) # pylint: disable=no-member
284-
285-
allButton = QtWidgets.QPushButton(QtGui.QIcon(":eject.png"), "All")
286-
allButton.setToolTip("Unmonitor all jobs")
287-
allButton.setFocusPolicy(QtCore.Qt.NoFocus)
288-
allButton.setFlat(True)
289-
layout.addWidget(allButton)
290-
allButton.clicked.connect(self.jobMonitor.removeAllItems) # pylint: disable=no-member
291-
292-
removeSelectedButton = QtWidgets.QPushButton(QtGui.QIcon(":eject.png"), "")
293-
removeSelectedButton.setToolTip("Unmonitor selected jobs")
294-
removeSelectedButton.setFocusPolicy(QtCore.Qt.NoFocus)
295-
removeSelectedButton.setFlat(True)
296-
layout.addWidget(removeSelectedButton)
297-
removeSelectedButton.clicked.connect(self.jobMonitor.actionRemoveSelectedItems) # pylint: disable=no-member
298-
299-
eatSelectedButton = QtWidgets.QPushButton(QtGui.QIcon(":eat.png"), "")
300-
eatSelectedButton.setToolTip("Eats all dead frames for selected jobs")
278+
# Create Unmonitor dropdown
279+
unmonitorCombo = QtWidgets.QComboBox()
280+
unmonitorCombo.setFocusPolicy(QtCore.Qt.NoFocus)
281+
unmonitorCombo.addItems(["Unmonitor", "All Jobs", "Finished Jobs", "Selected Jobs"])
282+
unmonitorCombo.setToolTip("Select jobs to unmonitor")
283+
284+
def handleUnmonitorSelection(index):
285+
if index == 1: # All Jobs
286+
self.jobMonitor.removeAllItems()
287+
elif index == 2: # Finished Jobs
288+
self.jobMonitor.removeFinishedItems()
289+
elif index == 3: # Selected Jobs
290+
self.jobMonitor.actionRemoveSelectedItems()
291+
# Reset to default selection after action
292+
unmonitorCombo.setCurrentIndex(0)
293+
294+
unmonitorCombo.currentIndexChanged.connect(handleUnmonitorSelection)
295+
layout.addWidget(unmonitorCombo)
296+
297+
eatSelectedButton = QtWidgets.QPushButton(QtGui.QIcon(":eat.png"), "Eat Dead Frames")
298+
eatSelectedButton.setToolTip(
299+
"Eats all dead frames for selected jobs to free scheduling resources")
301300
eatSelectedButton.setFocusPolicy(QtCore.Qt.NoFocus)
302-
eatSelectedButton.setFlat(True)
303301
layout.addWidget(eatSelectedButton)
304-
eatSelectedButton.clicked.connect(self.jobMonitor.actionEatSelectedItems) # pylint: disable=no-member
302+
eatSelectedButton.clicked.connect(
303+
self.jobMonitor.actionEatSelectedItems) # pylint: disable=no-member
305304

306-
retryButton = QtWidgets.QPushButton(QtGui.QIcon(":retry.png"), "")
305+
retryButton = QtWidgets.QPushButton(QtGui.QIcon(":retry.png"), "Retry Dead Frames")
307306
retryButton.setToolTip("Retries all dead frames for selected jobs")
308307
retryButton.setFocusPolicy(QtCore.Qt.NoFocus)
309-
retryButton.setFlat(True)
310308
layout.addWidget(retryButton)
311309
retryButton.clicked.connect(self.jobMonitor.actionRetrySelectedItems) # pylint: disable=no-member
312310

313-
killButton = QtWidgets.QPushButton(QtGui.QIcon(":kill.png"), "")
314-
killButton.setToolTip("Kill selected jobs")
311+
killButton = QtWidgets.QPushButton(QtGui.QIcon(":kill.png"), "Kill Jobs")
312+
killButton.setToolTip("Kill selected jobs and their running frames")
315313
killButton.setFocusPolicy(QtCore.Qt.NoFocus)
316-
killButton.setFlat(True)
317314
layout.addWidget(killButton)
318315
killButton.clicked.connect(self.jobMonitor.actionKillSelectedItems) # pylint: disable=no-member
319316

320-
pauseButton = QtWidgets.QPushButton(QtGui.QIcon(":pause.png"), "")
321-
pauseButton.setToolTip("Pause selected jobs")
317+
pauseButton = QtWidgets.QPushButton(QtGui.QIcon(":pause.png"), "Pause Jobs")
318+
pauseButton.setToolTip("Pause selected job")
322319
pauseButton.setFocusPolicy(QtCore.Qt.NoFocus)
323-
pauseButton.setFlat(True)
324320
layout.addWidget(pauseButton)
325321
pauseButton.clicked.connect(self.jobMonitor.actionPauseSelectedItems) # pylint: disable=no-member
326322

327-
unpauseButton = QtWidgets.QPushButton(QtGui.QIcon(":unpause.png"), "")
323+
unpauseButton = QtWidgets.QPushButton(QtGui.QIcon(":unpause.png"), "Unpause Jobs")
328324
unpauseButton.setToolTip("Unpause selected jobs")
329325
unpauseButton.setFocusPolicy(QtCore.Qt.NoFocus)
330-
unpauseButton.setFlat(True)
331326
layout.addWidget(unpauseButton)
332327
unpauseButton.clicked.connect(self.jobMonitor.actionResumeSelectedItems) # pylint: disable=no-member
333328

docs/_docs/index.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,23 @@ permalink: /docs/
4141

4242
---
4343

44+
<!-- OpenCue Walkthrough Video Section -->
45+
<section class="video-section" aria-labelledby="walkthrough-video-heading">
46+
<div class="video-container">
47+
<h2 id="walkthrough-video-heading" class="section-title">OpenCue Walkthrough Tutorial</h2>
48+
<div class="video-wrapper">
49+
<iframe
50+
src="https://www.youtube-nocookie.com/embed/v4i83ccrz5w"
51+
title="OpenCue Walkthrough - Submitting and Monitoring Render Jobs"
52+
frameborder="0"
53+
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
54+
allowfullscreen
55+
loading="lazy">
56+
</iframe>
57+
</div>
58+
</div>
59+
</section>
60+
4461
### [Quick starts](quick-starts)
4562

4663
Try OpenCue in the sandbox environment on different operating systems

docs/_docs/reference/CueGUI-app.md

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,30 +62,36 @@ CueGUI provides convenient copy buttons to quickly copy job, layer, and frame na
6262

6363
To copy a job name to the clipboard, right-click on a job in the *Monitor Jobs* view and select **Copy Job Name**. The exact job name will be copied to your clipboard.
6464

65-
![Copy Job Name context menu](/assets/images/cuegui/cuegui_copy_job_name.png)
65+
![Copy Job Name context menu](/assets/images/cuegui/cuetopia/cuegui_copy_job_name.png)
6666

6767
### Copying layer names
6868

6969
To copy a layer name, right-click on a layer in the job details view and select **Copy Layer Name**. This copies the layer name to your clipboard.
7070

71-
![Copy Layer Name context menu](/assets/images/cuegui/cuegui_copy_layer_name.png)
71+
![Copy Layer Name context menu](/assets/images/cuegui/cuetopia/cuegui_copy_layer_name.png)
7272

7373
### Copying frame names
7474

7575
To copy a frame name, right-click on a frame in the frame list and select **Copy Frame Name**. The frame name will be copied to your clipboard.
7676

77-
![Copy Frame Name context menu](/assets/images/cuegui/cuegui_copy_frame_name.png)
77+
![Copy Frame Name context menu](/assets/images/cuegui/cuetopia/cuegui_copy_frame_name.png)
7878

7979
All copy buttons use the same icon as the "Copy Log Path" feature for visual consistency. When multiple items are selected, all selected names will be copied to the clipboard separated by spaces.
8080

81-
## Managing frames
81+
## Managing frames and jobs
8282

83-
To manage frames, select one of the following:
83+
The Monitor Jobs toolbar provides action buttons for managing jobs and frames:
8484

85-
* **Retry** - Retrying a frame stops rendering and retries the frame on
86-
another proc.
87-
* **Eat** - Eating a frame stops rendering and doesn't try to continue
88-
processing the frame.
85+
* **Eat Dead Frames** - Eats all dead frames for selected jobs to free scheduling resources. Eating a frame stops rendering and marks it as complete without retrying.
86+
* **Retry Dead Frames** - Retries all dead frames for selected jobs. Retrying requeues failed frames to run again.
87+
* **Kill Jobs** - Kill selected jobs and their running frames. Stops all processing for the selected jobs.
88+
* **Pause Jobs** - Pause selected job. No new frames will start on paused jobs.
89+
* **Unpause Jobs** - Unpause selected jobs. Resumes processing of paused jobs.
90+
91+
Individual frame management options are also available through right-click context menus:
92+
93+
* **Retry** - Retrying a frame stops rendering and retries the frame on another proc.
94+
* **Eat** - Eating a frame stops rendering and doesn't try to continue processing the frame.
8995
* **Kill** - Killing a frame stops rendering and books to another proc.
9096

9197
## Rendering and staggering frames

docs/_docs/user-guides/cuetopia-monitoring-guide.md

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ This guide provides comprehensive documentation for Cuetopia, which includes the
3333

3434
The Monitor Jobs plugin is the primary interface for monitoring active and completed render jobs. It provides a comprehensive overview of all jobs with real-time status updates.
3535

36-
![Monitor Jobs Interface](/assets/images/cuegui/cuetopia_monitor_jobs.png)
36+
![Monitor Jobs Interface](/assets/images/cuegui/cuetopia/cuetopia_monitor_jobs.png)
3737

3838
### Interface Components
3939

@@ -63,15 +63,17 @@ The toolbar contains the following controls from left to right:
6363
- Groups jobs with dependencies together
6464
- Shows parent-child relationships in the tree view
6565

66-
7. **Action Buttons** (from left to right):
67-
- **Finished** (eject icon): Removes all finished jobs from monitoring
68-
- **All** (eject icon): Clears all jobs from the monitor
69-
- **Selected** (eject icon): Removes selected jobs
70-
- **Eat** (pac-man icon): Eats all dead frames in selected jobs
71-
- **Retry** (circular arrow): Retries all dead frames in selected jobs
72-
- **Kill** (X icon): Kills selected jobs
73-
- **Pause** (pause icon): Pauses selected jobs
74-
- **Unpause** (play icon): Resumes selected paused jobs
66+
7. **Unmonitor Dropdown**: A dropdown menu with options to remove jobs from monitoring:
67+
- **All Jobs**: Clears all jobs from the monitor
68+
- **Finished Jobs**: Removes all finished jobs from monitoring
69+
- **Selected Jobs**: Removes selected jobs
70+
71+
8. **Action Buttons** (from left to right):
72+
- **Eat Dead Frames** (pac-man icon): Eats all dead frames for selected jobs to free scheduling resources
73+
- **Retry Dead Frames** (circular arrow): Retries all dead frames for selected jobs
74+
- **Kill Jobs** (X icon): Kill selected jobs and their running frames
75+
- **Pause Jobs** (pause icon): Pause selected job
76+
- **Unpause Jobs** (play icon): Unpause selected jobs
7577

7678
### Job Table Columns
7779

@@ -139,7 +141,7 @@ Right-clicking on a job provides these actions:
139141

140142
The Monitor Job Details plugin provides detailed information about a selected job's layers and frames. It can be opened manually from the menu or appears automatically when you double-click a job in the Monitor Jobs view.
141143

142-
![Job Details Interface](/assets/images/cuegui/cuetopia_monitor_jobs_details.png)
144+
![Job Details Interface](/assets/images/cuegui/cuetopia/cuetopia_monitor_jobs_details.png)
143145

144146
### Layout Structure
145147

@@ -230,7 +232,7 @@ Frames are color-coded by status:
230232

231233
The Job Graph plugin provides a visual node-based representation of job layers and their dependencies.
232234

233-
![Job Graph Interface](/assets/images/cuegui/cuetopia_job_graph.png)
235+
![Job Graph Interface](/assets/images/cuegui/cuetopia/cuetopia_job_graph.png)
234236

235237
### Graph Features
236238

docs/_docs/user-guides/monitoring-jobs.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ The OS filter allows you to filter hosts based on their operating system:
157157
4. The host list updates to show only hosts matching the selected OS values
158158
5. Use the **Clear** option to remove all OS filters
159159

160-
![Monitor Hosts with OS Filter](/assets/images/cuegui/cuecommander_monitor_os_filter.png)
160+
![Monitor Hosts with OS Filter](/assets/images/cuegui/cuecommander/cuecommander_monitor_os_filter.png)
161161

162162
The OS filter list dynamically updates based on the operating systems detected in your host environment. When you first open CueCommander, the filter displays "Not Loaded" to indicate that host data hasn't been retrieved yet. Once hosts are loaded, the filter automatically populates with the actual OS values found in your system.
163163

docs/assets/images/cuegui/cuecommander_monitor_os_filter.png renamed to docs/assets/images/cuegui/cuecommander/cuecommander_monitor_os_filter.png

File renamed without changes.

docs/assets/images/cuegui/cuegui_copy_frame_name.png renamed to docs/assets/images/cuegui/cuetopia/cuegui_copy_frame_name.png

File renamed without changes.

docs/assets/images/cuegui/cuegui_copy_job_name.png renamed to docs/assets/images/cuegui/cuetopia/cuegui_copy_job_name.png

File renamed without changes.

0 commit comments

Comments
 (0)