diff --git a/.gitignore b/.gitignore index 07a4e83768add5d50d539a4061ed6b02298fdfc5..66afdcdbab5a6e66c535b4f83f0bc70aadebc020 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ **/build **/dist **/glassfish-resources.xml +.idea diff --git a/bin/12IDB/dm-12idb-daq b/bin/12IDB/dm-12idb-daq new file mode 100755 index 0000000000000000000000000000000000000000..daed1d22c634a005247f6665f6b57c6587009ed1 --- /dev/null +++ b/bin/12IDB/dm-12idb-daq @@ -0,0 +1,18 @@ +#!/bin/sh + +# Run command + +if [ -z $DM_ROOT_DIR ]; then + cd `dirname $0` && myDir=`pwd` + setupFile=$myDir/../../setup.sh + if [ ! -f $setupFile ]; then + echo "Cannot find setup file: $setupFile" + exit 1 + fi + source $setupFile > /dev/null +fi +source $DM_ROOT_DIR/bin/dm_command_setup.sh + +eval "$DM_ROOT_DIR/src/python/dm/aps_beamline_tools/cli/daqCli.py $DM_COMMAND_ARGS" + + diff --git a/bin/12IDB/dm-12idb-upload b/bin/12IDB/dm-12idb-upload new file mode 100755 index 0000000000000000000000000000000000000000..9f753a812397f21b40fb9e9308449d903925fdf7 --- /dev/null +++ b/bin/12IDB/dm-12idb-upload @@ -0,0 +1,18 @@ +#!/bin/sh + +# Run command + +if [ -z $DM_ROOT_DIR ]; then + cd `dirname $0` && myDir=`pwd` + setupFile=$myDir/../../setup.sh + if [ ! -f $setupFile ]; then + echo "Cannot find setup file: $setupFile" + exit 1 + fi + source $setupFile > /dev/null +fi +source $DM_ROOT_DIR/bin/dm_command_setup.sh + +eval "$DM_ROOT_DIR/src/python/dm/aps_beamline_tools/cli/uploadCli.py $DM_COMMAND_ARGS" + + diff --git a/doc/RELEASE_NOTES.txt b/doc/RELEASE_NOTES.txt index 72ae398fe62cb21927feb99d076e4941c12fa75d..dae7eee7e03f724969c957875665fa65a515b13f 100644 --- a/doc/RELEASE_NOTES.txt +++ b/doc/RELEASE_NOTES.txt @@ -1,3 +1,17 @@ +Release 3.1.0 +============================= +-DM GUI + - Add settings page + - Allow user to specify refresh rates per module. + +Release 3.0.1 (08/09/2019) +============================= +- Fixed issue with unchecked additions to metadata catalog +- Updated support software: + - OpenJDK (replaces Oracle JDK) + - Payara (replaces Glassfish) +- Added 12IDB utilities + Release 3.0.0 (07/26/2019) ============================= - Added python web service API for downloading files diff --git a/etc/daq-web-service.conf.template b/etc/daq-web-service.conf.template index 0a6ea49dce549f6d179e74d1a6ebc9a72957adea..b3206abd6a1ebac7cda6a8009072f040fedd1c2d 100644 --- a/etc/daq-web-service.conf.template +++ b/etc/daq-web-service.conf.template @@ -19,13 +19,14 @@ principalAuthenticator2=LdapPasswordPrincipalAuthenticator(serverUrl='ldaps://ph [FileSystemObserver] # Minimum file processing delay since last update -minFileProcessingDelayInSeconds=10 +minFileProcessingDelayInSeconds=30 fileSystemEventTimeoutInSeconds=10 -fileSystemObserverAgent=dm.daq_web_service.service.impl.watchdogFileSystemObserverAgent.WatchdogFileSystemObserverAgent() +#fileSystemObserverAgent=dm.daq_web_service.service.impl.watchdogFileSystemObserverAgent.WatchdogFileSystemObserverAgent() #fileSystemObserverAgent=dm.daq_web_service.service.impl.ftpFileSystemObserverAgent.FtpFileSystemObserverAgent('dmdaq', 2811) +fileSystemObserverAgent=dm.daq_web_service.service.impl.pollingFileSystemObserverAgent.PollingFileSystemObserverAgent(pollingPeriod=30) [FileProcessingManager] -numberOfProcessingThreads=5 +numberOfProcessingThreads=10 defaultNumberOfRetries=1 defaultRetryWaitPeriodInSeconds=60 statUtility=dm.common.utility.fileUtility.FileUtility() diff --git a/sbin/11IDB/dm_11idb_system_test_daq.sh b/sbin/11IDB/dm_11idb_system_test_daq.sh index 04e2b5fe71bc271869cf81308f4e6a1ed934eb90..664d6cb6d18f8c56cf630b1e8d46127d0a7096ad 100755 --- a/sbin/11IDB/dm_11idb_system_test_daq.sh +++ b/sbin/11IDB/dm_11idb_system_test_daq.sh @@ -1,6 +1,6 @@ #!/bin/sh cd `dirname $0`/.. && DM_SBIN_DIR=`pwd` -$DM_SBIN_DIR/dm_system_test_daq.sh /gdata/dm/test/11IDB dtn-int-01:/gdata/dm/test/11IDB +$DM_SBIN_DIR/dm_system_test_daq.sh /home/dm_idb/test diff --git a/sbin/11IDB/dm_11idb_system_test_upload.sh b/sbin/11IDB/dm_11idb_system_test_upload.sh index b8b4b58338b10da9d25e34d23036973673b9da70..af73933125fc04464d128438bce0cddb2033fe31 100755 --- a/sbin/11IDB/dm_11idb_system_test_upload.sh +++ b/sbin/11IDB/dm_11idb_system_test_upload.sh @@ -1,6 +1,6 @@ #!/bin/sh cd `dirname $0`/.. && DM_SBIN_DIR=`pwd` -$DM_SBIN_DIR/dm_system_test_upload.sh /gdata/dm/test/11IDB dtn-int-01:/gdata/dm/test/11IDB +$DM_SBIN_DIR/dm_system_test_upload.sh /home/dm_idb/test diff --git a/sbin/11IDC/dm_11idc_system_test_daq.sh b/sbin/11IDC/dm_11idc_system_test_daq.sh index b3ab1a4aebdcad38e53c98922ac6927d5dff05ba..f36c5d7e62b9dd2b28a2e6945393caf7066a1b75 100755 --- a/sbin/11IDC/dm_11idc_system_test_daq.sh +++ b/sbin/11IDC/dm_11idc_system_test_daq.sh @@ -1,5 +1,5 @@ #!/bin/sh cd `dirname $0`/.. && DM_SBIN_DIR=`pwd` -$DM_SBIN_DIR/dm_system_test_daq.sh /gdata/dm/test/11IDC dtn-int-01:/gdata/dm/test/11IDC +$DM_SBIN_DIR/dm_system_test_daq.sh /home/dm_idc/test diff --git a/sbin/11IDC/dm_11idc_system_test_upload.sh b/sbin/11IDC/dm_11idc_system_test_upload.sh index 9e0462930b2a568ef0be5bd55516ce100b74971d..5ddcd19b7aab3fa0d033f57e76f8254b4ad3a3ed 100755 --- a/sbin/11IDC/dm_11idc_system_test_upload.sh +++ b/sbin/11IDC/dm_11idc_system_test_upload.sh @@ -1,5 +1,5 @@ #!/bin/sh cd `dirname $0`/.. && DM_SBIN_DIR=`pwd` -$DM_SBIN_DIR/dm_system_test_upload.sh /gdata/dm/test/11IDC dtn-int-01:/gdata/dm/test/11IDC +$DM_SBIN_DIR/dm_system_test_upload.sh /home/dm_idc/test diff --git a/sbin/12IDB/dm_12idb_system_test_daq.sh b/sbin/12IDB/dm_12idb_system_test_daq.sh new file mode 100755 index 0000000000000000000000000000000000000000..664d6cb6d18f8c56cf630b1e8d46127d0a7096ad --- /dev/null +++ b/sbin/12IDB/dm_12idb_system_test_daq.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +cd `dirname $0`/.. && DM_SBIN_DIR=`pwd` +$DM_SBIN_DIR/dm_system_test_daq.sh /home/dm_idb/test + + diff --git a/sbin/12IDB/dm_12idb_system_test_upload.sh b/sbin/12IDB/dm_12idb_system_test_upload.sh new file mode 100755 index 0000000000000000000000000000000000000000..af73933125fc04464d128438bce0cddb2033fe31 --- /dev/null +++ b/sbin/12IDB/dm_12idb_system_test_upload.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +cd `dirname $0`/.. && DM_SBIN_DIR=`pwd` +$DM_SBIN_DIR/dm_system_test_upload.sh /home/dm_idb/test + + diff --git a/sbin/17BM/dm_17bm_system_test_daq.sh b/sbin/17BM/dm_17bm_system_test_daq.sh index 3454d6eb007a75ab1f70cc4060bbce5cf18669d9..7127a19a7ab246689148cf2471fae72774dd41f5 100755 --- a/sbin/17BM/dm_17bm_system_test_daq.sh +++ b/sbin/17BM/dm_17bm_system_test_daq.sh @@ -1,5 +1,5 @@ #!/bin/sh cd `dirname $0`/.. && DM_SBIN_DIR=`pwd` -$DM_SBIN_DIR/dm_system_test_daq.sh /gdata/dm/test/17BM dtn-int-01:/gdata/dm/test/17BM +$DM_SBIN_DIR/dm_system_test_daq.sh /home/dm_bm/test diff --git a/sbin/17BM/dm_17bm_system_test_upload.sh b/sbin/17BM/dm_17bm_system_test_upload.sh index 0ce5a3b903bb7a1e0031ed2385f5552e339d52ce..467a9cdbdfe4713f6361a655c7702a6abedcac10 100755 --- a/sbin/17BM/dm_17bm_system_test_upload.sh +++ b/sbin/17BM/dm_17bm_system_test_upload.sh @@ -1,5 +1,5 @@ #!/bin/sh cd `dirname $0`/.. && DM_SBIN_DIR=`pwd` -$DM_SBIN_DIR/dm_system_test_upload.sh /gdata/dm/test/17BM dtn-int-01:/gdata/dm/test/17BM +$DM_SBIN_DIR/dm_system_test_upload.sh /home/dm_bm/test diff --git a/sbin/dm_remove_catalog_duplicates.sh b/sbin/dm_remove_catalog_duplicates.sh index fbede229fd4d0874ea26eae54d76d278ee5c0c0d..572e17e108ecc227a689499178f41b152353e3ad 100755 --- a/sbin/dm_remove_catalog_duplicates.sh +++ b/sbin/dm_remove_catalog_duplicates.sh @@ -51,7 +51,7 @@ while read -r f; do f=`echo $f | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//'` echo "**********" echo "Working on file: \"$f\" ($fCount / $nUnique)" - dm-stat-file --experiment=$EXPERIMENT_NAME --relative-path=$f --md5sum > $STAT_FILE || exit 1 + dm-stat-file --experiment=$EXPERIMENT_NAME --relative-path="$f" --md5sum > $STAT_FILE || exit 1 fileSize=`cat $STAT_FILE | sed -e '1,/STAT INFO/d' | awk '{print $2}' | sed 's?fileSize=??'` md5Sum=`cat $STAT_FILE | sed -e '1,/STAT INFO/d' | awk '{print $3}' | sed 's?md5Sum=??'` echo "File size: $fileSize, md5Sum: $md5Sum" @@ -71,12 +71,12 @@ while read -r f; do else echo "File $id is marked as duplicate of $goodId" echo "$f $id" >> $DUPLICATE_LIST_FILE - echo dm-delete-file --keep-in-storage --experiment=$EXPERIMENT_NAME --file-$id >> $DELETED_LIST_FILE + echo dm-delete-file --keep-in-storage --force --experiment=$EXPERIMENT_NAME --file-$id >> $DELETED_LIST_FILE fi else echo "Catalog info is not correct for $f, file size: $catFileSize, md5Sum: $catMd5Sum" echo "$f $id" >> $BAD_LIST_FILE - echo dm-delete-file --keep-in-storage --experiment=$EXPERIMENT_NAME --file-$id >> $DELETED_LIST_FILE + echo dm-delete-file --keep-in-storage --force --experiment=$EXPERIMENT_NAME --file-$id >> $DELETED_LIST_FILE fi done done < "$UNIQUE_LIST_FILE" diff --git a/sbin/dm_station_upgrade_stage4.sh b/sbin/dm_station_upgrade_stage4.sh index 9a2955b914394c65e77a8616df577de95da3c9ae..fb0f7c542400664228e89b278abce11895285551 100755 --- a/sbin/dm_station_upgrade_stage4.sh +++ b/sbin/dm_station_upgrade_stage4.sh @@ -38,7 +38,7 @@ if [ -f $DM_UPLOAD_LIST_FILE ]; then while IFS='' read -r line || [[ -n "$line" ]]; do uploadArgs=`echo $line | sed 's?experimentName?--experiment?' | sed 's?dataDirectory?--data-directory?'` echo "Restarting upload: $uploadArgs" - dm-upload $uploadArgs || exit 1 + dm-upload $uploadArgs --reprocess || exit 1 done < "$DM_UPLOAD_LIST_FILE" else echo "There is no uploads file: $DM_UPLOAD_LIST_FILE" diff --git a/src/python/dm/aps_beamline_tools/gui/dmStationUi.py b/src/python/dm/aps_beamline_tools/gui/dmStationUi.py index dd38696e3794a966e232a27ca9ff9e16ea1b3c73..1be8bbc48aa3ce5a16361a0680d92e2fb893b31d 100755 --- a/src/python/dm/aps_beamline_tools/gui/dmStationUi.py +++ b/src/python/dm/aps_beamline_tools/gui/dmStationUi.py @@ -4,13 +4,15 @@ from __future__ import print_function import sys import os -from PyQt4.QtGui import QMainWindow, QStackedLayout, QApplication, QWidget, QTabWidget, QSplashScreen, QPixmap, QMenu, QAction, QCursor, QMessageBox, QAbstractButton +from PyQt4.QtGui import QMainWindow, QStackedLayout, QApplication, QWidget, QTabWidget, QSplashScreen, QPixmap, QMenu, \ + QAction, QCursor, QMessageBox, QAbstractButton, QIcon from PyQt4.QtCore import Qt, QTimer from time import sleep, time import smtplib from email.mime.text import MIMEText from traceback import format_tb +from dm.aps_beamline_tools.gui.settingsTab import SettingsTab from dm.common.constants import dmStatus from dm.common.exceptions.dmException import DmException from dm.common.exceptions.configurationError import ConfigurationError @@ -104,6 +106,7 @@ class DmStationUi(QMainWindow): self.fileTab = FileTab(self.stationName, self) self.workflowTab = WorkflowTab(self.stationName, self) self.processingJobsTab = ProcessingJobsTab(self.stationName, self) + self.settingsTab = SettingsTab(self) # Add the windows to the stack. self.stackedLayout.addWidget(self.experimentsTab) @@ -124,6 +127,19 @@ class DmStationUi(QMainWindow): # Hide until ready for release self.tabs.addTab(self.workflowTab, "Workflows") self.tabs.addTab(self.processingJobsTab, "Processing Jobs") + homeDir = os.path.dirname(sys.argv[0]) + settingsIcon = QIcon(homeDir + '/images/settings.svg') + self.tabs.addTab(self.settingsTab, settingsIcon, "Settings") + + self.refreshDaqsTimer = QTimer() + self.refreshDaqsTimer.timeout.connect(self.refreshDaqs) + self.refreshUploadsTimer = QTimer() + self.refreshUploadsTimer.timeout.connect(self.refreshUploads) + self.refreshExperimentsTimer = QTimer() + self.refreshExperimentsTimer.timeout.connect(self.refreshExperiments) + self.refreshJobsTimer = QTimer() + self.refreshJobsTimer.timeout.connect(self.refreshJobs) + self.setUpRefreshTimers() # Set a central widget to hold everything self.setCentralWidget(self.tabs) @@ -204,6 +220,34 @@ class DmStationUi(QMainWindow): def clearSelection(self, table): table.clearSelection() + def setUpRefreshTimers(self): + self.refreshDaqsTimer.stop() + self.refreshExperimentsTimer.stop() + self.refreshUploadsTimer.stop() + + self._startRefreshTimer(self.refreshDaqsTimer, self.settingsTab.fetchRefCycleDaqs()) + self._startRefreshTimer(self.refreshUploadsTimer, self.settingsTab.fetchRefCycleUploads()) + self._startRefreshTimer(self.refreshExperimentsTimer, self.settingsTab.fetchRefCycleExperiments()) + self._startRefreshTimer(self.refreshJobsTimer, self.settingsTab.fetchRefCycleJobs()) + + def _startRefreshTimer(self, timer, seconds): + # 0 means that no refresh cycle will occur + if seconds != 0: + interval = seconds * 1000 + timer.start(interval) + + def refreshExperiments(self): + self.experimentsTab.updateList() + + def refreshDaqs(self): + self.daqsTab.updateList() + + def refreshUploads(self): + self.uploadsTab.updateList() + + def refreshJobs(self): + self.processingJobsTab.updateList() + # Refreshes the experiments, DAQ, and Uploads tables. def refreshTables(self): self.experimentsTab.updateList() @@ -292,10 +336,6 @@ if __name__ == "__main__": sleep(0.001) app.processEvents() window = DmStationUi() - # Calls refreshTables every minute - timer = QTimer() - timer.timeout.connect(window.refreshTables) - timer.start(60000) splashScreen.finish(window) window.show() window.raise_() diff --git a/src/python/dm/aps_beamline_tools/gui/images/settings.svg b/src/python/dm/aps_beamline_tools/gui/images/settings.svg new file mode 100644 index 0000000000000000000000000000000000000000..672eed9b22067dcf00034a0a097a12e0033408f4 --- /dev/null +++ b/src/python/dm/aps_beamline_tools/gui/images/settings.svg @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="iso-8859-1"?> + +<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 478.703 478.703" style="enable-background:new 0 0 478.703 478.703;" xml:space="preserve"> +<g> + <g> + <path d="M454.2,189.101l-33.6-5.7c-3.5-11.3-8-22.2-13.5-32.6l19.8-27.7c8.4-11.8,7.1-27.9-3.2-38.1l-29.8-29.8 + c-5.6-5.6-13-8.7-20.9-8.7c-6.2,0-12.1,1.9-17.1,5.5l-27.8,19.8c-10.8-5.7-22.1-10.4-33.8-13.9l-5.6-33.2 + c-2.4-14.3-14.7-24.7-29.2-24.7h-42.1c-14.5,0-26.8,10.4-29.2,24.7l-5.8,34c-11.2,3.5-22.1,8.1-32.5,13.7l-27.5-19.8 + c-5-3.6-11-5.5-17.2-5.5c-7.9,0-15.4,3.1-20.9,8.7l-29.9,29.8c-10.2,10.2-11.6,26.3-3.2,38.1l20,28.1 + c-5.5,10.5-9.9,21.4-13.3,32.7l-33.2,5.6c-14.3,2.4-24.7,14.7-24.7,29.2v42.1c0,14.5,10.4,26.8,24.7,29.2l34,5.8 + c3.5,11.2,8.1,22.1,13.7,32.5l-19.7,27.4c-8.4,11.8-7.1,27.9,3.2,38.1l29.8,29.8c5.6,5.6,13,8.7,20.9,8.7c6.2,0,12.1-1.9,17.1-5.5 + l28.1-20c10.1,5.3,20.7,9.6,31.6,13l5.6,33.6c2.4,14.3,14.7,24.7,29.2,24.7h42.2c14.5,0,26.8-10.4,29.2-24.7l5.7-33.6 + c11.3-3.5,22.2-8,32.6-13.5l27.7,19.8c5,3.6,11,5.5,17.2,5.5l0,0c7.9,0,15.3-3.1,20.9-8.7l29.8-29.8c10.2-10.2,11.6-26.3,3.2-38.1 + l-19.8-27.8c5.5-10.5,10.1-21.4,13.5-32.6l33.6-5.6c14.3-2.4,24.7-14.7,24.7-29.2v-42.1 + C478.9,203.801,468.5,191.501,454.2,189.101z M451.9,260.401c0,1.3-0.9,2.4-2.2,2.6l-42,7c-5.3,0.9-9.5,4.8-10.8,9.9 + c-3.8,14.7-9.6,28.8-17.4,41.9c-2.7,4.6-2.5,10.3,0.6,14.7l24.7,34.8c0.7,1,0.6,2.5-0.3,3.4l-29.8,29.8c-0.7,0.7-1.4,0.8-1.9,0.8 + c-0.6,0-1.1-0.2-1.5-0.5l-34.7-24.7c-4.3-3.1-10.1-3.3-14.7-0.6c-13.1,7.8-27.2,13.6-41.9,17.4c-5.2,1.3-9.1,5.6-9.9,10.8l-7.1,42 + c-0.2,1.3-1.3,2.2-2.6,2.2h-42.1c-1.3,0-2.4-0.9-2.6-2.2l-7-42c-0.9-5.3-4.8-9.5-9.9-10.8c-14.3-3.7-28.1-9.4-41-16.8 + c-2.1-1.2-4.5-1.8-6.8-1.8c-2.7,0-5.5,0.8-7.8,2.5l-35,24.9c-0.5,0.3-1,0.5-1.5,0.5c-0.4,0-1.2-0.1-1.9-0.8l-29.8-29.8 + c-0.9-0.9-1-2.3-0.3-3.4l24.6-34.5c3.1-4.4,3.3-10.2,0.6-14.8c-7.8-13-13.8-27.1-17.6-41.8c-1.4-5.1-5.6-9-10.8-9.9l-42.3-7.2 + c-1.3-0.2-2.2-1.3-2.2-2.6v-42.1c0-1.3,0.9-2.4,2.2-2.6l41.7-7c5.3-0.9,9.6-4.8,10.9-10c3.7-14.7,9.4-28.9,17.1-42 + c2.7-4.6,2.4-10.3-0.7-14.6l-24.9-35c-0.7-1-0.6-2.5,0.3-3.4l29.8-29.8c0.7-0.7,1.4-0.8,1.9-0.8c0.6,0,1.1,0.2,1.5,0.5l34.5,24.6 + c4.4,3.1,10.2,3.3,14.8,0.6c13-7.8,27.1-13.8,41.8-17.6c5.1-1.4,9-5.6,9.9-10.8l7.2-42.3c0.2-1.3,1.3-2.2,2.6-2.2h42.1 + c1.3,0,2.4,0.9,2.6,2.2l7,41.7c0.9,5.3,4.8,9.6,10,10.9c15.1,3.8,29.5,9.7,42.9,17.6c4.6,2.7,10.3,2.5,14.7-0.6l34.5-24.8 + c0.5-0.3,1-0.5,1.5-0.5c0.4,0,1.2,0.1,1.9,0.8l29.8,29.8c0.9,0.9,1,2.3,0.3,3.4l-24.7,34.7c-3.1,4.3-3.3,10.1-0.6,14.7 + c7.8,13.1,13.6,27.2,17.4,41.9c1.3,5.2,5.6,9.1,10.8,9.9l42,7.1c1.3,0.2,2.2,1.3,2.2,2.6v42.1H451.9z"/> + <path d="M239.4,136.001c-57,0-103.3,46.3-103.3,103.3s46.3,103.3,103.3,103.3s103.3-46.3,103.3-103.3S296.4,136.001,239.4,136.001 + z M239.4,315.601c-42.1,0-76.3-34.2-76.3-76.3s34.2-76.3,76.3-76.3s76.3,34.2,76.3,76.3S281.5,315.601,239.4,315.601z"/> + </g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +<g> +</g> +</svg> diff --git a/src/python/dm/aps_beamline_tools/gui/settingsTab.py b/src/python/dm/aps_beamline_tools/gui/settingsTab.py new file mode 100644 index 0000000000000000000000000000000000000000..eb4cd3003eab0b116af2730f9875903f00a020dc --- /dev/null +++ b/src/python/dm/aps_beamline_tools/gui/settingsTab.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python + +from PyQt4.QtGui import QGridLayout, QSpacerItem, QSizePolicy, QPushButton, QWidget, \ + QFont, QLabel, QTableWidget, QTableWidgetItem, QColor, QAbstractItemView, QHBoxLayout, QPalette, QFormLayout, \ + QGroupBox, QLineEdit, QDoubleValidator, QIntValidator +from PyQt4.QtCore import Qt, QSettings, QString + +from dm.aps_beamline_tools.gui.apiFactory import ApiFactory +from .subclasses import customSelectionModel, customStyledDelegate + + +# Define the Processing Jobs tab content: +class SettingsTab(QWidget): + + ORG_NAME="UChicagoArgonneLLC" + APP_NAME="dmStationUi" + + REF_CYCLE_EXPERIMENTS = "experimentsRefreshCycle" + REF_CYCLE_DAQS = "daqsRefreshCycle" + REF_CYCLE_UPLOADS = "uploadsRefreshCycle" + REF_CYCLE_JOBS = "processingJobsRefreshCycle" + + DEFAULT_INTERVAL = 60 + + def __init__(self, parent): + super(SettingsTab, self).__init__(parent) + self.parent = parent + self.settingsLayout() + self.settings = QSettings(SettingsTab.ORG_NAME, SettingsTab.APP_NAME, self) + self.loadSettings() + + # GUI layout where each block is a row on the grid + def settingsLayout(self): + grid = QGridLayout() + + labelFont = QFont('Arial', 18, QFont.Bold) + lbl = QLabel('Settings', self) + lbl.setAlignment(Qt.AlignCenter) + lbl.setFont(labelFont) + grid.addWidget(lbl, 0, 0) + + refIntervalGroup = QGroupBox() + refIntervalGroup.setAlignment(Qt.AlignCenter) + refIntervalGroup.setTitle("Refresh Intervals (seconds)") + + refIntervalsFormLayout = QFormLayout() + self.experimentsRefInternvalVal = self._createIntInput(refIntervalsFormLayout, "Experiments", "Specify the interval in seconds for experiments refresh cycle (0 for no refresh)") + self.daqsRefInternvalVal = self._createIntInput(refIntervalsFormLayout, "Daqs", "Specify the interval in seconds for daqs refresh cycle (0 for no refresh)") + self.uploadsRefInternvalVal = self._createIntInput(refIntervalsFormLayout, "Uploads", "Specify the interval in seconds for uploads refresh cycle (0 for no refresh)") + self.jobsRefInternvalVal = self._createIntInput(refIntervalsFormLayout, "Processing Jobs", + "Specify the interval in seconds for processing jobs refresh cycle (0 for no refresh)") + refIntervalGroup.setLayout(refIntervalsFormLayout) + + grid.addWidget(refIntervalGroup, 2, 0) + + saveBtn = QPushButton('Save', self) + saveBtn.clicked.connect(self.saveSettings) + + grid.addWidget(saveBtn, 3, 0, Qt.AlignCenter) + self.setLayout(grid) + + def _createIntInput(self, formLayout, promptText, tooltip, min=0, max=1000): + minMaxText = " (" +str(min) + "-" + str(max)+")" + promptTextLabel = QLabel(promptText + minMaxText) + inputObject = QLineEdit() + inputObject.setValidator(QIntValidator(min, max, self)) + inputObject.setToolTip(tooltip) + + formLayout.addRow(promptTextLabel, inputObject) + return inputObject + + def loadSettings(self): + self._loadIntervalSettings(SettingsTab.REF_CYCLE_UPLOADS, self.uploadsRefInternvalVal) + self._loadIntervalSettings(SettingsTab.REF_CYCLE_DAQS, self.daqsRefInternvalVal) + self._loadIntervalSettings(SettingsTab.REF_CYCLE_EXPERIMENTS, self.experimentsRefInternvalVal) + self._loadIntervalSettings(SettingsTab.REF_CYCLE_JOBS, self.jobsRefInternvalVal) + + def _loadIntervalSettings(self, key, settingInputWidget): + refCycle = self.settings.value(key, SettingsTab.DEFAULT_INTERVAL).toString() + if (refCycle == ""): + refCycle = QString(str(SettingsTab.DEFAULT_INTERVAL)) + + settingInputWidget.setText(refCycle) + + def saveSettings(self): + self.settings.setValue(SettingsTab.REF_CYCLE_DAQS, self.daqsRefInternvalVal.text()) + self.settings.setValue(SettingsTab.REF_CYCLE_EXPERIMENTS, self.experimentsRefInternvalVal.text()) + self.settings.setValue(SettingsTab.REF_CYCLE_UPLOADS, self.uploadsRefInternvalVal.text()) + self.settings.setValue(SettingsTab.REF_CYCLE_JOBS, self.jobsRefInternvalVal.text()) + + self.loadSettings() + + # Reload with the new values + self.parent.setUpRefreshTimers() + + def fetchRefCycleExperiments(self): + return int(self.experimentsRefInternvalVal.text()) + + def fetchRefCycleDaqs(self): + return int(self.daqsRefInternvalVal.text()) + + def fetchRefCycleUploads(self): + return int(self.uploadsRefInternvalVal.text()) + + def fetchRefCycleJobs(self): + return int(self.jobsRefInternvalVal.text()) diff --git a/src/python/dm/common/objects/daqInfo.py b/src/python/dm/common/objects/daqInfo.py index fe502676db20490d037b2ceec081e84ebce97a9f..6ef9e9d0e6942c70f685e4542522ff0b6e021476 100755 --- a/src/python/dm/common/objects/daqInfo.py +++ b/src/python/dm/common/objects/daqInfo.py @@ -114,11 +114,12 @@ class DaqInfo(DmObject): self['percentageProcessingErrors'] = '%.2f' % percentageProcessingErrors if self.get('endTime'): - daqStatus = dmProcessingStatus.DM_PROCESSING_STATUS_FINALIZING if nCompletedFiles >= nFiles: daqStatus = dmProcessingStatus.DM_PROCESSING_STATUS_DONE if nProcessingErrors: daqStatus = dmProcessingStatus.DM_PROCESSING_STATUS_FAILED + else: + daqStatus = dmProcessingStatus.DM_PROCESSING_STATUS_FAILED lastFileProcessingErrorTime = self.get('lastFileProcessingErrorTime') lastFileProcessedTime = self.get('lastFileProcessedTime') endTime = lastFileProcessedTime diff --git a/src/python/dm/common/processing/plugins/mongoDbFileCatalogPlugin.py b/src/python/dm/common/processing/plugins/mongoDbFileCatalogPlugin.py index ce42abe32e3bfd6f8b1bd471c7a7c0a6a925ed69..977a1031f84d8bc458ca9117abd4d332ff27c110 100755 --- a/src/python/dm/common/processing/plugins/mongoDbFileCatalogPlugin.py +++ b/src/python/dm/common/processing/plugins/mongoDbFileCatalogPlugin.py @@ -161,9 +161,4 @@ class MongoDbFileCatalogPlugin(FileProcessor): fileMongoDbApi = self.acquireMongoApi() processingTimer = threading.Timer(self.PROCESSING_TIMER_DELAY_PERIOD, self.processFilePath, args=[fileMongoDbApi, filePath, filePathDict, experiment, dataDirectory, destDirectory, daqInfo, uploadId, processDirectoryInfo]) processingTimer.start() - -####################################################################### -# Testing. -if __name__ == '__main__': - pass diff --git a/tools/conda/etc/BUILD.conf b/tools/conda/etc/BUILD.conf index 8c66487fee2379667bf544daf383843f61e30e65..9e4b87fb1c2840b894ad949d262a4e272d055c7b 100644 --- a/tools/conda/etc/BUILD.conf +++ b/tools/conda/etc/BUILD.conf @@ -1,2 +1,2 @@ -EPICS_BASE_VERSION=7.0.2.2 +EPICS_BASE_VERSION=7.0.3 SDDS_VERSION=4.1