Esempio n. 1
0
    def declare(self, xml, proxyFile=None):
        """
        register job related informations in the db
        """

        taskInfo, jobInfos, rjAttrs = self.deserialize(xml)

        # reconstruct task
        task = Task(taskInfo)
        task['user_proxy'] = proxyFile
        self.saveTask(task)

        # reconstruct jobs and fill the data
        jobs = []
        for jI in jobInfos:
            job = Job(jI)
            subn = int(job['submissionNumber'])
            if subn > 0:
                job['submissionNumber'] = subn - 1
            else:
                job['submissionNumber'] = subn
            jobs.append(job)

        task.addJobs(jobs)

        for job in task.jobs:
            attrs = rjAttrs[str(job['name'])]
            self.getRunningInstance(job, attrs)
            self.updateDB(job)

        # self.updateDB( task )

        # all done
        return task
Esempio n. 2
0
    def loadTask(self, taskId, jobRange='all', deep=True):
        """
        retrieve task information from db using task id

        the jobs loading can be tuned using jobRange:
        - None       : no jobs are loaded
        - 'all'      : all jobs are loaded
        - list/range : only selected jobs are loaded
        """

        # db connect
        if self.db is None:
            self.connect()

        # create template for task
        task = Task()
        task['id'] = int(taskId)
        task.load(self.db, False)

        # load jobs
        # # backward compatible 'deep' parameter handling
        if jobRange is not None and deep != False:
            self.load(task, jobRange)

        return task
Esempio n. 3
0
    def loadTask( self, taskId, jobRange='all', deep=True ) :
        """
        retrieve task information from db using task id

        the jobs loading can be tuned using jobRange:
        - None       : no jobs are loaded
        - 'all'      : all jobs are loaded
        - list/range : only selected jobs are loaded
        """

        # db connect
        if self.db is None :
            self.connect()

        # create template for task
        task = Task()
        task['id'] = int(taskId)
        task.load(self.db, False)

        # load jobs
        # # backward compatible 'deep' parameter handling
        if jobRange is not None and deep != False :
            self.load( task, jobRange )

        return task
Esempio n. 4
0
    def declare( self, xml, proxyFile=None ) :
        """
        register job related informations in the db
        """

        taskInfo, jobInfos, rjAttrs = self.deserialize( xml )

        # reconstruct task
        task = Task( taskInfo )
        task['user_proxy'] = proxyFile
        self.saveTask( task )

        # reconstruct jobs and fill the data
        jobs = []
        for jI in jobInfos:
            job = Job( jI )
            subn = int( job['submissionNumber'] )
            if subn > 0 :
                job['submissionNumber'] = subn - 1
            else :
                job['submissionNumber'] = subn
            jobs.append(job)

        task.addJobs(jobs)

        for job in task.jobs:
            attrs = rjAttrs[ str(job['name']) ]
            self.getRunningInstance( job, attrs )
            self.updateDB( job )

        # self.updateDB( task )

        # all done
        return task
Esempio n. 5
0
    def testTask(self):
        """
        __testTask__
        """

        try:
            if self.taskId is not None:
                self.load(self.taskId, self.jobRange)
            else:
                self.task = self.bossSession.loadTaskByName(self.taskName,
                                                            deep=False)
                self.load(self.task, self.jobRange)
            print "Task loaded..."
        except BossLiteError, e:
            print "Task not found... declaring"

            taskParams = {
                'name': self.taskName,
                'globalSandbox': '/etc/redhat-release'
            }

            self.task = Task(taskParams)
            print self.task

            parameters = {
                'executable': '/bin/echo',
                'arguments': 'ciao',
                'standardError': 'err.txt',
                'standardOutput': 'out.txt',
                'outputFiles': ['out.txt']
            }
            #                      'outputFiles' : ['err.txt', 'out.txt', '.BrokerInfo']}
            jobs = []
            for jobId in range(1, 51):
                parameters['name'] = 'job' + str(jobId)
                job = Job(parameters)
                self.bossSession.getNewRunningInstance(job)
                jobs.append(job)

            parameters['arguments'] = 'ciao2'
            for jobId in range(51, 101):
                parameters['name'] = 'job' + str(jobId)
                job = Job(parameters)
                self.bossSession.getNewRunningInstance(job)
                jobs.append(job)

            self.task.addJobs(jobs)
            self.bossSession.saveTask(self.task)

            for job in self.task.jobs:
                print job['jobId'], job['taskId'], job['submissionNumber'],
                if job.runningJob is not None:
                    print job.runningJob['jobId'], \
                          job.runningJob['taskId'], \
                          job.runningJob['submission']
