def apply(self, task): nodeId = None name = task.name parent, created = self.getOrCreateParentNode(task) user = task.user priority = task.priority dispatchKey = task.dispatchKey maxRN = task.maxRN if isinstance(task, TaskGroup): strategy = task.strategy node = FolderNode(nodeId, name, parent, user, priority, dispatchKey, maxRN, strategy, taskGroup=task) else: node = TaskNode(None, name, parent, user, priority, dispatchKey, maxRN, task) task.nodes[RULENAME] = node if created: return [node.parent, node] else: return [node]
def register(cls, dispatchTree, userName, rootName): rootNode = FolderNode(None, rootName, dispatchTree.root, userName, 1, 1, 0, FifoStrategy(), None) rule = cls(dispatchTree, rootNode) dispatchTree.rules.append(rule) for task in dispatchTree.tasks.values(): rule.apply(task) return rule
def getOrCreateParentNode(self, task): if task.parent: return (task.parent.nodes[RULENAME], False) userName = task.user for child in self.root.children: if child.name == userName: return (child, False) userNode = FolderNode(None, userName, self.root, userName, 1, 1.0, -1, FifoStrategy(), None) return (userNode, True)
def __init__(self): # core data self.root = FolderNode(0, "root", None, "root", 1, 1, 0, FifoStrategy()) self.nodes = WeakValueDictionary() self.nodes[0] = self.root self.pools = {} self.renderNodes = {} self.tasks = {} self.rules = [] self.poolShares = {} self.commands = {} # deduced properties self.nodeMaxId = 0 self.poolMaxId = 0 self.renderNodeMaxId = 0 self.taskMaxId = 0 self.commandMaxId = 0 self.poolShareMaxId = 0 self.toCreateElements = [] self.toModifyElements = [] self.toArchiveElements = [] # listeners self.nodeListener = ObjectListener(self.onNodeCreation, self.onNodeDestruction, self.onNodeChange) self.taskListener = ObjectListener(self.onTaskCreation, self.onTaskDestruction, self.onTaskChange) # # JSA # self.taskGroupListener = ObjectListener(self.onTaskCreation, self.onTaskDestruction, self.onTaskGroupChange) self.renderNodeListener = ObjectListener(self.onRenderNodeCreation, self.onRenderNodeDestruction, self.onRenderNodeChange) self.poolListener = ObjectListener(self.onPoolCreation, self.onPoolDestruction, self.onPoolChange) self.commandListener = ObjectListener( onCreationEvent=self.onCommandCreation, onChangeEvent=self.onCommandChange) self.poolShareListener = ObjectListener(self.onPoolShareCreation) self.modifiedNodes = []
def initPoolsDataFromBackend(self): ''' Loads pools and workers from appropriate backend. ''' try: if settings.POOLS_BACKEND_TYPE == "file": manager = FilePoolManager() elif settings.POOLS_BACKEND_TYPE == "ws": manager = WebServicePoolManager() elif settings.POOLS_BACKEND_TYPE == "db": return False except Exception: return False computers = manager.listComputers() ### recreate the pools poolsList = manager.listPools() poolsById = {} for poolDesc in poolsList: pool = Pool(id=int(poolDesc.id), name=str(poolDesc.name)) self.dispatchTree.toCreateElements.append(pool) poolsById[pool.id] = pool ### recreate the rendernodes rnById = {} for computerDesc in computers: try: computerDesc.name = socket.getfqdn(computerDesc.name) ip = socket.gethostbyname(computerDesc.name) except socket.gaierror: continue renderNode = RenderNode( computerDesc.id, computerDesc.name + ":" + str(computerDesc.port), computerDesc.cpucount * computerDesc.cpucores, computerDesc.cpufreq, ip, computerDesc.port, computerDesc.ramsize, json.loads(computerDesc.properties)) self.dispatchTree.toCreateElements.append(renderNode) ## add the rendernodes to the pools for pool in computerDesc.pools: poolsById[pool.id].renderNodes.append(renderNode) renderNode.pools.append(poolsById[pool.id]) self.dispatchTree.renderNodes[str(renderNode.name)] = renderNode rnById[renderNode.id] = renderNode # add the pools to the dispatch tree for pool in poolsById.values(): self.dispatchTree.pools[pool.name] = pool if self.cleanDB or not self.enablePuliDB: graphs = FolderNode(1, "graphs", self.dispatchTree.root, "root", 0, 0, 0, FifoStrategy()) self.dispatchTree.toCreateElements.append(graphs) self.dispatchTree.nodes[graphs.id] = graphs ps = PoolShare(1, self.dispatchTree.pools["default"], graphs, PoolShare.UNBOUND) self.dispatchTree.toCreateElements.append(ps) if self.enablePuliDB: # clean the tables pools and rendernodes (overwrite) self.pulidb.dropPoolsAndRnsTables() self.pulidb.createElements(self.dispatchTree.toCreateElements) self.dispatchTree.resetDbElements() return True