Skip to content

Commit

Permalink
fixing basic functionality of monitor cue view (#234)
Browse files Browse the repository at this point in the history
  • Loading branch information
Greg Denton authored Mar 7, 2019
1 parent 3fdc4a0 commit d86dc58
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 68 deletions.
12 changes: 7 additions & 5 deletions cuebot/src/main/resources/conf/ddl/postgres/demo_data.sql
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,17 @@ Insert into DEPT (PK_DEPT,STR_NAME,B_DEFAULT) values ('AAAAAAAA-AAAA-AAAA-AAAA-A

Insert into DEPT (PK_DEPT,STR_NAME,B_DEFAULT) values ('AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAA1', 'Animation', false);

Insert into DEPT (PK_DEPT,STR_NAME,B_DEFAULT) values ('AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAA2', 'Hair',false);
Insert into DEPT (PK_DEPT,STR_NAME,B_DEFAULT) values ('AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAA2', 'Hair', false);

Insert into DEPT (PK_DEPT,STR_NAME,B_DEFAULT) values ('AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAA3', 'Cloth',false);
Insert into DEPT (PK_DEPT,STR_NAME,B_DEFAULT) values ('AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAA3', 'Cloth', false);

Insert into DEPT (PK_DEPT,STR_NAME,B_DEFAULT) values ('AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAA4', 'Layout',false);
Insert into DEPT (PK_DEPT,STR_NAME,B_DEFAULT) values ('AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAA4', 'Layout', false);

Insert into DEPT (PK_DEPT,STR_NAME,B_DEFAULT) values ('AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAA5', 'FX',false);
Insert into DEPT (PK_DEPT,STR_NAME,B_DEFAULT) values ('AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAA5', 'FX', false);

Insert into DEPT (PK_DEPT,STR_NAME,B_DEFAULT) values ('AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAA6', 'Pipeline',false);
Insert into DEPT (PK_DEPT,STR_NAME,B_DEFAULT) values ('AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAA6', 'Pipeline', false);

Insert into DEPT (PK_DEPT,STR_NAME,B_DEFAULT) values ('AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAA7', 'Unknown', true);


Insert into FACILITY (PK_FACILITY,STR_NAME,B_DEFAULT) values ('AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAA1', 'local', false);
Expand Down
85 changes: 44 additions & 41 deletions cuegui/cuegui/CueJobMonitorTree.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,8 @@
COLUMN_COMMENT = 1
COLUMN_EAT = 2
COLUMN_MAXRSS = 13

FONT_BOLD = QtGui.QFont("Luxi Sans", -1, QtGui.QFont.Bold)
UPDATE_INTERVAL = 22


def getEta(stats):
Expand All @@ -66,7 +66,7 @@ def __init__(self, parent):

self.startColumnsForType(cuegui.Constants.TYPE_JOB)
self.addColumn("Job", 550, id=1,
data=lambda job:(job.data.name),
data=lambda job: job.data.name,
tip="The name of the job: show-shot-user_uniqueName\n\n"
"The color behind the job will change to:\n"
"Blue \t if it is paused\n"
Expand All @@ -75,64 +75,64 @@ def __init__(self, parent):
"Purple \t if all remaining frames depend on something\n"
"Yellow \t if the maxRss is over %sKb" % cuegui.Constants.MEMORY_WARNING_LEVEL)
self.addColumn("_Comment", 20, id=2,
sort=lambda job:(job.data.has_comment),
sort=lambda job: job.data.has_comment,
tip="A comment icon will appear if a job has a comment. You\n"
"may click on it to view the comments.")
self.addColumn("_Autoeat", 20, id=3,
sort=lambda job:(job.data.auto_eat),
sort=lambda job: job.data.auto_eat,
tip="If the job has auto eating enabled, a pac-man icon\n"
"will appear here and all frames that become dead will\n"
"automatically be eaten.")
self.addColumn("Run", 38, id=3,
data=lambda job:(job.stats.running_frames),
sort=lambda job:(job.stats.running_frames),
data=lambda job: job.data.job_stats.running_frames,
sort=lambda job: job.data.job_stats.running_frames,
tip="The number of running frames.")
self.addColumn("Cores", 55, id=4,
data=lambda job:("%.02f" % job.stats.reserved_cores),
sort=lambda job:(job.stats.reserved_cores),
data=lambda job: "%.02f" % job.data.job_stats.reserved_cores,
sort=lambda job: job.data.job_stats.reserved_cores,
tip="The number of reserved cores.")
self.addColumn("Wait", 45, id=5,
data=lambda job:(job.stats.waiting_frames),
sort=lambda job:(job.stats.waiting_frames),
data=lambda job: job.data.job_stats.waiting_frames,
sort=lambda job: job.data.job_stats.waiting_frames,
tip="The number of waiting frames.")
self.addColumn("Depend", 55, id=6,
data=lambda job:(job.stats.depend_frames),
sort=lambda job:(job.stats.depend_frames),
data=lambda job: job.data.job_stats.depend_frames,
sort=lambda job: job.data.job_stats.depend_frames,
tip="The number of dependent frames.")
self.addColumn("Total", 50, id=7,
data=lambda job:(job.stats.total_frames),
sort=lambda job:(job.stats.total_frames),
data=lambda job: job.data.job_stats.total_frames,
sort=lambda job: job.data.job_stats.total_frames,
tip="The total number of frames.")
# self.addColumn("_Booking Bar", 150, id=8, default=False,
# delegate=JobBookingBarDelegate)
self.addColumn("Min", 38, id=9,
data=lambda job:("%.0f" % job.data.min_cores),
sort=lambda job:(job.data.min_cores),
data=lambda job: "%.0f" % job.data.min_cores,
sort=lambda job: job.data.min_cores,
tip="The minimum number of running cores that the cuebot\n"
"will try to maintain.")
self.addColumn("Max", 38, id=10,
data=lambda job:("%.0f" % job.data.max_cores),
sort=lambda job:(job.data.max_cores),
data=lambda job: "%.0f" % job.data.max_cores,
sort=lambda job: job.data.max_cores,
tip="The maximum number of running cores that the cuebot\n"
"will allow.")
self.addColumn("Age", 50, id=11,
data=lambda job:(cuegui.Utils.secondsToHHHMM(time.time() - job.data.start_time)),
sort=lambda job:(time.time() - job.data.start_time),
data=lambda job: cuegui.Utils.secondsToHHHMM(time.time() - job.data.start_time),
sort=lambda job: time.time() - job.data.start_time,
tip="The HOURS:MINUTES since the job was launched.")
self.addColumn("Pri", 30, id=12,
data=lambda job:(job.data.priority),
sort=lambda job:(job.data.priority),
data=lambda job: job.data.priority,
sort=lambda job: job.data.priority,
tip="The job priority. The cuebot uses this as a suggestion\n"
"to determine what job needs the next available matching\n"
"resource.")
self.addColumn("ETA", 65, id=13,
data=lambda job:(""),
data=lambda job: "",
tip="(Inacurate and disabled until a better solution exists)\n"
"A very rough estimate of the number of HOURS:MINUTES\n"
"it will be before the entire job is done.")
self.addColumn("MaxRss", 60, id=14,
data=lambda job:(cuegui.Utils.memoryToString(job.stats.maxRss)),
sort=lambda job:(job.stats.maxRss),
data=lambda job: cuegui.Utils.memoryToString(job.data.job_stats.max_rss),
sort=lambda job: job.data.job_stats.max_rss,
tip="The most memory used at one time by any single frame.")
self.addColumn("_Blank", 20, id=15,
tip="Spacer")
Expand Down Expand Up @@ -190,7 +190,7 @@ def __init__(self, parent):
# Skip updates if the user is scrolling
self._limitUpdatesDuringScrollSetup()

self.setUpdateInterval(22)
self.setUpdateInterval(UPDATE_INTERVAL)

def __itemSingleClickedCopy(self, item, col):
"""Called when an item is clicked on. Copies selected object names to
Expand Down Expand Up @@ -360,8 +360,8 @@ def _processUpdate(self, work, results):
"""Adds or updates jobs and groups. Removes those that do not get updated
@type work: from threadpool
@param work: from threadpool
@type nested_shows: [list<NestedGroup>, set(str)]
@param nested_shows: List that contains updated nested groups and a set
@type results: [list<NestedGroup>, set(str)]
@param results: List that contains updated nested groups and a set
of all updated item ids"""
if results is None:
return
Expand Down Expand Up @@ -394,6 +394,8 @@ def _processUpdate(self, work, results):
# Only updates
self.__processUpdateHandleNested(self.invisibleRootItem(), results[0])
self.redraw()
except Exception:
logger.warning("Failed to process update.", exc_info=True)
finally:
self._itemsLock.unlock()

Expand Down Expand Up @@ -447,7 +449,8 @@ def __processUpdateHandleNested(self, parent, groups):
self.__processUpdateHandleNested(groupItem, group.groups)

# If group has jobs, update them
jobs = group.jobs
groupWrapper = opencue.api.getGroup(group.id)
jobs = groupWrapper.getJobs()
if hasattr(jobs, 'nested_jobs'):
jobs = jobs.nested_jobs
for job in jobs:
Expand Down Expand Up @@ -715,17 +718,17 @@ def data(self, col, role):

elif role == QtCore.Qt.BackgroundRole:
if col == COLUMN_MAXRSS and \
self.rpcObject.job_stats.max_rss > cuegui.Constants.MEMORY_WARNING_LEVEL:
self.rpcObject.data.job_stats.max_rss > cuegui.Constants.MEMORY_WARNING_LEVEL:
return self.__highMemoryColor
if self.rpcObject.data.is_paused:
return self.__pausedColor
if self.rpcObject.stats.dead_frames:
if self.rpcObject.data.job_stats.dead_frames:
return self.__dyingColor
if not self.rpcObject.job_stats.running_frames:
if not self.rpcObject.job_stats.waiting_frames and \
self.rpcObject.job_stats.depend_frames:
if not self.rpcObject.data.job_stats.running_frames:
if not self.rpcObject.data.job_stats.waiting_frames and \
self.rpcObject.data.job_stats.depend_frames:
return self.__dependedColor
if self.rpcObject.job_stats.waiting_frames and \
if self.rpcObject.data.job_stats.waiting_frames and \
time.time() - self.rpcObject.data.start_time > 30:
return self.__noRunningColor
return self.__backgroundColor
Expand All @@ -742,13 +745,13 @@ def data(self, col, role):
elif role == QtCore.Qt.UserRole + 1:
if "FST" not in self._cache:
self._cache["FST"] = {
FrameState.Dead: self.rpcObject.job_stats.dead_frames,
FrameState.Depend: self.rpcObject.job_stats.depend_frames,
FrameState.Eaten: self.rpcObject.job_stats.eaten_frames,
FrameState.Running: self.rpcObject.job_stats.running_frames,
FrameState.Dead: self.rpcObject.data.job_stats.dead_frames,
FrameState.Depend: self.rpcObject.data.job_stats.depend_frames,
FrameState.Eaten: self.rpcObject.data.job_stats.eaten_frames,
FrameState.Running: self.rpcObject.data.job_stats.running_frames,
FrameState.Setup: 0,
FrameState.Succeeded: self.rpcObject.job_stats.succeeded_frames,
FrameState.Waiting: self.rpcObject.job_stats.waiting_frames
FrameState.Succeeded: self.rpcObject.data.job_stats.succeeded_frames,
FrameState.Waiting: self.rpcObject.data.job_stats.waiting_frames
}
return self._cache.get("FST", cuegui.Constants.QVARIANT_NULL)

Expand Down
35 changes: 17 additions & 18 deletions cuegui/cuegui/GroupDialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ def __init__(self, parentGroup, modifyGroup, defaults, parent):
self._modifyGroup = modifyGroup
__modify = modifyGroup is not None

self._departments = opencue.api.getDepartmentNames()
try:
self._departments = opencue.api.getDepartmentNames()
except Exception as e:
Expand Down Expand Up @@ -110,14 +111,12 @@ def __createToggleInput(self, text, row, inputWidget, startEnabled):
self.layout().addWidget(check, row, 0)
self.layout().addWidget(label, row, 1)
self.layout().addWidget(inputWidget, row, 2)
check.clicked.connect(inputWidget.setEnabled)
check.clicked.connect(label.setEnabled)
check.stateChanged.connect(inputWidget.setEnabled)
check.stateChanged.connect(label.setEnabled)
return (check, inputWidget)

def __createButtons(self, buttons, row, width):
self.__buttons = QtWidgets.QDialogButtonBox(buttons,
QtCore.Qt.Horizontal,
self)
self.__buttons = QtWidgets.QDialogButtonBox(buttons, QtCore.Qt.Horizontal, self)
self.layout().addWidget(self.__buttons, row, 1, 1, width)
self.__buttons.accepted.connect(self.accept)
self.__buttons.rejected.connect(self.reject)
Expand All @@ -141,27 +140,27 @@ def accept(self):
self.__setValue(self._defaultJobPriorityCheck,
__group.setDefaultJobPriority,
int(self._defaultJobPriorityValue.value()),
__group.data.defaultJobPriority, -1)
__group.data.default_job_priority, -1)

self.__setValue(self._defaultJobMinCoresCheck,
__group.setDefaultJobMinCores,
float(self._defaultJobMinCoresValue.value()),
__group.data.defaultJobMinCores, float(-1))
__group.data.default_job_min_cores, float(-1))

self.__setValue(self._defaultJobMaxCoresCheck,
__group.setDefaultJobMaxCores,
float(self._defaultJobMaxCoresValue.value()),
__group.data.defaultJobMaxCores, float(-1))
__group.data.default_job_max_cores, float(-1))

self.__setValue(self._minCoresCheck,
__group.setMinCores,
float(self._minCoresValue.value()),
__group.data.minCores, float(0.0))
__group.data.min_cores, float(0.0))

self.__setValue(self._maxCoresCheck,
__group.setMaxCores,
float(self._maxCoresValue.value()),
__group.data.maxCores, float(-1))
__group.data.max_cores, float(-1))

self.close()

Expand All @@ -176,27 +175,27 @@ def __setValue(self, checkBox, setter, newValue, currentValue, disableValue):

class ModifyGroupDialog(GroupDialog):
def __init__(self, modifyGroup, parent=None):
modifyGroup = opencue.api.getGroup(modifyGroup)
modifyGroup = opencue.api.getGroup(modifyGroup.id)
defaults = {"title": "Modify Group: %s" % modifyGroup.data.name,
"message": "Modifying the group %s" % modifyGroup.data.name,
"name": modifyGroup.data.name,
"department": modifyGroup.data.department,
"defaultJobPriority": modifyGroup.data.defaultJobPriority,
"defaultJobMinCores": modifyGroup.data.defaultJobMinCores,
"defaultJobMaxCores": modifyGroup.data.defaultJobMaxCores,
"minCores": modifyGroup.data.minCores,
"maxCores": modifyGroup.data.maxCores}
"defaultJobPriority": modifyGroup.data.default_job_priority,
"defaultJobMinCores": modifyGroup.data.default_job_min_cores,
"defaultJobMaxCores": modifyGroup.data.default_job_max_cores,
"minCores": modifyGroup.data.min_cores,
"maxCores": modifyGroup.data.max_cores}
GroupDialog.__init__(self, None, modifyGroup, defaults, parent)

class NewGroupDialog(GroupDialog):
def __init__(self, parentGroup, parent=None):
defaults = {"title": "Create New Group",
"message": "Group to be created as a child of the group %s" % parentGroup.data.name,
"message": "Group to be created as a child of the group %s" % parentGroup.name,
"name": "",
"department": "Unknown",
"defaultJobPriority": 0,
"defaultJobMinCores": 1.0,
"defaultJobMaxCores": 1.0,
"minCores": 0.0,
"maxCores": 1.0}
GroupDialog.__init__(self, parentGroup, None, defaults, parent)
GroupDialog.__init__(self, opencue.wrappers.group.NestedGroup(parentGroup), None, defaults, parent)
13 changes: 13 additions & 0 deletions pycue/opencue/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,19 @@ def deleteFacility(name):
facility_pb2.FacilityDeleteRequest(name=name), timeout=Cuebot.Timeout)


#
# Departments
#
@util.grpcExceptionParser
def getDepartmentNames():
"""Return a list of the known department names.
@rtype: list<str>
@return: a list of department names
"""
return list(Cuebot.getStub('department').GetDepartmentNames(
department_pb2.DeptGetDepartmentNamesRequest(), timeout=Cuebot.Timeout).names)


#
# Shows
#
Expand Down
Loading

0 comments on commit d86dc58

Please sign in to comment.