Esempio n. 6
0
    def loadTaskByName(self, name, jobRange='all', deep=True):
        """
        retrieve task information from db for task 'name'
        """

        # db connect
        if self.db is None:
            self.connect()

        # create template for task and load
        task = Task()
        task['name'] = name
        task.load(self.db, False)

        # load jobs
        # # backward compatible 'deep' parameter handling
        if jobRange is not None and deep != False:
            self.load(task, jobRange)

        return task
Esempio n. 7
0
    def loadTaskByName( self, name, jobRange='all', deep=True ) :
        """
        retrieve task information from db for task 'name'
        """

        # db connect
        if self.db is None :
            self.connect()

        # create template for task and load
        task = Task()
        task['name'] = name
        task.load(self.db, False)

        # load jobs
        # # backward compatible 'deep' parameter handling
        if jobRange is not None and deep != False :
            self.load( task, jobRange )

        return task
Esempio n. 8
0
    def testTask( self ) :
        """
        __testTask__
        """
        
        try:
            if self.taskId is not None :
                self.load( self.taskId, self.jobRange)
            else :
                self.task = self.bossSession.loadTaskByName( self.taskName,
                                                             deep=False)
                self.load( self.task, self.jobRange)
            print "Task loaded..."
        except BossLiteError, e:
            print "Task not found... declaring"

 
            taskParams = {'name' : self.taskName,
                          'globalSandbox' : '/etc/redhat-release' }
            
            self.task = Task( taskParams )
            print self.task
            
            parameters = {'executable' : '/bin/echo',
                          'arguments' : 'ciao',
                          'standardError' : 'err.txt',
                          'standardOutput' : 'out.txt',
                          'outputFiles' : ['out.txt']}
    #                      'outputFiles' : ['err.txt', 'out.txt', '.BrokerInfo']}
            jobs = []
            for jobId in range(1, 51):
                parameters['name'] = 'job' + str(jobId)
                job = Job(parameters)
                self.bossSession.getNewRunningInstance(job)
                jobs.append(job)
    
            parameters['arguments'] = 'ciao2'
            for jobId in range(51, 101):
                parameters['name'] = 'job' + str(jobId)
                job = Job(parameters)
                self.bossSession.getNewRunningInstance(job)
                jobs.append(job)

            self.task.addJobs(jobs)
            self.bossSession.saveTask( self.task )
    
            for job in self.task.jobs :
                print job['jobId'], job['taskId'], job['submissionNumber'],
                if job.runningJob is not None :
                    print job.runningJob['jobId'], \
                          job.runningJob['taskId'], \
                          job.runningJob['submission']
Esempio n. 9
0
    def loadTasksByUser(self, user, deep=True):
        """
        retrieve task information from db for task owned by user
        """

        # db connect
        if self.db is None:
            self.connect()

        # create template for task
        task = Task()
        task['user'] = user

        # load task
        taskList = self.db.select(task, deep)

        return taskList
Esempio n. 10
0
 def createTask_(self, optsToSave):
     """
     Task declaration
     with the first coniguration stuff 
     """
     opt = {}
     if optsToSave.get('server_mode', 0) == 1:
         opt['serverName'] = optsToSave['server_name']
     opt['name'] = getUserName() + '_' + string.split(
         common.work_space.topDir(),
         '/')[-2] + '_' + common.work_space.task_uuid()
     task = Task(opt)
     try:
         common.bossSession.saveTask(task)
     except Exception, e:
         raise CrabException('Error creating task ' +
                             str(traceback.format_exc()))
