Author: tmckay
Date: 2012-09-07 16:02:45 +0000 (Fri, 07 Sep 2012)
New Revision: 5459
Modified:
branches/tmckay/cumin/python/cumin/grid/job.py
Log:
Improve some error handling when remote ops generate exceptions.
This should eliminate "Loading..." forever scenarios or unbounded errors.
Modified: branches/tmckay/cumin/python/cumin/grid/job.py
===================================================================
--- branches/tmckay/cumin/python/cumin/grid/job.py 2012-09-06 17:21:28 UTC (rev 5458)
+++ branches/tmckay/cumin/python/cumin/grid/job.py 2012-09-07 16:02:45 UTC (rev 5459)
@@ -24,6 +24,12 @@
strings = StringCatalog(__file__)
log = logging.getLogger("cumin.job")
+class ErrorResult(object):
+ def __init__(self, err):
+ self.status = "Failed"
+ self.error = err
+ self.data = None
+
class SubmissionObjectFrame(ObjectFrame):
def get_submission_sched(self, session, id):
submission = self.get_object(session, id)
@@ -506,17 +512,18 @@
id = self.frame.id.get(session)
submission, sched = self.frame.get_submission_sched(session, id)
job_id = self.frame.job_id.get(session)
- results = self.app.remote.get_job_ad(sched, job_id, submission,
- default={'JobAd': {}})
+ try:
+ results = self.app.remote.get_job_ad(sched, job_id, submission,
+ default={'JobAd': {}})
+ except Exception, e:
+ results = ErrorResult(Exception("Failed to get job ad: exception:
"\
+ "%s" % e))
return results
def check_job_owner(self, session, ad):
error = None
if not session.client_session.check_owner(ad['Owner']):
- class InventError:
- def __init__(self, msg):
- self.args = [msg]
- error = InventError("Logged in user does not own the specified
job")
+ error = Exception("Logged in user does not own the specified job")
return error
def do_get_items(self, session):
@@ -525,19 +532,21 @@
if not ad_list and not error:
ad_list = list()
results = self.get_job_ad(session)
- error = None
if results.error:
error = results.error
elif self.do_check_viewable:
error = self.check_job_owner(session, results.data['JobAd'])
-
- self.qmf_error.set(session, error)
- ads = results.data['JobAd']
- cls = self.app.model.job_meta_data
- ad_list = [self.gen_item(x, ads[x], cls, dtype=self.get_type(ads, x)) \
- for x in ads if not x.startswith("!!")]
+ else:
+ error = None
+ if error:
+ self.qmf_error.set(session, error)
+ else:
+ ads = results.data['JobAd']
+ cls = self.app.model.job_meta_data
+ ad_list = [self.gen_item(x, ads[x],
+ cls, dtype=self.get_type(ads, x)) \
+ for x in ads if not x.startswith("!!")]
self.items.set(session, ad_list)
-
return ad_list, error
def get_desc(self, descriptors, x):
@@ -615,14 +624,22 @@
id = self.frame.id.get(session)
submission, sched = self.frame.get_submission_sched(session, id)
job_id = self.frame.job_id.get(session)
- results = self.app.remote.get_job_ad(sched, job_id, submission,
- default={'JobAd': {}})
+ try:
+ results = self.app.remote.get_job_ad(sched, job_id, submission,
+ default={'JobAd': {}})
+ except Exception, e:
+ results = ErrorResult(Exception("Failed to get job ad: "\
+ "exception: %s" % e))
error = results.error
- self.qmf_error.set(session, error)
- ads = results.data['JobAd']
- cls = self.app.model.job_meta_data
- ad_list = [self.gen_item(x, ads[x], cls, dtype=self.get_type(ads, x)) \
- for x in ads if not x.startswith("!!") and x in
self.app.fast_view_attributes]
+ if error:
+ self.qmf_error.set(session, error)
+ else:
+ ads = results.data['JobAd']
+ cls = self.app.model.job_meta_data
+ ad_list = [self.gen_item(x, ads[x], cls,
+ dtype=self.get_type(ads, x)) \
+ for x in ads if not x.startswith("!!") \
+ and x in self.app.fast_view_attributes]
self.items.set(session, ad_list)
return ad_list, error
@@ -1003,12 +1020,17 @@
state, file, start, end = self.get_file_args(session)
if file:
- result = self.app.remote.fetch_job_data(scheduler, job_id, state,
- file, start, end,
- submission,
- default={'Data':
""})
+ try:
+ result = self.app.remote.fetch_job_data(scheduler,
+ job_id, state,
+ file, start, end,
+ submission,
+ default={'Data':
""})
+ except Exception, e:
+ result = ErrorResult(Exception("Failed to get job data: "\
+ "exception: %s" % e))
if result.error:
- return result.status
+ return result.error
return escape_entity(result.data['Data'])
return self.err_msg