Esempio n. 1
0
 class FactoryMock(object):
     def __init__(self, fcl, am):
         self.fcl = fcl
         self.mcl = Config()
         self.mcl.add_section('MockMonitor')
         self.mcl.set('MockMonitor','monitorURL','')
         self.threadsregistry = ThreadsRegistry()
         self.authmanager = am
Esempio n. 2
0
def getMockFactoryConfig():
    cp = Config()
    cp.add_section('Factory')
    cp.set('Factory', 'batchstatus.condor.maxage', '60' )
    cp.set('Factory', 'batchstatus.condor.sleep', '30' )
    cp.set('Factory', 'factoryUser', 'autopyfactory' )
    cp.set('Factory', 'factoryId', 'dummy-mock' )

    return cp
Esempio n. 3
0
class AgisCEQueue(object):
    """
    Represents a single CE queue within a Panda queue description.  
    """
    def __init__(self, parent, cedict):
        self.log = logging.getLogger('autopyfactory.config')
        self.parent = parent
        self.panda_queue_name = parent.panda_queue_name 
        self.ce_name = cedict['ce_name']                         # AGLT2-CE-gate04.aglt2.org
        self.ce_endpoint = cedict['ce_endpoint']                 # gate04.aglt2.org:2119
        self.ce_host = self.ce_endpoint.split(":")[0]
        self.ce_state = cedict['ce_state'].lower()               # 'active'
        self.ce_status = cedict['ce_status'].lower()             # 
        self.ce_queue_status = cedict['ce_queue_status'].lower()
        self.ce_flavour = cedict['ce_flavour'].lower()           # GLOBUS
        self.ce_version = cedict['ce_version'].lower()           # GT5
        self.ce_queue_name = cedict['ce_queue_name']             # default
        self.ce_jobmanager = cedict['ce_jobmanager'].lower()     # condor
        self.ce_queue_maxcputime = cedict['ce_queue_maxcputime'] # in seconds
        self.ce_queue_maxwctime = cedict['ce_queue_maxwctime']   # in seconds
        
        self.apf_scale_factor = 1.0
        
        # Empty/default attributes:
        self.gridresource = None
        self.submitplugin = None
        self.submitpluginstr = None
        self.gramversion = None
        self.gramqueue = None
        self.creamenv = None
        self.creamattr = ''
        self.condorattr = None
        self.maxmemory = None
        self.maxtime = None

        if self.ce_flavour in ['osg-ce','globus']:
            self._initglobus()
        elif self.ce_flavour == 'htcondor-ce':
            self._initcondorce()
        elif self.ce_flavour == 'cream-ce':
            self._initcream()
        elif self.ce_flavour == 'arc-ce':
            self._initarc()
        elif self.ce_flavour == 'lcg-ce':
            self.log.debug("Ignoring old CE type 'LCG-CE'")
                    
        else:
            self.log.warning("CEQueue %s has unknown ce_flavour: %s" % (self.ce_name, self.ce_flavour))

    def _initcondorce(self):
        self.gridresource = self.ce_endpoint.split(':')[0]
        self.submitplugin = 'CondorOSGCE'
        self.submitpluginstr = 'condorosgce'

    def _initglobus(self):
        self.gridresource = '%s/jobmanager-%s' % (self.ce_endpoint, self.ce_jobmanager)
        if self.ce_version == 'gt2':
            self.submitplugin = 'CondorGT2'
            self.submitpluginstr = 'condorgt2'
        elif self.ce_version == 'gt5':
            self.submitplugin = 'CondorGT5'
            self.submitpluginstr = 'condorgt5'                
            self.gramversion = 'gram5'
            self.gramqueue = self.ce_queue_name

    def _initcream(self):
        self.gridresource = '%s/ce-cream/services/CREAM2 %s %s' % (self.ce_endpoint, 
                                                                       self.ce_jobmanager, 
                                                                       self.ce_queue_name)
        self.submitplugin = 'CondorCREAM'
        self.submitpluginstr = 'condorcream'
        if self.parent.pilot_version not in ['current']:
            self.creamenv = 'RUCIO_ACCOUNT=pilot PILOT_HTTP_SOURCES=%s' % self.parent.pilot_version
        else:
            self.creamenv = 'RUCIO_ACCOUNT=pilot'

        # glue 1.3 uses minutes and this / operator uses floor value
        # https://wiki.italiangrid.it/twiki/bin/view/CREAM/UserGuideEMI2#Forward_of_requirements_to_the_b       
        self.maxtime = self.parent.maxtime / 60
        self.maxmemory = self.parent.maxmemory
        self.cputime = self.parent.corecount * self.maxtime

        # maxrss and maxtime are expected to be set in AGIS for all queues
        if self.parent.corecount:
            self.creamattr = 'CpuNumber=%d;WholeNodes=false;SMPGranularity=%d;' % (self.parent.corecount,
                                                                                   self.parent.corecount)
        if self.parent.corecount:
            cputime = self.parent.corecount * self.maxtime
        else:
            cputime = self.maxtime

        self.creamattr += 'CERequirements = "other.GlueCEPolicyMaxCPUTime == %d ' % cputime
        self.creamattr += '&& other.GlueCEPolicyMaxWallClockTime == %d ' % self.maxtime
        self.creamattr += '&& other.GlueHostMainMemoryRAMSize == %d' % self.parent.maxrss
        if self.parent.maxswap:
            maxvirtual = self.parent.maxrss + self.parent.maxswap
            self.creamattr += ' && other.GlueHostMainMemoryVirtualSize == %d";' % maxvirtual
        else:
            self.creamattr += '";'

    def _initarc(self):
        # ignore :port part
        self.gridresource = self.ce_endpoint.split(':')[0]
        self.submitplugin = 'CondorNordugrid'
        self.submitpluginstr = 'condornordugrid'

        self.maxmemory = self.parent.maxmemory