Esempio n. 11
0
    def loadTasksByProxy(self, name, deep=True):
        """
        retrieve task information from db for all tasks
        with user proxy set to name
        """

        # db connect
        if self.db is None:
            self.connect()

        # create template for task
        task = Task()
        task['user_proxy'] = name

        # load task
        taskList = self.db.select(task, deep)

        return taskList
Esempio n. 12
0
    def load(self,
             task,
             jobRange="all",
             jobAttributes=None,
             runningAttrs=None,
             strict=True,
             limit=None,
             offset=None):
        """
        retrieve information from db for:
        - jobRange can be of the form:
             'a,b:c,d,e'
             ['a',b','c']
             'all'
             None (no jobs to be loaded

        In some way these should be the option to build the query.
        Maybe, same options should be used also in
        loadSubmitted, loadCreated, loadEnded, loadFailed

        Takes the highest submission number for each job
        """

        # db connect
        if self.db is None:
            self.connect()

        # already loaded task?
        if not isinstance(task, Task):
            task = Task({'id': task})
            task.load(self.db, False)
        elif jobRange == 'all' and task.jobs != []:
            jobRange = None

        # simple case: no jobs loading request
        if jobRange is None:
            return task

        # defining default
        if jobAttributes is None:
            jobAttributes = {}

        # evaluate job list
        jobList = None
        if jobRange is not None and jobRange != 'all':

            # identify jobRange
            if type(jobRange) == list:
                jobList = jobRange
            else:
                jobList = parseRange(jobRange)

            # if there are loaded jobs, load just missing
            if task.jobs != []:
                s = [str(job['jobId']) for job in task.jobs]
                jobList = [str(x) for x in jobList if str(x) not in s]

            # no jobs to be loaded?
            if jobList == []:
                return task
            elif jobList is not None:
                jobList.sort()

        # load
        jobAttributes['taskId'] = int(task['id'])
        jobs = self.loadJobsByRunningAttr( runningAttrs, \
                                           jobAttributes, \
                                           strict=strict, \
                                           limit=limit, offset=offset,\
                                           jobList=jobList )
        task.appendJobs(jobs)

        return task
Esempio n. 13
0
    def load( self, task, jobRange="all", jobAttributes=None, runningAttrs=None, strict=True, limit=None, offset=None ) :
        """
        retrieve information from db for:
        - jobRange can be of the form:
             'a,b:c,d,e'
             ['a',b','c']
             'all'
             None (no jobs to be loaded

        In some way these should be the option to build the query.
        Maybe, same options should be used also in
        loadSubmitted, loadCreated, loadEnded, loadFailed

        Takes the highest submission number for each job
        """

        # db connect
        if self.db is None :
            self.connect()

        # already loaded task?
        if not isinstance( task, Task ) :
            task = Task({'id' : task})
            task.load(self.db, False)
        elif jobRange == 'all' and task.jobs != []:
            jobRange = None

        # simple case: no jobs loading request
        if jobRange is None:
            return task

        # defining default
        if jobAttributes is None :
            jobAttributes = {}

        # evaluate job list
        jobList = None
        if jobRange is not None and jobRange != 'all':

            # identify jobRange
            if type( jobRange ) == list :
                jobList = jobRange
            else :
                jobList = parseRange( jobRange )

            # if there are loaded jobs, load just missing
            if task.jobs != []:
                s = [ str(job['jobId']) for job in task.jobs ]
                jobList = [str(x) for x in jobList if str(x) not in s]

            # no jobs to be loaded?
            if jobList == [] :
                return task
            elif jobList is not None:
                jobList.sort()

        # load
        jobAttributes['taskId'] = int( task['id'] )
        jobs = self.loadJobsByRunningAttr( runningAttrs, \
                                           jobAttributes, \
                                           strict=strict, \
                                           limit=limit, offset=offset,\
                                           jobList=jobList )
        task.appendJobs( jobs )

        return task
