From 8b3f840abd0d6ae8f7d5c72b2eec6dacaa577190 Mon Sep 17 00:00:00 2001 From: Jimmy Christensen Date: Fri, 5 Jul 2024 04:50:11 +0200 Subject: [PATCH 01/11] Enhance Qt compatibility and fix QtGui.QPalette bug in cuegui (#1376) - Bug fix: Resolved a bug in `cuegui/cuegui/DarkPalette.py` related to palette roles when using PySide6. - Qt compatibility: Updated imports from `PySide2` to `qtpy` in various files to ensure compatibility with both PySide2 and PySide6. - Version support: PySide2 is still used for Python versions below 3.11 (in line with VFX platform requirements), while PySide6 enables usage with Python 3.11 and above. - Requirements update: Updated the requirements files to include necessary dependencies for `qtpy`. - Removed function `scrollContentsBy` from `cuegui/cuegui/plugins/LogViewPlugin.py`. The function caused cuegui to crash due to threading issues with QPainter and did not show line numbers, making it unnecessary. --- cuegui/cuegui/DarkPalette.py | 40 +++++++++++------------ cuegui/cuegui/FrameMonitor.py | 14 ++++---- cuegui/cuegui/SubscribeToJobDialog.py | 4 +-- cuegui/cuegui/plugins/LogViewPlugin.py | 8 ----- cuesubmit/cuesubmit/__main__.py | 4 +-- cuesubmit/cuesubmit/ui/Command.py | 2 +- cuesubmit/cuesubmit/ui/Job.py | 2 +- cuesubmit/cuesubmit/ui/SettingsWidgets.py | 2 +- cuesubmit/cuesubmit/ui/Style.py | 2 +- cuesubmit/cuesubmit/ui/Submit.py | 2 +- cuesubmit/cuesubmit/ui/Widgets.py | 2 +- requirements.txt | 4 +-- requirements_gui.txt | 6 ++-- 13 files changed, 43 insertions(+), 49 deletions(-) diff --git a/cuegui/cuegui/DarkPalette.py b/cuegui/cuegui/DarkPalette.py index fed62996b..373624e18 100644 --- a/cuegui/cuegui/DarkPalette.py +++ b/cuegui/cuegui/DarkPalette.py @@ -52,50 +52,50 @@ def DarkPalette(): p = QtGui.QPalette() c = GreyF(0.175) - p.setColor(p.Window, c) - p.setColor(p.Button, c) + p.setColor(QtGui.QPalette.Window, c) + p.setColor(QtGui.QPalette.Button, c) c = GreyF(0.79) - p.setColor(p.WindowText, c) - p.setColor(p.Text, c) - p.setColor(p.ButtonText, c) - p.setColor(p.BrightText, c) + p.setColor(QtGui.QPalette.WindowText, c) + p.setColor(QtGui.QPalette.Text, c) + p.setColor(QtGui.QPalette.ButtonText, c) + p.setColor(QtGui.QPalette.BrightText, c) c = ColorF(0.6, 0.6, 0.8) - p.setColor(p.Link, c) + p.setColor(QtGui.QPalette.Link, c) c = ColorF(0.8, 0.6, 0.8) - p.setColor(p.LinkVisited, c) + p.setColor(QtGui.QPalette.LinkVisited, c) c = GreyF(0.215) - p.setColor(p.Base, c) + p.setColor(QtGui.QPalette.Base, c) c = GreyF(0.25) - p.setColor(p.AlternateBase, c) + p.setColor(QtGui.QPalette.AlternateBase, c) c = GreyF(0.0) - p.setColor(p.Shadow, c) + p.setColor(QtGui.QPalette.Shadow, c) c = GreyF(0.13) - p.setColor(p.Dark, c) + p.setColor(QtGui.QPalette.Dark, c) c = GreyF(0.21) - p.setColor(p.Mid, c) + p.setColor(QtGui.QPalette.Mid, c) c = GreyF(0.25) - p.setColor(p.Midlight, c) + p.setColor(QtGui.QPalette.Midlight, c) c = GreyF(0.40) - p.setColor(p.Light, c) + p.setColor(QtGui.QPalette.Light, c) c = ColorF(0.31, 0.31, 0.25) - p.setColor(p.Highlight, c) + p.setColor(QtGui.QPalette.Highlight, c) c = GreyF(0.46) - p.setColor(QtGui.QPalette.Disabled, p.WindowText, c) - p.setColor(QtGui.QPalette.Disabled, p.Text, c) - p.setColor(QtGui.QPalette.Disabled, p.ButtonText, c) + p.setColor(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, c) + p.setColor(QtGui.QPalette.Disabled, QtGui.QPalette.Text, c) + p.setColor(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, c) c = GreyF(0.55) - p.setColor(QtGui.QPalette.Disabled, p.BrightText, c) + p.setColor(QtGui.QPalette.Disabled, QtGui.QPalette.BrightText, c) return p diff --git a/cuegui/cuegui/FrameMonitor.py b/cuegui/cuegui/FrameMonitor.py index 56c586cd9..9a76e861e 100644 --- a/cuegui/cuegui/FrameMonitor.py +++ b/cuegui/cuegui/FrameMonitor.py @@ -428,14 +428,14 @@ def _filterStatusSetup(self, layout): btn.setMenu(menu) menu.triggered.connect(self._filterStatusHandle) # pylint: disable=no-member - for item in [("Clear", QtCore.Qt.ALT + QtCore.Qt.Key_QuoteLeft), + for item in [("Clear", QtCore.Qt.ALT | QtCore.Qt.Key_QuoteLeft), None, - ("Succeeded", QtCore.Qt.ALT + QtCore.Qt.Key_1), - ("Running", QtCore.Qt.ALT + QtCore.Qt.Key_2), - ("Waiting", QtCore.Qt.ALT + QtCore.Qt.Key_3), - ("Depend", QtCore.Qt.ALT + QtCore.Qt.Key_4), - ("Dead", QtCore.Qt.ALT + QtCore.Qt.Key_5), - ("Eaten", QtCore.Qt.ALT + QtCore.Qt.Key_6)]: + ("Succeeded", QtCore.Qt.ALT | QtCore.Qt.Key_1), + ("Running", QtCore.Qt.ALT | QtCore.Qt.Key_2), + ("Waiting", QtCore.Qt.ALT | QtCore.Qt.Key_3), + ("Depend", QtCore.Qt.ALT | QtCore.Qt.Key_4), + ("Dead", QtCore.Qt.ALT | QtCore.Qt.Key_5), + ("Eaten", QtCore.Qt.ALT | QtCore.Qt.Key_6)]: if item: a = QtWidgets.QAction(item[0], menu) if item[0] != "Clear": diff --git a/cuegui/cuegui/SubscribeToJobDialog.py b/cuegui/cuegui/SubscribeToJobDialog.py index 758497b90..fa332a8b2 100644 --- a/cuegui/cuegui/SubscribeToJobDialog.py +++ b/cuegui/cuegui/SubscribeToJobDialog.py @@ -24,8 +24,8 @@ from builtins import map -from PySide2 import QtCore -from PySide2 import QtWidgets +from qtpy import QtCore +from qtpy import QtWidgets import cuegui.Constants import cuegui.Logger import cuegui.Utils diff --git a/cuegui/cuegui/plugins/LogViewPlugin.py b/cuegui/cuegui/plugins/LogViewPlugin.py index 5c36ec717..9d86e712f 100644 --- a/cuegui/cuegui/plugins/LogViewPlugin.py +++ b/cuegui/cuegui/plugins/LogViewPlugin.py @@ -149,14 +149,6 @@ def mouseReleaseEvent(self, event): self.mousePressedSignal.emit(pos) self.copy_selection(QtGui.QClipboard.Selection) - def scrollContentsBy(self, *args, **kwargs): - """ - Overriding to make sure the line numbers area is updated when scrolling - """ - - self._line_num_area.repaint() - return QtWidgets.QPlainTextEdit.scrollContentsBy(self, *args, **kwargs) - def copy_selection(self, mode): """ Copy (Ctrl + C) action. Stores the currently selected text in the diff --git a/cuesubmit/cuesubmit/__main__.py b/cuesubmit/cuesubmit/__main__.py index 3adecc770..d712f30a7 100644 --- a/cuesubmit/cuesubmit/__main__.py +++ b/cuesubmit/cuesubmit/__main__.py @@ -23,8 +23,8 @@ from __future__ import absolute_import import sys -from PySide2 import QtGui -from PySide2 import QtWidgets +from qtpy import QtGui +from qtpy import QtWidgets from cuesubmit import Constants from cuesubmit import JobTypes diff --git a/cuesubmit/cuesubmit/ui/Command.py b/cuesubmit/cuesubmit/ui/Command.py index c1d144b24..ac0afb1a6 100644 --- a/cuesubmit/cuesubmit/ui/Command.py +++ b/cuesubmit/cuesubmit/ui/Command.py @@ -20,7 +20,7 @@ from __future__ import division from __future__ import absolute_import -from PySide2 import QtCore, QtWidgets +from qtpy import QtCore, QtWidgets from cuesubmit.ui import Widgets from cuesubmit import Constants diff --git a/cuesubmit/cuesubmit/ui/Job.py b/cuesubmit/cuesubmit/ui/Job.py index e8fe51d0a..fc15d5536 100644 --- a/cuesubmit/cuesubmit/ui/Job.py +++ b/cuesubmit/cuesubmit/ui/Job.py @@ -21,7 +21,7 @@ from __future__ import absolute_import from builtins import range -from PySide2 import QtCore, QtGui, QtWidgets +from qtpy import QtCore, QtGui, QtWidgets from cuesubmit import Layer from cuesubmit.ui import Style diff --git a/cuesubmit/cuesubmit/ui/SettingsWidgets.py b/cuesubmit/cuesubmit/ui/SettingsWidgets.py index 01601265a..612e67193 100644 --- a/cuesubmit/cuesubmit/ui/SettingsWidgets.py +++ b/cuesubmit/cuesubmit/ui/SettingsWidgets.py @@ -20,7 +20,7 @@ from __future__ import division from __future__ import absolute_import -from PySide2 import QtCore, QtWidgets +from qtpy import QtCore, QtWidgets from cuesubmit import Constants from cuesubmit.ui import Command diff --git a/cuesubmit/cuesubmit/ui/Style.py b/cuesubmit/cuesubmit/ui/Style.py index 4730bf706..0679e6aa4 100644 --- a/cuesubmit/cuesubmit/ui/Style.py +++ b/cuesubmit/cuesubmit/ui/Style.py @@ -20,7 +20,7 @@ from __future__ import division from __future__ import absolute_import -from PySide2 import QtGui +from qtpy import QtGui MAIN_WINDOW = """ diff --git a/cuesubmit/cuesubmit/ui/Submit.py b/cuesubmit/cuesubmit/ui/Submit.py index 1e0246d17..36a6a43ba 100644 --- a/cuesubmit/cuesubmit/ui/Submit.py +++ b/cuesubmit/cuesubmit/ui/Submit.py @@ -24,7 +24,7 @@ from builtins import range import getpass -from PySide2 import QtCore, QtGui, QtWidgets +from qtpy import QtCore, QtGui, QtWidgets import opencue from cuesubmit import Constants diff --git a/cuesubmit/cuesubmit/ui/Widgets.py b/cuesubmit/cuesubmit/ui/Widgets.py index bc658a3a7..0be3ca359 100644 --- a/cuesubmit/cuesubmit/ui/Widgets.py +++ b/cuesubmit/cuesubmit/ui/Widgets.py @@ -21,7 +21,7 @@ from __future__ import absolute_import from builtins import object -from PySide2 import QtCore, QtGui, QtWidgets +from qtpy import QtCore, QtGui, QtWidgets from cuesubmit import Constants from cuesubmit.ui import Style diff --git a/requirements.txt b/requirements.txt index 262f681f9..ce74faf66 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ 2to3==1.0 enum34==1.1.6 evdev==1.4.0;python_version<"3.0" and "linux" in sys_platform -future==0.18.3 +future==1.0.0 futures==3.2.0;python_version<"3.0" grpcio==1.26.0;python_version<"3.0" grpcio-tools==1.26.0;python_version<"3.0" @@ -17,4 +17,4 @@ pyfakefs==5.2.3;python_version>="3.7" pylint==2.6.0;python_version>="3.7" pynput==1.7.6 PyYAML==5.1 -six==1.11.0 +six==1.16.0 diff --git a/requirements_gui.txt b/requirements_gui.txt index b7ff2d6b0..1f5b19637 100644 --- a/requirements_gui.txt +++ b/requirements_gui.txt @@ -1,3 +1,5 @@ -PySide2==5.15.2.1 +PySide6==6.7.1;python_version>"3.11" +PySide6==6.5.3;python_version=="3.11" +PySide2==5.15.2.1;python_version<="3.10" QtPy==1.11.3;python_version<"3.7" -QtPy==2.3.0;python_version>="3.7" +QtPy==2.4.1;python_version>="3.7" From aa9b36589445131a92eab9a0ff417116c9c32e6d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 20:38:47 -0700 Subject: [PATCH 02/11] Bump tj-actions/changed-files from 35 to 41 in /.github/workflows (#1402) Bumps [tj-actions/changed-files](https://github.com/tj-actions/changed-files) from 35 to 41. - [Release notes](https://github.com/tj-actions/changed-files/releases) - [Changelog](https://github.com/tj-actions/changed-files/blob/main/HISTORY.md) - [Commits](https://github.com/tj-actions/changed-files/compare/v35...v41) --- updated-dependencies: - dependency-name: tj-actions/changed-files dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/testing-pipeline.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/testing-pipeline.yml b/.github/workflows/testing-pipeline.yml index 15967a4a9..32d367689 100644 --- a/.github/workflows/testing-pipeline.yml +++ b/.github/workflows/testing-pipeline.yml @@ -93,7 +93,7 @@ jobs: - uses: actions/checkout@v3 - name: Get Changed Files id: get_changed_files - uses: tj-actions/changed-files@v35 + uses: tj-actions/changed-files@v41 - name: Check for Version Change run: ci/check_changed_files.py ${{ steps.get_changed_files.outputs.modified_files }} ${{ steps.get_changed_files.outputs.deleted_files }} @@ -112,6 +112,6 @@ jobs: - uses: actions/checkout@v3 - name: Get Changed Files id: get_changed_files - uses: tj-actions/changed-files@v35 + uses: tj-actions/changed-files@v41 - name: Check for Version Change run: ci/check_version_bump.py ${{ steps.get_changed_files.outputs.all_changed_and_modified_files }} From c345dffa9c5bc1a5186d377a7f2c9b1691a9a544 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 20:39:36 -0700 Subject: [PATCH 03/11] Bump grpcio from 1.47.0 to 1.53.2 (#1403) Bumps [grpcio](https://github.com/grpc/grpc) from 1.47.0 to 1.53.2. - [Release notes](https://github.com/grpc/grpc/releases) - [Changelog](https://github.com/grpc/grpc/blob/master/doc/grpc_release_schedule.md) - [Commits](https://github.com/grpc/grpc/compare/v1.47.0...v1.53.2) --- updated-dependencies: - dependency-name: grpcio dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index ce74faf66..4363e51c1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,7 @@ future==1.0.0 futures==3.2.0;python_version<"3.0" grpcio==1.26.0;python_version<"3.0" grpcio-tools==1.26.0;python_version<"3.0" -grpcio==1.47.0;python_version>="3.0" +grpcio==1.53.2;python_version>="3.0" grpcio-tools==1.47.0;python_version>="3.0" mock==2.0.0 packaging==20.9 From c56d8cbc015fdbb0a30eb6b5c408a13adc383864 Mon Sep 17 00:00:00 2001 From: Ramon Figueiredo Date: Wed, 10 Jul 2024 09:02:06 -0700 Subject: [PATCH 04/11] [rqd] Fix non ASCII chars (#1335) - Ensure consistent handling of non-ASCII characters in logs - Always encode lines to ASCII with an 'ignore' option to discard non-ASCII characters. - Removed unused file_descriptor block and ensured consistent encoding logic. This change prevents UnicodeEncodeError and ensures consistent log outputs. --- rqd/rqd/rqcore.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/rqd/rqd/rqcore.py b/rqd/rqd/rqcore.py index 40d073cc0..271ac6122 100644 --- a/rqd/rqd/rqcore.py +++ b/rqd/rqd/rqcore.py @@ -318,17 +318,13 @@ def runLinux(self): else: tempCommand += [self._createCommandFile(runFrame.command)] - if rqd.rqconstants.RQD_PREPEND_TIMESTAMP: - file_descriptor = subprocess.PIPE - else: - file_descriptor = self.rqlog # pylint: disable=subprocess-popen-preexec-fn frameInfo.forkedCommand = subprocess.Popen(tempCommand, env=self.frameEnv, cwd=self.rqCore.machine.getTempPath(), stdin=subprocess.PIPE, - stdout=file_descriptor, - stderr=file_descriptor, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, close_fds=True, preexec_fn=os.setsid) finally: @@ -343,6 +339,16 @@ def runLinux(self): if rqd.rqconstants.RQD_PREPEND_TIMESTAMP: pipe_to_file(frameInfo.forkedCommand.stdout, frameInfo.forkedCommand.stderr, self.rqlog) + else: + with open(self.rqlog, 'a') as f: + # Convert to ASCII while discarding characters that can not be encoded + for line in frameInfo.forkedCommand.stdout: + line = line.encode('ascii', 'ignore') + f.write(line.decode('ascii') + '\n') + for line in frameInfo.forkedCommand.stderr: + line = line.encode('ascii', 'ignore') + f.write(line.decode('ascii') + '\n') + returncode = frameInfo.forkedCommand.wait() # Find exitStatus and exitSignal @@ -1222,6 +1228,8 @@ def print_and_flush_ln(fd, last_timestamp): remainder = lines[-1] for line in lines[0:-1]: + # Convert to ASCII while discarding characters that can not be encoded + line = line.encode('ascii', 'ignore') print("[%s] %s" % (curr_line_timestamp, line), file=outfile) outfile.flush() os.fsync(outfile) From 7109fc897805f8a7b760b794b17b5a51763c1ad7 Mon Sep 17 00:00:00 2001 From: Jimmy Christensen Date: Wed, 10 Jul 2024 20:16:05 +0200 Subject: [PATCH 05/11] Fix CI/CD checks that uses old docker images (#1405) --- .github/workflows/testing-pipeline.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/testing-pipeline.yml b/.github/workflows/testing-pipeline.yml index 32d367689..c3816db57 100644 --- a/.github/workflows/testing-pipeline.yml +++ b/.github/workflows/testing-pipeline.yml @@ -11,6 +11,8 @@ jobs: name: Run Python Unit Tests (CY2022) runs-on: ubuntu-latest container: aswf/ci-opencue:2022 + env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true steps: - uses: actions/checkout@v3 - name: Run Python Tests @@ -21,6 +23,8 @@ jobs: runs-on: ubuntu-latest container: image: aswf/ci-opencue:2022 + env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true steps: - uses: actions/checkout@v3 - name: Build with Gradle @@ -53,6 +57,8 @@ jobs: name: Run Python Unit Tests using Python2 runs-on: ubuntu-latest container: aswf/ci-opencue:2019 + env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true steps: - uses: actions/checkout@v3 - name: Run Python Tests @@ -71,6 +77,8 @@ jobs: name: Lint Python Code runs-on: ubuntu-latest container: aswf/ci-opencue:2022 + env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true steps: - uses: actions/checkout@v3 - name: Lint Python Code From efa22a400389f471302a735067f921e3ae13c457 Mon Sep 17 00:00:00 2001 From: Diego Tavares Date: Wed, 10 Jul 2024 11:25:56 -0700 Subject: [PATCH 06/11] Redesign free temp dir monitoring feature (#1394) * Redesign free temp dir monitoring feature The previous version of this feature relied on a pre-defined limit for how much space needs to be available on the tmp directory. This posed a problem for non-homogeneous farms where different hosts can have great discrepancies on storage size. This new implementation relies on a pre-defined minimum percentage of available temporary storage. --- .../spcue/dispatcher/HostReportHandler.java | 146 +++++++++++------- cuebot/src/main/resources/opencue.properties | 7 +- .../dispatcher/HostReportHandlerTests.java | 16 +- cuebot/src/test/resources/opencue.properties | 2 +- 4 files changed, 101 insertions(+), 70 deletions(-) diff --git a/cuebot/src/main/java/com/imageworks/spcue/dispatcher/HostReportHandler.java b/cuebot/src/main/java/com/imageworks/spcue/dispatcher/HostReportHandler.java index 1c042f110..c31edc53c 100644 --- a/cuebot/src/main/java/com/imageworks/spcue/dispatcher/HostReportHandler.java +++ b/cuebot/src/main/java/com/imageworks/spcue/dispatcher/HostReportHandler.java @@ -100,6 +100,7 @@ public class HostReportHandler { private static final String SUBJECT_COMMENT_FULL_TEMP_DIR = "Host set to REPAIR for not having enough storage " + "space on the temporary directory (mcp)"; private static final String CUEBOT_COMMENT_USER = "cuebot"; + private static final String WINDOWS_OS = "Windows"; // A cache to store kill requests and count the number of occurrences. // The cache expires after write to avoid growing unbounded. If a request for a host-frame doesn't appear @@ -182,7 +183,11 @@ public void handleHostReport(HostReport report, boolean isBoot) { rhost.getLoad(), new Timestamp(rhost.getBootTime() * 1000l), rhost.getAttributesMap().get("SP_OS")); - changeHardwareState(host, report.getHost().getState(), isBoot, report.getHost().getFreeMcp()); + // Both logics are conflicting, only change hardware state if + // there was no need for a tempDirStorage state change + if (!changeStateForTempDirStorage(host, report.getHost())) { + changeHardwareState(host, report.getHost().getState(), isBoot); + } changeNimbyState(host, report.getHost()); /** @@ -247,12 +252,10 @@ public void handleHostReport(HostReport report, boolean isBoot) { } } - // The minimum amount of free space in the temporary directory to book a host - Long minBookableFreeTempDir = env.getRequiredProperty("dispatcher.min_bookable_free_temp_dir_kb", Long.class); - - if (minBookableFreeTempDir != -1 && report.getHost().getFreeMcp() < minBookableFreeTempDir) { - msg = String.format("%s doens't have enough free space in the temporary directory (mcp), %dMB needs %dMB", - host.name, (report.getHost().getFreeMcp()/1024), (minBookableFreeTempDir/1024)); + if (!isTempDirStorageEnough(report.getHost().getTotalMcp(), report.getHost().getFreeMcp(), host.os)) { + msg = String.format( + "%s doens't have enough free space in the temporary directory (mcp), %dMB", + host.name, (report.getHost().getFreeMcp()/1024)); } else if (host.idleCores < Dispatcher.CORE_POINTS_RESERVED_MIN) { msg = String.format("%s doesn't have enough idle cores, %d needs %d", @@ -333,6 +336,27 @@ else if (!dispatchSupport.isCueBookable(host)) { } } + /** + * Check if a reported temp storage size and availability is enough for running a job + * + * Use dispatcher.min_available_temp_storage_percentage (opencue.properties) to + * define what's the accepted threshold. Providing hostOs is necessary as this feature + * is currently not available on Windows hosts + * + * @param tempTotalStorage Total storage on the temp directory + * @param tempFreeStorage Free storage on the temp directory + * @param hostOs Reported os + * @return + */ + private boolean isTempDirStorageEnough(Long tempTotalStorage, Long tempFreeStorage, String hostOs) { + // The minimum amount of free space in the temporary directory to book a host + int minAvailableTempPercentage = env.getRequiredProperty( + "dispatcher.min_available_temp_storage_percentage", Integer.class); + + return minAvailableTempPercentage == -1 || hostOs.equalsIgnoreCase(WINDOWS_OS) || + (((tempFreeStorage * 100.0) / tempTotalStorage) >= minAvailableTempPercentage); + } + /** * Update the hardware state property. * @@ -342,62 +366,11 @@ else if (!dispatchSupport.isCueBookable(host)) { * updated with a boot report. If the state is Repair, then state is * never updated via RQD. * - * - * Prevent cue frames from booking on hosts with full temporary directories. - * - * Change host state to REPAIR or UP according the amount of free space - * in the temporary directory: - * - Set the host state to REPAIR, when the amount of free space in the - * temporary directory is less than the minimum required. Add a comment with - * subject: SUBJECT_COMMENT_FULL_TEMP_DIR - * - Set the host state to UP, when the amount of free space in the temporary directory - * is greater or equals to the minimum required and the host has a comment with - * subject: SUBJECT_COMMENT_FULL_TEMP_DIR - * * @param host * @param reportState * @param isBoot - * @param freeTempDir */ - private void changeHardwareState(DispatchHost host, HardwareState reportState, boolean isBoot, long freeTempDir) { - - // The minimum amount of free space in the temporary directory to book a host - Long minBookableFreeTempDir = env.getRequiredProperty("dispatcher.min_bookable_free_temp_dir_kb", Long.class); - - // Prevent cue frames from booking on hosts with full temporary directories - if (minBookableFreeTempDir != -1 && !host.os.equalsIgnoreCase("Windows")) { - if (host.hardwareState == HardwareState.UP && freeTempDir < minBookableFreeTempDir) { - - // Insert a comment indicating that the Host status = Repair with reason = Full temporary directory - CommentDetail c = new CommentDetail(); - c.subject = SUBJECT_COMMENT_FULL_TEMP_DIR; - c.user = CUEBOT_COMMENT_USER; - c.timestamp = null; - c.message = "Host " + host.getName() + " marked as REPAIR. The current amount of free space in the " + - "temporary directory (mcp) is " + (freeTempDir/1024) + "MB. It must have at least " - + (minBookableFreeTempDir/1024) + "MB of free space in temporary directory"; - commentManager.addComment(host, c); - - // Set the host state to REPAIR - hostManager.setHostState(host, HardwareState.REPAIR); - host.hardwareState = HardwareState.REPAIR; - - return; - } else if (host.hardwareState == HardwareState.REPAIR && freeTempDir >= minBookableFreeTempDir) { - // Check if the host with REPAIR status has comments with subject=SUBJECT_COMMENT_FULL_TEMP_DIR and - // user=CUEBOT_COMMENT_USER and delete the comments, if they exists - boolean commentsDeleted = commentManager.deleteCommentByHostUserAndSubject(host, - CUEBOT_COMMENT_USER, SUBJECT_COMMENT_FULL_TEMP_DIR); - - if (commentsDeleted) { - // Set the host state to UP - hostManager.setHostState(host, HardwareState.UP); - host.hardwareState = HardwareState.UP; - return; - } - } - } - + private void changeHardwareState(DispatchHost host, HardwareState reportState, boolean isBoot) { // If the states are the same there is no reason to do this update. if (host.hardwareState.equals(reportState)) { return; @@ -427,6 +400,61 @@ private void changeHardwareState(DispatchHost host, HardwareState reportState, b } } + /** + * Prevent cue frames from booking on hosts with full temporary directories. + * + * Change host state to REPAIR or UP according to the amount of free space + * in the temporary directory: + * - Set the host state to REPAIR, when the amount of free space in the + * temporary directory is less than the minimum required. + * - Set the host state to UP, when the amount of free space in the temporary directory + * is greater or equal to the minimum required and the host has a comment with + * subject: SUBJECT_COMMENT_FULL_TEMP_DIR + * + * @param host + * @param reportHost + * @return + */ + private boolean changeStateForTempDirStorage(DispatchHost host, RenderHost reportHost) { + // The minimum amount of free space in the temporary directory to book a host + int minAvailableTempPercentage = env.getRequiredProperty( + "dispatcher.min_available_temp_storage_percentage", Integer.class); + + // Prevent cue frames from booking on hosts with full temporary directories + boolean hasEnoughTempStorage = isTempDirStorageEnough(reportHost.getTotalMcp(), reportHost.getFreeMcp(), host.os); + if (!hasEnoughTempStorage && host.hardwareState == HardwareState.UP) { + // Insert a comment indicating that the Host status = Repair with reason = Full temporary directory + CommentDetail c = new CommentDetail(); + c.subject = SUBJECT_COMMENT_FULL_TEMP_DIR; + c.user = CUEBOT_COMMENT_USER; + c.timestamp = null; + long requiredTempMb = (long)((minAvailableTempPercentage / 100.0) * reportHost.getTotalMcp()/ 1024); + c.message = "Host " + host.getName() + " marked as REPAIR. The current amount of free space in the " + + "temporary directory (mcp) is " + (reportHost.getFreeMcp()/1024) + "MB. It must have at least " + + ((requiredTempMb)) + "MB of free space in temporary directory"; + commentManager.addComment(host, c); + + // Set the host state to REPAIR + hostManager.setHostState(host, HardwareState.REPAIR); + host.hardwareState = HardwareState.REPAIR; + + return true; + } else if (hasEnoughTempStorage && host.hardwareState == HardwareState.REPAIR) { + // Check if the host with REPAIR status has comments with subject=SUBJECT_COMMENT_FULL_TEMP_DIR and + // user=CUEBOT_COMMENT_USER and delete the comments, if they exist + boolean commentsDeleted = commentManager.deleteCommentByHostUserAndSubject(host, + CUEBOT_COMMENT_USER, SUBJECT_COMMENT_FULL_TEMP_DIR); + + if (commentsDeleted) { + // Set the host state to UP + hostManager.setHostState(host, HardwareState.UP); + host.hardwareState = HardwareState.UP; + return true; + } + } + return false; + } + /** * Changes the NIMBY lock state. If the DB indicates a NIMBY lock * but RQD does not, then the host is unlocked. If the DB indicates diff --git a/cuebot/src/main/resources/opencue.properties b/cuebot/src/main/resources/opencue.properties index 4dd691e07..21f8d0602 100644 --- a/cuebot/src/main/resources/opencue.properties +++ b/cuebot/src/main/resources/opencue.properties @@ -110,11 +110,10 @@ dispatcher.report_queue.max_pool_size=8 # Queue capacity for handling Host Report. dispatcher.report_queue.queue_capacity=1000 -# The minimum amount of free space in the temporary directory (mcp) to book a host. -# E.g: 1G = 1048576 kB => dispatcher.min_bookable_free_temp_dir_kb=1048576 -# Default = -1 (deactivated) +# The minimum amount of available space on the temporary directory (mcp) to book a host. +# Hosts with less free space than the limit will be marked as REPAIR # If equals to -1, it means the feature is turned off -dispatcher.min_bookable_free_temp_dir_kb=-1 +dispatcher.min_available_temp_storage_percentage=20 # Number of threads to keep in the pool for kill frame operation. dispatcher.kill_queue.core_pool_size=6 diff --git a/cuebot/src/test/java/com/imageworks/spcue/test/dispatcher/HostReportHandlerTests.java b/cuebot/src/test/java/com/imageworks/spcue/test/dispatcher/HostReportHandlerTests.java index b610ff11c..b39b97ad0 100644 --- a/cuebot/src/test/java/com/imageworks/spcue/test/dispatcher/HostReportHandlerTests.java +++ b/cuebot/src/test/java/com/imageworks/spcue/test/dispatcher/HostReportHandlerTests.java @@ -297,14 +297,16 @@ public void testHandleHostReportWithFullTemporaryDirectories() { * Precondition: * - HardwareState=UP * Action: - * - Receives a HostReport with freeTempDir < dispatcher.min_bookable_free_temp_dir_kb (opencue.properties) + * - Receives a HostReport with less freeTempDir than the threshold + * (opencue.properties: min_available_temp_storage_percentage) * Postcondition: * - Host hardwareState changes to REPAIR - * - A comment is created with subject=SUBJECT_COMMENT_FULL_TEMP_DIR and user=CUEBOT_COMMENT_USER + * - A comment is created with subject=SUBJECT_COMMENT_FULL_TEMP_DIR and + * user=CUEBOT_COMMENT_USER * */ - // Create HostReport + // Create HostReport with totalMcp=4GB and freeMcp=128MB HostReport report1 = HostReport.newBuilder() - .setHost(getRenderHostBuilder(hostname).setFreeMcp(1024L).build()) + .setHost(getRenderHostBuilder(hostname).setFreeMcp(CueUtil.MB128).build()) .setCoreInfo(cores) .build(); // Call handleHostReport() => Create the comment with subject=SUBJECT_COMMENT_FULL_TEMP_DIR and change the @@ -337,9 +339,11 @@ public void testHandleHostReportWithFullTemporaryDirectories() { * Test 2: * Precondition: * - HardwareState=REPAIR - * - There is a comment for the host with subject=SUBJECT_COMMENT_FULL_TEMP_DIR and user=CUEBOT_COMMENT_USER + * - There is a comment for the host with subject=SUBJECT_COMMENT_FULL_TEMP_DIR and + * user=CUEBOT_COMMENT_USER * Action: - * - Receives a HostReport with freeTempDir >= dispatcher.min_bookable_free_temp_dir_kb (opencue.properties) + * Receives a HostReport with more freeTempDir than the threshold + * (opencue.properties: min_available_temp_storage_percentage) * Postcondition: * - Host hardwareState changes to UP * - Comment with subject=SUBJECT_COMMENT_FULL_TEMP_DIR and user=CUEBOT_COMMENT_USER gets deleted diff --git a/cuebot/src/test/resources/opencue.properties b/cuebot/src/test/resources/opencue.properties index 1547b9d5e..9d3b7a437 100644 --- a/cuebot/src/test/resources/opencue.properties +++ b/cuebot/src/test/resources/opencue.properties @@ -64,7 +64,7 @@ dispatcher.kill_queue.queue_capacity=1000 dispatcher.booking_queue.core_pool_size=6 dispatcher.booking_queue.max_pool_size=6 dispatcher.booking_queue.queue_capacity=1000 -dispatcher.min_bookable_free_temp_dir_kb=1048576 +dispatcher.min_available_temp_storage_percentage=20 dispatcher.min_bookable_free_mcp_kb=1048576 dispatcher.oom_max_safe_used_memory_threshold=0.95 dispatcher.oom_frame_overboard_allowed_threshold=0.6 From 40b13e082d164a7b5bcf1ef41eea3948262a1891 Mon Sep 17 00:00:00 2001 From: Diego Tavares Date: Wed, 10 Jul 2024 11:30:55 -0700 Subject: [PATCH 07/11] New email template (#1382) Rework the email template and remove imageworks email domains from EmailSupport. Company domains and CC emails can now be configured on opencue.properties. Signed-off-by: Diego Tavares Co-authored-by: Samer-sef --- .../spcue/service/EmailSupport.java | 178 +++++---- .../com/imageworks/spcue/util/CueUtil.java | 8 +- .../conf/webapp/html/email_template.html | 364 ++++++++++++------ .../main/resources/public/opencue_logo.png | Bin 0 -> 45372 bytes .../main/resources/public/services/arnold.png | Bin 0 -> 3615 bytes .../resources/public/services/arnoldlive.png | Bin 0 -> 3680 bytes .../public/services/arnoldpreview.png | Bin 0 -> 3755 bytes .../main/resources/public/services/cnode.png | Bin 0 -> 3673 bytes .../main/resources/public/services/comp.png | Bin 1742 -> 3478 bytes .../resources/public/services/default.png | Bin 1519 -> 3913 bytes .../resources/public/services/distsim16.png | Bin 0 -> 3808 bytes .../resources/public/services/distsim32.png | Bin 0 -> 3856 bytes .../resources/public/services/distsim4.png | Bin 0 -> 3697 bytes .../resources/public/services/distsim8.png | Bin 0 -> 3711 bytes .../main/resources/public/services/eddy.png | Bin 0 -> 3938 bytes .../resources/public/services/finalizer.png | Bin 0 -> 3718 bytes .../main/resources/public/services/ginsu.png | Bin 1519 -> 0 bytes .../resources/public/services/houdini.png | Bin 2396 -> 3722 bytes .../main/resources/public/services/katana.png | Bin 2088 -> 3819 bytes .../resources/public/services/limboreaper.png | Bin 0 -> 3599 bytes .../resources/public/services/massive.png | Bin 0 -> 3447 bytes .../main/resources/public/services/maya.png | Bin 2680 -> 3478 bytes .../resources/public/services/mayapub.png | Bin 0 -> 3459 bytes .../resources/public/services/mayaziva.png | Bin 0 -> 3671 bytes .../resources/public/services/mentalray.png | Bin 2680 -> 0 bytes .../main/resources/public/services/neat.png | Bin 0 -> 3554 bytes .../main/resources/public/services/nuke.png | Bin 2545 -> 3581 bytes .../main/resources/public/services/ofx.png | Bin 0 -> 3617 bytes .../resources/public/services/opflares.png | Bin 0 -> 3686 bytes .../resources/public/services/playblast.png | Bin 2680 -> 3403 bytes .../resources/public/services/posteddy.png | Bin 0 -> 3741 bytes .../resources/public/services/postprocess.png | Bin 0 -> 3650 bytes .../resources/public/services/preeddy.png | Bin 0 -> 3730 bytes .../resources/public/services/preprocess.png | Bin 0 -> 3642 bytes .../main/resources/public/services/prman.png | Bin 1342 -> 0 bytes .../main/resources/public/services/proxy.png | Bin 0 -> 3585 bytes .../main/resources/public/services/reaper.png | Bin 0 -> 3499 bytes .../resources/public/services/rebelle.png | Bin 0 -> 3405 bytes .../main/resources/public/services/rsmb.png | Bin 0 -> 3601 bytes .../resources/public/services/sapphire.png | Bin 0 -> 3597 bytes .../main/resources/public/services/shell.png | Bin 1265 -> 3431 bytes .../resources/public/services/simulation.png | Bin 1616 -> 3494 bytes .../public/services/simulation16.png | Bin 0 -> 3796 bytes .../public/services/simulation32.png | Bin 0 -> 3837 bytes .../resources/public/services/simulation4.png | Bin 0 -> 3687 bytes .../resources/public/services/simulation8.png | Bin 0 -> 3702 bytes .../public/services/simulationhi.png | Bin 0 -> 3725 bytes .../resources/public/services/spotless.png | Bin 0 -> 3817 bytes .../main/resources/public/services/svea.png | Bin 2157 -> 0 bytes .../resources/public/services/trinity.png | Bin 3178 -> 0 bytes .../main/resources/public/services/unreal.png | Bin 0 -> 3653 bytes cuebot/src/main/resources/public/success.png | Bin 2963 -> 0 bytes cuebot/src/test/resources/opencue.properties | 8 + 53 files changed, 342 insertions(+), 216 deletions(-) create mode 100644 cuebot/src/main/resources/public/opencue_logo.png create mode 100755 cuebot/src/main/resources/public/services/arnold.png create mode 100755 cuebot/src/main/resources/public/services/arnoldlive.png create mode 100755 cuebot/src/main/resources/public/services/arnoldpreview.png create mode 100755 cuebot/src/main/resources/public/services/cnode.png mode change 100644 => 100755 cuebot/src/main/resources/public/services/comp.png mode change 100644 => 100755 cuebot/src/main/resources/public/services/default.png create mode 100755 cuebot/src/main/resources/public/services/distsim16.png create mode 100755 cuebot/src/main/resources/public/services/distsim32.png create mode 100755 cuebot/src/main/resources/public/services/distsim4.png create mode 100755 cuebot/src/main/resources/public/services/distsim8.png create mode 100755 cuebot/src/main/resources/public/services/eddy.png create mode 100755 cuebot/src/main/resources/public/services/finalizer.png delete mode 100644 cuebot/src/main/resources/public/services/ginsu.png mode change 100644 => 100755 cuebot/src/main/resources/public/services/houdini.png mode change 100644 => 100755 cuebot/src/main/resources/public/services/katana.png create mode 100755 cuebot/src/main/resources/public/services/limboreaper.png create mode 100755 cuebot/src/main/resources/public/services/massive.png mode change 100644 => 100755 cuebot/src/main/resources/public/services/maya.png create mode 100755 cuebot/src/main/resources/public/services/mayapub.png create mode 100755 cuebot/src/main/resources/public/services/mayaziva.png delete mode 100644 cuebot/src/main/resources/public/services/mentalray.png create mode 100755 cuebot/src/main/resources/public/services/neat.png mode change 100644 => 100755 cuebot/src/main/resources/public/services/nuke.png create mode 100755 cuebot/src/main/resources/public/services/ofx.png create mode 100755 cuebot/src/main/resources/public/services/opflares.png mode change 100644 => 100755 cuebot/src/main/resources/public/services/playblast.png create mode 100755 cuebot/src/main/resources/public/services/posteddy.png create mode 100755 cuebot/src/main/resources/public/services/postprocess.png create mode 100755 cuebot/src/main/resources/public/services/preeddy.png create mode 100755 cuebot/src/main/resources/public/services/preprocess.png delete mode 100644 cuebot/src/main/resources/public/services/prman.png create mode 100755 cuebot/src/main/resources/public/services/proxy.png create mode 100755 cuebot/src/main/resources/public/services/reaper.png create mode 100755 cuebot/src/main/resources/public/services/rebelle.png create mode 100755 cuebot/src/main/resources/public/services/rsmb.png create mode 100755 cuebot/src/main/resources/public/services/sapphire.png mode change 100644 => 100755 cuebot/src/main/resources/public/services/shell.png mode change 100644 => 100755 cuebot/src/main/resources/public/services/simulation.png create mode 100755 cuebot/src/main/resources/public/services/simulation16.png create mode 100755 cuebot/src/main/resources/public/services/simulation32.png create mode 100755 cuebot/src/main/resources/public/services/simulation4.png create mode 100755 cuebot/src/main/resources/public/services/simulation8.png create mode 100755 cuebot/src/main/resources/public/services/simulationhi.png create mode 100755 cuebot/src/main/resources/public/services/spotless.png delete mode 100644 cuebot/src/main/resources/public/services/svea.png delete mode 100644 cuebot/src/main/resources/public/services/trinity.png create mode 100755 cuebot/src/main/resources/public/services/unreal.png delete mode 100644 cuebot/src/main/resources/public/success.png diff --git a/cuebot/src/main/java/com/imageworks/spcue/service/EmailSupport.java b/cuebot/src/main/java/com/imageworks/spcue/service/EmailSupport.java index b25e7d520..23e51037d 100644 --- a/cuebot/src/main/java/com/imageworks/spcue/service/EmailSupport.java +++ b/cuebot/src/main/java/com/imageworks/spcue/service/EmailSupport.java @@ -15,23 +15,16 @@ * limitations under the License. */ - - package com.imageworks.spcue.service; -import java.io.ByteArrayOutputStream; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.StringWriter; +import java.io.*; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Properties; +import java.util.stream.Collectors; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; @@ -40,6 +33,8 @@ import org.apache.velocity.app.VelocityEngine; import org.jdom.output.Format; import org.jdom.output.XMLOutputter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; import org.springframework.mail.MailException; import org.springframework.mail.MailSender; import org.springframework.mail.SimpleMailMessage; @@ -61,49 +56,19 @@ public class EmailSupport { private MailSender mailSender; private JobManager jobManager; + private String emailDomain; + private String emailFromAddress; + private String[] emailCcAddresses; - private Properties opencueProperties; - - private final Map imageMap; + private Map imageMap; private static final Logger logger = LogManager.getLogger(EmailSupport.class); - public EmailSupport() { - - /* - * The OpenCue configuration file which we need to find the email template. - */ - opencueProperties = getOpenCueProperties(); - - Map map = new HashMap(); - - loadImage(map, "bar.png"); - loadImage(map, "opencue.png"); - loadImage(map, "fail.png"); - loadImage(map, "frame.png"); - loadImage(map, "graph_bar.png"); - loadImage(map, "header.png"); - loadImage(map, "html_bg.png"); - loadImage(map, "logo.png"); - loadImage(map, "memory.png"); - loadImage(map, "play.png"); - loadImage(map, "success.png"); - loadImage(map, "services/comp.png"); - loadImage(map, "services/default.png"); - loadImage(map, "services/ginsu.png"); - loadImage(map, "services/houdini.png"); - loadImage(map, "services/katana.png"); - loadImage(map, "services/maya.png"); - loadImage(map, "services/mentalray.png"); - loadImage(map, "services/nuke.png"); - loadImage(map, "services/playblast.png"); - loadImage(map, "services/prman.png"); - loadImage(map, "services/shell.png"); - loadImage(map, "services/simulation.png"); - loadImage(map, "services/svea.png"); - loadImage(map, "services/trinity.png"); - - imageMap = Collections.unmodifiableMap(map); + @Autowired + public EmailSupport(Environment env) { + this.emailDomain = env.getProperty("email.domain", "opencue.io"); + this.emailFromAddress = env.getProperty("email.from.address", "opencue-noreply@opencue.io"); + this.emailCcAddresses = env.getProperty("email.cc.addresses", "").split(","); } private static void loadImage(Map map, String path) { @@ -172,9 +137,9 @@ private static void loadImage(Map map, String path) { public void reportLaunchError(JobSpec spec, Throwable t) { SimpleMailMessage msg = new SimpleMailMessage(); - msg.setTo(String.format("%s@imageworks.com", spec.getUser())); - msg.setFrom("middle-tier@imageworks.com"); - msg.setCc("middle-tier@imageworks.com"); + msg.setTo(String.format("%s@%s", spec.getUser(), this.emailDomain)); + msg.setFrom(this.emailFromAddress); + msg.setCc(this.emailCcAddresses); msg.setSubject("Failed to launch OpenCue job."); StringBuilder sb = new StringBuilder(131072); @@ -187,7 +152,7 @@ public void reportLaunchError(JobSpec spec, Throwable t) { sb.append(" provided below.\n\n"); sb.append("Failed to launch jobs:\n"); - for (BuildableJob job: spec.getJobs()) { + for (BuildableJob job : spec.getJobs()) { sb.append(job.detail.name); sb.append("\n"); } @@ -206,7 +171,7 @@ public void reportJobComment(JobInterface job, CommentDetail c, String[] emails) SimpleMailMessage msg = new SimpleMailMessage(); msg.setTo(emails); - msg.setFrom("opencue-noreply@imageworks.com"); + msg.setFrom(this.emailFromAddress); msg.setSubject("New comment on " + job.getName()); StringBuilder sb = new StringBuilder(8096); @@ -228,52 +193,49 @@ public void sendMessage(SimpleMailMessage message) { } } - public Properties getOpenCueProperties() { - - // get the input stream of the properties file - InputStream in = EmailSupport.class.getClassLoader() - .getResourceAsStream("opencue.properties"); - - Properties props = new java.util.Properties(); - try { - props.load(in); - } catch (IOException e) { - props = new Properties(); - props.setProperty( "resource.loader", "file" ); - props.setProperty("class.resource.loader.class", - "org.apache.velocity.runtime.resource.loader.FileResourceLoader" ); - props.setProperty("file.resource.loader.path", "/opt/opencue/webapps/spcue"); - } - return props; - } - public void sendShutdownEmail(JobInterface job) { JobDetail d = jobManager.getJobDetail(job.getJobId()); - if (d.email == null ) { return; } + if (d.email == null) { + return; + } try { VelocityEngine ve = new VelocityEngine(); ve.setProperty("resource.loader", "class"); - ve.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + ve.setProperty("class.resource.loader.class", + "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); ve.init(); VelocityContext context = new VelocityContext(); ExecutionSummary exj = jobManager.getExecutionSummary(job); FrameStateTotals jts = jobManager.getFrameStateTotals(job); + String status = ""; + if (jts.total != jts.succeeded) { + status = "Failed "; + } else { + status = "Succeeded "; + } + context.put("jobName", d.name); + context.put("jobStatus", status.toUpperCase()); context.put("deptName", d.deptName.toUpperCase()); context.put("showName", d.showName.toUpperCase()); + context.put("totalLayers", d.totalLayers); context.put("shotName", d.shot.toUpperCase()); - context.put("totalFrames", String.format("%04d", jts.total)); - context.put("succeededFrames", String.format("%04d", jts.succeeded)); - context.put("failedFrames", String.format("%04d", jts.dead + jts.eaten + jts.waiting)); - context.put("checkpointFrames", String.format("%04d", jts.checkpoint)); + context.put("succeededFrames", jts.succeeded); + context.put("totalFrames", jts.total); + context.put("dependFrames", jts.depend); + context.put("deadFrames", jts.dead); + context.put("waitingFrames", jts.waiting); + context.put("eatenFrames", jts.eaten); + context.put("failedFrames", jts.dead + jts.eaten + jts.waiting); + context.put("checkpointFrames", jts.checkpoint); context.put("maxRSS", String.format(Locale.ROOT, "%.1fGB", exj.highMemoryKb / 1024.0 / 1024.0)); - context.put("coreTime", String.format(Locale.ROOT, "%.1f", + context.put("coreTime", String.format(Locale.ROOT, "%.1f", exj.coreTime / 3600.0)); Template t = ve.getTemplate("/conf/webapp/html/email_template.html"); @@ -281,43 +243,78 @@ public void sendShutdownEmail(JobInterface job) { List layers = jobManager.getLayerDetails(job); List layerStats = new ArrayList(layers.size()); - for (LayerDetail layer: layers) { + boolean shouldCreateFile = false; + + Map map = new HashMap(); + loadImage(map, "opencue_logo.png"); + + for (LayerDetail layer : layers) { if (layer.type.equals(LayerType.RENDER)) { LayerStats stats = new LayerStats(); stats.setDetail(layer); stats.setExecutionSummary(jobManager.getExecutionSummary(layer)); stats.setFrameStateTotals(jobManager.getFrameStateTotals(layer)); stats.setThreadStats(jobManager.getThreadStats(layer)); - stats.setOutputs(jobManager.getLayerOutputs(layer)); + stats.setOutputs(jobManager.getLayerOutputs(layer).stream().sorted().collect(Collectors.toList())); layerStats.add(stats); + if (stats.getOutputs().size() > 3) + shouldCreateFile = true; + if (!layer.services.isEmpty()) + loadImage(map, "services/" + layer.services.toArray()[0] + ".png"); } } + imageMap = Collections.unmodifiableMap(map); + context.put("layers", layerStats); StringWriter w = new StringWriter(); t.merge(context, w); String subject = "OpenCue Job " + d.getName(); - if (jts.total != jts.succeeded) { - subject = "Failed " + subject; - } - else { - subject = "Succeeded " + subject; + + subject = status + subject; + + BufferedWriter output = null; + File file = null; + if (shouldCreateFile) { + try { + file = new File("my_outputs.txt"); + output = new BufferedWriter(new FileWriter(file)); + for (LayerDetail layer : layers) { + if (layer.type.equals(LayerType.RENDER)) { + List sortedNames = jobManager + .getLayerOutputs(layer) + .stream() + .sorted() + .collect(Collectors.toList()); + output.write(layer.name + "\n" + String.join("\n", sortedNames) + "\n"); + } + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (output != null) { + try { + output.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } } - String from = "middle-tier@imageworks.com"; for (String email : d.email.split(",")) { try { - CueUtil.sendmail(email, from, subject, new StringBuilder(w.toString()), imageMap); + CueUtil.sendmail(email, this.emailFromAddress, subject, new StringBuilder(w.toString()), imageMap, + file); } catch (Exception e) { // just log and eat if the mail server is down or something // of that nature. logger.info("Failed to send job complete mail, reason: " + e); } } - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); throw new SpcueRuntimeException("Failed " + e, e); } @@ -335,4 +332,3 @@ public void setMailSender(MailSender mailSender) { this.mailSender = mailSender; } } - diff --git a/cuebot/src/main/java/com/imageworks/spcue/util/CueUtil.java b/cuebot/src/main/java/com/imageworks/spcue/util/CueUtil.java index 88b325483..67d4d17e1 100644 --- a/cuebot/src/main/java/com/imageworks/spcue/util/CueUtil.java +++ b/cuebot/src/main/java/com/imageworks/spcue/util/CueUtil.java @@ -19,6 +19,7 @@ package com.imageworks.spcue.util; +import java.io.File; import java.lang.management.ManagementFactory; import java.lang.management.ThreadMXBean; import java.util.ArrayList; @@ -168,7 +169,7 @@ public static int findChunk(List dependOnFrames, int dependErFrame) { * @param body * @param images */ - public static void sendmail(String to, String from, String subject, StringBuilder body, Map images) { + public static void sendmail(String to, String from, String subject, StringBuilder body, Map images, File attachment) { try { Properties props = System.getProperties(); props.put("mail.smtp.host", CueUtil.smtpHost); @@ -199,6 +200,11 @@ public static void sendmail(String to, String from, String subject, StringBuilde imageBodyPart.setHeader("Content-ID", '<' + name + '>'); mimeMultipart.addBodyPart(imageBodyPart); } + if (attachment != null && attachment.length() != 0){ + MimeBodyPart attachmentPart = new MimeBodyPart(); + attachmentPart.attachFile(attachment); + mimeMultipart.addBodyPart(attachmentPart); + } msg.setContent(mimeMultipart); msg.setHeader("X-Mailer", "OpenCueMailer"); diff --git a/cuebot/src/main/resources/conf/webapp/html/email_template.html b/cuebot/src/main/resources/conf/webapp/html/email_template.html index ff1524d39..4d5ea1be3 100644 --- a/cuebot/src/main/resources/conf/webapp/html/email_template.html +++ b/cuebot/src/main/resources/conf/webapp/html/email_template.html @@ -2,143 +2,259 @@ Job Execution Summary - -
- -
-
- $showName/$shotName -
+ + #if( $jobStatus == "FAILED " ) + #set( $statusColor = "#FF0000") + #else + #set( $statusColor = "#37C837") + #end +
+
+ + + + + + + + + + + + + + + + + + + +
Show: $showName
Shot: $shotName
Job: $jobName
Status: $jobStatus
+ Logo +
+ #set( $successToOverall = $succeededFrames*1.0 / $totalFrames) + #set( $successPercentage = $successToOverall * 100) + #set( $successPercentageRounded = $successPercentage.intValue()) + #set( $waitingToOverall = $waitingFrames*1.0 / $totalFrames) + #set( $waitingPercentage = $waitingToOverall * 100) + #set( $dependToOverall = $dependFrames*1.0 / $totalFrames) + #set( $dependPercentage = $dependToOverall * 100) + #set( $eatenToOverall = $eatenFrames*1.0 / $totalFrames) + #set( $eatenPercentage = $eatenToOverall * 100) + #set( $deadToOverall = $deadFrames*1.0 / $totalFrames) + #set( $deadPercentage = $deadToOverall * 100) +
+ + + + + +
+
+
+ + + + + + + #if( $checkpointFrames > 0) + + + + + #end + #if( $checkpointFrames == "0.0") + + + + + #end + + + + + #if( $eatenFrames > 0) + + + + + #end + #if( $dependFrames > 0) + + + + + #end + #if( $deadFrames > 0) + + + + + #end + #if( $waitingFrames > 0) + + + + + #end + #if( $succeededFrames > 0) + + + + + #end + #if( $failedFrames > 0) + + + + + #end + + + + + +
Peak Memory:$maxRSS
Checkpoints:$checkpointFrames
Proc Hours:$coreTime
Layers:$totalLayers
Eaten Frames:$eatenFrames
Depend Frames:$dependFrames
Dead Frames:$deadFrames
Incomplete Frames:$waitingFrames
Succeeded Frames:$succeededFrames
Failed Frames:$failedFrames
Total Frames:$totalFrames
+
+
+
-
-
-
- $jobName -
-
$deptName
-
-
-
-
- - - - - - - - - - - - - - + #foreach( $layer in $layers ) + + #set( $service = $layer.detail.services) + #set($serviceCommaSeparated ="") + #set($separator="") + #foreach($item in $service) + #set($serviceCommaSeparated = $serviceCommaSeparated + $separator + $item) + #set($separator = ",") + #end + + #set( $range = $layer.detail.range) + #set( $coreTime = $layer.getFormattedProcHours()) + #set( $failedFrames = $layer.getFailedFrames()) + #set( $highMemory = $layer.getFormattedHighMemory()) + #set( $graphLegend = $layer.getGraphLegend()) + #set( $graphData = $layer.getGraphData()) + #set( $graphScale = $layer.getGraphScale()) + #set( $graphUnits = $layer.getGraphUnits()) + #set( $waitingFrames = $layer.frameStateTotals.waiting) + #set( $dependFrames = $layer.frameStateTotals.depend) + #set( $succeededFrames = $layer.frameStateTotals.succeeded) + #set( $totalFrames = $layer.frameStateTotals.total) + #set( $checkpoints = $layer.frameStateTotals.checkpoint) + #set( $deadFrames = $layer.frameStateTotals.dead) + #set( $eatenFrames = $layer.frameStateTotals.eaten) + #set( $incompleteFrames = $layer.frameStateTotals.waiting + $layer.frameStateTotals.depend) + #set( $outputCount = $layer.getOutputs().size()) + #set( $outputs = $layer.outputs) + + #set( $successToOverall = $succeededFrames*1.0 / $totalFrames) + #set( $successPercentage = $successToOverall * 100) + #set( $successPercentageRounded = $successPercentage.intValue()) + #set( $waitingToOverall = $waitingFrames*1.0 / $totalFrames) + #set( $waitingPercentage = $waitingToOverall * 100) + #set( $dependToOverall = $dependFrames*1.0 / $totalFrames) + #set( $dependPercentage = $dependToOverall * 100) + #set( $eatenToOverall = $eatenFrames*1.0 / $totalFrames) + #set( $eatenPercentage = $eatenToOverall * 100) + #set( $deadToOverall = $deadFrames*1.0 / $totalFrames) + #set( $deadPercentage = $deadToOverall * 100) + + #if( "$!service.get(0)" == "" ) + #set( $serviceIconName = "default") + #else + #set( $serviceIconName = $service.get(0)) + #end + +
+
+
$totalFramesTOTAL FRAMES
$succeededFramesSUCCEEDED
$failedFramesFAILED
+ + + + + + +
Layer:$layer.detail.name
+ serviceIcon +
+ + + + + +
+ + - - + + - - ----> + + -
$eatenFramesEATENPeak Memory:$highMemory
$waitingFramesINCOMPLETECheckpoints:$checkpoints
-
-
- - - + + - - + + - - + + -
$maxRSSPEAK MEMORYProc Hours:$coreTime
$checkpointFramesCHECKPOINTSRange:$range
$coreTimePROC HOURSServices:$serviceCommaSeparated
-
-
-
- - - #foreach( $layer in $layers ) - - #set( $service = $layer.detail.services ) - #set( $coreTime = $layer.getFormattedProcHours() ) - #set( $failedFrames = $layer.getFailedFrames() ) - #set( $highMemory = $layer.getFormattedHighMemory() ) - #set( $graphLegend = $layer.getGraphLegend() ) - #set( $graphData = $layer.getGraphData() ) - #set( $graphScale = $layer.getGraphScale() ) - #set( $graphUnits = $layer.getGraphUnits() ) - #set( $outputCount = $layer.getOutputs().size() ) - #set( $waitingFrames = $layer.frameStateTotals.waiting ) - #set( $deadFrames = $layer.frameStateTotals.dead ) - #set( $eatenFrames = $layer.frameStateTotals.eaten ) - #set( $incompleteFrames = $layer.frameStateTotals.waiting + $layer.frameStateTotals.depend ) - -
-
- $layer.detail.name -
-
-
-
- DEAD -
$deadFrames -
-
- EATEN -
$eatenFrames -
-
- INCOMPLETE -
$incompleteFrames -
-
-
-
- PEAK MEMORY -
${highMemory} -
-
- PROC HOURS -
$coreTime -
-
- OUTPUTS -
$outputCount -
-
-
-
- Avg Frame Time

${graphData} + #if( $outputCount > 0) + + Outputs: + + + #foreach($i in [0..2]) + #if( $i < $outputCount) + + + + #end + #end + #if( $outputs.size() > 3) + + + + #end +
$outputs.get($i)
... [$outputCount outputs attached]
+ + + #end + + +
+ #end
-
-

- Outputs -
- - - - #foreach( $output in $layer.outputs ) - - - - - #end -
${output}
-
-#end -
diff --git a/cuebot/src/main/resources/public/opencue_logo.png b/cuebot/src/main/resources/public/opencue_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1827d958b11756a18d3a3fb87c22bacdcaf3c9ec GIT binary patch literal 45372 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 Ijif2;e@_WV*#H0l literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/arnold.png b/cuebot/src/main/resources/public/services/arnold.png new file mode 100755 index 0000000000000000000000000000000000000000..190dfb016b9331d5b01ecfa000b413dae1455a8b GIT binary patch literal 3615 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 literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/arnoldpreview.png b/cuebot/src/main/resources/public/services/arnoldpreview.png new file mode 100755 index 0000000000000000000000000000000000000000..0be8a5824cd9def437489f529b0a011f0975a086 GIT binary patch literal 3755 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 xW|~zPP`f&}ZqI_`gQ;S literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/cnode.png b/cuebot/src/main/resources/public/services/cnode.png new file mode 100755 index 0000000000000000000000000000000000000000..abb8fb6ca64a02b6a016740bde3cbb0b9f1b786d GIT binary patch literal 3673 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 V+7s^^epdDI=i%bbEOrh}{ugu#;U541 literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/comp.png b/cuebot/src/main/resources/public/services/comp.png old mode 100644 new mode 100755 index 78ec52e9adda34c86897bbd3f8749a98f1ff7d47..09796c17c12517160b8953799a7893f039c91a91 GIT binary patch literal 3478 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 delta 1726 zcmV;v20{6j8_o@oB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$WOG!jQR9M5smwQZGRUF50 zx@mkR#w8}2_(;^mKYV0!e`w;{s8Q$e6`d~XrV^cxIhUDC*?-o70xN}b`=n6HD1Fe< zQrbEhkJ1j>@*2DX3V~sm7)Xp230-ypGFm41Gs08pF)*RA z$V@DKRwxwSDu0%WD1n&&E{DTe^`8pp_4+FdRm!1XfAun*UB_vq>d-)zDC_adD)3`j zX;eTcp}rU!Yzfh0$1(4l#?F#=79|*0PDe zJuBfc;><`#NRll`T(N+rNO@j?{DNHY`Mlm>uNI-hFJqy0H)aQGK(|W~Zc0Y@Oh5E` z^*FmD)_<&6pr9}h;cy6k|9lK2mLr$oCv|!_?A(cv>G3}>KLcMA4}r-6^dENz1rq*C z|7sWHDzZV(*)h=>7Xyijr4-y1de9Z`oE0FHy@r6t%;X=EJD2uFc7t4zV>X#fe3EQY z;y)6QWDCzLz^8a{C2qh}jR3y(JOr&TL3^uJEDBH*br0!7EEZqSCgfIE*V3nl zM%fwk!{w@_DG9ZHSpiCzd0qi7FBQ(Maq#Vl!yNS>rkk}0bSf}&!W0%ug_)!pibT{$ zCS&Q`aNh_s+&+Y6OA~rJhA=ZTjY5sGo6T{>1qFDSX>8pOVs>^W1` zii?57NL%fmhoS-tisv!p$P1@&Q~S!S)j>~_2X)$77*k4ctiCTQK&ZEOVSe6+5|d#z zKR^GP6$@CBw&0927e3)S_-ittP{5oBJ?QE@6w32no-9hTZYsMbH&Fpi3%_2!E6u z(4p4Uh;i>EI@^20YK`icKp=Q<*tK_W}w!B5AlPrQjjnGQ`2oj9Z{!p5zMa5(IEU^9jFA1U$h$140h;>Fkb ztx?DT6t^i!!!xtf&=jeV%;BIQM+3FmfNeX!$6ZhD zz->?Lg4a6|NxaB%0)fB+6ztjJ90B&aLYggPY<3&k+FQ}t)sB|7V{kV*!OP@=%cZdA zKpHA5%W>OdU*Y!WIJoo0)JTGh5uoV+JDXgRaMfQ0R%K)!?6e-XV1MAG2hD8_sBd!O zsMCghNl94u?0Z=Iz#H&*`XY%Jxmbb4qQ>UC>KuX3KmX);m8O99uxnn=j@(sW14m6Y zT3cH%JUkS!Ctt>Y136(GOiu~1`PQ8C4zSm?@vp~kPWqnX5s0!v<;={r~^~ diff --git a/cuebot/src/main/resources/public/services/default.png b/cuebot/src/main/resources/public/services/default.png old mode 100644 new mode 100755 index b990a034df03dedc28279784d8c517d14d7e1642..49886829d49765fca37b1245b1ff543a26eee8da GIT binary patch literal 3913 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 A+W-In delta 1501 zcmV<31tR*%9`6f~B!2;OQb$4nuFf3k00006VoOIv0RI600RN!9r;`8x010qNS#tmY z4c7nw4c7reD4Tcy000McNliru+6o8}C^C2(lga=91#d}2K~z}7?UzlA97h$$f3Lcy zduDoOXJ)Nk?Z$E(CyN7#aDYT0Bn|g~067eB8 z1cF4QC=n#~iX2cJ1t*GajDf5-A-3bOvznfn-I?yLuE(K!W@kSlfs)_@lvGnQ)uVd< z_kaKQ>b0mU*K-)I^Y}l2>khyNICK8x`;71q;Js4^t12icimIYYxhkqI&sD#C*Rc;j zf~s=%{7cq3r+@#gk>|NSf9g+GRSO0{JQ3m9XIJUP@w-ZSv)Sb1cYhL>J8v3-$>_x~ zYik$&<3mM?4?&9W)6Ho-rpu8dHvwRCyR8ArT4b%oxMW`=xl=qNJFJQb#t5*z%B;+!kav-vgvEfLt<;*;*5E~3QokSwz-F3jWmK7Uezn4KW|Npgn}3tKY)CaA2n z1hPK^VuZ?EKs?C#%U@sN=#gdS+YLkvBEl%isMW&K;Q~ZvExzx;)VRaxJ`Cg~n*1#Q z7-KNTLjpsq9&yw19B;;3T)Vcxq2&%B#N!bMnw64)!b@?E+**83@VsJQUGXfR)qpM0 z*xVAycz@PyjPWo=5d+332p9v07HV9&y2%Tt*NLhD$Br%$`ijkS#;N7CH)7h2D#KC2 ze6vckRYjd+bISHC1GYe8GfP-9AjTk5;~vIa6U zY89PHMddv=G$_M32IYZIwBiwaYx6o((LijV=wTH&#o{^91lOa&gbtw$YNvxyTiCwZ4snF zskd1TlxUoDG=dB<#YHV*F~JzAID$?G6Mt68`UC7BMl0Y_$Nir<$i3friC;Y}JpNpl z?|J&%gdY-v70e{P?Ty`m#~F|Z6s__*E-f(k|f=y5al^lNs3xhF@I1s zm|H)JM7JO&Dob>kzWBj#|NqkYtXFZzj8px6z=(xBu9tKTKI%G~9XD z0;ACu<0N@pM8u!XNq|p1xP3^iZh!gEv8SjtB1C2&IOXE&S2_2$0Vw3T!}mQNTpjcK zR}(~pcDqBX715b*kQ?EF2fj;(cFv zN87K97hmV(^UrbV@+Cd>;;CfN@Bi|#-~8?e-EMaiNK~}|u=eVOZ~p8T4}Z%!=k4rX zb*8J;@?PKF;qIN2uGshdJXW*mmAKbmJ#+fZqfb2X)M;Q0^i_2WKvWeGS$d0B=Isuz zeD`o=SxkVTs%BI5lmNna5r6_YU{!TbzRUmo+ws2u@$yXb6DkuP00000NkvXXu0mjf DLWkB9 diff --git a/cuebot/src/main/resources/public/services/distsim16.png b/cuebot/src/main/resources/public/services/distsim16.png new file mode 100755 index 0000000000000000000000000000000000000000..04ab6beb0c34bde4e1b1cab9a562147efd29c3d4 GIT binary patch literal 3808 zcma)930PBC77qKa0RaJ7l8BWSvhQia_M$=&K|n+W%1iP>B4i;(Ir_%{aj?J%fiSfcN5!aOLYK1m zG6@b8$aoM=Es?|42n5?tEeH8YkP5|v62(#uW~j0TgAxlkn3dE}LZ}>oMBR6fO&1>$mY3)Rc)TiGvBy6QW{5!%=`t z0iozPB9>1e5Kwd`j?Wh|C=kI1MIw+$cmfSiB4J4+7Lm*%(NOO{7?@5W5V9h;i{F#M zzc?6?N+oCE@o8ykxHK|OrbxsSnM@|0K+`iuLk9KB94HUNc6&{td*(==#Mb|(pnj%kwf?h zNGV&V;6t$a{6Cx*rNYebHT(_dMX8WfHRBHF{(n1v;1Td=?Bwed$x~?(@bOSGB!Tgi zuqNV+Ah}4Uk|{;9{{lU8Je3GN0h}#Xm_iJ94VcW8@z?1ggSi|Ge1a2*1uQ;9rIH{9 z1uGDOR4j!E39(E9laHm6K?a>7;0cLz#s{3g@()~0B@hD00EGc?iNr?F$21}JHP|AlsaEoDX8c5+2gb*D|5DJ+vHn*THxKYp6oyvl$M)g1hMf2N(2Ln<&8al@_BIpxKgXa!w zA_~!l5&mwnJI+zZqEA`#R+Jxp$|wvtcIbKLXLZBTZpT`)DpsEXs>`$XFOTxnF2iK{ z+Zm#-_Fk&&c=5$DzXC1N)Mw-KypGvJP|L`sqLEE+Ti!YFt>3lu7>Uv+-jLUKI2~hT zO&I#^H;z3S*I;j4(|0T9s?uxU5p>^hPHoYU@#8fa_iO2n4lj4^$n?oN{y50*%9B90 z%}@SbwdG&yPMrO!{+XTAXSa|cFYUH9W1jse*+l%Qpu$koY|>!D=7cT4?Z$nzjtromXtnt^w4Q z0gP6@`FJtIxYXz~e}n{e7M-)L&OXr#-+*Zpc*)LZeKM5DUdO7D45 z+_rQi0-mCb{G6|rCv;v*!A( zdA+0AzQ4>xznFJ*w}`*B1b z`_+}Y*UNjn)?RS}+S^9*(+2kboD^TNwomEv1!q3P@Jqr0h1U*$1_Jna5hEc;psh07 zH^x0;Xm_1kIvRg*6S1qh7P+&mE_KUey6`KtklUO-za10q zKxOw~0 zv2k?Fw>t>~&Zg;z4))+J9s1c^h34gnZhhE1Aeymz^fC%^3>$IRC8}I#vya~M+jPufr)uMA!&`g6 zmENa2OJXJ$W+F^Vn~!;k%r9*-dXQy8rh2e*yKlYV#9w^yw8-10dU%dGM zy;~x$XJjuJdr;tVxym_u&*I=1mo3;swX%oy#_;4?oc?W{$j09@0ZEK4s{<$JWd$Ll z-*J`FOlJJ8Qgq3gtqpzivTe@CX^T=21a^MV-m0>Pth}O&COPflPTHY;E`~Vu{i5BE z68l43Zm%jSFdrIl@O`^nA&O*eLBaN2b416wYHJl@9K zHtI|B28TplDHUDItM0ly&GSyoa|rA5>H2L+=jEe0=jtNt3^tvkx=8)Ye%?@$^@(FM z?ahn!&1RAZy0@~x5!)bPLQlFnVMnoY^G9K2YjdB;EhE=jdo{EjR7fX&ms;@{W_yoB zcihMqOoB<)tchgA0(r*|6}yy0g(nXUltpi7j!-9@D^A*Dw8MJt$LNi`+s9Q6^E-Zw zioDVCqsX=>-7M8zcb$H3^8(vXOTId%JVH0P>>T8YnEU)#o!dxq$ERlZs0GFGCx+|7 ztZEf@7fy|cfx-8x|JHyYvJ8<*1%>&>Yk;|#Uqu_znrgyxp(J#LHJOt7#wfHoway$>g zh_?lTv`O^_j*g~3G`&utAsc9m*h49lJW$4N-d@y;wVm~@C6t-5`_9v#Oz?5bRqM)# zRk)YTs86#<290FvXPniX(D^szC&P4i&b%{xvZQ0NbRy%t{y%8&qGjCDz=W;;1o6%R A2><{9 literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/distsim32.png b/cuebot/src/main/resources/public/services/distsim32.png new file mode 100755 index 0000000000000000000000000000000000000000..98ee5979c1a6950b1ef6c33c5867309225e7d176 GIT binary patch literal 3856 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 HBRBpVd#UBd literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/eddy.png b/cuebot/src/main/resources/public/services/eddy.png new file mode 100755 index 0000000000000000000000000000000000000000..872c57135c352c286d527371072fe3425bbc73ed GIT binary patch literal 3938 zcma)92~-p377ij5682p-L$DT*kW9!z!cM}bfXI#;Op*!2W+RDgiXsMaK|mi!WfiHS zlq$F&2r48f8mjWB6+}^Sfg-XLtzfJ64WP6=&$r~9$^6T`-~GSu-v6F6dqP9}wUOpX z1OlNQ7{CaF-{{##LmmE?q^G}zUz(zTSP24wGMs%>5G7@12!uM48xbRo2@ayMgnTEE zEo4GYseBP^jX=10riwt;*N_y=gc7&{cg#e~6%3locE?1Mg7Lv3I+Vx_NEbul=^+uU z^siY|HpbHf?UqV|0r-#} zBFGeOmbzo$qt0{Si-Lm}fCZ9|O2L}pQb7?8aKhvG{8?gi))HwL^ye`?Yb}XL6G6Bz zNFv-UWl@cB0K<-keNq77pS;d>Bsx za{?9!i4uiUp(IiGAD|bu=Y*II0INk?E#|^i1M(O`*5+BrK!!U8-f?1c*)$eJA`u`L zB9_eoNmwEPaj;Z8m4ziagDw;zo5=wvE}w8d=T9f&84S9QGttG52mrneZ=w&0&LDbI ziBw-QflmMA8z_)SK>-W;6q^gj21rZ}lS6{AL@LCFV>>gkObUgHC6YKy3P1$e6e4-f zpGFr$pj0T15DIypN;UM85@KI+u#nB=q62DTzYhP@E}q8qfQ)|56|GjRIbQ z^YrJDU7P_Tz@ai>B}pKb#3Hg`G!hw0VG&#aDv?cb!2=lF!Vv?w5;$vVAA3VMl=N}L zJ`J_ItnBVw|z7N?0Ke>Lv(98P((CGa6C*7_bjN@IEE;uC0r-4lZ2 z+G|Rq@9$=r_$JY+`9Jj}Z@PcDzxMpyi&e)Pjr_UgYov@9a?IK)TfIZ|%VYsQZ`_5q zTc%&${3y0n(O;9Tz#a

zb5iSWv6QW^hp2N^q3+-7oKvnGtGXZL+dWW z;!6IHCacAcG-bt_QvRY}<4})RlwZs{eLLW3V;QjC-5}dgwc8bw+u>#W&OSm-m3G0- zVr3TI5?U?XZMvqy0DS%3%YC&Kz@oq$?qROmhJvdvZLQ><(~4Wwlia0RG8-dR|MrQU zj-E!4;x(a(Nhpi1%I!#;upYARnpF0x2hi&5G^bvQj4B>Ev_|4AM?x8BXYHP?k5{YY z@2J|{?S7QOjE@aHq*@%Qm>%{CKG4&n2yfefNzjaUeGpsG^^eXigX8DrU*y<$8Y(4T zk!Ge+A@%E411&EXo!|}i)l0}@#^(J+Gj>7Ob8?F1Md5`*)_18ol=qYlQv@&Pxp8xA zx5y{vgBx+WEthcpHOd2ZD6V$BoBrDL_=K~geWN>+>z~UVs$4AYZqwMFZrcBwO~Io4 zhlo|TqVtj)q6S;U%MtfMc@uj7n5z6jrHth+iq-!1t;`4&g-gCZrO1ynA-^=KojQVF z*TC24%x+ZqCbp`sC7e5EC^&7HeBKUO7psG+vEN_*VAGNpmk~$WzA-Y7I1$_EH`Ao) zRJoY-WA->0v!zB6AM;H^f5Bk%wo8m9!ARrgf+BSf9Q!!+-J9USu?+dp7nU@2ZQZ(@ z_x!z{YIh&%gs&`oqjJr>YH3>;W)0-+Z9=*&)Nfq6!~QASOfOF=kDCzfULJq%>@L)I z@%J~GUTYi-ZK?k)67(&f{DGq=DN?HLE6mO}$7nu3D0$q9OkA4j$rD?pW4EO#C%Bop z#Bt9%Di)(Q_jR3>pdE5m!isEay`aUW0I7>TAA9!dlQvB{SLaSfyo*SVH!!q*#BTba zuTXwhc=Fifn~iqLu&fcENRO>|7Ef5|AqmZq#*es&NTj%@`C0jU`Cy2h6{=kdZnA%{ zwc!ky)7|%FU0IFgIQ}KySWq@L`5;Qy7N~OczdmVk{1CEKcS%JbJ7#mX!D?jZ?>1zl z^NK3Z#TL^$G)`h1J+$Lv9ks5mKd>e{$=f?q>Gq|WXkX&p)DzgGRMrLGNEL>^TE1GN zxzUAF`}JE7)n5s|9<)>LXtvj@x4BX-=5FJgq@7h#;vL7F2cyGdGamlV`zv)mt_mnq$T zHkTa_v2o89#_U45Av|!;FWJE2S)+!6BE;94BxuW&=j4N#5jZn_OJjpZi^HW(K~u$J zCL2+_Y_(xp#B)VFLu6FaVl&c|9(n-v``W66#jVzRvGijqljbYwfQIkDB1h$}66TjU z`ks#VVU;eg^xCj>FD5%$tZPx0j;g<`X=0tac`%ktDVr!5+WCa{{LCh3)F$zzEJC+0 z@8ALTUzW+9pbJKTXH6T>GZF17jJC3OX}P6)k2}#SE(gdcG9GOHKQ*fX5WBe^$qh7Cx2>?ut0X#_Xxdv%btNRidm*fjQf^ApH2`Jk-?BuL*ry_0;7nd-QcS zYfMnu22h1vUs3Pyo$E>x&Tc9%PO)$tk8@G}6mHr7TXvt_w`l`D{Lz#eaJs&9wBO*u zv_BJHV_v)O2(H7`>%G0bhl}O0q=#$@(p@2{AINAHSV&)M^xl-7u$RU0@$UpT?8@o* zVT#ALKN_np8|Nh}a`sPlm&#XvaAFwh?OB1^Wb>8cQcQ{NP;geJF0b_0%2KsUHrAD~ zC)cml-ar>M(GQaz@~bN^Ik+@VPWCK&PE}3~YZV8bi%o7&JdB!oMXnNjH`)JH_tG$> zpQo)!FU^S>G*~t=Uz`0I;3RSXIf}f94_b_8%;q@*GaOuVL*_hUP()P za=c%&*xNX0Nlk}=&+Xm!IfwKu<9mTrD5uBu$;uh4V#Us0d#jy9hCvXy^4^Wh8b{)_ zMjc)?{c>}_iLu=bdFIGPy?6FLokv_vmp`L#+=U{U?YQNgII`I)=V?KJT-UVi(yO9V zHYGku95Zn7d_$oz0Ru$3=JeBwKuQ z-_5rdI1W}jw;Jqm?)~PrtEX+-jflrCb&j`&0NZa{d(phQl;O17c$wk&(H$2Lj!kHBy8OrB{^P;84r)Z|qgr8|zV_~98xKWl%v{GWnowhxffJ(E#m zq*IF;P&+5ty`5p`#*|ql5Vw&LHMU1*e4EGx@*-B);lW?=I@kRGOztv%zar_){*FGT zYpadV=pRI7?AEf1<;Iw{u0fYdhGEdFn24BN>s7j<)c--oHYzs8-!9I`Dj#|G1v}74 V#Wl2N|Lj+Apl=A{luvxtzW}gkI~@Q3 literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/finalizer.png b/cuebot/src/main/resources/public/services/finalizer.png new file mode 100755 index 0000000000000000000000000000000000000000..03d3a2e25716ceb400c13b1119a98b0bc98dfd92 GIT binary patch literal 3718 zcma)93p|s1A6FrFlafN#Iz-H_%$ED+GPmXyq03`?#$p@W*hb1_E|t^GR8A;$DoRdt zywyQ&sgS4~6{jLeB)6PO7roCY)#vSf-?Pu>+4H}Af8X!_clrPJ*-o0btGdc^6*)OM zb*dZ17ka~GkCGzv&5w_tgkH+gZX5V=a;n<0XP(?IdAf3PiYhGsAVH9qCyCBwTL27h z7-%74M?+{iIU9RXG(e981@JI1oW-$4j8@hl;4FqMBGA$c?G;T1BUof8d_-EEb8yk}xE z1cGQ13MCW@Erd7=E-xH~ArgrwG*-p|A&`7AM*xVB9R8{=3>1)0=dq#%EG`EwV+6vu zu>xBJbktcN*wJ2IbHp6}=SV>@Ly3TB6vhILVzXtA&7k=LU-0WOeu(D#i=#o5FUaS{ z^5`H0U-i}4ISx|(?884Wc8&u%f;n?2_W#@Xiw=W6hl`HoMa_hXK}Ug6ARFT2Lq1{V z9Ey(M3b_0T?th`4+nx!8OaO`&X&sLRRSghD;nHJelvIi>0@|@)uoxsdXlaQBt?@_( z6RPxB8zC;2}CPS5pA;L|(06L2!3y~8@t#KGUhDi*AB54UAE$Mg$#Aa!QB+#+e7$TlQutsALsJSD$vG`Ed#GiYE9~kp_ z6vcuRq02=A=(2kbxd}j?$c`af{E-{~tW;+0g%Kb``F+B_%i=7I&t(dP01tEwhpxnb zRuvX&VflSY&6?3808TgvwO-VWqbOOAn)M7do0qRn&+L8E&miw-mY^mn8_u<7XfoH} zK@LRCgWC5*ny^bwP6rH6Du0+8D6p`i{t>{L!1$!WGr8hN`;6a*19Zg(qoF zwDc6oMHP(O?!#MY<}OlAn7!L^A8o^9iyY4DBKK`s=`Q*;DJ7}6Jq+xcZ^S0*`v#C{MQo=1#$0AZR4#T*ltY}e*E;J=HB#g70v-uJ1h*hw46|FdrlANvLOr2 zn-xGU5+dD75}{ju5jI9GrK~f3%1&-Qy0ez$XfW0qfVr|Euqj|re|W8Y@$dU?rLMW! zVtv}U@L?I8q(csk_n{W|p&zHMWG=i})LS;LU$WgpblLSS!)>Q) zAxT3^Gb>4M{mS$Eni_&MhRk})FGsr)ZnD?EOBcxp8S&EPomzxlFT|JZ70z}l>BSeG z(>W8SF)V0Ndg^gLLHAT(-GYntIj?dyl5N;XvpuVUJ({rK^>H1q#{QL9->Ru>IGVu^ zcW|CMor)`V>Bt~@dFSMu1zx%oUP$golo0K%VjzJB=PYf?)*5a57_&M&!9enw0@orw zBT^9^flgQrp}hjC8YQrbK2lL)V>(aa4800nkWtxLJ0^d#BxXaN+N40T#~6d0*Cbh0 zRu&jh+^c-HBhSs@@~N2R{JMi7qef8q#mCi&+}wc=mje!SO5Yhp<@#3T@h17+w09 z?aGkFaheGx_4T>uiyl_%>Bf$)9qP%?AA6VKM7MlQGg8TR`PH4iQQ?qXrO$J{lm}kt zcPu99^<>;L+jwqQu&%Cl=P0Zop)LIVG4u(SarNQl*xx%%gqxS}9_V{S`i|S)xBThD z6Qj4IoB^%EwAhf|W(Dc)G3PDkG<(FMN17VaH-($z+W24ZIdsv)qf$Cf=By2lH1{A$ zB6Wfb#P`Dg?zWp+wC&}AecdSK=UdA}E=^Ar&ejhMgan^bHrtNU_au{-Ob(|Tq|!Dw z#pc@RB_@d^s&7`LJTzTslb5WwwBgQ%u?fY7>=$W&xcC0Gthq7VOf{H1Qd4%L#KkB? zvSjJPt6|Nr6Vrw9iB@kK3bfu%gtY|PpALPbuy=X^v$L+{^N?asLZizRt=A| zGDQcSFi+31(^cD4221=LV8>v!wB-mpWI^HGg_*icrg3%k&7&kIEltu8(3S}sPkXHh z{RrdNo4QDEm#Cgm`8(%esZP9_RxpoH&+RssPW3eQRD9Ci^l<*)0j^^^T^%J+MOp9U8k43OPCH%G zeC5iDUcEYMgUT9ETbh3|Q|ZY2v}vt|Lplp32b(<8%Je$|>Mx8=`Abbb+R8bpM+p*(DLw`p#;aPK@Et{nGcJwjTC5A$3+89hnG< zb-qzD=)T!qw^gN&2z)96sFf!duX&u<98Pu3Jagx$?;;Rg-L)hRlf;UN_$|>26scz%9uj2RS zr=n{DHgufI0#|Dvy}3;=|H_~070NesF2Bh{yY6Ka_P@KOxJlHv3g|ZsHC$($SEV9) z;(eVKjDDix9#ee+=0MKr9_9?|j%urOwD@mqCy5%r$5C6gBv?;HvH)dQyhE z8Mq>7WEa!APsKYa>h?04m{M#K=w7%;;%;;1r{m3T*Y-Q+$EO`wP{Yq%V5r-FqTM^W zp=m^+`JzzWXDVm+WT(jg(tFeUF|e-4e0%*XZU%{km+jE}Rc)D-T;x*FHx{oD# zoZ#bXS>>i7$GUaztnSGl+H@?b;;#n>o;t3QR!{Fg&%sSjRvrvi3Vk*oeyjIXqrq6Y zxU?%$yWPHi)T!mop0*Eu%KAp!?9mvmpXJ4!vd7JMudI@ZDdp zw)E8Mw)OA&(5$5Az3hXhlD-dR=k93o@hmg5mJN%?SqcYCTqFWm`HthYoq_@axn(zE zc&g)AUS0pBlHW>I8=TJ;ztS7xE3O&gMN7w=K)lkRDl#OgAbVq-cg6I=kd)%Ko6p*& QW&aeZ&fb(#r!6V}2FMfd{Qv*} literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/ginsu.png b/cuebot/src/main/resources/public/services/ginsu.png deleted file mode 100644 index 28d41e9fdae5f20de6ba47632a4eba6d9cbd7212..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1519 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 Q*8W@cbo1erxUSszZ+U0(6aWAK delta 2377 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 diff --git a/cuebot/src/main/resources/public/services/katana.png b/cuebot/src/main/resources/public/services/katana.png old mode 100644 new mode 100755 index e2c103e66bedd44c5dcc818da6983047938cafd0..91b7d6a41acbd970283155752b60bc36fa3f59af GIT binary patch literal 3819 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 KP6cbrp8o*?2^UlV delta 2055 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 literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/maya.png b/cuebot/src/main/resources/public/services/maya.png old mode 100644 new mode 100755 index 90e30a4034e0ac95c2ead4d37a9dea3f10e2ebf1..8e541a7580fabdbe5b79c3954d731bf7735332d1 GIT binary patch literal 3478 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 delta 2663 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 N$-~W;Q|=m){5P6AY=Zy* literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/mayaziva.png b/cuebot/src/main/resources/public/services/mayaziva.png new file mode 100755 index 0000000000000000000000000000000000000000..ff0d5767211fe651115f428d16c104a382241443 GIT binary patch literal 3671 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 diff --git a/cuebot/src/main/resources/public/services/neat.png b/cuebot/src/main/resources/public/services/neat.png new file mode 100755 index 0000000000000000000000000000000000000000..44a5704218fa91f71b0cc2f0d5bce10c834b61f9 GIT binary patch literal 3554 zcma)92UHW;8V=HlC?c?mAR!`xlHMlKs1QOCLswWuo|9x!BqSjT5Y#9j#kFHW1r<<1 zk+r}g>VgX*#Rj3cVi!bM*MeX{(3O1?K-BYm?`_VR%q{=-efKZ-KWBal^!GM5vo%8? z5azxLBC*eE1r)N{Ka{sR zibv<87tBY^Q!`+KXh;R3)X@^DlA&gzhj|(BShtKrqlQgXQB1VEP7oE&2}H4E3J68R z5->bG9*?5Yu{@ptAVYXJ6cJA(;_y@)k%%D@83Yo8NJWkQ(6F3>FJJ_FdX0*~GbUQ3 zQpp)OTzq^yHlBo)DTFuzoleK$i8>D00;5cjsz5bHs+{qe!4p#Q6k@qbER&*ij38GQ zt74+zqmK9xE$48?h^5NWNWn3~sX;l8fW_mYqjioATPsz;(3fL;*IF5xAct_lkWv<_ z;6bqYj4xnz9IQO*!#@DC;~=SO3=YTse}g~k@Ofi)@>qprI81yV4w698FrO0ki7@7n zTqIM;lp@)Gp&r{F4unnsjus<8A%?34lz7T`u{ug$PbM1P!Scm?1`nc8h!8-=@C6_R zLnc513>{DBVJIXJppp4p0f7d5=J_6;MWX=j1gbk3@FEikY)^Nx2ZiNHcBhl+Y$}n( z`i%9JDpjDA2YuES!`gTOi4Rdp5C)(DbPO3J;4vTFK;0gXhXk*VlWJpZfu7-{u$A;cbcCnc%M%p{wubydO;#4J|wLRd=UVWUt z;DEtZ=Y=1xl9U2ry!PX~$~WtC-ptcZI!XCk+o1)i?4PFWj4>1mzLk>er^lok5Vp$dQV^~OCRM?R->yF8fPCen5TO~X2AlfB~ zZ?ufDQleK;G0vu;DPmLa^0ux*iOHU57(mI}($-jJdi`J4jVsc%OWh-TE*>Q1rfKy< z>ZUGP8lC>YJM}K%=H@e`do>n_dg$?h#oT3wtIw59rAIBg6q7#JGQ&}svNbSsVy)i5 z(DL4%n7p|00p-{tFN3Cqc{!E+&K>1*^NvjHLGE9%<;h#=!gDMu!#qHQ+D1k0af~~k z)g(tWw7fY(u5hKn|*gGR|g%PQUa!_MdpGq)X-Tu31?ewP`kr;ck?Je^d zSDo^AwQbqNLsI@s;?GPZO}e`#FVCrA>r)!-vj4Hz>n}{DWUv&9Z-T-UuvT0$*`npBW)^|Y<`Rab(^eYfs zXm@RM?ir&)kKF7;R=03BCpxv<=tB%t-1O}9qBb{KCrw>)riXA_WAOOXj#9_YL~n7N z=4qFDGdCim;G|#1tMtKLD<1p$)LQ>bQ`OaGj2UX>7Rznj_7~ns@Bu!R{j_10a6=m_ zKmYg=L}aa|&*`XSGEj!Z1cfsnL3i9l&n+X`3_{{7d*vsuU%Nmp>b{#;F#Bj>4)2#i zhsbq*2`63`maA&Odk&b!M~Q!-I|tq|cZ``adV88KW|~)oemQ!><$jbBu()$jhu}&nBOK@q_=l*;)4t?^!pdYmP?0VU*fb zOyByb=z=^X=4r)_;*K9)%^6CVz;zuMKugq1fQRGQdisGO1%LV}TjB<5^moMEo;$y$ zZZM={*7~G^Y>R6fP6R)Fw&A34%41Zxjh!@D?KY!3x1u zy12zZTMbg!>)uS8e%zjCRenbwd5qO${BlA$TUun;44j@9TJ$6ScRP1KbISYyIZ}V;vG2^&&);LBKdzs&i-}{m59asQu(FB{ zN`k5jK?EX`tKH)wTMMRjcYR1QvvDvZ*cuu^0Z==4$}MclADOG9s@A9He|9L54p0Xg z^Gzy0ez=?!U1YSSbfVMYNx$BG;rO~TvD`A%{Ca!sX>m0(;zhuljn_&DFSzJ&r~EX^ zeK$Hu??}*KbwTANZ;rkuQg7hmWstn1*wL2O)H=IE80*zP?Sb9%fS_Ym#o$nn3fGkQ zyrisTA7{}OdXviwrk;5iXG2B_$Jh_?93;*oh9BWQSZsuT(HN^`J}FEpQv%&HnZi% w+wjF_te|n3NB%6cKLucCC8aeRJZ~SsnX7ghCRFlI>%PK#+5VoVJXR+E8}5{xEC2ui literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/nuke.png b/cuebot/src/main/resources/public/services/nuke.png old mode 100644 new mode 100755 index ea993a6b070e288acc37a331311d3f2993ea7752..086c8709c0c1c6f723cba6aaf15933b2f8fa79b9 GIT binary patch literal 3581 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 delta 2516 zcmV;_2`l#f8}Sp6Bnkm@Qb$4nuFf3kks%j<00(qQO+^RV3J4K03g9%+j{pD(gGod| zR9M4}mwAvC)fL8n=ictO&6_vFfWx5d0)Y{U3xY(gD2(8Ss0dL9H7=zlT561CG#ZUY zt70lfF>Zi+TtZ4C7*RlFD|g4TT+xV%(FlUW%sgi1E!}-j{^%Ii7;6HI_;5Mds0U{YXnMbvwjz`VG* zH@&ncG3vcx$K2fkPSt4^PqDXp80*KsmIP`CNp zh_5;fodvWI2&$0qlxza&pHqhQb4YD}0$lF(qHB0S2F+ZYYQA72K={Iu;z@RzZwsXU>co-DmhWzz-6Qbo1>?Q^Yj+TJO?+#e^4FC<%hy^qY!t<+B+}r2+3hbY z5Jd5ONP}w9N9t0_S(8G}oD|~MW&=#W%cW(_?YpjJzO(b^4xQi?URg-7YvSCc!pwOo z_sv$(yH5*v^un@?*h?vw!5Z+aVh#8<4q$MDa{rluJpGF@KiONkZb?FCFG#vCzUuXn zZ|3T<{jS}%$%o_kWk=3~m(Ll0@0H$INWOFUMGKSq)Y~4vY6<0%$q|0Ng2IwlEoVLC zv$+#;Sw$)^bae~k1}keWFH_f~P=uF0FkJEvpCBT7?Cg>qJJN#eb*;3l`2#?>a)y}j z#iOl%9vZ%Oexuj@)*W5pHae2pcjrkIAUIZYd~WkbZbfQ z3|K*t7zy73JwO15?(bNBaao({)XZ9tj6VL%LA3FP(y}S70Qn0SW4tNPMF7(E{#8U> z6X(7lEPlu1p3_2e^rQ$%5cUcngn>X2PMjDqcXl9sGSJ>BbQVM?K;R(l$082{LG#eJ zN#)7&0_m5+J z0SU`em8$~cBEbM-2P-4`D)~UDODnk?Olx*b+s7$@b0Vsu1W2k6ddNVPJ6Bus1*D}p zsJAASn*7kZf60TY=FDXW&!_awIj#5mh;PM7Mnh!RF3Q4z8=%77fQc7x%=jRHPcTLn!JQ3)d;Ku$ZzF{DBD z@iq&Ee5NtoJ z3>)0Bw}%NP{AY{d^UcEgErz3R_qXNtZY|n@72&vjBl+WrAx(QKKc5uI>VFHbePr0M z-mvH$!}Q4^^Pls$VTl!EKq{V73Ly&6555+r76b7h8q`@pzv>j6LPu|0V33`hwrW}$ z>k1xv+0s>ifcwq}89mDJ=b0flFZ1|dgUA7c6ck;%QKWs7QLk1dbn$mQi-?8w?Lwhw z)FaGO2rNA%p(cq~zv_=#6_V^+JL3C6BrJN{;#s)=jF3b2cRV&QU_)LQ+@Mepu?9%0 z)TNcs#UMBbJr3zC#MF4;P_;V|zHRHeyK)sH1`H-e!c(jV3M%pURksJEfL3lOpdzZOf^SvRN%Y~@EWi1u zrxfCCgpoji&Y2i7eOyGL2&Hg4tO}Y=s9J*>Y_6D1B70<=IEPf+W*6AEU03EJB8sX= z!c!4{fxo?Ou+2VFk*e@O4)#5hJk^x*`l3{Bl+BAn`#KIB zqD19*`>GYK#bS>6sPIx9F^@{+5eW;~WJRWb75bbL*a`y&Ip(#7Od8=R6k%9jC!-ow z@N2rw=0awv$t5^=xFelLLMMpmu9$yk#304Fsv5&ylibm|Dpk=5x)sKZa$I*@1P=Y_ zNM&?W1Yzn~(~}tW9xnI#;UgV~k8*VP#NAFc0!2^}koa7kS0ho0%cKF){>}*O=$PXX7JI86Rq~7>lYRH5Ej6o{Ne| zC7SqbKx>k^ox93AUPhG=u3Y5t$tH1s*Bn(QU6-ODO}7j^?25c8Jzi^5`&_s&kUm%2 zY;AD;^w1nO+C_z}Xb@GK0F{ax$hJ}8r;0?vLwsA2hsI^t%f<@*{gWQ|y=2`@Gs@+Z{4L!vHB#vCV9J9ye0|%wJ@AQ(LFj`%2Pb?x+>G>2f!#XqvfPFkSh3sYl0TUOmp zkh*TTUC}J=O(8t`t<+$H7hMW zqBS9#ZX_xUedjafnfDA!KQy#`VJQ|-u}IYkt7+DlQ>{%R`|jnKePG0Y3Hv$Hbt#;y zzqc^pv@5eezPSAdf6ao25&w*s*Y1_A&8cYfWmYzvN^d^%`6k1X;^#aeGB1>yjXS+X~WjOI2{eJj6erAO1NFR~#$(3zyKa7G0$(qZS=A zW{-6DEH6=%A^ zhg zkjg==a75b2&|m@qBm zOeUsbvC+}dm}py!ND_v{Q>j!ejv(iN5ol?wPzJ=Hg;Mj+3`|H0N_b)!Pb5Uj83DE^ zQs#hyL!Hqe5PN#g5(}lDG6m-h8v}^3cnl6J5Xgm1qop!G=t~&iMN9o-#SqpHl8PcF zAOyqBzZg45!Ja>9_y@+$QIJqJYYylBe;a@H!vSY;;z$X9I!zo93-KWV%qN94;b#Sj z!$mTYG+gvwsAspQ6Crm1XN%@7;lW)4@R=eoQcmf{bU?v77!Hp^10g#*0z@IAIb6UF zO~gZ7G!;h$(RQ`~g-qnIxp*?=Gtc+z8Dt#E+1YL-k+PDA$2&8fh;%y!ljuYxQk_Wz z2II4>n@}nPgdp_UHxKqr03m>YC*jd-kW5AsK^%l;Q^etMW4{L_QfT;Zq43G!05ahJf;k|KE0PERxQBQGAPmBag<&Y8+L z5nm*M9mCPte!cF-VE9NxTpl0ZkovjMk#5cm5}ryTp$Qng{FuyCl?h3BQ4nXPL?l2? z_c@LCog9-PE|qJGqoTJeSIbGie8)?LfF#Y{-s;CW8bDo=W79DL6a|I~$@aPYPEp_S0-w4gLJ-iO+*Q z!iS3nfbw$=%LHI0@-XC!-;?prT4lyQIvj#2zb*JTRh)rIMO;}lAc361;3M&$T}2>Z z?7nTO88a{(5QahU=*3P8#mZ;Yj56#@UA~B(-ur5v!Rn`%;2|l0oE^{b%j|%MgfO)P z9^Y-=CUgWsrQVI{q;kaateX-~{aA|r37Te$E{&9y zSUgv+b-R_%m6yu2Q77&XCg)55b%sJDtvGnO)I5ZZhvj)--^9_0ee_W>+pgM6LX?mlQ zquI5inUz#7%UE&P9z`GKk2wc)8zhx<^xQ&blCGT^{IGf8`TL?XMsZhnq3OS~Rp0Sd zCl2A2_jPS8#cml!yI21C@*=(=Y@Pk9Lu&pZ&nVa~5LAj8oHvkz8SrsenJkzJT%*p5oxuixKJ2vp_Qd5^OcfIzNB8BC* zPb+TMqvR)1eOU<_XV;g#K02QDWOR7MqHILjc;7j+8mS@Pqk04wsJ}06i}hJBzCmnx zc;MBArt_9I5rv6i%Ttuj1e!NJ7_mG)UmV;e+Wu;2;H>zz<$|sUf&JCCNlZ?=)X>G1 ziPYcn+))YpTt~n2!J1y^Z=RZ!kI_);DOA~Q&HeVBJB+YiDsd$GZ+nV07|ZysvM7!8 zpAX7%#y#e=KTf3u72dRb`iOMUTV+Mo+p9^xWfh-Hda2HjxrB%lnC3bm4Tl=uzJqg- zo8W#kL@5CDIi9p`ZweIn+hRfiQ|eF`IluDb+VJAxCne(>=xP4E+<<1i?nw1|YgR6C z!p!*B#I-M2xKRDWPJmD|byR<(tiK=|Z)g3Qg~=)Li!3^{W}9L%*xW8QMJX_b-u!a8 zAvaOAcW!qaf}fWWtP>T*un1555IR0~y`tFdWzgjnC3V$*a9ye{rFVps*HyHKJ5`*> zvSu>X;(#)QcfIw~6A`Bo8IZN6_M|5eW(A56&LuBCC~Z|)_( zcPtG)>(Mt^=RBpFcH!azddISmHCC_Gv=h5mNoh-l+;Q2z#+N5$3}3!JuQ9Ig`0~Y* z;&UAf*HFr8Yuv*!ougQfOwW#w=$q{~?#!@JQBL-*sD2M|PFB zUWwMVtw_@~#fFu33X4tkZL~P6w)84Dy0qn7c;dVHj<2Pm|H@JQDun(8qFP3L{e)wgD|mYlY|E>v`@H=U)=bozQ;n<`J+jy_cI7=h3wMT ztxfJN+K@`M9B8qlL|+t$uW3@lE}sr{SQS*Z=E>n>9HB zd(HqZRpKcP(u8i=#L=Epidx5zk5Xa`O0?!?H0x*-`Eb1n%54VBxfPKsCWokpe3If% zt~G7!0DR5utL`?x>*ce7)`iIx+8Za`Z=U?YM(iD*GX`OP`Ox(IUd7GRb3fLsd*RZ5 z5o^68?}Bf*m(>Izz7$hynR)-lUd8ujo7`@WYadBovhvclN*qr)0~Xi&qfu*Jp-BpT z(Yw^-5>RsMfb3;_w)rATw%;bx7qQtI4{~2^SgTFEcG0Zi5Jyrb4Iz1L?5hQpw94wz zG!Fg+NUpO~T(#VKtO55Gj2hyzj1K2=C%eBtNzsM$8 zZ5IocdJZX@9Mq!@FLQl3es@?SyEMr2deGjH+Z@e3k?yEDl~%{L>%Op&9@aXw>(`PU z_p2!xx-V;q*K8tx6o;6%DPS$0c)VGEgP)qU;7FYfePcV2eA;@gMS@G-evV(DS9{s+ zpn}mUS@+0TdrLBL&sI^T(=P`9>bSFf;w}vWp$*x2>$2KKBD}yhztC-v|2A#po^#RQ zPu}XA&l)-=obMsGnD2ejr8x&t*}AHpXIlG!4Sg`oI^!X<*(TkF$j#qpBNks6`tZIq z=cCTpa!j;$ANlIMhU-~_-Rmc-PxJmx-hHv{>a(3)-Y)jw4*$U^zrzlIprM%>39-rOTv@Q1J|n#m1_HeJ|zcuZitpU3m(&zV}?=Vow~;y zHGg5)4^?jpt9fYVx%>6MSg_Ui`=_`3xe9jj2r6F(iv zZytVau^KRrp{-{}AL{hW^xPrXJ-@;PI{NtXlj^5RHC@M8OM0ge`t{iZl@2!wy=6>N>ZWF zf{g99_(}?ugb-1pg_KHZ(ds)xsh+Rz`|do?ne$(M@9+J;zxVyW&vUlAyROtyH&jO; z5L!--Ob_^tls~G<@V_`R@-_TY6FT~c5eSVr@<#!Yl|2`MP*&%&yd~Z)&NNUEjA3&G zeh@|)EQHYrgte_y$OZ!;3DOVp=ZDZyFV0;+A^99SYAw+Pa1k;f9^Wxi1bIffvcSkd zkjg>X+90i^G?*Y5lCY7|;GhsOO-e^i@Y3M1d>M;EPCz7qbd8jq*ptY~-=^6L);yAyG^G!N#Aug>5Z9mSJK zgfuKRJUko|ZiNwu{INJHm5K%Mat;`Q7Dt3g*iv+ec)>RYCL{($e4&Id2tmpj*?xjh z2^|F=buxxvp^M8DaftYQ+eLu!8(PCDF5W;#uVnL_~ zgkboB@5T;cu;;Ha`~zc$FepSaWe#iqzm327;eb;(VW=o*LM9G~g@T}9m`@DHgqsRT z$P-8eVxHi?P)}`72qAX>t3`7Y@!_gr2QdX;sGQP?Nk_pu7!IF910f<24^aqc4wp?t z6L1h0O$DeRnrOwQkO>?=E{;t3#`7zC2AN2)$C2;^$_fGw=fJclEGIIU1bZrh>OjIX z7~gE2Lc|hw2nc=i&4+z+xOgin6$hY6ejtb@_yJTj8w5Z!2M2;U0)<4vkqHy_G=>Ob zO9Ud8KoIn;RNcQRfn+e?%EVETOI+9>KSVB%`43hQlP!VhD0%IoVOMy7g(K0ds5Cqo z4UlO7FbQ=LaQNJaUqJ~J8t!K(d~-N#3H$$oIUtQI5Cya08sZ1D{UNL{#2M1o-C zM4i+4ztETraj9G@SXnXzD@)+w{m_0883#{^WIUH_MJ5wSsIT^%AL?VWQNSy3p1vQM zVud5%xKuw_Ng^9f1PL6NjYvY1K|BRVC2+_T0Efa(9nq05hO-v&wKsS|o4<~N_^?O# za?#kJ{GP*Mvf)VN$B-}nDvWibw=Ynb-eJ%X(;RW{u1naSyFt6POij~{_D<6qNowgfH}zG| zi!ZJ`k`sDtI;xVl-#mKAIg}PXq;#rJsql$=rSmdSHbd`3WtG=Oe9~%#ScF2iHlv{}B5M>gUv>EXD#i2K?TC9On1|^+AM*oT#>Zt&uyz2 zXJt#(iTOZg!I{NZ8+oMUwDG)AhrlRbCF7m9cP%G*?FHTm|0<2L9S(?{Lr=S6M-r%h zK&vX}(A3vD$3OM2=?KkYCcS-bA01%+Wh6t5Vqy`nDk2)tI`GA``mUw%&cL|nWW|gA zv9q;n+WMqv*K6zy{px@V3SNZejEn(hwpLBRE)BE3NNaba2e+$Cyg#2PEmtbYus_}M z=RxeN64~XKIscluw05NDTwhWnvElxw-cfJTp#;O2h|shcRt4LDz7qL zFFCa^C=y&>H1JQu-78@&2|~eFySxKrHwYaPb^ONjC$L=&2GiC*d0wP zjyD*4c~Zz#eR9o354681J$&QRkWJm|rP3Uy@-g)tgZ8mAXH>>7Op-dOt`By+oRZiW z_Qs2| zyRgR3S?%?j3Z3y~D91lZzZzn0IykqF>@n!N?Wde_D^0vzsqLihyQWS8i=U#tsS{U+?X4JVR&!Wt zkv%-8*Y@G7fh^0OcN(cG`&a?H4IDQ2jb^>8;5QC9{PY%E4VNjz*$iYqiLbI+ z^zpepBac*&tQ$!Cm>B;og{jxOjE6JV48Oj4zvtjAOu|ApmD5lZB0uLPUO!*4Q`c?* zYP)6iG~3H6{k%f=wI!!k4QBdJAB$>#YnIr1^mw-q(cM=wRM)VxO-H{bPI+I&g6b_b z1N{eH6@79&lP=-4*?aDU!X zO}mc<{Rg8+_o};&R5<%SnTvmbdzQ41AzkE7gmwv3_y5YWF z9ZHEp){;N;(vxa74~aIob|Z$24|_TIc+E?UDnxF&bX3(jg=b@3G&WKy?CBWk)2cnu zV{D9Vbn|^VTIgnpIauUFYi9R%&O;>vnR?l{b%DbfSh96d0GO3)yk*`_HyyiPXkAg) z`bEkfT*QtsLO#oL)~)Ih47E{c^1tUA`eY z`s5`#_5-!!_?0s&B&%bK35RT!ZMi(0QedF{D*kDiQvGn;Au~5$&r|#FA&Th(IWqiN z6Ihi~YfcCCXmr{HSe4g5IJ$NI*?Ct4-Osl^)AP(L2%TPKQas(@Mslw`>epwYIIbIhK`b0PcOL_+nbq=Z5<__cj-ww|Go8OAR{^Rnq=g zahb(5QbMh;tP|mt)YOw}tF+THsZxWuVY;!)qs)`_TFGM7x75UpfHI=`a3D(tq zxKO)t<#u%$p!4CzK}kfjwiBmMSZIE_!Dz?uywAg~5TBKDnJOLJqR*=t^V>sevGjBeX?7}J*Q3UW;S*LUzFviXV(H*qBO-oI mZB*+7u`Pd`ccJ|DX=ZND{sObYmzU&Uf=&*u%#!7s;{FZ&Hs?J6 literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/playblast.png b/cuebot/src/main/resources/public/services/playblast.png old mode 100644 new mode 100755 index eca5dcf4397da3002af92734768a72d2ec8122d2..d0b89c1d7da0d3ae9971c66a95a5b6ce7c24afb0 GIT binary patch literal 3403 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 literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/postprocess.png b/cuebot/src/main/resources/public/services/postprocess.png new file mode 100755 index 0000000000000000000000000000000000000000..5f386676b1d6437db94a8ee70e938ba8ced1f5fe GIT binary patch literal 3650 zcma)93p`Y58y}b4@3lfLV??!_nK^SaGZAJ6Ni_41MNtc<3Fgx^%SAUwJ~pEA*x-ofjgFTnh|FOHULKtO)j7z=S2y zct{}OBY0)B6h&h&E^bOG1V|(%FB5%MEfa9qF^D4473ZOHhz<7RV%ZWI zf_27&08AtjvCa%U3=8QLgy@7N5lJKhkwzeq01}A_l9?nL_R|N4x|0cnOdiMUlQZ}#-6c=STSLa=Kg;hfA%AQCvegjS=3mX1TX=KLZVSVIjRYq z5G0L|C?xU-$$z1q*d9xS$^n`!=0ceW?HVYGBY|U7ls+6+9J+%Shy+X+p;Ac*odO7i z5EY<+h!9{988AR4Lv&|~fG-4{>7RMNWzS->$#hSOGlkCPfS@PGgTkV+ITQ~Dh2cpf zvDu$(eZ+DFB!-dCzD1~S3Jg+6L?Is#QmJHs0)aGuK_c-10hNw`AW0w;Ak;B?CR>I; z3W+R0B8mFks@%_+z_QtBXMzmuEI$YqiB;*D{goBMffR@_mx} zY)OYSr8AykPf4AtVdWc;&M8Mlv%Kv2rB3;rKf9EZszLPZ=TLp;LKBk}jHB9ZXa zzqZu485{wL!x41!62^oQR5NN^8DYFGUqp}XeKpTe^_T82Bk@OjhS|m$I@pBn_A86RjtiHgS>77XTPxO;Z1O=pbdpyot7h6KzO)=@sbbEgR1kSdJPZzt z+c9FWk-Ji@4Lm(CY4k?yfrH7*%8=I?m?=k`1}YWSb=B6}GVAwHTl6kt0vgjc5Qgg4DF$uoVA`O)%1iSPA#)-vF1t#MbU9VO@m5Qv+M2@sX-YqXaP znj0O)E=k?mvN1o@cu(%l>?Chz{qyk`vmJET5D_Kyt(za}=s75(=u+uU3-i(08{n_j*sc$o{ z_c7)>5HiA3HgOF!C#{QJTi+_-dg-ycO)NAFbss)XKBqw}%_vQ-GI4im+P!Uhdft>v z2e~0eIsNk;W_Kq1d^_8u?wm_O?5_T+1twX{j(6sTwzeyIypR-A`+ZZl%zag)E?!oC zs{O*=sbP}y`cH3B2A@p*{mHAdq1*M@nC-;qqh)`L1Z!>+_FOHH#_qTsRQ!I_DqrCB z&=qf?@mjb4b-Br!1jD>p1C_Iv;GbW+UvQs2qi9q8koD<;C{^S#1zS}vv;N~SFY;29(kADc^+iRa}X?Wsx3r(?$o88 zY%IK|+s$dTJ)|r6(AoEEgFjY1yLrPX$sM`M9Vl_%bcBg_KX6p9D$&6BgU_ri_sDz7 zc#p318pB=fOyrajH^t+Y{cwb-4ECF!8>Lrw@cG76GM@Wp(t?PxpsY(c1&0-;W*kwL zYB;P@o23)pY+e;REognC>4I(P|dkHmR`nz~j?qTXpPhSXwM=O5p5|k0w{Walh7J^RK5r%T_0u zo{oa*54{A22PdB~nkHUD+fpES$^GtR+44aCZy^;=Dx_}`loGe5$kYI>5`K@ifu>rz zp?mq&kq4_fTFGg;LQdPQ2;WLl^@S6~Q)y?X6_z(N#=o|=chT^)ae+ZEHD9N~CQ0h~ zp(*8SLq{v7npd5kvso5Vy2NYC;45I*GKp9J;GLfH0)wnGr~Q{F2U>$e0zc)8Mt)bEh)kZKK1*{jIubKRSArw!BMgmim(gFV3nBS`_zX-DZrG z2j6D~cex!K#GygPQayZ3%%R`{a8>kZfID_*?6%ktdguhj3% zt>BwpvNO?)%Dtn{3t1QAk$xgE*=|Pb0&UY^#6PpYby)xSx*pT4hO=HbO17%=L>2A) zV|-2FOefQ<&FhHSu~2Xg=aG%@q|P-T3^(uE1IwC&zxa`^H8o*5*hRv(Pt9jdVwD*s zmeSSp5@QP$zC?<8TBmeBa@ zs_({uE;B2$EhYYoSLlVUHyb){R<|x$7Lh$Ovm&yu>CPT*@6j5=&YIQxq^h*Wpy7h#G{idsEex*6*w|6#l(|xk$9cdR-|MGl1{W;~VunqqP D&TqLI literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/preeddy.png b/cuebot/src/main/resources/public/services/preeddy.png new file mode 100755 index 0000000000000000000000000000000000000000..cb6c2d9b360195d87a3bdc523bad8a60783089f9 GIT binary patch literal 3730 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 VwZwzIxmNYn=<4LbsdU`3>)#=w?eG8q literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/preprocess.png b/cuebot/src/main/resources/public/services/preprocess.png new file mode 100755 index 0000000000000000000000000000000000000000..bfce5d7077418ac0d63e92965df1e36ce94a2787 GIT binary patch literal 3642 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 AYybcN diff --git a/cuebot/src/main/resources/public/services/proxy.png b/cuebot/src/main/resources/public/services/proxy.png new file mode 100755 index 0000000000000000000000000000000000000000..928abb1233e8401a05436a74e8afaec15227cf82 GIT binary patch literal 3585 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 IZ~6Lv1EXwJUH||9 literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/rsmb.png b/cuebot/src/main/resources/public/services/rsmb.png new file mode 100755 index 0000000000000000000000000000000000000000..c662aa42f1ae8741ee28a1b9025da97a89a14b15 GIT binary patch literal 3601 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 literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/sapphire.png b/cuebot/src/main/resources/public/services/sapphire.png new file mode 100755 index 0000000000000000000000000000000000000000..2c1ad37a24f510e83cf3e84010a97e3ad7af5c8b GIT binary patch literal 3597 zcma)93piA37ao@wmxQF-bd2dn%>6!*%#2G!l3a4hHnV3;m>Dy}$n8XE%E{^GP*N%i ziIU@x`iV*hhjgmrk`AdMav6(4PC;ZL)+k%0L!`Hh8BtkXfUkP^UG7iCtV~h=tNmnSyeLjRM42JO+mi3sVZ4LQ7@t;FmDIi0Lm6)gG2yz4G_u}aUztI>)6&PXa~a;a2XtsOeTOd z5}L~c$Y>HCv03iqb>{|f&1}JzskqT1L1RNKSCUF1?8sL(7XexmQg@6NzbQ(Bi z&tOSFKqiuSh(w{ETh;AzCXg%^)R}lX(#!?m2!zV?n15vjvH=-rjZ*e58jpiqdEhAw zBAr2?qH$CP4mS;T5pe~)?calvXbe2<8z^*gxPT1!zhEwh!4pZs0H}uqVE`Y*iiLa> za;8KKmMBytfgD585x-tv$6~ojL_9$#v>|nOU?SJqv7k&*C};u(uRJExRb_(`K_tkv zmx#iUQ+>`5d?&|LkVoecadb2l#BtCh9w7)F1XA(PE162*QHfM4iGuoM&;6=DrUwPI z0@dkD$TT9Jgy+$NpiGhhG?_!lrcPJ9p>R+w^^Sy}xT&R%mSyb6--vqnY+&LB!Dm z7nrlQ6%d->w1`_B@180K%JTngF8k0LxuuYW&PgjzH(wI6WVNS$$n|Y^S9#xnE7nG( zIQ&qRz%^960k4rYDZWfg3 zo;v{}CdS{Gn7tRSQr{Ex;EA~0(YLi{tE$P5m>oKdR|srcQbmZz@=)AcG7di3-&be>Z8W;w9=9gj%qaVQAFq_UYi%QNuIr2Wcw!aFPu%#W? z;h{HTHwPDJOM}neI3Bb#_OT9*bNN6+cXjPw3T? zFGKY;8Bmx-h9?2GaQ-w^Y^4ZQeuC?}+==D$zt-@r};wj;>gB8HF7| zXE$0a1~ijX79ER7Khgthn7p)Y%dzdwsb;cF+x+^-g7ns%dmTcF1Z~U{K znj$GGShO-!xbwz=^T%5%@fw^a1u{?H<=5d4DsAs}yLnyDE>v%Z<-1c06Z?OQM3fB{7Ps>hdjz19?v+i&+ zOQagmp%R};FfhIvxV+5LICpe7pvuc{1-0gm{mn-`*>ShBQVP%O>n%D>Hpkq0uzaj9 z$)f*IaI$l&Ms*&-W;x<%ionGwSGS`Ic`Q*Y0(WsCVNe4$$u)~CSr=7?7vFfC%CyqT>PXsW5)i%CCq8>*WLL`kk4yciSHTB& z^=#tkH67IV_hrAboUcftVSe*VXPLDn{@u6S|Elq&cS$Bc`nP|~B%Ez;RH=V8Vw=;z zU+}o#guZ^l9>U|@Kf+CxB)4anj~2Th%Nj6zf2F%3a3L6aXSt#Ks=9_3jR;qMQdISD z_kGj_MQML#Po+H0^6+D~Cti`qabwE>W;Ow%0nhI*Fbj;`S^ub__qJ8B@x87dNxtSU zMFz%yBv!AlYX^G?=K#?W?=*~&_Lw1Xu6$$mS5t@n3z4m0G|2fUD;@m&^5q}p-u*#Xk1)n z=_%53Gj{vIC-@@w^dI|^u6mg5J~aF~Ahi)2o^S3|Sl3;W=$*%;|C9#Xh~0RW8Ms=u zTCYA9)~;%@_vZ_j>8E4mYL_b=G6}BcZMCB&@N`qNiWK?lh2={OEjiWBGpExvuAPtTOzFafCY%;5Ri`@o z?$V~t9kuz2K&`Q5$sJCBN1j*DLxJhR`LV`EVfp9WP^Njo7Kyjp&*&QE6gw4YZ||$_ zRd32xSv<7)(!0vPBYalhIS_ZG>Gqm4$rh9kiyKq}GKl$x3b+e?DBUP@NKVpi9sYQ2 z^Jepo2WQSUJXO3|a`{8fY1MZp#iOK_^4{UZn?76iIbP)PE)venN?TFGaL(VQTk!nw zvrB_?>C^W1kQR8_S~(=E#%0r?;`nlfzKz3AZpU2vZr<;D9zl3{=caxhlHaobUPIun zI~fV0-x1#akcFovqs?tHa;ItvFwE3&+Fq>WI*eSNwmxgry;n{2%`Nv%uVGJE*_TPMCr3?gHq*@qgt zIJVF2s15q?Ijbu{w;X@=s-Q&;ho7RIS1>2qU2U@Hu1*Z!WVOaf*&^1q%<9oD z9V4;-pg=KFVUXzi2JXA&b(z(%vFAx=0|a)LW0(&;eJ1ub-m@Q z>dy8mc;i!4Sn@E^U|UC3(oXAJ2gfidjJ{q}dzaD9-LITzaR2w0GtuWe;GNAOlR>a% zHd`xIEZx3uu|;F%lQ(!{#mNN*?&WpAuRrErfDq9!B?|Ei;$DeC#-GI8TG(*xik7s{ zgn~7xFMlyz5lDABJ|Mmp-mX>VzrIv&??=_YY|5k?;v+vOKiJmUxw4Cyfr) literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/shell.png b/cuebot/src/main/resources/public/services/shell.png old mode 100644 new mode 100755 index 10cf381b5d5d34553bb95bc009f672f68ec32bc0..63d8d0b235dac561199e2eb1ac2871681405eca7 GIT binary patch literal 3431 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 delta 1245 zcmV<31S0$A8u1B`B!2;OQb$4nuFf3k00009a7bBm000fw000fw0YWI7cmMzZ2XskI zMF-jn2oWqbf)m4S000DoNkl12S9*Nz$GmC0_?o9%^((DFbMAql4sG=U0qcf!G9vNYI-~mU}08HDOHhO zSs8!4{>X;c19C>m5ZEkM<7-K|4P}Sji)-*HBjIQg3XV-P4lt?KZk=wRqu~_^8TssC} zdwaXt+}vb$cYhaAEfzXvhI_U;%Z{pG=EW0MKpd_`6nDeRZ|06!;_{`-Y;0`I*TXRY zP*tA)`JB(c{DRSV%w#gjZc{--5dlPSb3V9vlVx4gbuE^hz2ASM>k{V1)$J?HW;5Eh zp=~>wW<}FGA33PV>dzw z)b*0lXv}1ifnK?Km3mpDLDA5nArL}?yHQouv4o84iG&C-gzV-J5H~~>l|vA-*(|%7 z?45(ff@)M@=4@|Y#w>w?m>wpd3ZjaXq&(dNDy*7@Z@>SJ*=)wBs_0U}-4PKSm`6bNCYmNzrbo$BcdQ3ta*;IU-}X`$peC*Q5lcM+_-+7op*QG{q+}q-rYq* z0AM^GV-Ai}*EJyo9Otb!FJ`bJfZ;C3tW}XSJs=`N&_Fe+c=Y56j~+iJ#7I?Dhzjmd zRTYK-!g5s;s|W}i8ymE3Te3a_ba!xY0e27$|9_kVsySw%#7s3HDh0iuK}pFlH`*={ zLSSoai!P;HZf-+4dI4gkq*c%Gfb?NdC4_(!#XS%aA;w6T40oex8e)iuz+^flwH?W= z)O=QMMY+4fODuT|K-+Z)6pIxRB}i7DK?qf>^5HmbN`$CP&z&O`>%9G7?v3| z4Ry zD3VKfEpDok6UrP7LI|-`hT|A6UO;QA$-V3LOYBH$vdodO7c8i2NK%eGv*^u2#rbL5@7lL||^Q?mV~{qFRq^h}%10)X@` zEr*#G5-F`VIYzDmG0#>4nRyDB)K@~z70icr?#}5UXxkRtsh2gQ(FoO$J6eDFD1Wku z4jr*>8{E8hJzJk< zhMNr}r3szpM+tcKKyA~1I-{0Tg+uOSf`~)ln7y;+X92IWx zS8yB8eHuCuS-SfHu<8>ctXhi_~6`p|8j5@!!VZYPubCMQ8$_00000NkvXX Hu0mjfv9mc_ diff --git a/cuebot/src/main/resources/public/services/simulation.png b/cuebot/src/main/resources/public/services/simulation.png old mode 100644 new mode 100755 index 87be4dd1784c05fb1b3b5b9b29d0f2422e24e2b2..a12bb2b1de7ba0f312062a3fa6f60bd925e3e7ce GIT binary patch literal 3494 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 x&?|1ZFYPC1L;o002ovPDHLkV1g0`0*?Ry diff --git a/cuebot/src/main/resources/public/services/simulation16.png b/cuebot/src/main/resources/public/services/simulation16.png new file mode 100755 index 0000000000000000000000000000000000000000..f568a5de0b13aa0948ce5acbb32c9c973127333e GIT binary patch literal 3796 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 literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/simulation4.png b/cuebot/src/main/resources/public/services/simulation4.png new file mode 100755 index 0000000000000000000000000000000000000000..b6ec1d9ba6869034b6b50d925a7be5991e7fa2cb GIT binary patch literal 3687 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 literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/simulation8.png b/cuebot/src/main/resources/public/services/simulation8.png new file mode 100755 index 0000000000000000000000000000000000000000..09f28e793814096e21a93e2e075151b48f2c9278 GIT binary patch literal 3702 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 B-EaT^ literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/simulationhi.png b/cuebot/src/main/resources/public/services/simulationhi.png new file mode 100755 index 0000000000000000000000000000000000000000..176ca34ef85a7779b413bb899ed37cfe4e4fb4a2 GIT binary patch literal 3725 zcma)92UJtp7LA}1Kzb1roe&f$DKEWH1QHaG66p$vDK8L7NK7J4oQX&g6s%zRjEbTl zAcA8-Q9*FXh$G;P6;a3tVuL|Y5dr-#ps4Hn|DUY&@^0B@pS#aF_pJ4@S^i7)bmr*5 zU@$#zFJ>V0MyMb7Oz2;hlJXjQX-m9T$Y3yC6ZJC#NfI_U4wNG}V2mK%1^IVv9TFknxgf(xet@5Z0mcfvQlwx|ihnRS zC5}tuAs4$MoRjDffe4hd5lJFpyo{dYf}G%`Lu2(a7KxaE$m3j)?rMjKa6cA;A(ny& z3I>Pf0sw%Z&@fyspGpJ)6ao+6@mPS2#pBUu8CNQh$OYnfgqo4f z5wDZGAfcm9Y7j~M{HBQGWuGDi#SELomSAxh04oxyg-xJk@<8y*F}{nI1t&{DY#=BT zuaj~?2yXMm*fRn0{7J(d%6Jh#doBCGjyx z#8ist46#rwg&aetBYeH?&0w&kV!l8KZO8(bdLX<#8DuEVWHcUwQ(u$GtTI8VAOYkp zk%~o#i8`kXz7t~#$fxlM01Zt60WO-z$8*pekb;AzBnqBSAy6npGV+r>@2mQlY!uK6 zl&3F8rV?;O9G}L4B1vMSNn9ciVk42!6fT~MqY-%&Du6>`r;g|)kU?2X{?r?Sz_p)7 zLILCvx?FTNSAEYRnQTaj`WWiP@5%UQr7~%s7z;v_-zNN} z;~{D()V@QNekvFYZtu->4-U`xbx(va^0rxK-I>-7<=c10PSr9>@zw1+O??%CcDBWl zX?EuVjoc0?+ytc#8Rn%qx5}Q+HTAL24s<)}W$I;AmV<~)SGew80GAY+YVGv4a(X2y ze6>~i*s`@y7W%{4Tg+JOm}G+m+T$$jO}<2++wtd2w4YB{4!YiUN6_@HkujdPOTapVE5~{>qP)W+ zwL+Hv>m^SKH@zM!RzScl08Fixfcnh~-+lK}6w;sz( z(l>RD1Puqrr0pB)w@=rox@goqzhi_b>_ihOl5%)!Ytv#)MX&6A+R6hi_yrwrP_JVU zs}Hd>?*7ua=Z7pWL#byG)~4n%0$D8e_$lN_TkNEa9~74ZV*3QQ^CG zb32yh6N1^w{tnyJcD)ixy{I$8G0Z_DHOVdMy{1ayQ*-V{Z_Y3Io#Tyddp2sFT>iwi ztMAf4cZ5W_P{JtR>DXX%Qg@!qKs!IYn)Phnu@?9>5ck zvd-TW;4}kQFzpra@>%+k#2H8Zk(oV9SA-u)WLihjW2SXasA1C z!G|~HP+JyWh|CUsfBGkD)9d>4l(RN#*;#DDd4w?UC)XEQ7YS?bEn3}mq_H8yvG1NG zH!DfGDtuIgL`G@}DX_f83pbH3eO9{LuV)!;T-KuKR!BaGt>RM`)E}nzsN!7KaDe{y zF&NT=2v_18u1r(C4?Xw+m3q@4WQTnLG1z_7hzh{Wj4G!USSZ4`-(H%f`ps~`;kO$P z5IcS}5{~C9ZEy2~@V@M^ zVES<*>OE|5I_)kl(gFsbu>wzAbH=4xVZ$=Y%!)Q!l9Q>|Ijn5~LQZZ{HZeWg_K>W6 z=%&pGjlL|s`)LEob*g&T#ySI?BE?{`agz_Za<${0W_O@IRoR9rYp&OIbXxo_vf$%i zp5+O78x@+3$wlGj=6BK_Tci*&6`C@WgxR|zt>=est$$i$sBL%If$O=@Vqh)P($O7N zOl>+_G)fg-*6FW}v}}H*RjZe=y-f71IPk*!TUU#^9Y*skeGagqXUI%)%DP6{_MDj& zTN-G*eC{ENP4QCe`Nng~`}z%!J(*GMW-HvR?Q7R{Gko(C7Hmw=VTEM?u*Fd?f})@O zxr==9TxZcsZQV8b4=^YbeTP~DTB`J_p|%6%ObV)O$kJkC;#-}^mBs*JFoM;vw}htw zTezoxe~q!OHh5QG&tzO@#_Gr5{4E6zwe5Ohxy6#4hUZ6{884bys-dTj){i>kO3M`y z7|DuDfAo6oQ9ay{xl?yz+wRvh=Q;gesZ{jdJ) zy-%F&DQ;-`-bWPOozLw$+MW+S9*V-Od~%~r<3X5{79q61I25K_s`}kF{L%FD$iHFh zZP6=wy*6sbwQ%k)b1Hhevi)9tLFcoJRi*wT*P}2^;g5G%nXciGYu~$m5N>iBA59Mk zmziH>08gu3w?f19JI5R*4t?_|2UgxSeDGtHNAk;1i#canj$Jn9 zge0Ub+O;&TxzMN7*Nq6Tj0*vbGLjl92Lmnj-!wLnBp+}4L}#`-AM_(Q5FhL=dsu}f zQmQ^2JP05DsAqorO3sV|>(SAQu+r=+=jNbK8k8LBtuZ^%lY2Jm+O&K7(r<({XujCJ z5v8?MNmIhl@6y;i-MT?mLXs#eiwCavRjsdcbE9!Dljdd^&+4hrK9L(yz6#|YgMF7= zl$<>{V4!+(ySbX}I)84-jlKJ>1;7>AYX>)wTTZIh+N5`m``)Y8YOn3{nU~m?V+O0v zFU`B}9W6Wd^VB}vfx7~(- zsN-2Zxjv{_<11F#?@qb}ul2VW3x=hxFj{EaaOM>d=V()CGOG$!>W)KpM{avGMqMxS zd^DW8%A~0GrpZv7yO+{_emXXr YmvKA~cIUzy^#`N3r$4jOV|CiU0ln7k2><{9 literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/services/spotless.png b/cuebot/src/main/resources/public/services/spotless.png new file mode 100755 index 0000000000000000000000000000000000000000..cde291db4b885e9bba007a186b1298639d9e163d GIT binary patch literal 3817 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 QIsgCw07*qoM6N<$f}qgVDgXcg diff --git a/cuebot/src/main/resources/public/services/unreal.png b/cuebot/src/main/resources/public/services/unreal.png new file mode 100755 index 0000000000000000000000000000000000000000..94d601761f3a49344c22112312d6574898c85ec4 GIT binary patch literal 3653 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 DaB9|x literal 0 HcmV?d00001 diff --git a/cuebot/src/main/resources/public/success.png b/cuebot/src/main/resources/public/success.png deleted file mode 100644 index 17c8a5a01465de9a59239537153b3560ebd51a78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2963 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 email-to: jon@opencue.io +email.domain=opencue.io +# An email address to use as From for cuebot emails +email.from.address=opencue-noreply@opencue.io +# A comma-separated list of emails to be cc'ed on maintenance communications +email.cc.addresses=dev-team@opencue.io + grpc.cue_port=8453 grpc.rqd_server_port=${CUEBOT_GRPC_RQD_SERVER_PORT:50051} grpc.max_message_bytes=104857600 From 0f8a7174d682a71c6b91e8846dc3cbb5a5457001 Mon Sep 17 00:00:00 2001 From: Nuwan Jayawardene Date: Thu, 11 Jul 2024 00:01:34 +0530 Subject: [PATCH 08/11] Add framespec parameter format check (#1389) To determine Blender render command format --- cuesubmit/cuesubmit/Submission.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cuesubmit/cuesubmit/Submission.py b/cuesubmit/cuesubmit/Submission.py index 59799663f..f1083b23d 100644 --- a/cuesubmit/cuesubmit/Submission.py +++ b/cuesubmit/cuesubmit/Submission.py @@ -21,6 +21,7 @@ from __future__ import absolute_import from builtins import str +import re import outline import outline.cuerun @@ -73,7 +74,7 @@ def buildBlenderCmd(layerData): renderCommand += ' -o {}'.format(outputPath) if outputFormat: renderCommand += ' -F {}'.format(outputFormat) - if frameRange: + if re.match(r"^\d+-\d+$", frameRange): # Render frames from start to end (inclusive) via '-a' command argument renderCommand += (' -s {startFrame} -e {endFrame} -a' .format(startFrame=Constants.FRAME_START_TOKEN, From ad89c303e7b0566ba7b23aaea2fe00df64fd9755 Mon Sep 17 00:00:00 2001 From: Jimmy Christensen Date: Wed, 10 Jul 2024 20:35:59 +0200 Subject: [PATCH 09/11] Add FileSequence (#1396) Link the Issue(s) this Pull Request is related to. This fixes #242 * Added initial code for FileSequence together with tests imported from the old C implementation. * Added docstrings and fixed linting * Added ability to iterate and call specific frames * Add support for len() and str() in FileSpec * Re-enable layer output tests and change to Path instead of FileSpec * Re-do callable function to allow for fileSequences without frameset to be callable and add test for it * Added a getOpenRVPath function for easier being able to open in OpenRV. --- pycue/FileSequence/FileSequence.py | 130 +++++++++++++++++++++++++++++ pycue/FileSequence/__init__.py | 1 + pycue/tests/file_sequence.py | 110 ++++++++++++++++++++++++ pyoutline/tests/layer_test.py | 6 +- 4 files changed, 243 insertions(+), 4 deletions(-) create mode 100644 pycue/FileSequence/FileSequence.py diff --git a/pycue/FileSequence/FileSequence.py b/pycue/FileSequence/FileSequence.py new file mode 100644 index 000000000..61d86a55e --- /dev/null +++ b/pycue/FileSequence/FileSequence.py @@ -0,0 +1,130 @@ +# Copyright Contributors to the OpenCue Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Helper class for representing a frame seqeunce path. + +It supports a complex syntax implementing features such as comma-separated frame ranges, +stepped frame ranges and more. See the FileSequence class for more detail. +""" + +import re +from .FrameSet import FrameSet + + +class FileSequence: + """Represents a file path to a frame sequence""" + __filepath = None + frameSet = None + __basename = None + __prefix = None + __suffix = None + __dirname = "" + __padSize = 1 + __iter_index = 0 + + def __init__(self, filepath): + """ + Construct a FileSequence object by parsing a filepath. + Details on how to specify a frame range can be seen in the FrameRange class + """ + + filePathMatch = re.match(r"^(?P.*\.)(?P[\d#,\-@x]+)(?P\.[.\w]+)$", filepath) + if filePathMatch is not None: + self.__filepath = filepath + self.__prefix = filePathMatch.group('pf') + self.__suffix = filePathMatch.group('sf') + dirmatch = re.match(r"^(?P.*/)(?P.*)$", self.__prefix) + if dirmatch is not None: + self.__dirname = dirmatch.group("dirname") + self.__basename = dirmatch.group("basename") + else: + self.__basename = self.__prefix + framerangematch = re.match(r"^([\d\-x,]+)", filePathMatch.group("fspec")) + if framerangematch is not None: + self.frameSet = FrameSet(framerangematch.group(1)) + if self.frameSet.get(0) > self.frameSet.get(-1): + raise ValueError('invalid filesequence range : ' + framerangematch.group(1)) + firstFrameMatch = re.findall(r"^[-0]\d+", framerangematch.group(1)) + if len(firstFrameMatch) > 0: + self.__padSize = len(firstFrameMatch[0]) + + padmatch = re.findall(r"#+$", filePathMatch.group("fspec")) + if len(padmatch) > 0: + self.__padSize = len(padmatch[0]) + else: + raise ValueError('invalid filesequence path : ' + filepath) + + def getPrefix(self): + """Returns the prefix of the file sequence""" + return self.__prefix + + def getSuffix(self): + """Returns the suffix of the file sequence""" + return self.__suffix + + def getDirname(self): + """Returns the dirname of the file sequence, if given otherwise returns empty an string""" + return self.__dirname + + def getBasename(self): + """Returns the base name of the file sequence""" + return self.__basename.rstrip(".") + + def getPadSize(self): + """Returns the size of the frame padding. It defaults to 1 if none is detected""" + return self.__padSize + + def getFileList(self, frameSet=None): + """ Returns the file list of the sequence """ + filelist = [] + paddingString = "%%0%dd" % self.getPadSize() + for frame in self.frameSet.getAll(): + if frameSet is None or (isinstance(frameSet, FrameSet) and frame in frameSet.getAll()): + framepath = self.getPrefix() + paddingString % frame + self.getSuffix() + filelist.append(framepath) + return filelist + + def getOpenRVPath(self, frameSet=None): + """ Returns a string specific for the OpenRV player""" + frameRange = "" + curFrameSet = frameSet or self.frameSet + if isinstance(curFrameSet, FrameSet): + frameRange = "%d-%d" % (curFrameSet.get(0), curFrameSet.get(-1)) + framepath = self.getPrefix() + frameRange + "@"*self.__padSize + self.getSuffix() + return framepath + + def __getitem__(self, index): + return self.getFileList()[index] + + def __next__(self): + self.__iter_index += 1 + if self.__iter_index <= len(self): + return self.getFileList()[self.__iter_index - 1] + raise StopIteration + + def __iter__(self): + self.__iter_index = 0 + return self + + def __len__(self): + return len(self.getFileList()) + + def __call__(self, frame): + paddingString = "%%0%dd" % self.getPadSize() + framepath = self.getPrefix() + paddingString % frame + self.getSuffix() + return framepath + + def __str__(self): + return self.__filepath diff --git a/pycue/FileSequence/__init__.py b/pycue/FileSequence/__init__.py index 711e1dc83..8010a19bc 100644 --- a/pycue/FileSequence/__init__.py +++ b/pycue/FileSequence/__init__.py @@ -23,3 +23,4 @@ from __future__ import division from .FrameRange import FrameRange from .FrameSet import FrameSet +from .FileSequence import FileSequence diff --git a/pycue/tests/file_sequence.py b/pycue/tests/file_sequence.py index f03438f9c..2adc6907d 100644 --- a/pycue/tests/file_sequence.py +++ b/pycue/tests/file_sequence.py @@ -24,6 +24,7 @@ from FileSequence import FrameRange from FileSequence import FrameSet +from FileSequence import FileSequence class FrameRangeTests(unittest.TestCase): @@ -189,5 +190,114 @@ def testNormalize(self): self.assertEqual([1, 2, 3], duplicates.getAll()) +class FileSequenceTests(unittest.TestCase): + def __testFileSequence(self, filespec, **kwargs): + fs = FileSequence(filespec) + + tests = {'prefix': fs.getPrefix(), + 'frameSet': fs.frameSet, + 'suffix': fs.getSuffix(), + 'padSize': fs.getPadSize(), + 'dirname': fs.getDirname(), + 'basename': fs.getBasename() + } + + for arg, member in tests.items(): + if arg in kwargs: + if isinstance(member, FrameSet): + self.assertEqual(member.getAll(), kwargs[arg].getAll(), + "Comparing '%s', got '%s', expected '%s'" % (arg, str(member), + str(kwargs[arg]))) + else: + self.assertEqual(member, kwargs[arg], + "Comparing '%s', got '%s', expected '%s'" % (arg, str(member), + str(kwargs[arg]))) + + def testVariousFileSequences(self): + """Test various file sequences are correctly parsed.""" + self.__testFileSequence('foo.1-1####.bar', prefix='foo.', frameSet=FrameSet('1-1'), + suffix='.bar', padSize=4) + self.__testFileSequence('foo.####.bar', prefix='foo.', frameSet=None, suffix='.bar', + padSize=4) + # Not sure why this becomes padSize of 10 + # self.__testFileSequence('foo.1-15x2#@#@.bar', prefix='foo.', frameSet=FrameSet('1-15x2'), + # suffix='.bar', + # padSize=10) + self.__testFileSequence('foo.1-15x2.bar', prefix='foo.', frameSet=FrameSet('1-15x2'), + suffix='.bar', padSize=1) + self.__testFileSequence('someImage.1,3,5####.rla', prefix='someImage.', + frameSet=FrameSet('1,3,5'), suffix='.rla', padSize=4) + self.__testFileSequence('foo.####.exr.tx', prefix='foo.', frameSet=None, suffix='.exr.tx', + padSize=4) + self.__testFileSequence('foo.1-10#.bar.1-9####.bar', prefix='foo.1-10#.bar.', + frameSet=FrameSet('1-9'), suffix='.bar', padSize=4) + self.__testFileSequence('foo.1-9.bar', prefix='foo.', frameSet=FrameSet('1-9'), + suffix='.bar', padSize=1) + self.__testFileSequence('foo.1-10.bar', prefix='foo.', frameSet=FrameSet('1-10'), + suffix='.bar', padSize=1) + self.__testFileSequence('foo.9.bar', prefix='foo.', frameSet=FrameSet('9-9'), suffix='.bar', + padSize=1) + + self.__testFileSequence('foo.1-10#.bar', prefix='foo.', dirname='', basename='foo') + self.__testFileSequence('/foo.1-10#.bar', prefix='/foo.', dirname='/', basename='foo') + self.__testFileSequence('baz/foo.1-10#.bar', prefix='baz/foo.', dirname='baz/', + basename='foo') + self.__testFileSequence('/baz/foo.1-10#.bar', prefix='/baz/foo.', dirname='/baz/', + basename='foo') + self.__testFileSequence('/bar/baz/foo.1-10#.bar', prefix='/bar/baz/foo.', + dirname='/bar/baz/', basename='foo') + + self.__testFileSequence('foo.-15-15####.bar', prefix='foo.', frameSet=FrameSet('-15-15'), + suffix='.bar', padSize=4) + self.__testFileSequence('foo.-15--1####.bar', prefix='foo.', frameSet=FrameSet('-15--1'), + suffix='.bar', padSize=4) + + def testPadSizeWithoutPadTokens(self): + """Test the pad size is correctly guessed when no padding tokens are given.""" + self.__testFileSequence('foo.0009.bar', padSize=4) + self.__testFileSequence('foo.1-9x0002.bar', padSize=1) + # This test contradicts another test for negative steps + # self.__testFileSequence('foo.9-1x-0002.bar', padSize=1) + self.__testFileSequence('foo.9-09x0002.bar', padSize=1) + self.__testFileSequence('foo.9,10.bar', padSize=1) + self.__testFileSequence('foo.009,10.bar', padSize=3) + self.__testFileSequence('foo.-011.bar', padSize=4) + + # sequence padded to 4 but frame count goes above 9999 + self.__testFileSequence('foo.0001-10000.bar', padSize=4) + + def testInvalidSequences(self): + """Test invalid file sequences throw expected exception.""" + self.assertRaises(ValueError, FileSequence, 'asdasdasda') + self.assertRaises(ValueError, FileSequence, 'foo.fred#.bar') + self.assertRaises(ValueError, FileSequence, 'foo..bar') + self.assertRaises(ValueError, FileSequence, 'foo.-,x#.bar') + self.assertRaises(ValueError, FileSequence, 'foo.x2.bar') + self.assertRaises(ValueError, FileSequence, 'foo.-20---10.bar') + # order reversed + self.assertRaises(ValueError, FileSequence, 'foo.10-1.bar') + self.assertRaises(ValueError, FileSequence, 'foo.-10--20.bar') + # require a prefix + self.assertRaises(ValueError, FileSequence, '.1') + self.assertRaises(ValueError, FileSequence, '0.1') + + def __testStringify(self, filespec, index, expected): + fs = FileSequence(filespec) + self.assertEqual(expected, fs[index]) + + def testStringify(self): + self.__testStringify('foo.011.bar', 0, 'foo.011.bar') + self.__testStringify('foo.-011.bar', 0, 'foo.-011.bar') + + def __testFrameList(self, filespec, frame, expected): + fs = FileSequence(filespec) + self.assertEqual(expected, fs(frame)) + + def testFrameList(self): + self.__testFrameList('foo.1-10.bar', 4, 'foo.4.bar') + self.__testFrameList('foo.1-10####.bar', 4, 'foo.0004.bar') + self.__testFrameList('foo.####.bar', 4, 'foo.0004.bar') + + if __name__ == '__main__': unittest.main() diff --git a/pyoutline/tests/layer_test.py b/pyoutline/tests/layer_test.py index f1fd61b9f..686233cbc 100644 --- a/pyoutline/tests/layer_test.py +++ b/pyoutline/tests/layer_test.py @@ -592,9 +592,7 @@ class OutputRegistrationTest(unittest.TestCase): def setUp(self): outline.Outline.current = None - # TODO(bcipriano) Re-enable this test once FileSequence has a Python - # implementation. (Issue #242) - def disabled__test_output_passing(self): + def test_output_passing(self): """ Test that output registered in a pre-process is serialized to a ol:outputs file in the render layer. @@ -608,7 +606,7 @@ def disabled__test_output_passing(self): # the preprocess prelayer = outline.LayerPreProcess(layer1) prelayer._execute = lambda frames: prelayer.add_output( - "test", outline.io.FileSpec("/tmp/foo.#.exr")) + "test", outline.io.Path("/tmp/foo.#.exr")) # Add both to the outline ol.add_layer(layer1) From 15c8d483d7a57f266f2b1864ac908d907c80dbe8 Mon Sep 17 00:00:00 2001 From: Jimmy Christensen Date: Wed, 10 Jul 2024 20:37:58 +0200 Subject: [PATCH 10/11] Order layer outputs in the order they were added (#1399) Summarize your change. When adding multiple outputs to a layer, they are not returned in the same order as they were added. This adds a new SERIAL column which auto-increments to the layer_output table. With the correct order, it's possible to determine the "main" output of a layer by using the order. --- VERSION.in | 2 +- .../java/com/imageworks/spcue/dao/postgres/LayerDaoJdbc.java | 4 +++- .../postgres/migrations/V30__Add_order_column_to_outputs.sql | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 cuebot/src/main/resources/conf/ddl/postgres/migrations/V30__Add_order_column_to_outputs.sql diff --git a/VERSION.in b/VERSION.in index eec15f902..f7c6c31b6 100644 --- a/VERSION.in +++ b/VERSION.in @@ -1 +1 @@ -0.29 +0.30 diff --git a/cuebot/src/main/java/com/imageworks/spcue/dao/postgres/LayerDaoJdbc.java b/cuebot/src/main/java/com/imageworks/spcue/dao/postgres/LayerDaoJdbc.java index 15941a196..f555bef6e 100644 --- a/cuebot/src/main/java/com/imageworks/spcue/dao/postgres/LayerDaoJdbc.java +++ b/cuebot/src/main/java/com/imageworks/spcue/dao/postgres/LayerDaoJdbc.java @@ -77,7 +77,9 @@ public void insertLayerOutput(LayerInterface layer, String filespec) { "FROM " + "layer_output " + "WHERE " + - "pk_layer = ?"; + "pk_layer = ?" + + "ORDER BY " + + "ser_order"; private static final RowMapper OUTPUT_MAPPER = new RowMapper() { diff --git a/cuebot/src/main/resources/conf/ddl/postgres/migrations/V30__Add_order_column_to_outputs.sql b/cuebot/src/main/resources/conf/ddl/postgres/migrations/V30__Add_order_column_to_outputs.sql new file mode 100644 index 000000000..cf6244bba --- /dev/null +++ b/cuebot/src/main/resources/conf/ddl/postgres/migrations/V30__Add_order_column_to_outputs.sql @@ -0,0 +1,3 @@ +-- Add a serial column to layer_output for getting correct order of outputs + +alter table layer_output add ser_order SERIAL not null; From e54987aa69b7b659b65f55f8abc92b75621fc582 Mon Sep 17 00:00:00 2001 From: Diego Tavares Date: Sat, 13 Jul 2024 07:43:39 -0700 Subject: [PATCH 11/11] Fix nullpointer condition on healthcheck (#1412) --- .../com/imageworks/spcue/servlet/HealthCheckServlet.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cuebot/src/main/java/com/imageworks/spcue/servlet/HealthCheckServlet.java b/cuebot/src/main/java/com/imageworks/spcue/servlet/HealthCheckServlet.java index d8af5ab07..9da011ade 100644 --- a/cuebot/src/main/java/com/imageworks/spcue/servlet/HealthCheckServlet.java +++ b/cuebot/src/main/java/com/imageworks/spcue/servlet/HealthCheckServlet.java @@ -26,7 +26,6 @@ import com.imageworks.spcue.servant.CueStatic; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.web.servlet.FrameworkServlet; @@ -45,8 +44,6 @@ public class HealthCheckServlet extends FrameworkServlet { private static final Logger logger = LogManager.getLogger(HealthCheckServlet.class); private CueStatic cueStatic; - - @Autowired private Environment env; private enum HealthStatus { @@ -62,6 +59,8 @@ private enum HealthStatus { public void initFrameworkServlet() throws ServletException { this.cueStatic = (CueStatic) Objects.requireNonNull(this.getWebApplicationContext()).getBean("cueStaticServant"); + this.env = (Environment) + Objects.requireNonNull(this.getWebApplicationContext()).getBean("environment"); } private ArrayList getHealthStatus() { @@ -96,7 +95,7 @@ private ArrayList getHealthStatus() { } private void getJobs() { - if (this.cueStatic != null) { + if (this.cueStatic != null && this.env != null) { // Defaults to testing show, which is added as part of the seeding data script String defaultShow = env.getProperty("protected_shows", String.class, "testing").split(",")[0];