####        self.maxtime = self.ce_queue_maxwctime
        self.maxtime = self.parent.maxtime
        
        self.nordugridrsl = '(jobname = arc_pilot)'
        self.rsladd = '(runtimeenvironment = APPS/HEP/ATLAS-SITE-LCG)(runtimeenvironment = ENV/PROXY)'
        self.rsladd += '(count = %d)' % self.parent.corecount
        self.rsladd += '(countpernode = %d)' % self.parent.corecount
        if self.parent.maxrss:
            percore = self.parent.maxrss/self.parent.corecount
            self.rsladd += '(memory = %d)' % percore
        else:
            percore = self.parent.maxmemory/self.parent.corecount
            self.rsladd += '(memory = %d)' % percore

        if self.maxtime:
            self.rsladd += '(walltime = %d)' % self.maxtime
            
        if self.maxtime:
            self.rsladd += '(cputime = %d)' % (self.maxtime * self.parent.corecount)    
            
    def getAPFConfigString(self):
        """
        Returns string of valid APF configuration for this queue-ce entry.
        Calculates scale factor based on how many other CEs serve this PQ
          
        """
        cp = self.getAPFConfig()
        sio = StringIO()
        s = cp.write(sio)
        return sio.getvalue()
    
    
    def getAPFConfig(self):
        """
        Returns ConfigParser object representing config
        
        """
        self.cp = Config()
        sect = '%s-%s' % ( self.parent.panda_resource, self.ce_host )
        sect = str(sect)
        self.cp.add_section(sect)      
        # Unconditional config
        self.cp.set( sect, 'enabled', 'True')
        self.cp.set( sect, 'batchqueue', self.panda_queue_name)
        self.cp.set( sect, 'wmsqueue', self.parent.panda_resource )
        self.cp.set( sect, 'batchsubmitplugin', self.submitplugin )
        self.cp.set( sect, 'batchsubmit.%s.gridresource' % self.submitpluginstr , self.gridresource )
        #if self.parent.type == 'analysis':
        #    self.cp.set( sect, 'executable.arguments' , '%(executable.defaultarguments)s -u user'  )
        #else:
        #    self.cp.set( sect, 'executable.arguments' , '%(executable.defaultarguments)s -u managed'  )
        
        try:       
            self.apf_scale_factor = ((( 1.0 / float(self.parent.parent.numfactories) ) / len(self.parent.ce_queues) ) / float(self.parent.parent.jobsperpilot) ) 
        except ZeroDivisionError:
            self.log.error("Division by zero. Something wrong with scale factory calc.")
            self.apf_scale_factor = 1.0
        self.cp.set( sect, 'sched.scale.factor', str(self.apf_scale_factor) )
        
        #HTCondor CE
        if self.ce_flavour == 'htcondor-ce':
            pr = 'periodic_remove = (JobStatus == 2 && (CurrentTime - EnteredCurrentStatus) > 604800)'
            self.cp.set( sect, 'batchsubmit.condorosgce.condor_attributes', pr )          
            if self.parent.maxrss is not None:
                self.cp.set( sect, 'batchsubmit.condorosgce.condor_attributes.+maxMemory', str(self.parent.maxrss) )
            else:
                self.cp.set( sect, 'batchsubmit.condorosgce.condor_attributes.+maxMemory', str(self.parent.maxmemory) )

            self.cp.set( sect, 'batchsubmit.condorosgce.condor_attributes.+xcount', str(self.parent.corecount) )
            self.cp.set( sect, 'batchsubmit.condorosgce.condor_attributes.+voactivity', '"%s"' % self.parent.type )
            if self.ce_queue_name not in ['default','']:
                self.cp.set( sect, 'batchsubmit.condorosgce.condor_attributes.+remote_queue', '"%s"' % self.ce_queue_name)
            if self.ce_queue_maxwctime:
                self.cp.set( sect, 'batchsubmit.condorosgce.condor_attributes.+maxWallTime', '%s' % self.ce_queue_maxwctime)

        # Globus
        if self.ce_flavour in ['osg-ce','globus']:
            self.cp.set( sect, 'globusrsl.%s.queue' % self.gramversion, self.gramqueue )
              
        # Cream-specific JDL
        if self.ce_flavour == 'cream-ce':
            self.cp.set( sect, 'batchsubmit.condorcream.environ', self.creamenv )
            if self.creamattr is not None:
                self.cp.set(sect, 'creamattr', self.creamattr)
                self.cp.set(sect, 'batchsubmit.condorcream.condor_attributes' , '%(req)s,%(hold)s,%(remove)s,cream_attributes = %(creamattr)s,notification=Never' )      
            else:
                self.cp.set(sect, 'batchsubmit.condorcream.condor_attributes' , '%(req)s,%(hold)s,%(remove)s,notification=Never' )

        # Arc-CE
        if self.ce_flavour == 'arc-ce':
            pr = 'periodic_remove = (JobStatus == 2 && (CurrentTime - EnteredCurrentStatus) > 604800)'
            pr = '%(req)s,%(hold)s,%(remove)s,notification=Never'
            self.cp.set( sect, 'batchsubmit.condornordugrid.condor_attributes', pr )
            self.cp.set( sect, 'batchsubmit.condornordugrid.condor_attributes.+remote_queue', self.ce_queue_name )
            self.cp.set( sect, 'batchsubmit.condornordugrid.nordugridrsl', self.nordugridrsl )
            self.cp.set( sect, 'nordugridrsl.nordugridrsladd', self.rsladd )
            self.cp.set( sect, 'nordugridrsl.queue', self.ce_queue_name )
            self.cp.set( sect, 'nordugridrsl.addenv.RUCIO_ACCOUNT', 'pilot' )

        return self.cp

    
    def __str__(self):
        s = "AgisCEQueue: "
        s += "PQ=%s " %  self.panda_queue_name
        s += "wmsqueue=%s " % self.parent.panda_resource
        s += "submitplugin=%s " % self.submitplugin
        s += "host=%s " % self.ce_host
        s += "endpoint=%s " %self.ce_endpoint
        s += "gridresource=%s " % self.gridresource
        s += "maxtime=%s " % self.parent.maxtime
        return s