Esempio n. 14
0
class TaskAPITests(object):
    """
    TaskAPITests for the Job class
    """

    ##########################################################################
    def __init__(self, dbtype, installDb=False):
        """
        __init__
        """

        self.bossSession = None
        self.schedSession = None
        self.task = None
        self.jobRange = 'all'
        self.outdir = None
        self.taskId = None
        self.taskName = 'test_task'

        # read configuration
        self.database = dbType
        self.dbConfig = dbConfig
        self.schedulerConfig = schedulerConfig

        if dbtype.lower() == 'sqlite':
            self.bossSession = self._SqLiteSession(installDb)
        elif dbtype.lower() == 'mysql':
            self.bossSession = self._MySqlSession(installDb)
        else:
            print "bad db choice: '%s', allowed only 'SQLite' or 'MySQL'" % \
                  dbtype
            sys.exit()

    ##########################################################################
    def _SqLiteSession(self, installDb):
        """
        __sqLiteSession__
        """

        if self.bossSession is not None:
            return

        # BossLiteApi session
        self.database = "SQLite"

        self.bossSession = BossLiteAPI(self.database, self.dbConfig)

        # db installed?
        try:
            if installDb:
                self.bossSession.bossLiteDB.installDB(
                    '$PRODCOMMON_ROOT/lib/ProdCommon/BossLite/DbObjects/setupDatabase-sqlite.sql'
                )
                self.bossSession.bossLiteDB.reset()
        except:
            pass

        return self.bossSession

    ##########################################################################
    def _MySqlSession(self, installDb):
        """
        __mySqlSession__
        """

        if self.bossSession is not None:
            return

        self.database = "MySQL"

        # BossLiteApi session
        self.bossSession = BossLiteAPI(self.database, self.dbConfig)

        # db installed?
        try:
            if installDb:
                self.bossSession.bossLiteDB.installDB(
                    '$PRODCOMMON_ROOT/lib/ProdCommon/BossLite/DbObjects/setupDatabase.sql'
                )
        except:
            pass

        return self.bossSession

    ##########################################################################
    def schedulerSession(self):
        """
        __schedulerSession__
        """

        if self.schedSession is not None:
            return self.schedSession

        self.schedSession = BossLiteAPISched( self.bossSession, \
                                                  self.schedulerConfig, \
                                                  self.task )
        return self.schedSession

    ##########################################################################
    def testTask(self):
        """
        __testTask__
        """

        try:
            if self.taskId is not None:
                self.load(self.taskId, self.jobRange)
            else:
                self.task = self.bossSession.loadTaskByName(self.taskName,
                                                            deep=False)
                self.load(self.task, self.jobRange)
            print "Task loaded..."
        except BossLiteError, e:
            print "Task not found... declaring"

            taskParams = {
                'name': self.taskName,
                'globalSandbox': '/etc/redhat-release'
            }

            self.task = Task(taskParams)
            print self.task

            parameters = {
                'executable': '/bin/echo',
                'arguments': 'ciao',
                'standardError': 'err.txt',
                'standardOutput': 'out.txt',
                'outputFiles': ['out.txt']
            }
            #                      'outputFiles' : ['err.txt', 'out.txt', '.BrokerInfo']}
            jobs = []
            for jobId in range(1, 51):
                parameters['name'] = 'job' + str(jobId)
                job = Job(parameters)
                self.bossSession.getNewRunningInstance(job)
                jobs.append(job)

            parameters['arguments'] = 'ciao2'
            for jobId in range(51, 101):
                parameters['name'] = 'job' + str(jobId)
                job = Job(parameters)
                self.bossSession.getNewRunningInstance(job)
                jobs.append(job)

            self.task.addJobs(jobs)
            self.bossSession.saveTask(self.task)

            for job in self.task.jobs:
                print job['jobId'], job['taskId'], job['submissionNumber'],
                if job.runningJob is not None:
                    print job.runningJob['jobId'], \
                          job.runningJob['taskId'], \
                          job.runningJob['submission']

        return self.task
