blob: 4eafddb0c93c5766998e19f0802c7492506fa3cf [file] [log] [blame]
#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