def __sendJobToTaskQueue( self, job, classAdJob, siteCandidates, bannedSites ):
    """This method sends jobs to the task queue agent and if candidate sites
       are defined, updates job JDL accordingly.
    """

    reqJDL = classAdJob.get_expression( 'JobRequirements' )
    classAddReq = ClassAd( reqJDL )

    if siteCandidates:
      classAddReq.insertAttributeVectorString( 'Sites', siteCandidates )
    if bannedSites:
      classAddReq.insertAttributeVectorString( 'BannedSites', bannedSites )

    if classAdJob.lookupAttribute( "SubmitPools" ):
      classAddReq.set_expression( 'SubmitPools', classAdJob.get_expression( 'SubmitPools' ) )

    if classAdJob.lookupAttribute( "GridMiddleware" ):
      classAddReq.set_expression( 'GridMiddleware', classAdJob.get_expression( 'GridMiddleware' ) )

    if classAdJob.lookupAttribute( "PilotTypes" ):
      classAddReq.set_expression( 'PilotTypes', classAdJob.get_expression( 'PilotTypes' ) )
    #HAck to migrate old jobs to new ones.
    #DELETE ON 08/09
    else:
      if classAdJob.lookupAttribute( "PilotType" ):
        classAddReq.set_expression( 'PilotTypes', classAdJob.get_expression( 'PilotType' ) )

    if classAdJob.lookupAttribute( "JobType" ):
      jobTypes = [ jt for jt in classAdJob.getListFromExpression( 'JobType' ) if jt ]
      classAddReq.insertAttributeVectorString( 'JobTypes', jobTypes )

    #Required CE's requirements
    gridCEs = [ ce for ce in classAdJob.getListFromExpression( 'GridRequiredCEs' ) if ce ]
    if gridCEs:
      classAddReq.insertAttributeVectorString( 'GridCEs', gridCEs )

    if siteCandidates:
      sites = ','.join( siteCandidates )
      classAdJob.insertAttributeString( "Site", sites )

    reqJDL = classAddReq.asJDL()
    classAdJob.insertAttributeInt( 'JobRequirements', reqJDL )

    jdl = classAdJob.asJDL()
    result = self.jobDB.setJobJDL( job, jdl )
    if not result['OK']:
      return result

    if siteCandidates:
      if len( siteCandidates ) == 1:
        self.log.verbose( 'Individual site candidate for job %s is %s' % ( job, siteCandidates[0] ) )
        self.jobDB.setJobAttribute( job, 'Site', siteCandidates[0] )
      elif bannedSites:
        remainingSites = []
        for site in siteCandidates:
          if not site in bannedSites:
            remainingSites.append( site )
        if remainingSites:
          if len( remainingSites ) == 1:
            self.log.verbose( 'Individual site candidate for job %s is %s' % ( job, remainingSites[0] ) )
            self.jobDB.setJobAttribute( job, 'Site', remainingSites[0] )
          else:
            self.log.verbose( 'Site candidates for job %s are %s' % ( job, str( remainingSites ) ) )
            result = self.jobDB.getJobAttribute(job,'Site')
            siteGroup = "Multiple"  
            if result['OK']:
              if result['Value'].startswith('Group'):
                siteGroup = result['Value']              
            self.jobDB.setJobAttribute( job, 'Site', siteGroup )
      else:
        self.log.verbose( 'Site candidates for job %s are %s' % ( job, str( siteCandidates ) ) )
        result = self.jobDB.getJobAttribute(job,'Site')
        siteGroup = "Multiple"  
        if result['OK']:
          if result['Value'].startswith('Group'):
            siteGroup = result['Value']              
        self.jobDB.setJobAttribute( job, 'Site', siteGroup )
    else:
      self.log.verbose( 'All sites are eligible for job %s' % job )
      self.jobDB.setJobAttribute( job, 'Site', 'ANY' )

    return self.setNextOptimizer( job )
