Package Jobber :: Module status
[hide private]
[frames] | no frames]

Source Code for Module Jobber.status

  1  from Globals import InitializeClass 
  2  from Products.ZenRelations.RelSchema import * 
  3  from Products.ZenModel.ZenModelRM import ZenModelRM 
  4  import os 
  5  import sys 
  6  import time 
  7  import copy 
  8  import logging 
  9  from zope.interface import implements 
 10  from twisted.internet import defer 
 11  from twisted.spread import pb 
 12  from interfaces import IJobStatus 
 13  from logfile import LogFile 
 14  import tempfile 
 15  import transaction 
 16   
 17  SUCCESS = 0 
 18  FAILURE = 1 
 19   
20 -class JobStatus(ZenModelRM):
21 22 implements(IJobStatus) 23 24 _relations = ( 25 ("jobmanager", 26 ToOne( 27 ToManyCont, "Products.Jobber.manager.JobManager", "jobs" 28 ) 29 ), 30 ("job", 31 ToOne( 32 ToOne, "Products.Jobber.jobs.Job", "status" 33 ) 34 ), 35 ) 36 37 started = None # Start time 38 finished = None # Finish time 39 result = None 40 filename = None 41 properties = None 42
43 - def __init__(self, job):
44 if self.properties is None: 45 self.properties = {} 46 47 self.filename = tempfile.mktemp() 48 transaction.commit() 49 self.finishDeferreds = [] 50 51 id = job.id.replace('_', 'Status_') 52 super(JobStatus, self).__init__(id) 53 54 # Set up references to the job 55 self.addRelation('job', job)
56
57 - def getUid(self):
58 return self.id.split('_')[-1]
59
60 - def getLogFileName(self):
61 try: 62 self._p_jar.sync() 63 except AttributeError: 64 # No database, probably a unit test 65 pass 66 return self.filename
67
68 - def getLog(self):
69 return LogFile(self, self.getLogFileName())
70
71 - def getJob(self):
72 return self.job()
73
74 - def getTimes(self):
75 return (self.started, self.finished)
76
77 - def getDuration(self):
78 if self.isFinished(): 79 return self.finished - self.started
80
81 - def setProperties(self, **props):
82 self.properties.update(props) 83 self._p_changed = True
84
85 - def getProperties(self):
86 return copy.deepcopy(self.properties)
87
88 - def setZProperties(self, **zprops):
89 self.properties.setdefault('zProperties', {}).update(zprops) 90 self._p_changed = True
91
92 - def getResult(self):
93 return self.result
94
95 - def isStarted(self):
96 return (self.started is not None)
97
98 - def isFinished(self):
99 return (self.finished is not None)
100
101 - def waitUntilFinished(self):
102 if self.finished: 103 d = defer.succeed(self) 104 else: 105 d = defer.Deferred() 106 self.finishDeferreds.append(d) 107 return d
108
109 - def jobStarted(self):
110 self.started = time.time()
111
112 - def jobFinished(self, result):
113 """ 114 Called by the Job when it's done. C{result} should be SUCCESS or 115 FAILURE. 116 """ 117 self.finished = time.time() 118 self.result = result 119 # Call back to everything watching this Job 120 for d in self.finishDeferreds: 121 d.callback(self) 122 del self.finishDeferreds
123
124 - def delete(self):
125 # Clean up the log file 126 fn = self.getLogFileName() 127 if fn and os.path.exists(fn): 128 os.remove(fn) 129 # Remove the job status itself 130 parent = self.getPrimaryParent() 131 parent._delObject(self.id)
132 133 134 InitializeClass(JobStatus) 135 136
137 -class JobStatusProxy(pb.Copyable, pb.RemoteCopy):
138 """ 139 Represents a JobStatus object in a daemon. 140 """ 141 id = None 142 _properties = None 143
144 - def __init__(self, jobstatus):
145 self.id = jobstatus.id.split('_')[-1] 146 self._properties = jobstatus.getProperties()
147
148 - def get(self, key, default=None):
149 return self._properties.get(key, default)
150
151 - def __getitem__(self, name):
152 return self._properties[name]
153
154 - def __getattr__(self, attr):
155 return self[attr]
156
157 - def getProperties(self):
158 return copy.deepcopy(self._properties)
159 160 pb.setUnjellyableForClass(JobStatusProxy, JobStatusProxy) 161