Esempio n. 15
0
class TaskAPITests(object):
    """
    TaskAPITests for the Job class
    """

    ##########################################################################
    def __init__(self, dbtype, installDb=False):
        """
        __init__
        """
        
        self.bossSession = None
        self.schedSession = None
        self.task = None
        self.jobRange = 'all'
        self.outdir = None
        self.taskId =  None
        self.taskName =  'test_task'

        # read configuration
        self.database = dbType
        self.dbConfig = dbConfig
        self.schedulerConfig = schedulerConfig

        if dbtype.lower() == 'sqlite' :
            self.bossSession = self._SqLiteSession(installDb)
        elif dbtype.lower() == 'mysql' :
            self.bossSession = self._MySqlSession(installDb)
        else :
            print "bad db choice: '%s', allowed only 'SQLite' or 'MySQL'" % \
                  dbtype
            sys.exit()
        

    ##########################################################################
    def _SqLiteSession(self, installDb):
        """
        __sqLiteSession__
        """

        if self.bossSession is not None :
            return

        # BossLiteApi session
        self.database = "SQLite"
        
        self.bossSession = BossLiteAPI( self.database, self.dbConfig )
        
        # db installed?
        try:
            if installDb :
                self.bossSession.bossLiteDB.installDB(
                    '$PRODCOMMON_ROOT/lib/ProdCommon/BossLite/DbObjects/setupDatabase-sqlite.sql'
                    )
                self.bossSession.bossLiteDB.reset()
        except:
            pass
    
        return self.bossSession


    ##########################################################################
    def _MySqlSession(self, installDb):
        """
        __mySqlSession__
        """

        if self.bossSession is not None :
            return

        self.database = "MySQL"
    
        # BossLiteApi session
        self.bossSession = BossLiteAPI( self.database, self.dbConfig )
    
        # db installed?
        try:
            if installDb :
                self.bossSession.bossLiteDB.installDB(
                    '$PRODCOMMON_ROOT/lib/ProdCommon/BossLite/DbObjects/setupDatabase.sql'
                    )
        except:
            pass
    
        return self.bossSession


    ##########################################################################
    def schedulerSession(self):
        """
        __schedulerSession__
        """

        if self.schedSession is not None:
            return self.schedSession

        self.schedSession = BossLiteAPISched( self.bossSession, \
                                                  self.schedulerConfig, \
                                                  self.task )
        return self.schedSession


    ##########################################################################
    def testTask( self ) :
        """
        __testTask__
        """
        
        try:
            if self.taskId is not None :
                self.load( self.taskId, self.jobRange)
            else :
                self.task = self.bossSession.loadTaskByName( self.taskName,
                                                             deep=False)
                self.load( self.task, self.jobRange)
            print "Task loaded..."
        except BossLiteError, e:
            print "Task not found... declaring"

 
            taskParams = {'name' : self.taskName,
                          'globalSandbox' : '/etc/redhat-release' }
            
            self.task = Task( taskParams )
            print self.task
            
            parameters = {'executable' : '/bin/echo',
                          'arguments' : 'ciao',
                          'standardError' : 'err.txt',
                          'standardOutput' : 'out.txt',
                          'outputFiles' : ['out.txt']}
    #                      'outputFiles' : ['err.txt', 'out.txt', '.BrokerInfo']}
            jobs = []
            for jobId in range(1, 51):
                parameters['name'] = 'job' + str(jobId)
                job = Job(parameters)
                self.bossSession.getNewRunningInstance(job)
                jobs.append(job)
    
            parameters['arguments'] = 'ciao2'
            for jobId in range(51, 101):
                parameters['name'] = 'job' + str(jobId)
                job = Job(parameters)
                self.bossSession.getNewRunningInstance(job)
                jobs.append(job)

            self.task.addJobs(jobs)
            self.bossSession.saveTask( self.task )
    
            for job in self.task.jobs :
                print job['jobId'], job['taskId'], job['submissionNumber'],
                if job.runningJob is not None :
                    print job.runningJob['jobId'], \
                          job.runningJob['taskId'], \
                          job.runningJob['submission']
    
        return self.task