def MonitorWorkFunc(self,workItem): # for this function, data is the parallel multiprocess started for monitoring if self.deployed != True: self.workQueue.remove(workItem) return # get data from queue updateCanvas = False try: nodes = self.runningDeployment.getChildrenByKind('Node') nodeMap = {} for n in nodes: nodeMap[n.properties['name']] = n data = workItem.queue.get(False) while data != None: #print "GOT DATA: {}".format(data) dataList = data[0].split(' ') nodeName = dataList[0] node = nodeMap[nodeName] if dataList[1] == "UP": node.style['overlay']['outlineColor']=self.overlayDict['Node Up Overlay'] else: node.style['overlay']['outlineColor']=self.overlayDict['Node Down Overlay'] updateCanvas = True data = workItem.queue.get(False) except: # if we get here, we've read everything from the q if updateCanvas: self.DrawModel(self.runningDeployment,self.runningDeploymentCanvas) if not workItem.process.is_alive(): # process has terminated # update deployment overlays here workerThread = WorkerThread(func = lambda : deployment.monitorTest(self, workItem.queue) ) workerThread.start() workItem.data = workerThread
def OnDeploymentDeploy(self,e): if self.deployed == False: selectedPage = self.activeAspect.GetSelection() objName = self.activeAspect.GetPageText(selectedPage) info = self.activeAspectInfo.GetPageInfo(objName) dep = info.obj canvas = info.canvas testName = "NewTest" properties = OrderedDict() properties['name'] = testName properties['period'] = str(self.workTimerPeriod) properties['hardware_reference'] = None referenceDict = OrderedDict() referenceDict['hardware_reference'] = dep.properties['rhw_reference'].children inputs = dialogs.EditorWindow(parent=self, editDict=properties, title="Deployment Options", referenceDict = referenceDict) if inputs != OrderedDict(): for key,value in inputs.iteritems(): properties[key] = value self.rosCoreHost = properties['hardware_reference'] rosCoreIP = self.rosCoreHost.properties['ip_address'] numNodes, numHosts = self.BuildHostDict(dep,rosCoreIP) print "ROSMOD::Starting ROSCORE!" deployment.startMaster(self,None) testName = properties['name'] self.workTimerPeriod = float(properties['period']) self.workTimer.Start(self.workTimerPeriod*1000) deploymentProgressQ = multiprocessing.Queue() dlg = dialogs.RMLProgressDialog( parent = self, title="Deployment Progress", progress_q = deploymentProgressQ, numItems=numNodes) workerThread = WorkerThread( func = lambda : deployment.deployTest( self, deploymentProgressQ ) ) self.updatedHostDict = False workerThread.start() dlg.ShowModal() dlg.Destroy() self.runningDeployment = dep self.runningDeploymentCanvas = canvas self.runningNodes = numNodes self.deployed = True monitorQ = multiprocessing.Queue() workerThread = WorkerThread( func = lambda : deployment.monitorTest( self, monitorQ ) ) monitorWorkItem = WorkItem(process = workerThread, queue = monitorQ, workFunc = lambda e : MonitorWorkFunc(self,e)) self.workQueue.append(monitorWorkItem) workerThread.start() else: dialogs.ErrorDialog(self,"System is already running a deployment!")