def doIt(self): """ Does the job. """ oDb = TMDatabaseConnection(); aoGroups = SchedGroupLogic(oDb).getAll(); iRc = 0; for oGroup in aoGroups: if not self.oConfig.fQuiet: print('%s (ID %#d):' % (oGroup.sName, oGroup.idSchedGroup,)); try: (aoErrors, asMessages) = SchedulerBase.recreateQueue(oDb, self.oConfig.uid, oGroup.idSchedGroup, 2); except Exception as oXcpt: oDb.rollback(); print(' !!Hit exception processing "%s": %s' % (oGroup.sName, oXcpt,)); else: if not aoErrors: if not self.oConfig.fQuiet: print(' Successfully regenerated.'); else: iRc = 1; print(' %d errors:' % (len(aoErrors,))); for oError in aoErrors: if oError[1] is None: print(' !!%s' % (oError[0],)); else: print(' !!%s (%s)' % (oError[0], oError[1])); if asMessages and not self.oConfig.fQuiet: print(' %d messages:' % (len(asMessages),)); for sMsg in asMessages: print(' ##%s' % (sMsg,)); return iRc;
def doIt(self): """ Does the job. """ oDb = TMDatabaseConnection(); aoGroups = SchedGroupLogic(oDb).getAll(); iRc = 0; for oGroup in aoGroups: if not self.oConfig.fQuiet: print '%s (ID %#d):' % (oGroup.sName, oGroup.idSchedGroup,); try: (aoErrors, asMessages) = SchedulerBase.recreateQueue(oDb, self.oConfig.uid, oGroup.idSchedGroup, 2); except Exception as oXcpt: oDb.rollback(); print ' !!Hit exception processing "%s": %s' % (oGroup.sName, oXcpt,); else: if len(aoErrors) == 0: if not self.oConfig.fQuiet: print ' Successfully regenerated.'; else: iRc = 1; print ' %d errors:' % (len(aoErrors,)); for oError in aoErrors: if oError[1] is None: print ' !!%s' % (oError[0],); else: print ' !!%s (%s)' % (oError[0], oError[1]); if len(asMessages) > 0 and not self.oConfig.fQuiet: print ' %d messages:' % (len(asMessages),); for sMsg in asMessages: print ' ##%s' % (sMsg,); return iRc;
def _doGangGathering(self, oDb, oStatusData): """ _doRequestCommand worker for handling a box in gang-gathering state. This only checks for timeout. It will update the oStatusData if a timeout is detected, so that the box will be idle upon return. """ oStatusLogic = TestBoxStatusLogic(oDb) if oStatusLogic.timeSinceLastChangeInSecs(oStatusData) > config.g_kcSecGangGathering \ and SchedulerBase.tryCancelGangGathering(oDb, oStatusData): # <-- Updates oStatusData. self._doGangGatheringTimedOut(oDb, oStatusData) return None
def _doGangGathering(self, oDb, oStatusData): """ _doRequestCommand worker for handling a box in gang-gathering state. This only checks for timeout. It will update the oStatusData if a timeout is detected, so that the box will be idle upon return. """ oStatusLogic = TestBoxStatusLogic(oDb); if oStatusLogic.timeSinceLastChangeInSecs(oStatusData) > config.g_kcSecGangGathering \ and SchedulerBase.tryCancelGangGathering(oDb, oStatusData): # <-- Updates oStatusData. self._doGangGatheringTimedOut(oDb, oStatusData); return None;
def _actionRegenQueuesCommon(self): """ Common code for ksActionTestBoxesRegenQueues and ksActionTestCfgRegenQueues. Too lazy to put this in some separate place right now. """ self._checkForUnknownParameters() ## @todo should also be changed to a POST with a confirmation dialog preceeding it. self._sPageTitle = 'Regenerate All Scheduling Queues' self._sPageBody = '' aoGroups = SchedGroupLogic(self._oDb).getAll() for oGroup in aoGroups: self._sPageBody += '<h3>%s (ID %#d)</h3>' % (webutils.escapeElem( oGroup.sName), oGroup.idSchedGroup) try: (aoErrors, asMessages) = SchedulerBase.recreateQueue( self._oDb, self._oCurUser.uid, oGroup.idSchedGroup, 2) except Exception as oXcpt: self._oDb.rollback() self._sPageBody += '<p>SchedulerBase.recreateQueue threw an exception: %s</p>' \ % (webutils.escapeElem(str(oXcpt)),) self._sPageBody += cgitb.html(sys.exc_info()) else: if len(aoErrors) == 0: self._sPageBody += '<p>Successfully regenerated.</p>' else: for oError in aoErrors: if oError[1] is None: self._sPageBody += '<p>%s.</p>' % ( webutils.escapeElem(oError[0]), ) ## @todo links. #elif isinstance(oError[1], TestGroupData): # self._sPageBody += '<p>%s.</p>' % (webutils.escapeElem(oError[0]),); #elif isinstance(oError[1], TestGroupCase): # self._sPageBody += '<p>%s.</p>' % (webutils.escapeElem(oError[0]),); else: self._sPageBody += '<p>%s. [Cannot link to %s]</p>' \ % (webutils.escapeElem(oError[0]), webutils.escapeElem(str(oError[1]))) for sMsg in asMessages: self._sPageBody += '<p>%s<p>\n' % ( webutils.escapeElem(sMsg), ) return True
def _actionRegenQueuesCommon(self): """ Common code for ksActionTestBoxesRegenQueues and ksActionTestCfgRegenQueues. Too lazy to put this in some separate place right now. """ self._checkForUnknownParameters(); ## @todo should also be changed to a POST with a confirmation dialog preceeding it. self._sPageTitle = 'Regenerate All Scheduling Queues'; self._sPageBody = ''; aoGroups = SchedGroupLogic(self._oDb).getAll(); for oGroup in aoGroups: self._sPageBody += '<h3>%s (ID %#d)</h3>' % (webutils.escapeElem(oGroup.sName), oGroup.idSchedGroup); try: (aoErrors, asMessages) = SchedulerBase.recreateQueue(self._oDb, self._oCurUser.uid, oGroup.idSchedGroup, 2); except Exception as oXcpt: self._oDb.rollback(); self._sPageBody += '<p>SchedulerBase.recreateQueue threw an exception: %s</p>' \ % (webutils.escapeElem(str(oXcpt)),); self._sPageBody += cgitb.html(sys.exc_info()); else: if len(aoErrors) == 0: self._sPageBody += '<p>Successfully regenerated.</p>'; else: for oError in aoErrors: if oError[1] is None: self._sPageBody += '<p>%s.</p>' % (webutils.escapeElem(oError[0]),); ## @todo links. #elif isinstance(oError[1], TestGroupData): # self._sPageBody += '<p>%s.</p>' % (webutils.escapeElem(oError[0]),); #elif isinstance(oError[1], TestGroupCase): # self._sPageBody += '<p>%s.</p>' % (webutils.escapeElem(oError[0]),); else: self._sPageBody += '<p>%s. [Cannot link to %s]</p>' \ % (webutils.escapeElem(oError[0]), webutils.escapeElem(str(oError[1]))); for sMsg in asMessages: self._sPageBody += '<p>%s<p>\n' % (webutils.escapeElem(sMsg),); return True;
def _doRequestCommand(self, fIdle): """ Common code for handling command request. """ (oDb, oStatusData, oTestBoxData) = self._connectToDbAndValidateTb() if oDb is None: return False # # Status clean up. # # Only when BUSY will the TestBox Script request and execute commands # concurrently. So, it must be idle when sending REQUEST_COMMAND_IDLE. # if fIdle: if oStatusData.enmState == TestBoxStatusData.ksTestBoxState_GangGathering: self._doGangGathering(oDb, oStatusData) elif oStatusData.enmState == TestBoxStatusData.ksTestBoxState_GangGatheringTimedOut: self._doGangGatheringTimedOut(oDb, oStatusData) elif oStatusData.enmState == TestBoxStatusData.ksTestBoxState_GangTesting: dResponse = SchedulerBase.composeExecResponse( oDb, oTestBoxData.idTestBox, self._oSrvGlue.getBaseUrl()) if dResponse is not None: return dResponse elif oStatusData.enmState == TestBoxStatusData.ksTestBoxState_GangCleanup: self._doGangCleanup(oDb, oStatusData) elif oStatusData.enmState != TestBoxStatusData.ksTestBoxState_Idle: # (includes ksTestBoxState_GangGatheringTimedOut) self._cleanupOldTest(oDb, oStatusData) # # Check for pending command. # if oTestBoxData.enmPendingCmd != TestBoxData.ksTestBoxCmd_None: asValidCmds = TestBoxController.kasIdleCmds if fIdle else TestBoxController.kasBusyCmds if oTestBoxData.enmPendingCmd in asValidCmds: dResponse = { constants.tbresp.ALL_PARAM_RESULT: TestBoxController.kdCmdToTbRespCmd[ oTestBoxData.enmPendingCmd] } if oTestBoxData.enmPendingCmd in [ TestBoxData.ksTestBoxCmd_Upgrade, TestBoxData.ksTestBoxCmd_UpgradeAndReboot ]: dResponse[constants.tbresp. UPGRADE_PARAM_URL] = self._oSrvGlue.getBaseUrl( ) + TestBoxController.ksUpgradeZip return self._writeResponse(dResponse) if oTestBoxData.enmPendingCmd == TestBoxData.ksTestBoxCmd_Abort and fIdle: TestBoxLogic(oDb).setCommand( self._idTestBox, sOldCommand=oTestBoxData.enmPendingCmd, sNewCommand=TestBoxData.ksTestBoxCmd_None, fCommit=True) # # If doing gang stuff, return 'CMD_WAIT'. # ## @todo r=bird: Why is GangTesting included here? Figure out when testing gang testing. if oStatusData.enmState in [ TestBoxStatusData.ksTestBoxState_GangGathering, TestBoxStatusData.ksTestBoxState_GangTesting, TestBoxStatusData.ksTestBoxState_GangCleanup ]: return self._resultResponse(constants.tbresp.CMD_WAIT) # # If idling and enabled try schedule a new task. # if fIdle \ and oTestBoxData.fEnabled \ and not TestSetLogic(oDb).isTestBoxExecutingToRapidly(oTestBoxData.idTestBox) \ and oStatusData.enmState == TestBoxStatusData.ksTestBoxState_Idle: # (paranoia) dResponse = SchedulerBase.scheduleNewTask( oDb, oTestBoxData, oStatusData.iWorkItem, self._oSrvGlue.getBaseUrl()) if dResponse is not None: return self._writeResponse(dResponse) # # Touch the status row every couple of mins so we can tell that the box is alive. # oStatusLogic = TestBoxStatusLogic(oDb) if oStatusData.enmState != TestBoxStatusData.ksTestBoxState_GangGathering \ and oStatusLogic.timeSinceLastChangeInSecs(oStatusData) >= TestBoxStatusLogic.kcSecIdleTouchStatus: oStatusLogic.touchStatus(oTestBoxData.idTestBox, fCommit=True) return self._idleResponse()
def __init__(self, oDb, oSchedGrpData, iVerbosity, tsSecStart): SchedulerBase.__init__(self, oDb, oSchedGrpData, iVerbosity, tsSecStart)
def __init__(self, oDb, oSchedGrpData, iVerbosity, tsSecStart): SchedulerBase.__init__(self, oDb, oSchedGrpData, iVerbosity, tsSecStart);
def _doRequestCommand(self, fIdle): """ Common code for handling command request. """ (oDb, oStatusData, oTestBoxData) = self._connectToDbAndValidateTb(); if oDb is None: return False; # # Status clean up. # # Only when BUSY will the TestBox Script request and execute commands # concurrently. So, it must be idle when sending REQUEST_COMMAND_IDLE. # if fIdle: if oStatusData.enmState == TestBoxStatusData.ksTestBoxState_GangGathering: self._doGangGathering(oDb, oStatusData); elif oStatusData.enmState == TestBoxStatusData.ksTestBoxState_GangGatheringTimedOut: self._doGangGatheringTimedOut(oDb, oStatusData); elif oStatusData.enmState == TestBoxStatusData.ksTestBoxState_GangTesting: dResponse = SchedulerBase.composeExecResponse(oDb, oTestBoxData.idTestBox, self._oSrvGlue.getBaseUrl()); if dResponse is not None: return dResponse; elif oStatusData.enmState == TestBoxStatusData.ksTestBoxState_GangCleanup: self._doGangCleanup(oDb, oStatusData); elif oStatusData.enmState != TestBoxStatusData.ksTestBoxState_Idle: # (includes ksTestBoxState_GangGatheringTimedOut) self._cleanupOldTest(oDb, oStatusData); # # Check for pending command. # if oTestBoxData.enmPendingCmd != TestBoxData.ksTestBoxCmd_None: asValidCmds = TestBoxController.kasIdleCmds if fIdle else TestBoxController.kasBusyCmds; if oTestBoxData.enmPendingCmd in asValidCmds: dResponse = { constants.tbresp.ALL_PARAM_RESULT: TestBoxController.kdCmdToTbRespCmd[oTestBoxData.enmPendingCmd] }; if oTestBoxData.enmPendingCmd in [TestBoxData.ksTestBoxCmd_Upgrade, TestBoxData.ksTestBoxCmd_UpgradeAndReboot]: dResponse[constants.tbresp.UPGRADE_PARAM_URL] = self._oSrvGlue.getBaseUrl() + TestBoxController.ksUpgradeZip; return self._writeResponse(dResponse); if oTestBoxData.enmPendingCmd == TestBoxData.ksTestBoxCmd_Abort and fIdle: TestBoxLogic(oDb).setCommand(self._idTestBox, sOldCommand = oTestBoxData.enmPendingCmd, sNewCommand = TestBoxData.ksTestBoxCmd_None, fCommit = True); # # If doing gang stuff, return 'CMD_WAIT'. # ## @todo r=bird: Why is GangTesting included here? Figure out when testing gang testing. if oStatusData.enmState in [TestBoxStatusData.ksTestBoxState_GangGathering, TestBoxStatusData.ksTestBoxState_GangTesting, TestBoxStatusData.ksTestBoxState_GangCleanup]: return self._resultResponse(constants.tbresp.CMD_WAIT); # # If idling and enabled try schedule a new task. # if fIdle \ and oTestBoxData.fEnabled \ and oStatusData.enmState == TestBoxStatusData.ksTestBoxState_Idle: # (paranoia) dResponse = SchedulerBase.scheduleNewTask(oDb, oTestBoxData, self._oSrvGlue.getBaseUrl()); if dResponse is not None: return self._writeResponse(dResponse); # # Touch the status row every couple of mins so we can tell that the box is alive. # oStatusLogic = TestBoxStatusLogic(oDb); if oStatusData.enmState != TestBoxStatusData.ksTestBoxState_GangGathering \ and oStatusLogic.timeSinceLastChangeInSecs(oStatusData) >= TestBoxStatusLogic.kcSecIdleTouchStatus: oStatusLogic.touchStatus(oTestBoxData.idTestBox, fCommit = True); return self._idleResponse();