#Licensed to the Apache Software Foundation (ASF) under one #or more contributor license agreements. See the NOTICE file #distributed with this work for additional information #regarding copyright ownership. The ASF licenses this file #to you under the Apache License, Version 2.0 (the #"License"); you may not use this file except in compliance #with the License. You may obtain a copy of the License at # http://www.apache.org/licenses/LICENSE-2.0 #Unless required by applicable law or agreed to in writing, software #distributed under the License is distributed on an "AS IS" BASIS, #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #See the License for the specific language governing permissions and #limitations under the License. """defines nodepool and nodeset as abstract interface for batch system""" # -*- python -*- from hodlib.GridServices.service import * class NodeSet: """a set of nodes as one allocation unit""" PENDING, COMMITTED, COMPLETE = range(3) def __init__(self, id, numNodes, preferredList, isPreemptee): self.id = id self.numNodes = numNodes self.isPreemptee = isPreemptee self.preferredList = preferredList self.cmdDescSet = [] def getId(self): """returns a unique id of the nodeset""" return self.id def registerCommand(self, cmdDesc): """register a command to the nodeset""" self.cmdDescSet.append(cmdDesc) def getAddrList(self): """get list of node host names May return empty list if node set is not allocated yet""" raise NotImplementedError def _getNumNodes(self): return self.numNodes def _isPreemptee(self): return self.isPreemptee def _getPreferredList(self): return self.preferredList def _getCmdSet(self): return self.cmdDescSet class NodePool: """maintains a collection of node sets as they get allocated. Also the base class for all kinds of nodepools. """ def __init__(self, nodePoolDesc, cfg, log): self.nodePoolDesc = nodePoolDesc self.nodeSetDict = {} self._cfg = cfg self.nextNodeSetId = 0 self._log = log def newNodeSet(self, numNodes, preferred=[], isPreemptee=True, id=None): """create a nodeset possibly with asked properties""" raise NotImplementedError def submitNodeSet(self, nodeSet, walltime = None, qosLevel = None, account = None, resourcelist = None): """submit the nodeset request to nodepool return False if error happened""" raise NotImplementedError def pollNodeSet(self, nodeSet): """return status of node set""" raise NotImplementedError def getWorkers(self): """return the hosts that comprise this nodepool""" raise NotImplementedError def runWorkers(self, nodeSet = None, args = []): """Run node set workers.""" raise NotImplementedError def freeNodeSet(self, nodeset): """free a node set""" raise NotImplementedError def finalize(self): """cleans up all nodesets""" raise NotImplementedError def getServiceId(self): raise NotImplementedError def getJobInfo(self, jobId=None): raise NotImplementedError def deleteJob(self, jobId): """Delete a job, given it's id""" raise NotImplementedError def isJobFeasible(self): """Check if job can run by looking at any user/job limits""" raise NotImplementedError def updateWorkerInfo(self, workerInfoMap, jobId): """Update information about the workers started by this NodePool.""" raise NotImplementedError def getAccountString(self): """Return the account string for this job""" raise NotImplementedError def getNextNodeSetId(self): id = self.nextNodeSetId self.nextNodeSetId += 1 return id