Ejemplo n.º 1
0
 def submit(self, session=None):
     """
     submits the job on the local server
     @param session: the session used to load infile values
     @type session: Mobyle.Session
     @return: job information as a dictionary
     @rtype: dictionary
     """
     try:
         if isinstance(self.service, Program):
             self.job = MobyleJob( service    = self.service , 
                                   email      = self.email,
                                   session    = session,
                                   workflowID = self.workflowId)
         elif isinstance(self.service, Workflow):
             self.job = WorkflowJob( workflow   = self.service,
                                     email      = self.email,
                                     session    = session,
                                     workflowID = self.workflowId)
         else:
             raise NotImplementedError("No Job can be instanciated for a %s service" % str(self.service.__class__))
         for name, param in self.params.items():
             if param['parameter'].isInfile():
                 if param['src']:
                     param['src'] = DataProvider.get(param['src'])
                     self.job.setValue(name, (param['userName'], None, param['src'], param['srcFileName']))      
                 else:
                     self.job.setValue(name, (param['userName'], param['value'], None, None))      
             else:
                 if param['parameter'].getDataType().getName() == 'MultipleChoice': 
                     from types import StringTypes
                     if isinstance(  param['value'] , StringTypes ):
                         param['value'] = [ param['value'] ]
                 self.job.setValue(name, param['value'])
         # run Job
         self.job.run()
         return {
                 'id': str(self.job.getJobid()),
                 'date':str(time.strftime( "%x  %X", self.job.getDate())),
                 'status': str( self.job.getStatus() ),
                 }
     except UserValueError, e:
         if hasattr(e, 'message') and e.message:
             msg = {'errormsg':str(e.message)}
         else:
             msg = {'errormsg':str(e)}
         if hasattr(self, 'job') and self.job:
             jobId = self.job.getJobid()
             msg['id'] = str(jobId)
         if hasattr(e, 'param') and e.param:
             msg["errorparam"] = e.param.getName()
         if jobId:
             pid_str = str(registry.getJobPID(jobId))
         else:
             pid_str = "none"
         j_log.error("user error in job %s (email %s): %s"% (pid_str, getattr(self,"email","anonymous"),str(e)))
         return msg
Ejemplo n.º 2
0
 def set_value(self, parameter_name, value=None, src=None, srcFileName=None):
     wf_parameter = [p for p in self.workflow.parameters if p.name==parameter_name][0]
     if value is not None:
         log.debug("setting %s parameter value to %s" %(parameter_name, value))
     elif src is not None:
         log.debug("copying %s parameter value from %s/%s" %(parameter_name, src,srcFileName))
     else:
         log.error("no VALUE or SOURCE URL specified for %s parameter." % parameter_name)            
     """ set a parameter value """
     self.parameters[parameter_name] = value
     self.parameters[parameter_name + '.src'] = src
     self.parameters[parameter_name + '.srcFileName'] = srcFileName
     if value and value==wf_parameter.vdef:
         log.debug("setting %s parameter value to default value %s" %(parameter_name, wf_parameter.vdef))
         return            
     # save input value in a file
     # link this file from the JobState xml
     datatype_class = wf_parameter.type.datatype.class_name
     datatype_superclass = wf_parameter.type.datatype.superclass_name
     df = DataTypeFactory()
     if (datatype_superclass in [None,""] ):
         dt = df.newDataType(datatype_class)
     else:
         dt = df.newDataType(datatype_superclass, datatype_class)
     mt = MobyleType(dt)
     p = Parameter(mt, name=parameter_name)
     p._isout = wf_parameter.isout
     if dt.isFile():
         file_name = parameter_name+'.data'
         if src:
             src = DataProvider.get(src)
         file_name, size = mt.toFile( value , self , file_name, src , srcFileName  )
         if not(wf_parameter.isout):
             self.jobState.setInputDataFile(parameter_name, (file_name, size, None))
         else:
             self.jobState.setOutputDataFile(parameter_name, [(file_name, size, None)])
     else:
         if not(wf_parameter.isout):            
             self.jobState.setInputDataValue(parameter_name, value)
         else:
             raise NotImplementedError() # so far Mobyle does not manage non-file outputs
     self.jobState.commit()
Ejemplo n.º 3
0
    def submit(self, session=None):
        """
        submits the job on the remote server
        @param session: the session used to load infile values
        @type session: Mobyle.Session
        @return: job information as a dictionary
        @rtype: dictionary
        """
        endpointUrl = self.endpoint + "/job_submit.py"
        #values = self.request
        for param in [param for param in self.params.values() \
                      if (param.has_key('parameter') \
                          and param['parameter'].isInfile())]:
#            if param['srcFileName'] and not(param['value']):
#                param['value'] = session.getContentData(param['srcFileName'], \
#                                                        forceFull = True)[1]
            if param['srcFileName'] and not(param['value']):
                param['src'] = DataProvider.get(param['src'])
                param['value'] = urllib.urlopen('%s/%s' % (param['src'].getDir(), param['srcFileName'])).read()
                #param['value'] = urllib.urlopen(param['src']+'/'+param['srcFileName']).read()
        requestDict = {}
        if hasattr(self, 'programUrl'):
            requestDict['programName'] = self.programUrl
        else:
            requestDict['workflowUrl'] = self.workflowUrl            
        if self.email:
            requestDict['email'] = self.email
        requestDict['workflowId'] = self.workflowId            
        for name, param in self.params.items():
            requestDict[name] = param['value']
        try:
            response = self._remoteRequest(endpointUrl, requestDict)
        except:
            return {"errormsg":"A communication error happened during the \
                    submission of your job to the remote Portal"}
        return response