Author: eallen
Date: 2008-09-22 15:49:59 -0400 (Mon, 22 Sep 2008)
New Revision: 2528
Modified:
mgmt/trunk/cumin/python/cumin/job.py
mgmt/trunk/cumin/python/cumin/job.strings
Log:
GetAd call now returns nested dictionaries with type info.
Modified: mgmt/trunk/cumin/python/cumin/job.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/job.py 2008-09-22 19:48:51 UTC (rev 2527)
+++ mgmt/trunk/cumin/python/cumin/job.py 2008-09-22 19:49:59 UTC (rev 2528)
@@ -24,46 +24,55 @@
self.add_column(self.ids)
col = self.GlobalJobIdColumn(app, "global_job_id")
- self.add_hidden_column(col)
+ self.add_column(col)
self.set_default_column(col)
col = self.CustomIdColumn(app, "custom_id")
- self.add_hidden_column(col)
+ self.add_column(col)
col = self.CommandColumn(app, "cmd")
- self.add_hidden_column(col)
+ self.add_column(col)
col = self.AccountingGroupColumn(app, "agroup")
- self.add_hidden_column(col)
+ col.visible = False
+ self.add_column(col)
col = self.SchedulerColumn(app, "scheduler")
- self.add_hidden_column(col)
+ col.visible = False
+ self.add_column(col)
col = self.SubmitterColumn(app, "submitter")
- self.add_hidden_column(col)
+ col.visible = False
+ self.add_column(col)
col = self.ClusterIdColumn(app, "cluster_id")
col.alignment = "right"
- self.add_hidden_column(col)
+ col.visible = False
+ self.add_column(col)
col = self.ConcurrencyLimitsColumn(app, "concurrency_limits")
- self.add_hidden_column(col)
+ col.visible = False
+ self.add_column(col)
col = self.CustomGroupColumn(app, "custom_group")
- self.add_hidden_column(col)
+ col.visible = False
+ self.add_column(col)
col = self.CustomPriorityColumn(app, "custom_priority")
- self.add_hidden_column(col)
+ col.visible = False
+ self.add_column(col)
col = self.StatusColumn(app, "job_status")
- self.add_hidden_column(col)
+ self.add_column(col)
col = self.TitleColumn(app, "title")
- self.add_hidden_column(col)
+ col.visible = False
+ self.add_column(col)
col = self.ArgsColumn(app, "args")
col.alignment = "right"
- self.add_hidden_column(col)
+ col.visible = False
+ self.add_column(col)
self.phase = JobStatusSwitch(app, "phase")
self.add_child(self.phase)
@@ -136,6 +145,15 @@
def render_title(self, session, data):
return "Submitter"
+ def render_content(self, session, data):
+ submitter = Identifiable(data["submitter_id"])
+ if data["submitter"]:
+ branch = session.branch()
+ self.frame.show_submitter(branch, submitter).show_view(branch)
+ return fmt_olink(branch, submitter, name=data["submitter"])
+ else:
+ return data["scheduler"]
+
class SchedulerColumn(SqlTableColumn):
def render_title(self, session, data):
return "Scheduler"
@@ -182,6 +200,9 @@
def show_scheduler(self, session, sched):
return self.frame.show_scheduler(session, sched)
+ def show_submitter(self, session, submitter):
+ return self.frame.show_submitter(session, submitter)
+
def show_jobs_hold(self, session):
return self.frame.show_jobs_hold(session)
@@ -345,15 +366,9 @@
self.__release = JobReleaseButton(app, "release", self)
self.add_child(self.__release)
- def do_process(self, session, *args):
- self.show_column(session, "global_job_id")
- self.show_column(session, "custom_id")
- self.show_column(session, "cmd")
- self.show_column(session, "scheduler")
- self.show_column(session, "submitter")
- self.show_column(session, "job_status")
- super(JobGroupJobSet, self).do_process(session, *args)
-
+ def get_visible_columns(self, session):
+ return self.get_request_visible_columns(session, ["scheduler",
"submitter"])
+
def render_title(self, session, group):
where_group = "custom_group = '%s'" % group.get_id()
return "Jobs %s" % fmt_count(Job.select(where_group).count())
@@ -428,6 +443,10 @@
def __init__(self, app, name):
super(JobAdsSet, self).__init__(app, name, )
+ self.types = {0: "expression",
+ 1: "integer",
+ 2: "float",
+ 3: "string"}
def get_args(self, session):
return self.frame.get_args(session)
@@ -465,10 +484,11 @@
job_ads = self.get_raw_ads(session, job)
cls = self.app.model.get_class_by_object(job)
+ return [self.gen_item(x, job_ads[x]["VALUE"], cls,
dtype=self.types[job_ads[x]["TYPE"]]) for x in job_ads]
# list of dictionaries
# each disctionary has:
# name:, value:, type: [, error:] [, property:] [,path:]
- return [self.gen_item(x, job_ads[x], cls) for x in job_ads]
+ #return [self.gen_item(x, job_ads[x], cls) for x in job_ads]
#
def gen_item(self, name, value, cls, path=None, dtype=None, error=None, orig=None):
@@ -484,14 +504,9 @@
idict["name"] = name
idict["value"] = value
idict["orig"] = value
- if dtype:
- idict["type"] = dtype
- if dtype == "number":
- nval = convertStr(value)
- if nval:
- idict["value"] = nval
- else:
- idict["type"], idict["value"] = self.get_type(value)
+ idict["type"] = dtype
+ if dtype == "string":
+ idict["value"] = self.strip_string_quotes(value)
if orig:
idict["orig"] = orig
if error:
@@ -504,23 +519,11 @@
idict["path"] = path
return idict
- def get_type(self, value):
+ def strip_string_quotes(self, value):
dvalue = value
- dtype = "string"
- try:
- if isinstance(value, int) or isinstance(value, float) or isinstance(value,
long):
- dtype = "number"
- elif isinstance(value, basestring):
- if value[:1] == "\"" and value[-1:] ==
"\"":
- dtype = "string"
- dvalue = value[1:-1]
- else:
- dtype = "expression"
- elif value is None:
- dvalue = ""
- except:
- pass
- return dtype, dvalue
+ if value[:1] == "\"" and value[-1:] == "\"":
+ dvalue = value[1:-1]
+ return dvalue
class JobPropertyRenderer(TemplateRenderer):
def render_title(self, session, item):
@@ -653,19 +656,28 @@
ads[field]["value"] = ""
fval = ""
ftype = ads[field]["type"]
- if ftype == "number":
- fval = convertStr(fval)
- if fval is None:
- ads[field]["error"] = "Numeric value expected"
+ if ftype == "integer":
+ try:
+ fval = int(fval)
+ except:
+ ads[field]["error"] = "Integer value expected"
errors = True
+ elif ftype == "float":
+ try:
+ fval = float(fval)
+ except:
+ ads[field]["error"] = "Floating point value
expected"
+ errors = True
elif ftype == "string":
fval = "\"%s\"" % fval
else:
fval = unicode(fval)
if "orig" in ads[field]:
orig = ads[field]["orig"]
- if ftype == "number":
- orig = convertStr(orig)
+ if ftype == "integer":
+ orig = int(orig)
+ elif ftype == "float":
+ orig = float(orig)
if fval != orig:
just_ads[unicode(field)] = fval
@@ -721,16 +733,16 @@
items = self.ads.get_raw_ads(session, job)
out_file = err_file = user_file = None
if "Out" in items:
- out_file = items["Out"]
+ out_file = items["Out"]["VALUE"]
if "Err" in items:
- err_file = items["Err"]
+ err_file = items["Err"]["VALUE"]
if "UserLog" in items:
- user_file = items["UserLog"]
+ user_file = items["UserLog"]["VALUE"]
# strip any double quotes surrounding file names
- dtype, out_file = self.ads.get_type(out_file)
- dtype, err_file = self.ads.get_type(err_file)
- dtype, user_file = self.ads.get_type(user_file)
+ out_file = self.ads.strip_string_quotes(out_file)
+ err_file = self.ads.strip_string_quotes(err_file)
+ user_file = self.ads.strip_string_quotes(user_file)
# remember the file names so we don't need to reget them
self.out_file.set(session, out_file)
@@ -784,10 +796,8 @@
return raw[:-lindex]
first_last = self.first_last.get(session)
- start = 0
- end = 2048
- #start = first_last == "t" and -10240 or 0
- #end = first_last == "t" and 0 or 10240
+ start = first_last == "t" and -2048 or 0
+ end = first_last == "t" and 0 or 2048
file = self.which_file.get_current_file_name(session)
if file:
try:
@@ -1019,16 +1029,9 @@
self.__release = JobReleaseButton(app, "release", self)
self.add_child(self.__release)
- def do_process(self, session, *args):
- self.show_column(session, "global_job_id")
- self.show_column(session, "custom_id")
- self.show_column(session, "cmd")
- self.show_column(session, "custom_group")
- self.show_column(session, "scheduler")
- self.show_column(session, "submitter")
- self.show_column(session, "job_status")
- super(JobTab, self).do_process(session, *args)
-
+ def get_visible_columns(self, session):
+ return self.get_request_visible_columns(session, ["custom_group",
"scheduler", "submitter"])
+
def render_sql_where(self, session, *args):
phase_sql = self.get_phase_sql(session)
return "where %s" % phase_sql
@@ -1131,7 +1134,7 @@
def get_reason(self, session, verb):
""" returns <verb> by username[: <user input reason>]
"""
reason = [self.reason.get(session)]
- verb_by = "%s by %s" % (verb,
session.credentials.get("name"))
+ verb_by = "%s by %s" % (verb, session.user_session.subject.name)
reason.insert(0, verb_by)
return ": ".join(reason)
Modified: mgmt/trunk/cumin/python/cumin/job.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/job.strings 2008-09-22 19:48:51 UTC (rev 2527)
+++ mgmt/trunk/cumin/python/cumin/job.strings 2008-09-22 19:49:59 UTC (rev 2528)
@@ -10,16 +10,19 @@
j.custom_priority,
j.job_status,
j.global_job_id,
- j.owner as submitter,
j.title,
s.name as scheduler,
+ b.name as submitter,
j.scheduler_id,
+ j.submitter_id,
j.cmd
from job as j
left outer join job_stats as c on c.id = j.stats_curr_id
left outer join job_stats as p on p.id = j.stats_prev_id
inner join scheduler as s on s.id = j.scheduler_id
+inner join submitter as b on b.id = j.submitter_id
{sql_where}
+{sql_orderby}
{sql_limit}
[JobSet.count_sql]
@@ -28,6 +31,7 @@
left outer join job_stats as c on c.id = j.stats_curr_id
left outer join job_stats as p on p.id = j.stats_prev_id
inner join scheduler as s on s.id = j.scheduler_id
+inner join submitter as b on b.id = j.submitter_id
{sql_where}
[JobTab.html]
@@ -61,6 +65,7 @@
1 as jobs
from job as j
{sql_where}
+{sql_orderby}
{sql_limit}
[JobGroupSet.count_sql]