def getSubJobs(self): """ gets the list of subjobs (along with their status) @return: subjobs list of dictionaries @rtype: dictionary """ endpointUrl = self.endpoint + "/job_subjobs.py" requestDict = {} requestDict['jobId'] = self.jobId response = self._remoteRequest(endpointUrl, requestDict) rv= [] if response: for job_entry in response: if job_entry.has_key('jobSortDate'): jobDate = time.strptime(job_entry['jobSortDate'],"%Y%m%d%H%M%S") if job_entry.has_key('status'): jobstatus = Status(string=job_entry['status'], message=job_entry.get('status_message')) jobID = job_entry['url'] jobPID = self.server.name + '.' + job_entry['jobID'] serviceName = job_entry['programName'] rv.append({'jobID':jobID, 'jobPID':jobPID, 'userName':jobID, 'programName':serviceName, 'date':jobDate, 'status':jobstatus, 'owner':registry.getJobPID(self.jobId) }) return rv
def create(self, request_fs=None, request_dict=None, session=None): """ create sets up most of the class attributes TODO: check if this could be done in __init__? """ self.request = {} if request_dict: self.request = request_dict elif request_fs: for key in request_fs.keys(): self.request[key] = request_fs.getvalue(key) self.email = self.request.get('email', None) if not(self.email) and session: self.email = session.getEmail() self.parseService() if ( not( self.email ) and not( _cfg.opt_email( self.servicePID ) ) ): return {"emailNeeded":"true"} if (session and not(session.isActivated())): return {"activationNeeded":"true"} self.params = {} self.session = session self._processForm() resp = self.submit(session) if resp.has_key('id'): self.jobId = resp['id'] resp['pid'] = str(registry.getJobPID(resp['id'])) # log the job in the access log if not(resp.has_key('errormsg')): msg = "%s %s %s %s %s" % (self.servicePID, # service PID resp.get('pid','').replace(self.servicePID+'.',''), #job key str(self.email), # user email os.environ.get('REMOTE_HOST',os.environ.get('REMOTE_ADDR','local')), # ip or host os.environ.get('HTTP_X_MOBYLEPORTALNAME','unknown') # client portal ) acc_log.info( msg ) return resp
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 getSubJobs(self): """ gets the list of subjobs (along with their status) @return: subjobs list of dictionaries @rtype: list """ js = JobState(self.jobId) if hasattr(js, 'getSubJobs'): subjobs = js.getSubJobs() subsubjobs = [] for s in subjobs: s['jobPID'] = registry.getJobPID(self.jobId) + '::'+ registry.getJobPID(s['jobID']) child_jf = JobFacade.getFromJobId(s['jobID']) s['status'] = child_jf.getStatus() for ss in child_jf.getSubJobs(): ss['jobPID'] = s['jobPID'] + '::' + registry.getJobPID(ss['jobID']) schild_jf = JobFacade.getFromJobId(ss['jobID']) ss['status'] = schild_jf.getStatus() subsubjobs.append(ss) subjobs.extend(subsubjobs) return subjobs else: return []