Esempio n. 4
0
        log.setLevel(logging.DEBUG) # Override with command line switches
    if info:
        log.setLevel(logging.INFO) # Override with command line switches
    log.debug("Logging initialized.")      
    
    fconfig=Config()
    if fconfig_file is not None:
        fconfig_file = os.path.expanduser(fconfig_file)
        got_config = fconfig.read(fconfig_file)
        log.debug("Read config file %s, return value: %s" % (fconfig_file, got_config))  
    else:
        # Create valid config...
        fconfig.add_section('Factory')

        # Set unconditional defaults
        fconfig.set('Factory', 'config.queues.agis.baseurl', 'http://atlas-agis-api.cern.ch/request/pandaqueue/query/list/?json&preset=schedconf.all'   )
        fconfig.set('Factory', 'config.queues.agis.sleep', '3600'  )
        fconfig.set('Factory', 'config.queues.agis.jobsperpilot', '1.5' )
        fconfig.set('Factory', 'config.queues.agis.numfactories', '4')
        
        """
        config.queues.agis.vos = atlas
        config.queues.agis.clouds = US
        config.queues.agis.activities = analysis,production
        config.queues.agis.defaultsfiles = /etc/autopyfactory/agisdefaults.conf
        """

    # Override defaults with command line values, if given    
    if vo is not None:
        fconfig.set('Factory', 'config.queues.agis.vos', vo)
    if cloud is not None:
