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
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()
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