# Distributed SAGE # Copyright (C) 2006 Yi Qiang # This program is free software; you can redistribute it and/or# modify it under the terms of the GNU General Public License# as published by the Free Software Foundation; either version 2# of the License, or (at your option) any later version.# This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU General Public License for more details.# You should have received a copy of the GNU General Public License# along with this program; if not, write to the Free Software# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.# This class defines a Job which is to be stored in the JobDatabase. # python importsimport datetime# twisted importsfrom twisted.spread import pb# ZODB importsfrom persistent import Persistentclass Job(pb.Copyable, pb.RemoteCopy, Persistent): """Defines a Job that gets distributed to clients.""" def __init__(self, id=None, name=None, file=None, parent=None, author=None, type='string'): """Creates a new job. Parameters: name -- job name (can be the same for many jobs, let's you cluster jobs) id -- job id (must be unique) file -- job file parent -- sets if the job is a parent job author -- author of the job (not neccesarily unique) type -- the type of the job (file, string, generator) defaults to string """ self.jdict = {} # Job keywords self.jdict['name'] = name self.jdict['id'] = id self.jdict['file'] = file self.jdict['parent'] = parent self.jdict['author'] = author self.jdict['creation_time'] = datetime.datetime.now() self.jdict['finish_time'] = None self.jdict['updated_time'] = datetime.datetime.now() # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # Valid status keywords: # new, completed, incomplete, processing self.jdict['status'] = 'new' # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # self.jdict['children'] = [] self.jdict['type'] = type self.jdict['result'] = None self.jdict['failures'] = 0 self.jdict['killed'] = False def __str__(self): return str(self.jdict) def num_of_children(self): return len(self.jdict['children']) def get_file(self): return self.jdict['file'] def set_file(self, value): if not isinstance(value, str): raise TypeError self.jdict['file'] = value file = property(fget=get_file, fset=set_file, fdel=None, doc='Job file') def get_id(self): return self.jdict['id'] def set_id(self, value): if not isinstance(value, int): raise TypeError self.jdict['id'] = value id = property(fget=get_id, fset=set_id, fdel=None, doc='Job ID') def get_status(self): return self.jdict['status'] def set_status(self, value): statuses = ['new', 'completed', 'incomplete', 'processing'] if not value in statuses: raise TypeError self.jdict['status'] = value status = property(fget=get_status, fset=set_status, fdel=None, doc='Job status') def get_result(self): return self.jdict['result'] def set_result(self, value): if not (isinstance(value, list) or isinstance(value, str)): raise TypeError self.jdict['result'] = value result = property(fget=get_result, fset=set_result, fdel=None, doc='Job result') def get_author(self): return self.jdict['author'] def set_author(self, value): self.jdict['author'] = value author = property(fget=get_author, fset=set_author, fdel=None, doc='Job author') def get_finish_time(self): return self.jdict['finish_time'] def set_finish_time(self, value): if not isinstance(value, datetime.datetime): raise TypeError self.jdict['finish_time'] = value finish_time = property(fget=get_finish_time, fset=set_finish_time, fdel=None, doc='Job finish time') def get_updated_time(self): return self.jdict['updated_time'] def set_updated_time(self, value): if not isinstance(value, datetime.datetime): raise TypeError self.jdict['updated_time'] = value updated_time = property(fget=get_updated_time, fset=set_updated_time, fdel=None, doc='Job updated time') def get_creation_time(self): return self.jdict['creation_time'] def set_creation_time(self, value): if not isinstance(value, datetime.datetime): raise TypeError self.jdict['creation_time'] = value creation_time = property(fget=get_creation_time, fset=set_creation_time, fdel=None, doc='Job creation time') def get_type(self): return self.jdict['type'] def set_type(self, value): types = ['file', 'string', 'generator', 'spyx', 'py'] if value not in types: raise TypeError self.jdict['type'] = value type = property(fget=get_type, fset=set_type, fdel=None, doc='Job type') def get_failures(self): return self.jdict['failures'] def set_failures(self, value): if not isinstance(value, int): raise TypeError self.jdict['failures'] = value failures = property(fget=get_failures, fset=set_failures, fdel=None, doc='Number of failures') def get_killed(self): return self.jdict['killed'] def set_killed(self, value): if not isinstance(value, bool): raise TypeError self.jdict['killed'] = value killed = property(fget=get_killed, fset=set_killed, fdel=None, doc='Job killed status')