Esempio n. 5
0
        log.setLevel(logging.INFO)  # Override with command line switches
    log.debug("Logging initialized.")

    fconfig = Config()
    if fconfig_file is not None:
        fconfig_file = os.path.expanduser(fconfig_file)
        got_config = fconfig.read(fconfig_file)
        log.debug("Read config file %s, return value: %s" %
                  (fconfig_file, got_config))
    else:
        # Create valid config...
        fconfig.add_section('Factory')

        # Set unconditional defaults
        fconfig.set(
            'Factory', 'config.queues.agis.baseurl',
            'http://atlas-agis-api.cern.ch/request/pandaqueue/query/list/?json&preset=schedconf.all'
        )
        fconfig.set('Factory', 'config.queues.agis.sleep', '3600')
        fconfig.set('Factory', 'config.queues.agis.jobsperpilot', '1.5')
        fconfig.set('Factory', 'config.queues.agis.numfactories', '4')
        """
        config.queues.agis.vos = atlas
        config.queues.agis.clouds = US
        config.queues.agis.activities = analysis,production
        config.queues.agis.defaultsfiles = /etc/autopyfactory/agisdefaults.conf
        """

    # Override defaults with command line values, if given
    if vo is not None:
        fconfig.set('Factory', 'config.queues.agis.vos', vo)
    if cloud is not None:
Esempio n. 6
0
def getMockQueueConfig():
    cp = Config()
    cp.add_section('mock')
    cp.set('mock','batchstatusplugin', 'Condor')
    cp.set('mock','batchstatus.condor.queryargs', 'None')
    return cp
Esempio n. 7
0
def getMockQueueConfig():
    cp = Config()
    cp.add_section('mock')
    cp.set('mock', 'batchstatusplugin', 'Condor')
    cp.set('mock', 'batchstatus.condor.queryargs', 'None')
    return cp