Exemplo n.º 2
0
    def __sendJobToTaskQueue(self, job, classAdJob, siteCandidates,
                             bannedSites):
        """This method sends jobs to the task queue agent and if candidate sites
       are defined, updates job JDL accordingly.
    """

        reqJDL = classAdJob.get_expression('JobRequirements')
        classAddReq = ClassAd(reqJDL)

        if siteCandidates:
            classAddReq.insertAttributeVectorString('Sites', siteCandidates)
        if bannedSites:
            classAddReq.insertAttributeVectorString('BannedSites', bannedSites)

        if classAdJob.lookupAttribute("SubmitPools"):
            classAddReq.set_expression(
                'SubmitPools', classAdJob.get_expression('SubmitPools'))

        if classAdJob.lookupAttribute("GridMiddleware"):
            classAddReq.set_expression(
                'GridMiddleware', classAdJob.get_expression('GridMiddleware'))

        if classAdJob.lookupAttribute("PilotTypes"):
            classAddReq.set_expression('PilotTypes',
                                       classAdJob.get_expression('PilotTypes'))
        #HAck to migrate old jobs to new ones.
        #DELETE ON 08/09
        else:
            if classAdJob.lookupAttribute("PilotType"):
                classAddReq.set_expression(
                    'PilotTypes', classAdJob.get_expression('PilotType'))

        if classAdJob.lookupAttribute("JobType"):
            jobTypes = [
                jt for jt in classAdJob.getListFromExpression('JobType') if jt
            ]
            classAddReq.insertAttributeVectorString('JobTypes', jobTypes)

        #Required CE's requirements
        gridCEs = [
            ce for ce in classAdJob.getListFromExpression('GridRequiredCEs')
            if ce
        ]
        if gridCEs:
            classAddReq.insertAttributeVectorString('GridCEs', gridCEs)

        if siteCandidates:
            sites = ','.join(siteCandidates)
            classAdJob.insertAttributeString("Site", sites)

        reqJDL = classAddReq.asJDL()
        classAdJob.insertAttributeInt('JobRequirements', reqJDL)

        jdl = classAdJob.asJDL()
        result = self.jobDB.setJobJDL(job, jdl)
        if not result['OK']:
            return result

        if siteCandidates:
            if len(siteCandidates) == 1:
                self.log.verbose('Individual site candidate for job %s is %s' %
                                 (job, siteCandidates[0]))
                self.jobDB.setJobAttribute(job, 'Site', siteCandidates[0])
            elif bannedSites:
                remainingSites = []
                for site in siteCandidates:
                    if not site in bannedSites:
                        remainingSites.append(site)
                if remainingSites:
                    if len(remainingSites) == 1:
                        self.log.verbose(
                            'Individual site candidate for job %s is %s' %
                            (job, remainingSites[0]))
                        self.jobDB.setJobAttribute(job, 'Site',
                                                   remainingSites[0])
                    else:
                        self.log.verbose('Site candidates for job %s are %s' %
                                         (job, str(remainingSites)))
                        result = self.jobDB.getJobAttribute(job, 'Site')
                        siteGroup = "Multiple"
                        if result['OK']:
                            if result['Value'].startswith('Group'):
                                siteGroup = result['Value']
                        self.jobDB.setJobAttribute(job, 'Site', siteGroup)
            else:
                self.log.verbose('Site candidates for job %s are %s' %
                                 (job, str(siteCandidates)))
                result = self.jobDB.getJobAttribute(job, 'Site')
                siteGroup = "Multiple"
                if result['OK']:
                    if result['Value'].startswith('Group'):
                        siteGroup = result['Value']
                self.jobDB.setJobAttribute(job, 'Site', siteGroup)
        else:
            self.log.verbose('All sites are eligible for job %s' % job)
            self.jobDB.setJobAttribute(job, 'Site', 'ANY')

        return self.setNextOptimizer(job)