Esempio n. 8
0
class AgisCEQueue(object):
    """
    Represents a single CE queue within a Panda queue description.  
    """
    def __init__(self, parent, cedict):
        self.log = logging.getLogger('autopyfactory.config')
        self.parent = parent
        self.panda_queue_name = parent.panda_queue_name
        self.ce_name = cedict['ce_name']  # AGLT2-CE-gate04.aglt2.org
        self.ce_endpoint = cedict['ce_endpoint']  # gate04.aglt2.org:2119
        self.ce_host = self.ce_endpoint.split(":")[0]
        self.ce_state = cedict['ce_state'].lower()  # 'active'
        self.ce_status = cedict['ce_status'].lower()  #
        self.ce_queue_status = cedict['ce_queue_status'].lower()
        self.ce_flavour = cedict['ce_flavour'].lower()  # GLOBUS
        self.ce_version = cedict['ce_version'].lower()  # GT5
        self.ce_queue_name = cedict['ce_queue_name']  # default
        self.ce_jobmanager = cedict['ce_jobmanager'].lower()  # condor
        self.ce_queue_maxcputime = cedict['ce_queue_maxcputime']  # in seconds
        self.ce_queue_maxwctime = cedict['ce_queue_maxwctime']  # in seconds

        self.apf_scale_factor = 1.0

        # Empty/default attributes:
        self.gridresource = None
        self.submitplugin = None
        self.submitpluginstr = None
        self.gramversion = None
        self.gramqueue = None
        self.creamenv = None
        self.creamattr = ''
        self.condorattr = None
        self.maxmemory = None
        self.maxtime = None

        if self.ce_flavour in ['osg-ce', 'globus']:
            self._initglobus()
        elif self.ce_flavour == 'htcondor-ce':
            self._initcondorce()
        elif self.ce_flavour == 'cream-ce':
            self._initcream()
        elif self.ce_flavour == 'arc-ce':
            self._initarc()
        elif self.ce_flavour == 'lcg-ce':
            self.log.debug("Ignoring old CE type 'LCG-CE'")

        else:
            self.log.warning("CEQueue %s has unknown ce_flavour: %s" %
                             (self.ce_name, self.ce_flavour))

    def _initcondorce(self):
        self.gridresource = self.ce_endpoint.split(':')[0]
        self.submitplugin = 'CondorOSGCE'
        self.submitpluginstr = 'condorosgce'

    def _initglobus(self):
        self.gridresource = '%s/jobmanager-%s' % (self.ce_endpoint,
                                                  self.ce_jobmanager)
        if self.ce_version == 'gt2':
            self.submitplugin = 'CondorGT2'
            self.submitpluginstr = 'condorgt2'
        elif self.ce_version == 'gt5':
            self.submitplugin = 'CondorGT5'
            self.submitpluginstr = 'condorgt5'
            self.gramversion = 'gram5'
            self.gramqueue = self.ce_queue_name

    def _initcream(self):
        self.gridresource = '%s/ce-cream/services/CREAM2 %s %s' % (
            self.ce_endpoint, self.ce_jobmanager, self.ce_queue_name)
        self.submitplugin = 'CondorCREAM'
        self.submitpluginstr = 'condorcream'
        if self.parent.pilot_version not in ['current']:
            self.creamenv = 'RUCIO_ACCOUNT=pilot PILOT_HTTP_SOURCES=%s' % self.parent.pilot_version
        else:
            self.creamenv = 'RUCIO_ACCOUNT=pilot'

        # glue 1.3 uses minutes and this / operator uses floor value
        # https://wiki.italiangrid.it/twiki/bin/view/CREAM/UserGuideEMI2#Forward_of_requirements_to_the_b
        self.maxtime = self.parent.maxtime / 60
        self.maxmemory = self.parent.maxmemory
        self.cputime = self.parent.corecount * self.maxtime

        # maxrss and maxtime are expected to be set in AGIS for all queues
        if self.parent.corecount:
            self.creamattr = 'CpuNumber=%d;WholeNodes=false;SMPGranularity=%d;' % (
                self.parent.corecount, self.parent.corecount)
        if self.parent.corecount:
            cputime = self.parent.corecount * self.maxtime
        else:
            cputime = self.maxtime

        self.creamattr += 'CERequirements = "other.GlueCEPolicyMaxCPUTime == %d ' % cputime
        self.creamattr += '&& other.GlueCEPolicyMaxWallClockTime == %d ' % self.maxtime
        self.creamattr += '&& other.GlueHostMainMemoryRAMSize == %d' % self.parent.maxrss
        if self.parent.maxswap:
            maxvirtual = self.parent.maxrss + self.parent.maxswap
            self.creamattr += ' && other.GlueHostMainMemoryVirtualSize == %d";' % maxvirtual
        else:
            self.creamattr += '";'

    def _initarc(self):
        # ignore :port part
        self.gridresource = self.ce_endpoint.split(':')[0]
        self.submitplugin = 'CondorNordugrid'
        self.submitpluginstr = 'condornordugrid'

        self.maxmemory = self.parent.maxmemory
        ####        self.maxtime = self.ce_queue_maxwctime
        self.maxtime = self.parent.maxtime

        self.nordugridrsl = '(jobname = arc_pilot)'
        self.rsladd = '(runtimeenvironment = APPS/HEP/ATLAS-SITE-LCG)(runtimeenvironment = ENV/PROXY)'
        self.rsladd += '(count = %d)' % self.parent.corecount
        self.rsladd += '(countpernode = %d)' % self.parent.corecount
        if self.parent.maxrss:
            percore = self.parent.maxrss / self.parent.corecount
            self.rsladd += '(memory = %d)' % percore
        else:
            percore = self.parent.maxmemory / self.parent.corecount
            self.rsladd += '(memory = %d)' % percore

        if self.maxtime:
            self.rsladd += '(walltime = %d)' % self.maxtime

        if self.maxtime:
            self.rsladd += '(cputime = %d)' % (self.maxtime *
                                               self.parent.corecount)

    def getAPFConfigString(self):
        """
        Returns string of valid APF configuration for this queue-ce entry.
        Calculates scale factor based on how many other CEs serve this PQ
          
        """
        cp = self.getAPFConfig()
        sio = StringIO()
        s = cp.write(sio)
        return sio.getvalue()

    def getAPFConfig(self):
        """
        Returns ConfigParser object representing config
        
        """
        self.cp = Config()
        sect = '%s-%s' % (self.parent.panda_resource, self.ce_host)
        sect = str(sect)
        self.cp.add_section(sect)
        # Unconditional config
        self.cp.set(sect, 'enabled', 'True')
        self.cp.set(sect, 'batchqueue', self.panda_queue_name)
        self.cp.set(sect, 'wmsqueue', self.parent.panda_resource)
        self.cp.set(sect, 'batchsubmitplugin', self.submitplugin)
        self.cp.set(sect, 'batchsubmit.%s.gridresource' % self.submitpluginstr,
                    self.gridresource)
        #if self.parent.type == 'analysis':
        #    self.cp.set( sect, 'executable.arguments' , '%(executable.defaultarguments)s -u user'  )
        #else:
        #    self.cp.set( sect, 'executable.arguments' , '%(executable.defaultarguments)s -u managed'  )

        try:
            self.apf_scale_factor = (
                ((1.0 / float(self.parent.parent.numfactories)) /
                 len(self.parent.ce_queues)) /
                float(self.parent.parent.jobsperpilot))
        except ZeroDivisionError:
            self.log.error(
                "Division by zero. Something wrong with scale factory calc.")
            self.apf_scale_factor = 1.0
        self.cp.set(sect, 'sched.scale.factor', str(self.apf_scale_factor))

        #HTCondor CE
        if self.ce_flavour == 'htcondor-ce':
            if self.parent.maxrss is not None:
                self.cp.set(
                    sect,
                    'batchsubmit.condorosgce.condor_attributes.+maxMemory',
                    str(self.parent.maxrss))
            else:
                self.cp.set(
                    sect,
                    'batchsubmit.condorosgce.condor_attributes.+maxMemory',
                    str(self.parent.maxmemory))

            self.cp.set(sect,
                        'batchsubmit.condorosgce.condor_attributes.+xcount',
                        str(self.parent.corecount))
            self.cp.set(
                sect, 'batchsubmit.condorosgce.condor_attributes.+voactivity',
                '"%s"' % self.parent.type)
            if self.ce_queue_name not in ['default', '']:
                self.cp.set(
                    sect,
                    'batchsubmit.condorosgce.condor_attributes.+remote_queue',
                    '"%s"' % self.ce_queue_name)
            if self.ce_queue_maxwctime:
                self.cp.set(
                    sect,
                    'batchsubmit.condorosgce.condor_attributes.+maxWallTime',
                    '%s' % self.ce_queue_maxwctime)

        # Globus
        if self.ce_flavour in ['osg-ce', 'globus']:
            self.cp.set(sect, 'globusrsl.%s.queue' % self.gramversion,
                        self.gramqueue)

        # Cream-specific JDL
        if self.ce_flavour == 'cream-ce':
            self.cp.set(sect, 'batchsubmit.condorcream.environ', self.creamenv)
            if self.creamattr is not None:
                self.cp.set(sect, 'creamattr', self.creamattr)
                self.cp.set(
                    sect, 'batchsubmit.condorcream.condor_attributes',
                    '%(req)s,%(hold)s,%(remove)s,cream_attributes = %(creamattr)s,notification=Never'
                )
            else:
                self.cp.set(sect, 'batchsubmit.condorcream.condor_attributes',
                            '%(req)s,%(hold)s,%(remove)s,notification=Never')

        # Arc-CE
        if self.ce_flavour == 'arc-ce':
            pr = 'periodic_remove = (JobStatus == 2 && (CurrentTime - EnteredCurrentStatus) > 604800)'
            pr = '%(req)s,%(hold)s,%(remove)s,notification=Never'
            self.cp.set(sect, 'batchsubmit.condornordugrid.condor_attributes',
                        pr)
            self.cp.set(
                sect,
                'batchsubmit.condornordugrid.condor_attributes.+remote_queue',
                self.ce_queue_name)
            self.cp.set(sect, 'batchsubmit.condornordugrid.nordugridrsl',
                        self.nordugridrsl)
            self.cp.set(sect, 'nordugridrsl.nordugridrsladd', self.rsladd)
            self.cp.set(sect, 'nordugridrsl.queue', self.ce_queue_name)
            self.cp.set(sect, 'nordugridrsl.addenv.RUCIO_ACCOUNT', 'pilot')

        return self.cp

    def __str__(self):
        s = "AgisCEQueue: "
        s += "PQ=%s " % self.panda_queue_name
        s += "wmsqueue=%s " % self.parent.panda_resource
        s += "submitplugin=%s " % self.submitplugin
        s += "host=%s " % self.ce_host
        s += "endpoint=%s " % self.ce_endpoint
        s += "gridresource=%s " % self.gridresource
        s += "maxtime=%s " % self.parent.maxtime
        return s