rhmessaging commits: r2385 - in mgmt/trunk/cumin/python: wooly and 1 other directory.
by rhmessaging-commits@lists.jboss.org
Author: eallen
Date: 2008-09-02 16:09:10 -0400 (Tue, 02 Sep 2008)
New Revision: 2385
Modified:
mgmt/trunk/cumin/python/cumin/binding.py
mgmt/trunk/cumin/python/cumin/broker.py
mgmt/trunk/cumin/python/cumin/brokerlink.py
mgmt/trunk/cumin/python/cumin/formats.py
mgmt/trunk/cumin/python/cumin/job.py
mgmt/trunk/cumin/python/cumin/job.strings
mgmt/trunk/cumin/python/cumin/model.py
mgmt/trunk/cumin/python/cumin/page.py
mgmt/trunk/cumin/python/cumin/pool.py
mgmt/trunk/cumin/python/cumin/widgets.py
mgmt/trunk/cumin/python/cumin/widgets.strings
mgmt/trunk/cumin/python/wooly/__init__.py
mgmt/trunk/cumin/python/wooly/forms.py
mgmt/trunk/cumin/python/wooly/parameters.py
mgmt/trunk/cumin/python/wooly/widgets.py
Log:
Added support for JobSet, JobFrame, View Job Ads, Edit Job Ads
Modified: mgmt/trunk/cumin/python/cumin/binding.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/binding.py 2008-09-02 20:03:32 UTC (rev 2384)
+++ mgmt/trunk/cumin/python/cumin/binding.py 2008-09-02 20:09:10 UTC (rev 2385)
@@ -40,13 +40,13 @@
return fmt_shorten(exchange.name)
def render_name_path(self, session, *args):
- return "_".join((self.instance_data, "name"))
+ return DictParameter.sep().join((self.instance_data, "name"))
def render_exchange_type(self, session, exchange):
return exchange.type
def render_exchange_type_path(self, session, exchange):
- return "_".join((self.instance_data, "type"))
+ return DictParameter.sep().join((self.instance_data, "type"))
def render_exchange_id(self, session, exchange):
return exchange.id
@@ -99,7 +99,7 @@
super(BindingKeyExchangeInput, self).__init__(app, name, form)
def render_key_path(self, session, exchange):
- return "_".join((self.instance_data, "key"))
+ return DictParameter.sep().join((self.instance_data, "key"))
def render_key_error(self, session, exchange):
return self.render_list_error(session, exchange)
@@ -115,7 +115,7 @@
super(XMLExchangeInput, self).__init__(app, name, form)
def render_xquery_path(self, session, exchange):
- return "_".join((self.instance_data, "xquery"))
+ return DictParameter.sep().join((self.instance_data, "xquery"))
def render_headers_class(self, session, exchange):
exchange_info = self.get_exchange_info(session, exchange)
@@ -146,10 +146,10 @@
super(HeadersExchangeInput, self).__init__(app, name, form)
def render_x_match_path(self, session, exchange):
- return "_".join((self.instance_data, "x-match"))
+ return DictParameter.sep().join((self.instance_data, "x-match"))
def render_mkey_path(self, session, exchange):
- return "_".join((self.instance_data, "mkey"))
+ return DictParameter.sep().join((self.instance_data, "mkey"))
def render_headers_class(self, session, exchange):
exchange_info = self.get_exchange_info(session, exchange)
Modified: mgmt/trunk/cumin/python/cumin/broker.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/broker.py 2008-09-02 20:03:32 UTC (rev 2384)
+++ mgmt/trunk/cumin/python/cumin/broker.py 2008-09-02 20:09:10 UTC (rev 2385)
@@ -354,13 +354,13 @@
class Properties(CuminProperties):
def do_get_items(self, session, reg):
cls = self.app.model.get_class_by_object(reg)
- props = [(x.get_title(session), x.value(reg))
+ props = [(x.get_title(session), x.value(session, reg))
for x in cls.properties]
if reg.broker:
cls = self.app.model.get_class_by_object(reg.broker)
props.extend([(x.get_title(session),
- x.value(reg.broker))
+ x.value(session, reg.broker))
for x in cls.properties])
return props
Modified: mgmt/trunk/cumin/python/cumin/brokerlink.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/brokerlink.py 2008-09-02 20:03:32 UTC (rev 2384)
+++ mgmt/trunk/cumin/python/cumin/brokerlink.py 2008-09-02 20:09:10 UTC (rev 2385)
@@ -510,10 +510,10 @@
return "Add Broker Link to '%s'" % reg.name
def render_broker_name_path(self, session, *args):
- return "_".join((self.host.path, "name"))
+ return DictParameter.sep().join((self.host.path, "name"))
def render_broker_port_path(self, session, *args):
- return "_".join((self.host.path, "port"))
+ return DictParameter.sep().join((self.host.path, "port"))
def render_broker_name_value(self, session, *args):
host = self.host.get(session)
@@ -526,10 +526,10 @@
return host["port"]
def render_broker_username_path(self, session, *args):
- return "_".join((self.host.path, "username"))
+ return DictParameter.sep().join((self.host.path, "username"))
def render_broker_password_path(self, session, *args):
- return "_".join((self.host.path, "password"))
+ return DictParameter.sep().join((self.host.path, "password"))
def render_broker_username_value(self, session, *args):
host = self.host.get(session)
Modified: mgmt/trunk/cumin/python/cumin/formats.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/formats.py 2008-09-02 20:03:32 UTC (rev 2384)
+++ mgmt/trunk/cumin/python/cumin/formats.py 2008-09-02 20:09:10 UTC (rev 2385)
@@ -119,8 +119,9 @@
def fmt_olink(session, object, selected=False, name=None):
if name is None:
name = getattr(object, "name", fmt_none())
-
- if isinstance(name, basestring):
+ # don't shorten None since it will result in
+ # invalid xml
+ elif isinstance(name, basestring):
name = fmt_shorten(name)
return fmt_link(session.marshal(), name, selected and "selected")
Modified: mgmt/trunk/cumin/python/cumin/job.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/job.py 2008-09-02 20:03:32 UTC (rev 2384)
+++ mgmt/trunk/cumin/python/cumin/job.py 2008-09-02 20:09:10 UTC (rev 2385)
@@ -11,6 +11,9 @@
from parameters import *
from formats import *
from util import *
+#from scheduler import *
+#from submitter import *
+from system import *
strings = StringCatalog(__file__)
log = logging.getLogger("cumin.job")
@@ -19,20 +22,732 @@
def __init__(self, app, name):
super(JobSet, self).__init__(app, name)
- col = self.CommandColumn(app, "name")
- self.add_column(col)
+ self.ids = CheckboxIdColumn(app, "id", self)
+ self.add_column(self.ids)
+ col = self.GlobalJobIdColumn(app, "global_job_id")
+ self.add_hidden_column(col)
self.set_default_column(col)
+
+ col = self.CommandColumn(app, "cmd")
+ self.add_hidden_column(col)
+ col = self.AccountingGroupColumn(app, "agroup")
+ self.add_hidden_column(col)
+
+ #col = self.SubmitterColumn(app, "submitter")
+ #self.add_hidden_column(col)
+
+ #col = self.SchedulerColumn(app, "scheduler")
+ #self.add_hidden_column(col)
+
+ col = self.ClusterIdColumn(app, "cluster_id")
+ col.alignment = "right"
+ self.add_hidden_column(col)
+
+ col = self.ConcurrencyLimitsColumn(app, "concurrency_limits")
+ self.add_hidden_column(col)
+
+ col = self.CustomGroupColumn(app, "custom_group")
+ self.add_hidden_column(col)
+
+ col = self.CustomIdColumn(app, "custom_id")
+ self.add_hidden_column(col)
+
+ col = self.CustomPriorityColumn(app, "custom_priority")
+ self.add_hidden_column(col)
+
+ col = self.StatusColumn(app, "job_status")
+ col.alignment = "right"
+ self.add_hidden_column(col)
+
+ col = self.TitleColumn(app, "title")
+ self.add_hidden_column(col)
+
+ col = self.ArgsColumn(app, "args")
+ col.alignment = "right"
+ self.add_hidden_column(col)
+
def render_title(self, session):
return "Jobs %s" % fmt_count(Job.select().count())
+ class ArgsColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Arguments"
+
+ class ClusterIdColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Cluster Id"
+
+ class ConcurrencyLimitsColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Concurrency Limits"
+
+ class CustomGroupColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Custom Group"
+
+ class CustomIdColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Custom Id"
+
+ class CustomPriorityColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Custom Priority"
+
+ class GlobalJobIdColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Global Job Id"
+
+ def render_content(self, session, data):
+ job = Identifiable(data["id"])
+ branch = session.branch()
+ self.frame.show_job(branch, job).show_view(branch)
+ return fmt_olink(branch, job, name=data[self.name])
+
+ class StatusColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Status"
+
+ def render_content(self, session, data):
+ stat = data["job_status"]
+ return JobStatusInfo.get_status_string(stat)
+
+ class AccountingGroupColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Accounting Group"
+
+# class SubmitterColumn(SqlTableColumn):
+# def render_title(self, session, data):
+# return "Submitter"
+#
+# def render_content(self, session, data):
+# job = Identifiable(data["id"])
+# branch = session.branch()
+# self.frame.show_job(branch, job).show_view(branch)
+# return fmt_olink(branch, job, name=data["submitter"])
+
+# class SchedulerColumn(SqlTableColumn):
+# def render_title(self, session, data):
+# return "Scheduler"
+#
+# def render_content(self, session, data):
+# job = Identifiable(data["id"])
+# branch = session.branch()
+# self.frame.show_job(branch, job).show_view(branch)
+# return fmt_olink(branch, job, name=data["scheduler"])
+
class CommandColumn(SqlTableColumn):
def render_title(self, session, data):
return "Command"
- def render_content(self, session, data):
- job = Identifiable(data["id"])
+ class TitleColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Title"
+
+class JobFrame(CuminFrame):
+ def __init__(self, app, name):
+ super(JobFrame, self).__init__(app, name)
+
+ self.object = JobParameter(app, "id")
+ self.add_parameter(self.object)
+
+ view = JobView(app, "view")
+ self.add_mode(view)
+ self.set_view_mode(view)
+
+ self.__hold = JobHold(app, "jobhold")
+ self.add_mode(self.__hold)
+
+ self.__release = JobRelease(app, "jobrelease")
+ self.add_mode(self.__release)
+
+ self.__remove = JobRemove(app, "jobRemove")
+ self.add_mode(self.__remove)
+
+ self.__edit_ads = JobEditAds(app, "editads")
+ self.add_mode(self.__edit_ads)
+
+ #self.__scheduler = SchedulerFrame(app, "scheduler")
+ #self.add_mode(self.__scheduler)
+
+ #self.__submitter = SubmitterFrame(app, "submitter")
+ #self.add_mode(self.__submitter)
+
+ self.__system = SystemFrame(app, "system")
+ self.add_mode(self.__system)
+
+ def show_ads_edit(self, session):
+ self.page.set_current_frame(session, self.__edit_ads)
+ return self.show_mode(session, self.__edit_ads)
+
+ def show_scheduler(self, session, scheduler):
+ self.__scheduler.set_object(session, scheduler)
+ self.page.set_current_frame(session, self.__scheduler)
+ return self.show_mode(session, self.__scheduler)
+
+ def show_submitter(self, session, submitter):
+ self.__submitter.set_object(session, submitter)
+ self.page.set_current_frame(session, self.__submitter)
+ return self.show_mode(session, self.__submitter)
+
+ def show_job_hold(self, session):
+ self.page.set_current_frame(session, self.__hold)
+ return self.show_mode(session, self.__hold)
+
+ def show_job_release(self, session):
+ self.page.set_current_frame(session, self.__release)
+ return self.show_mode(session, self.__release)
+
+ def show_job_remove(self, session):
+ self.page.set_current_frame(session, self.__remove)
+ return self.show_mode(session, self.__remove)
+
+ def show_system(self, session, system):
+ frame = self.show_mode(session, self.__system)
+ frame.set_object(session, system)
+ return self.page.set_current_frame(session, frame)
+
+
+class JobHold(CuminConfirmForm):
+ def get_args(self, session):
+ return self.frame.get_args(session)
+
+ def render_title(self, session, job):
+ return "Hold Job '%d'" % job.idOriginal
+
+ def process_submit(self, session, job):
+ action = self.app.model.job.hold
+ action.invoke(job)
+
+ self.process_cancel(session, job)
+
+ def render_submit_content(self, session, job):
+ return "Yes, Hold Job '%d'" % job.idOriginal
+
+ def render_cancel_content(self, session, job):
+ return "No, Cancel"
+
+class JobRemove(CuminConfirmForm):
+ def get_args(self, session):
+ return self.frame.get_args(session)
+
+ def render_title(self, session, job):
+ return "Remove Job '%d'" % job.idOriginal
+
+ def process_submit(self, session, job):
+ action = self.app.model.job.remove
+ action.invoke(job)
+
+ self.process_cancel(session, job)
+
+ def render_submit_content(self, session, job):
+ return "Yes, Remove Job '%d'" % job.idOriginal
+
+ def render_cancel_content(self, session, job):
+ return "No, Cancel"
+
+class JobRelease(CuminConfirmForm):
+ def get_args(self, session):
+ return self.frame.get_args(session)
+
+ def render_title(self, session, job):
+ return "Release Job '%d'" % job.idOriginal
+
+ def process_submit(self, session, job):
+ action = self.app.model.job.release
+ action.invoke(job)
+
+ self.process_cancel(session, job)
+
+ def render_submit_content(self, session, job):
+ return "Yes, Release Job '%d'" % job.idOriginal
+
+ def render_cancel_content(self, session, job):
+ return "No, Cancel"
+
+class JobView(CuminView):
+ def __init__(self, app, name):
+ super(JobView, self).__init__(app, name)
+
+ summary = CuminSummary(app, "summary")
+ self.add_child(summary)
+
+ status = JobStatus(app, "status")
+ self.add_child(status)
+
+ self.__tabs = TabbedModeSet(app, "tabs")
+ self.add_child(self.__tabs)
+
+ #self.__tabs.add_tab(JobStats(app, "stats"))
+ self.__tabs.add_tab(JobAds(app, "jobads"))
+ self.__tabs.add_tab(JobOutput(app, "output"))
+ self.__tabs.add_tab(SystemSet(app, "systems"))
+ self.__tabs.add_tab(CuminDetails(app, "details"))
+
+class JobAds(Widget):
+ def __init__(self, app, name):
+ super(JobAds, self).__init__(app, name)
+
+ props = JobAdsViewer(app, "properties")
+ self.add_child(props)
+
+ def get_args(self, session):
+ return self.frame.get_args(session)
+
+ def render_title(self, session, job):
+ return "Ads"
+
+
+class JobEditAds(CuminForm):
+ def __init__(self, app, name):
+ super(JobEditAds, self).__init__(app, name)
+
+ # the parameter that will hold all the field values
+ self.ads = DictParameter(app, "params")
+ self.add_parameter(self.ads)
+ self.add_form_parameter(self.ads)
+
+ # the widget that gets/saves the data and draws the form
+ self.props = JobAdsEditor(app, "properties", self.ads)
+ self.add_child(self.props)
+
+ def get_args(self, session):
+ return self.frame.get_args(session)
+
+ def render_title(self, session, job):
+ return "Ads"
+
+ def process_submit(self, session, job):
+ ads = self.ads.get(session)
+ errors = False
+
+ just_ads = dict()
+ for field in ads:
+ try:
+ fval = ads[field]["value"]
+ except KeyError:
+ ads[field]["value"] = ""
+ fval = ""
+ ftype = ads[field]["type"]
+ if ftype == "number":
+ fval = convertStr(fval)
+ if fval is None:
+ ads[field]["error"] = "Numeric value expected"
+ errors = True
+ just_ads[field] = fval
+
+ if not errors:
+ #action = self.app.model.job.saveads
+ #action.invoke(job, just_ads)
+ self.process_cancel(session, job)
+
+ def process_cancel(self, session, job):
+ self.ads.clear()
+ super(JobEditAds, self).process_cancel(session, job)
+
+class JobAdsSet(PropertySet):
+ def __init__(self, app, name):
+ super(JobAdsSet, self).__init__(app, name)
+# self.got_data = False
+
+ def get_args(self, session):
+ return self.frame.get_args(session)
+
+ def do_get_items(self, session, job):
+
+# def completion(status, args=None):
+# self.got_data = True
+#
+# ads = dict()
+# model = self.app.model
+# job.GetAd(model.data, completion, ads)
+# wait(self.got_data)
+
+ # stolen straight for qpid-tool
+ ads = {u'CondorPlatform': u'$CondorPlatform: I386-LINUX_RHEL5 $',
+ u'KillSig': u'SIGTERM',
+ u'TransferFiles': u'ONEXIT',
+ u'Requirements': u'(Arch == "INTEL") && (OpSys == "LINUX") && (Disk >= DiskUsage) && ((Memory * 1024) >= ImageSize) && ((HasFileTransfer) || (TARGET.FileSystemDomain == MY.FileSystemDomain))',
+ u'ImageSize': 20,
+ u'TargetType': u'Machine',
+ u'OnExitHold': u'FALSE',
+ u'NumCkpts': 0,
+ u'PeriodicRelease': u'FALSE',
+ u'BufferBlockSize': 32768,
+ u'Environment': u'',
+ u'RootDir': u'/',
+ u'JobPrio': 0,
+ u'MinHosts': 1,
+ u'WantCheckpoint': u'FALSE',
+ u'CumulativeSuspensionTime': 0,
+ u'WantRemoteSyscalls': u'FALSE',
+ u'FileSystemDomain': u'mrg2.lab.bos.redhat.com',
+ u'GlobalJobId': u'mrg-test(a)#1219326763#1.0',
+ u'ExitStatus': 0,
+ u'WhenToTransferOutput': u'ON_EXIT',
+ u'CurrentHosts': 0,
+ u'ProcId': 0,
+ u'ImageSize_RAW': 20,
+ u'Iwd': u'/home/remote/mfarrell',
+ u'HoldReasonCode': 15,
+ u'NumSystemHolds': 0,
+ u'PeriodicHold': u'FALSE',
+ u'Args': u'100',
+ u'ClusterId': 1,
+ u'OnExitRemove': u'TRUE',
+ u'RemoteWallClockTime': 0,
+ u'HoldReason': u"submitted on hold at user's request",
+ u'NiceUser': u'FALSE',
+ u'PeriodicRemove': u'FALSE',
+ u'UserLog': u'/home/remote/mfarrell/log.1.0',
+ u'MyType': u'Job',
+ u'WantRemoteIO': u'TRUE',
+ u'LocalUserCpu': 0,
+ u'BufferSize': 524288,
+ u'ScheddBday': 12059630,
+ u'CompletionDate': 0,
+ u'JobLeaseDuration': 1200,
+ u'LastSuspensionTime': 0,
+ u'NumRestarts': 0,
+ u'Err': u'/dev/null',
+ u'QDate': 11367211,
+ u'RemoteSysCpu': 0,
+ u'Cmd': u'/bin/sleep',
+ u'TransferOut': u'FALSE',
+ u'DiskUsage_RAW': 20,
+ u'ExecutableSize': 20,
+ u'Owner': u'mfarrell',
+ u'LeaveJobInQueue': u'FALSE',
+ u'JobStatus': 5,
+ u'ExecutableSize_RAW': 20,
+ u'JobUniverse': 5,
+ u'DiskUsage': 20,
+ u'EnteredCurrentStatus': 11367211,
+ u'TotalSuspensions': 0,
+ u'ShouldTransferFiles': u'IF_NEEDED',
+ u'NumCkpts_RAW': 0,
+ u'MaxHosts': 1,
+ u'CommittedTime': 0,
+ u'In': u'/dev/null',
+ u'CoreSize': 0,
+ u'Rank': 0,
+ u'RemoteUserCpu': 0,
+ u'User': u'mfarrell(a)mrg2.lab.bos.redhat.com',
+ u'LocalSysCpu': 0,
+ u'TransferErr': u'FALSE',
+ u'ExitBySignal': u'FALSE',
+ u'CondorVersion': u'$CondorVersion: 7.0.4 Aug 6 2008 BuildID: RH-7.0.4-4.el5 $',
+ u'TransferIn': u'FALSE',
+ u'JobNotification': 0,
+ u'NumJobStarts': 0,
+ u'Out': u'/dev/null'}
+
+ keys = ads.keys()
+ keys.sort()
+ return [[x, {"value":str(ads[x]),
+ "type":self.get_type(ads[x])}] for x in keys]
+
+ def get_type(self, value):
+ return isinstance(value, int) and "number" or "string"
+
+class JobAdsViewer(JobAdsSet):
+ def __init__(self, app, name):
+ super(JobAdsViewer, self).__init__(app, name)
+
+ def get_args(self, session):
+ return self.frame.get_args(session)
+
+ def do_get_items(self, session, job):
+ items = super(JobAdsViewer, self).do_get_items(session, job)
+ return [[item[0], item[1]["value"]] for item in items]
+
+ def render_edit_ads_link(self, session, job):
+ branch = session.branch()
+ self.frame.show_ads_edit(branch)
+ return fmt_olink(branch, job, name="Edit Ads")
+
+class JobAdsEditor(CuminEditableProperties):
+ def __init__(self, app, name, params):
+ super(JobAdsEditor, self).__init__(app, name, params)
+
+ self.__items = JobAdsSet(app, name)
+ self.add_child(self.__items)
+
+ self.params = params
+
+ def get_args(self, session):
+ return self.frame.get_args(session)
+
+ def do_get_items(self, session, job):
+ ads = self.params.get(session)
+ if len(ads):
+ keys = ads.keys()
+ keys.sort()
+ return [[x, ads[x]] for x in keys]
+ else:
+ return self.__items.do_get_items(session, job)
+
+class JobOutput(TabbedModeSet):
+ def __init__(self, app, name):
+ super(JobOutput, self).__init__(app, name)
+
+
+ def render_title(self, session):
+ return "Output"
+
+
+class JobStats(TabbedModeSet):
+ def __init__(self, app, name):
+ super(JobStats, self).__init__(app, name)
+
+ self.add_child(StatSet(app, "io", "io"))
+ self.add_child(StatSet(app, "general", "general"))
+
+ chart = StatValueChart(app, "producers")
+ chart.stats = ("producerCount",)
+ self.add_child(chart)
+
+ def render_title(self, session):
+ return "Statistics"
+
+
+class JobStatus(CuminStatus):
+ def render_color(self, session, job):
+ return JobStatusInfo.get_status_color(job.JobStatus)
+
+ def render_job_status(self, session, job):
+ return JobStatusInfo.get_status_string(job.JobStatus)
+
+class JobGroupSet(CuminTable):
+ def __init__(self, app, name):
+ super(JobGroupSet, self).__init__(app, name)
+
+ self.ids = CheckboxIdColumn(app, "id", self)
+ #self.add_column(self.ids)
+
+ col = self.AccountingGroupColumn(app, "agroup")
+ self.add_column(col)
+
+ col = self.JobsCountColumn(app, "jobs")
+ self.add_column(col)
+
+ #col = self.SubmitterColumn(app, "submitter")
+ #self.add_column(col)
+
+ col = self.StatusColumn(app, "job_status")
+ col.alignment = "right"
+ self.add_column(col)
+
+ self.unit = GroupSwitch(app, "group")
+ self.add_child(self.unit)
+
+ def render_title(self, session):
+ return "Jobs %s" % fmt_count(Job.select().count())
+
+ class StatusColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Status"
+
+ class AccountingGroupColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Accounting Group"
+
+ class SubmitterColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Submitter"
+
+ class JobsCountColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Jobs"
+
+class JobGroupTab(JobGroupSet, Form):
+ def __init__(self, app, name):
+ super(JobGroupTab, self).__init__(app, name)
+
+ self.show_column("agroup")
+ self.set_default_column_name("agroup")
+
+ #self.show_column("submitter")
+ self.show_column("job_status")
+
+ self.__remove = self.Remove(app, "remove", self)
+ self.add_child(self.__remove)
+
+ self.__hold = self.Hold(app, "hold", self)
+ self.add_child(self.__hold)
+
+ self.__release = self.Release(app, "release", self)
+ self.add_child(self.__release)
+
+ class Remove(FormButton):
+ def process_submit(self, session):
+ ids = self.parent.ids.get(session)
+ self.parent.ids.clear(session)
+
branch = session.branch()
- self.frame.show_job(branch, job).show_view(branch)
- return fmt_olink(branch, job, name=data["cmd"])
+ frame = self.frame.show_job_group_remove(branch)
+ frame.ids.set(branch, ids)
+ self.page.set_redirect_url(session, branch.marshal())
+
+ def render_content(self, session):
+ return "Remove"
+
+ class Hold(FormButton):
+ def process_submit(self, session):
+ ids = self.parent.ids.get(session)
+ self.parent.ids.clear(session)
+
+ branch = session.branch()
+ frame = self.frame.show_job_group_hold(branch)
+ frame.ids.set(branch, ids)
+ self.page.set_redirect_url(session, branch.marshal())
+
+ def render_content(self, session):
+ return "Hold"
+
+ class Release(FormButton):
+ def process_submit(self, session):
+ ids = self.parent.ids.get(session)
+ self.parent.ids.clear(session)
+
+ branch = session.branch()
+ frame = self.frame.show_job_group_release(branch)
+ frame.ids.set(branch, ids)
+ self.page.set_redirect_url(session, branch.marshal())
+
+ def render_content(self, session):
+ return "Release"
+
+class JobsTab(JobSet, Form):
+ def __init__(self, app, name):
+ super(JobsTab, self).__init__(app, name)
+
+ self.show_column("global_job_id")
+ self.set_default_column_name("global_job_id")
+ self.show_column("cmd")
+ #self.show_column("submitter")
+ #self.show_column("scheduler")
+ self.show_column("job_status")
+
+ self.__remove = self.Remove(app, "remove", self)
+ self.add_child(self.__remove)
+
+ self.__hold = self.Hold(app, "hold", self)
+ self.add_child(self.__hold)
+
+ self.__release = self.Release(app, "release", self)
+ self.add_child(self.__release)
+
+ self.unit = GroupSwitch(app, "group")
+ self.add_child(self.unit)
+
+ class Remove(FormButton):
+ def process_submit(self, session):
+ ids = self.parent.ids.get(session)
+ self.parent.ids.clear(session)
+
+ branch = session.branch()
+ frame = self.frame.show_jobs_remove(branch)
+ frame.ids.set(branch, ids)
+ self.page.set_redirect_url(session, branch.marshal())
+
+ def render_content(self, session):
+ return "Remove"
+
+ class Hold(FormButton):
+ def process_submit(self, session):
+ ids = self.parent.ids.get(session)
+ self.parent.ids.clear(session)
+
+ branch = session.branch()
+ frame = self.frame.show_jobs_hold(branch)
+ frame.ids.set(branch, ids)
+ self.page.set_redirect_url(session, branch.marshal())
+
+ def render_content(self, session):
+ return "Hold"
+
+ class Release(FormButton):
+ def process_submit(self, session):
+ ids = self.parent.ids.get(session)
+ self.parent.ids.clear(session)
+
+ branch = session.branch()
+ frame = self.frame.show_jobs_release(branch)
+ frame.ids.set(branch, ids)
+ self.page.set_redirect_url(session, branch.marshal())
+
+ def render_content(self, session):
+ return "Release"
+
+class JobSetHold(CuminBulkActionForm):
+ def process_return(self, session):
+ branch = session.branch()
+ self.frame.show_view(branch)
+ self.page.set_current_frame(branch, self.frame)
+ self.page.set_redirect_url(session, branch.marshal())
+
+ def process_item(self, session, id):
+ job = Job.get(id)
+ action = self.app.model.job.hold
+ action.invoke(job)
+
+ def render_title(self, session):
+ return "Hold Jobs"
+
+ def render_item_content(self, session, id):
+ return "Hold Job '%s'" % Job.get(id).GlobalJobId
+
+class JobSetRelease(CuminBulkActionForm):
+ def process_return(self, session):
+ branch = session.branch()
+ self.frame.show_view(branch)
+ self.page.set_current_frame(branch, self.frame)
+ self.page.set_redirect_url(session, branch.marshal())
+
+ def process_item(self, session, id):
+ job = Job.get(id)
+ action = self.app.model.job.release
+ action.invoke(job)
+
+ def render_title(self, session):
+ return "Release Jobs"
+
+ def render_item_content(self, session, id):
+ return "Release Job '%s'" % Job.get(id).GlobalJobId
+
+class JobSetRemove(CuminBulkActionForm):
+ def process_return(self, session):
+ branch = session.branch()
+ self.frame.show_view(branch)
+ self.page.set_current_frame(branch, self.frame)
+ self.page.set_redirect_url(session, branch.marshal())
+
+ def process_item(self, session, id):
+ job = Job.get(id)
+ action = self.app.model.job.remove
+ action.invoke(job)
+
+ def render_title(self, session):
+ return "Remove Jobs"
+
+ def render_item_content(self, session, id):
+ return "Remove Job '%s'" % Job.get(id).GlobalJobId
+
+class JobStatusInfo(object):
+ stat_strings = ["Unexpanded", "Idle", "Running", "Removed", "Completed", "Held", "Submission Error"]
+ stat_colors = ["red", "green", "green", "green", "green", "yellow", "red"]
+ @classmethod
+ def get_status_string(cls, stat):
+ try:
+ return cls.stat_strings[stat]
+ except:
+ return ""
+ @classmethod
+ def get_status_color(cls, stat):
+ try:
+ return cls.stat_colors[stat]
+ except:
+ return "red"
+
Modified: mgmt/trunk/cumin/python/cumin/job.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/job.strings 2008-09-02 20:03:32 UTC (rev 2384)
+++ mgmt/trunk/cumin/python/cumin/job.strings 2008-09-02 20:09:10 UTC (rev 2385)
@@ -1,8 +1,177 @@
[JobSet.sql]
select
j.id,
+ j.accounting_group as agroup,
+ j.args,
+ j.cluster_id,
+ j.concurrency_limits,
+ j.custom_group,
+ j.custom_id,
+ j.custom_priority,
+ j.job_status,
+ j.global_job_id,
+/* j.owner as submitter, */
+ j.title,
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
+{sql_where}
+{sql_orderby}
+{sql_limit}
[JobSet.count_sql]
-select count(*) from pool
+select count(1)
+from job as j
+left outer join job_stats as c on c.id = j.stats_curr_id
+{sql_where}
+
+
+[JobsTab.html]
+<form id="{id}" method="post" action="?">
+
+ {group}
+
+ <div class="sactions">
+ <h2>Act on Selected Jobs:</h2>
+ {hold} {release} {remove}
+ </div>
+
+ <table class="mobjects">
+ <thead>
+ <tr>
+ <th class="setnav" colspan="{column_count}">
+ <div class="rfloat">{page}</div>
+ {count}
+ </th>
+ </tr>
+ <tr>{headers}</tr>
+ </thead>
+ <tbody>{items}</tbody>
+ </table>
+ <div>{hidden_inputs}</div>
+</form>
+
+[JobGroupSet.sql]
+select distinct
+ j.accounting_group as agroup,
+ j.job_status,
+/* j.owner as submitter, */
+ (select count(1)
+ from job as j
+ group by j.accounting_group) as jobs
+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
+{sql_where}
+{sql_orderby}
+{sql_limit}
+
+[JobGroupSet.count_sql]
+select count(j.accounting_group)
+from job as j
+left outer join job_stats as c on c.id = j.stats_curr_id
+{sql_where}
+
+
+[JobGroupTab.html]
+<form id="{id}" method="post" action="?">
+
+ {group}
+
+ <div class="sactions">
+ <h2>Act on Selected Groups:</h2>
+ {hold} {release} {remove}
+ </div>
+
+ <table class="mobjects">
+ <thead>
+ <tr>
+ <th class="setnav" colspan="{column_count}">
+ <div class="rfloat">{page}</div>
+ {count}
+ </th>
+ </tr>
+ <tr>{headers}</tr>
+ </thead>
+ <tbody>{items}</tbody>
+ </table>
+ <div>{hidden_inputs}</div>
+</form>
+
+[JobStatus.html]
+<div id="{id}" class="CuminStatus {color}">
+ <h2>Status</h2>
+ {job_status}
+</div>
+
+
+[JobAdsViewer.html]
+<table class="CuminDetails">
+ <tbody>
+ <tr>
+ <td>
+ <h2>Ads</h2>
+ <table class="PropertySet">
+ <thead>
+ <tr>
+ <th style="width: 50%;">Name</th>
+ <th style="width: 50%;">Value</th>
+ </tr>
+ </thead>
+ <tbody>{items}</tbody>
+ </table>
+ </td>
+ <td>
+ <h2>Actions</h2>
+ <ul class="ActionSet">
+ <li>{edit_ads_link}</li>
+ </ul>
+ </td>
+ </tr>
+ </tbody>
+</table>
+
+[JobAdsViewer.ad_html]
+<tr>
+ <th>{ad_title}</th><td>{ad_value}</td>
+</tr>
+
+
+
+[JobEditAds.css]
+div.inline_help {
+ position:fixed;
+}
+
+div.inline_help h2.legend {
+ margin-top: 1em;
+}
+
+[JobEditAds.html]
+<form id="{id}" class="mform editform" method="post" action="?">
+<table class="CuminDetails">
+ <tbody>
+ <tr>
+ <td>
+ <h2>Edit Job Ads</h2>
+ {properties}
+ </td>
+ <td>
+ <div class="inline_help">
+ <h2>Actions</h2>
+ {help}
+ {submit}
+ {cancel}
+ <h2 class="legend">Legend</h2>
+ <ul class="legend">
+ <li><span class="edit_string">String input expected</span></li>
+ <li><span class="edit_number">Numeric input expected</span></li>
+ </ul>
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+<div>{hidden_inputs}</div>
+</form>
Modified: mgmt/trunk/cumin/python/cumin/model.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/model.py 2008-09-02 20:03:32 UTC (rev 2384)
+++ mgmt/trunk/cumin/python/cumin/model.py 2008-09-02 20:09:10 UTC (rev 2385)
@@ -44,6 +44,7 @@
CuminSubmitter(self)
CuminPool(self)
+ CuminJob(self)
# Systems
@@ -117,7 +118,7 @@
else:
return self.name
- def value(self, object):
+ def value(self, session, object):
value = getattr(object, self.name, None)
if isinstance(value, datetime):
@@ -524,8 +525,8 @@
return object.nodeName
class SystemIdProperty(CuminProperty):
- def value(self, object):
- val = super(CuminSystem.SystemIdProperty, self).value(object)
+ def value(self, session, object):
+ val = super(CuminSystem.SystemIdProperty, self).value(session, object)
return "%08x-%04x-%04x-%04x-%04x%08x" % unpack("!LHHHHL", val)
@@ -1430,6 +1431,141 @@
def show_object(self, session, pool):
return self.cumin_model.show_main(session).show_pool(session, pool)
+class CuminJob(RemoteClass):
+ def __init__(self, model):
+ super(CuminJob, self).__init__(model, "job", Job, JobStats)
+
+ prop = CuminProperty(self, "AccountingGroup")
+ prop.title = "Group"
+ prop.summary = True
+
+ #prop = self.SchedulerProperty(self, "Scheduler")
+ #prop.title = "Scheduler"
+ #prop.summary = True
+
+ #prop = self.SubmitterProperty(self, "Owner")
+ #prop.title = "Submitter"
+ #prop.summary = True
+
+ prop = CuminProperty(self, "Args")
+ prop.title = "Args"
+
+ prop = CuminProperty(self, "ClusterId")
+ prop.title = "Cluster ID"
+
+ prop = CuminProperty(self, "Cmd")
+ prop.title = "Command"
+
+ prop = CuminProperty(self, "ConcurrencyLimits")
+ prop.title = "Concurrency Limits"
+
+ prop = CuminProperty(self, "CustomGroup")
+ prop.title = "Custom Group"
+
+ prop = CuminProperty(self, "CustomId")
+ prop.title = "Custom ID"
+
+ prop = CuminProperty(self, "CustomPriority")
+ prop.title = "Custom Priority"
+
+ prop = CuminProperty(self, "GlobalJobId")
+ prop.title = "Global Job ID"
+
+ prop = CuminProperty(self, "JobStatus")
+ prop.title = "Job Status"
+
+ prop = CuminProperty(self, "Note")
+ prop.title = "Note"
+
+ prop = CuminProperty(self, "ProcId")
+ prop.title = "Proc ID"
+
+ prop = CuminProperty(self, "QDate")
+ prop.title = "QDate"
+
+ prop = CuminProperty(self, "Requirements")
+ prop.title = "Requirements"
+
+ prop = CuminProperty(self, "Title")
+ prop.title = "Title"
+
+ prop = CuminProperty(self, "UserLog")
+ prop.title = "User Log"
+
+ prop = CuminProperty(self, "HoldReason")
+ prop.title = "Hold Reason"
+
+ action = self.Hold(self, "hold")
+ action.summary = True
+
+ action = self.Release(self, "release")
+ action.summary = True
+
+ action = self.Remove(self, "remove")
+ action.summary = True
+
+ def get_title(self, session):
+ return "Job"
+
+ def get_object_name(self, job):
+ return str(job.idOriginal)
+
+ def show_object(self, session, job):
+ return self.cumin_model.show_main(session).show_job(session, job)
+
+ class SubmitterProperty(CuminProperty):
+ def value(self, session, job):
+ value = super(CuminJob.SubmitterProperty, self).value(session, job)
+#TODO: get a Submitter .
+ submitter = None
+ branch = session.branch()
+ frame = self.cumin_class.show_object(branch, job)
+ frame.show_submitter(branch, submitter)
+ return value and fmt_olink(branch, job, name=value) or fmt_none()
+
+ class SchedulerProperty(CuminProperty):
+ def value(self, session, job):
+ value = super(CuminJob.SchedulerProperty, self).value(session, job)
+#TODO: get a Scheduler .
+ scheduler = None
+ branch = session.branch()
+ frame = self.cumin_class.show_object(branch, job)
+ frame.show_scheduler(branch, scheduler)
+ return value and fmt_olink(branch, job, name=value) or fmt_none()
+
+ class Hold(CuminAction):
+ def show(self, session, job):
+ frame = self.cumin_class.show_object(session, job)
+ return frame.show_job_hold(session)
+
+ def get_title(self, session):
+ return "Hold"
+
+ def do_invoke(self, job, args, completion):
+ job.hold(self.cumin_model.data, completion)
+
+ class Release(CuminAction):
+ def show(self, session, job):
+ frame = self.cumin_class.show_object(session, job)
+ return frame.show_job_release(session)
+
+ def get_title(self, session):
+ return "Release"
+
+ def do_invoke(self, job, args, completion):
+ job.release(self.cumin_model.data, completion)
+
+ class Remove(CuminAction):
+ def show(self, session, job):
+ frame = self.cumin_class.show_object(session, job)
+ return frame.show_job_remove(session)
+
+ def get_title(self, session):
+ return "Remove"
+
+ def do_invoke(self, job, args, completion):
+ job.remove(self.cumin_model.data, completion)
+
class CuminScheduler(RemoteClass):
def __init__(self, model):
super(CuminScheduler, self).__init__(model, "scheduler",
Modified: mgmt/trunk/cumin/python/cumin/page.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/page.py 2008-09-02 20:03:32 UTC (rev 2384)
+++ mgmt/trunk/cumin/python/cumin/page.py 2008-09-02 20:09:10 UTC (rev 2385)
@@ -8,6 +8,7 @@
from brokerprofile import *
from brokercluster import *
from pool import *
+from job import *
from system import *
from action import *
from widgets import *
@@ -93,6 +94,9 @@
self.__pool = PoolFrame(app, "pool")
self.add_mode(self.__pool)
+ self.__job = JobFrame(app, "job")
+ self.add_mode(self.__job)
+
self.__system = SystemFrame(app, "system")
self.add_mode(self.__system)
@@ -168,6 +172,11 @@
frame.set_object(session, pool)
return self.page.set_current_frame(session, frame)
+ def show_job(self, session, job):
+ frame = self.show_mode(session, self.__job)
+ frame.set_object(session, job)
+ return self.page.set_current_frame(session, frame)
+
def show_system(self, session, system):
frame = self.show_mode(session, self.__system)
frame.set_object(session, system)
Modified: mgmt/trunk/cumin/python/cumin/pool.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/pool.py 2008-09-02 20:03:32 UTC (rev 2384)
+++ mgmt/trunk/cumin/python/cumin/pool.py 2008-09-02 20:09:10 UTC (rev 2385)
@@ -11,10 +11,11 @@
from parameters import *
from formats import *
from util import *
-from job import JobSet
+from job import *
from scheduler import SchedulerSet, SchedulerFrame
from submitter import SubmitterSet, SubmitterFrame
+
strings = StringCatalog(__file__)
log = logging.getLogger("cumin.pool")
@@ -51,6 +52,18 @@
self.add_mode(view)
self.set_view_mode(view)
+ self.__job = JobFrame(app, "job")
+ self.add_mode(self.__job)
+
+ self.__jobs_hold = JobSetHold(app, "jobshold")
+ self.add_mode(self.__jobs_hold)
+
+ self.__jobs_release = JobSetRelease(app, "jobsrelease")
+ self.add_mode(self.__jobs_release)
+
+ self.__jobs_remove = JobSetRemove(app, "jobsremove")
+ self.add_mode(self.__jobs_remove)
+
self.__sched = SchedulerFrame(app, "sched")
self.add_mode(self.__sched)
@@ -58,7 +71,21 @@
self.add_mode(self.__sub)
def show_job(self, session, job):
- return self
+ self.__job.set_object(session, job)
+ self.page.set_current_frame(session, self.__job)
+ return self.show_mode(session, self.__job)
+
+ def show_jobs_hold(self, session):
+ self.page.set_current_frame(session, self.__jobs_hold)
+ return self.show_mode(session, self.__jobs_hold)
+
+ def show_jobs_release(self, session):
+ self.page.set_current_frame(session, self.__jobs_release)
+ return self.show_mode(session, self.__jobs_release)
+
+ def show_jobs_remove(self, session):
+ self.page.set_current_frame(session, self.__jobs_remove)
+ return self.show_mode(session, self.__jobs_remove)
def show_scheduler(self, session, sched):
self.__sched.set_object(session, sched)
@@ -80,7 +107,7 @@
self.__tabs = TabbedModeSet(app, "tabs")
self.add_child(self.__tabs)
- jobs = self.JobsTab(app, "jobs")
+ jobs = JobsTab(app, "jobs")
self.__tabs.add_tab(jobs)
scheds = self.SchedulersTab(app, "scheds")
@@ -89,9 +116,6 @@
subs = self.SubmittersTab(app, "subs")
self.__tabs.add_tab(subs)
- class JobsTab(JobSet):
- pass
-
class SchedulersTab(SchedulerSet):
pass
@@ -101,3 +125,4 @@
class PoolStatus(CuminStatus):
pass
+
Modified: mgmt/trunk/cumin/python/cumin/widgets.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/widgets.py 2008-09-02 20:03:32 UTC (rev 2384)
+++ mgmt/trunk/cumin/python/cumin/widgets.py 2008-09-02 20:09:10 UTC (rev 2385)
@@ -12,6 +12,9 @@
from formats import *
from util import *
+import time
+
+
strings = StringCatalog(__file__)
class CuminFrame(Frame, ModeSet):
@@ -143,8 +146,11 @@
def cancel(self, session):
self.__cancel.set(session, True)
+ def get_modal(self, session):
+ return True
+
def do_process(self, session, *args):
- self.page.set_modal(session, True)
+ self.page.set_modal(session, self.get_modal(session))
self.pre_process(session, *args)
@@ -266,13 +272,97 @@
else:
return "green"
+
+class CuminEditableProperties(PropertySet):
+ """Display input fields for editing properties
+
+ Parent class needs to override do_get_items() and return a list of items.
+ Each item should be another list.
+ item[0] should be the property name
+ item[1] should be the a dict:
+ item[1]["value"] is required and should be the value to edit
+ item[1]["type"] is required and should be an input type <"number" | "string">
+ item[1]["error"] is optional and should be the error text to display for that item
+
+ The dict_param that is passed in should be a object derived from DictParameter.
+ dict_param.path will be used to generate the input field name
+ """
+
+ def __init__(self, app, name, dict_param):
+ self.item_renderer=EditablePropertyRenderer(self, "property_html", dict_param)
+ super(CuminEditableProperties, self).__init__(app, name, item_renderer=self.item_renderer)
+
+class EditablePropertyRenderer(TemplateRenderer, Widget):
+ def __init__(self, widget, template_key, dict_param):
+ super(EditablePropertyRenderer, self).__init__(widget, template_key)
+
+ self.__bool_template = Template(self, "bool_html")
+ self.__string_template = Template(self, "string_html")
+ self.__bigstring_template = Template(self, "bigstring_html")
+ self.__number_template = Template(self, "number_html")
+
+ self.dict_param = dict_param
+
+ def render_title(self, session, propval):
+ title = propval[0]
+ return escape_amp(title)
+
+ def render_value(self, session, propval):
+ value = propval[1]["value"]
+ type = propval[1]["type"]
+ writer = Writer()
+ if type == "number":
+ self.__number_template.render(writer, session, propval)
+ else:
+ uvalue = value.upper()
+ if uvalue == "FALSE" or uvalue == "TRUE":
+ self.__bool_template.render(writer, session, propval)
+ else:
+ if len(value) > 40:
+ self.__bigstring_template.render(writer, session, propval)
+ else:
+ self.__string_template.render(writer, session, propval)
+
+ return writer.to_string()
+
+ def render_pname(self, session, propval):
+ return DictParameter.sep().join(
+ (self.dict_param.path, escape_entity(propval[0]), "value"))
+
+ def render_ptype_name(self, session, propval):
+ return DictParameter.sep().join(
+ (self.dict_param.path, escape_entity(propval[0]), "type"))
+
+ def render_ptype_value(self, session, propval):
+ return propval[1]["type"]
+
+ def render_val(self, session, propval):
+ try:
+ value = propval[1]["value"]
+ except KeyError:
+ value = ""
+ return escape_entity(str(value))
+
+ def render_error(self, session, propval):
+ if "error" in propval[1]:
+ return "<div class=\"error\">%s</div>" % propval[1]["error"]
+
+ def render_false_selected(self, session, propval):
+ return propval[1]["value"].upper() == "FALSE" and "checked=\"checked\"" or ""
+
+ def render_true_selected(self, session, propval):
+ return propval[1]["value"].upper() == "TRUE" and "checked=\"checked\"" or ""
+
+ def render_edit_number_class(self, session, propval):
+ return "error" in propval[1] and "numeric_error" or "edit_number"
+
class CuminProperties(PropertySet):
def get_args(self, session):
return self.frame.get_args(session)
def do_get_items(self, session, object):
cls = self.app.model.get_class_by_object(object)
- return [(x.get_title(session), x.value(object))
+ return [(x.get_title(session), x.value(session, object))
for x in cls.properties]
class CuminActions(ActionSet):
@@ -321,7 +411,7 @@
class SummaryProperties(CuminProperties):
def do_get_items(self, session, object):
cls = self.app.model.get_class_by_object(object)
- return [(x.get_title(session), x.value(object))
+ return [(x.get_title(session), x.value(session, object))
for x in cls.properties if x.summary]
class SummaryActions(CuminActions):
@@ -366,6 +456,13 @@
return fmt_link(branch.marshal(), title, class_, id=id)
+class GroupSwitch(StateSwitch):
+ def __init__(self, app, name):
+ super(GroupSwitch, self).__init__(app, name)
+
+ self.add_state("j", "Jobs")
+ self.add_state("g", "Groups")
+
class UnitSwitch(StateSwitch):
def __init__(self, app, name):
super(UnitSwitch, self).__init__(app, name)
Modified: mgmt/trunk/cumin/python/cumin/widgets.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/widgets.strings 2008-09-02 20:03:32 UTC (rev 2384)
+++ mgmt/trunk/cumin/python/cumin/widgets.strings 2008-09-02 20:09:10 UTC (rev 2385)
@@ -284,40 +284,105 @@
</div>
[SummaryProperties.css]
-div.SummaryProperties div.titles {
+table.SummaryProperties th {
color: #444;
- float:left;
font-weight: normal;
padding: 0 0.5em 0 0;
}
-div.SummaryProperties div.values {
- float:left;
-}
-div.SummaryProperties:after {
- content: ".";
- display: block;
- height: 0;
- clear: left;
- visibility: hidden;
-}
[SummaryProperties.html]
-<div class="SummaryProperties">
- <div class="titles">{titles}</div>
- <div class="values">{values}</div>
-</div>
+<table class="SummaryProperties">
+ <tbody>{items}</tbody>
+</table>
-[SummaryProperties.title_html]
- <div>{title}</div>
+[SummaryProperties.property_html]
+<tr><th>{title}</th><td>{value}</td></tr>
-[SummaryProperties.value_html]
- <div>{value}</div>
-
[StateSwitch.html]
<ul class="radiotabs">
{items}
</ul>
+[CuminEditableProperties.css]
+table.Editable input.edit_string,
+table.Editable textarea.edit_bigstring,
+div.inline_help span.edit_string {
+ border: 1px solid #CCCCCC;
+}
+table.Editable input.edit_number,
+div.inline_help span.edit_number {
+ border: 1px dashed #66CCFF;
+}
+table.Editable input.numeric_error,
+div.inline_help span.numeric_error {
+ border: 1px dashed #FF0000;
+}
+
+table.Editable input.edit_string,
+table.Editable input.edit_number,
+table.Editable input.numeric_error {
+ width: 20em;
+}
+table.Editable textarea.edit_bigstring {
+ width: 25em;
+}
+table.Editable div.error {
+ color: #FF0000;
+ font-size: 0.9em;
+}
+
+form.editform {
+ border:0 none !important;
+ width: 100% !important;
+}
+
+div.inline_help span.edit_string,
+div.inline_help span.edit_number,
+div.inline_help span.numeric_error {
+ color: #444444;
+ font-weight: normal;
+ padding:0.05em 0.2em;
+}
+div.inline_help ul.legend {
+ margin:0.5em 1em;
+}
+div.inline_help ul.legend li {
+ line-height: 1.75em;
+}
+
+[CuminEditableProperties.html]
+<table class="PropertySet Editable">
+ <thead>
+ <tr>
+ <th style="width: 50%;">Name</th>
+ <th style="width: 50%;">Value</th>
+ </tr>
+ </thead>
+ <tbody>{items}</tbody>
+</table>
+
+[CuminEditableProperties.property_html]
+<tr>
+ <th>{title}</th><td>{value}</td>
+</tr>
+
+[EditablePropertyRenderer.bool_html]
+<input class="edit_bool" id="{pname}.true" type="radio" name="{pname}" value="TRUE" {true_selected} /> <label for="{pname}.true">True</label>
+<input class="edit_bool" id="{pname}.false" type="radio" name="{pname}" value="FALSE" {false_selected} /> <label for="{pname}.false">False</label>
+<input type="hidden" name="{ptype_name}" value="{ptype_value}"/>
+
+[EditablePropertyRenderer.string_html]
+<input class="edit_string" type="text" name="{pname}" value="{val}" />
+<input type="hidden" name="{ptype_name}" value="{ptype_value}"/>
+
+[EditablePropertyRenderer.bigstring_html]
+<textarea class="edit_bigstring" name="{pname}" rows="4" cols="40">{val}</textarea>
+<input type="hidden" name="{ptype_name}" value="{ptype_value}"/>
+
+[EditablePropertyRenderer.number_html]
+<input class="{edit_number_class}" type="text" name="{pname}" value="{val}" />{error}
+<input type="hidden" name="{ptype_name}" value="{ptype_value}"/>
+
[StateSwitch.item_html]
<li>{item_link}</li>
@@ -396,3 +461,4 @@
[FormHelp.html]
<a class="help action" id="help_link" href="{help_href}">Help</a>
+
Modified: mgmt/trunk/cumin/python/wooly/__init__.py
===================================================================
--- mgmt/trunk/cumin/python/wooly/__init__.py 2008-09-02 20:03:32 UTC (rev 2384)
+++ mgmt/trunk/cumin/python/wooly/__init__.py 2008-09-02 20:09:10 UTC (rev 2385)
@@ -1,6 +1,6 @@
import sys, os
from cStringIO import StringIO
-from urllib import quote, unquote_plus
+from urllib import quote, unquote_plus, unquote
from copy import copy
from time import clock
from datetime import datetime
@@ -367,6 +367,7 @@
def do_unmarshal(self, path):
return self.app.get_widget(path)
+from parameters import DictParameter
class Application(object):
def __init__(self):
self.pages = dict()
@@ -446,13 +447,13 @@
self.parameter_index = index
param = self.parameter_index.get((page, key))
-
+
# check for partial match for dictparameters
if not param:
- if "_" in key:
- dict_key = key.split("_", 1)[0]
+ if DictParameter.sep() in key:
+ dict_key = key.split(DictParameter.sep(), 1)[0]
param = self.parameter_index.get((page, dict_key))
-
+
return param
def add_resource_dir(self, dir):
@@ -604,7 +605,8 @@
for var in vars:
try:
- key, svalue = var.split("=")
+ skey, svalue = var.split("=")
+ key = unquote(skey)
value = unquote_plus(svalue)
param = self.app.get_parameter(self.get_page(), key)
Modified: mgmt/trunk/cumin/python/wooly/forms.py
===================================================================
--- mgmt/trunk/cumin/python/wooly/forms.py 2008-09-02 20:03:32 UTC (rev 2384)
+++ mgmt/trunk/cumin/python/wooly/forms.py 2008-09-02 20:09:10 UTC (rev 2385)
@@ -35,10 +35,10 @@
def render_hidden_inputs(self, session, *args):
writer = Writer()
-
# remember our roots
if not self.origin.get(session):
self.origin.set(session, session.get_origin())
+
params = set(session.get_page().get_saved_parameters(session))
params.difference_update(self.form_params)
Modified: mgmt/trunk/cumin/python/wooly/parameters.py
===================================================================
--- mgmt/trunk/cumin/python/wooly/parameters.py 2008-09-02 20:03:32 UTC (rev 2384)
+++ mgmt/trunk/cumin/python/wooly/parameters.py 2008-09-02 20:09:10 UTC (rev 2385)
@@ -9,22 +9,26 @@
self.default = dict()
self.is_dictionary = True
+ @classmethod
+ def sep(cls):
+ return "|"
+
def add(self, session, value, full_key):
# full_key looks like <DictParameter.path>_<stuff>
keys = self.get(session)
# separate the DictParameter.path from the stuff
- foo, stuff = full_key.split("_", 1)
+ foo, stuff = full_key.split(DictParameter.sep(), 1)
if stuff:
self.split_stuff(keys, stuff, value)
def split_stuff(self, keys, stuff, value):
- """ Each time there is an _ in stuff,
+ """ Each time there is a delimiter in stuff,
create a nested dictionary entry """
- # can't use: stuff_1, stuff_2 = stuff.split("_", 1)
- stuff_list = stuff.split("_", 1)
+ # can't use: stuff_1, stuff_2 = stuff.split(DictParameter.sep(), 1)
+ stuff_list = stuff.split(DictParameter.sep(), 1)
stuff_1 = stuff_list[0]
if len(stuff_list) > 1:
stuff_2 = stuff_list[1]
@@ -38,7 +42,7 @@
del keys[stuff_1]
def get_instance_key(self, key):
- return "_".join((self.path, key))
+ return DictParameter.sep().join((self.path, key))
def clear(self):
self.default = dict()
Modified: mgmt/trunk/cumin/python/wooly/widgets.py
===================================================================
--- mgmt/trunk/cumin/python/wooly/widgets.py 2008-09-02 20:03:32 UTC (rev 2384)
+++ mgmt/trunk/cumin/python/wooly/widgets.py 2008-09-02 20:09:10 UTC (rev 2385)
@@ -1,9 +1,11 @@
from math import ceil
+import htmlentitydefs as entity
from xml.sax.saxutils import escape
from parameters import *
from resources import *
from wooly import *
+import urllib
strings = StringCatalog(__file__)
@@ -409,41 +411,16 @@
if self.item_renderer is None:
self.item_renderer = PropertyRenderer(self, "property_html")
- # Added as an alternate way to render titles and values
- # Instead of outputting the title and value in the same row,
- # this is used to putput all the titles, then all the values.
- self.title_renderer = PropertyRenderer(self, "title_html")
- self.value_renderer = PropertyRenderer(self, "value_html")
-
- def render_prop(self, session, renderer, *args):
- items = self.get_items(session, *args)
- writer = Writer()
-
- for item in items:
- renderer.render(writer, session, item)
-
- return writer.to_string()
-
- def render_titles(self, session, *args):
- return self.render_prop(session, self.title_renderer, *args)
-
- def render_values(self, session, *args):
- return self.render_prop(session, self.value_renderer, *args)
-
class PropertyRenderer(TemplateRenderer):
def render_title(self, session, prop):
- return prop[0]
+ return escape_amp(prop[0])
def render_value(self, session, prop):
- value = prop[1]
+ # we can't escape all entities here since
+ # values that contained html tags would get
+ # displayed improperly
+ return escape_amp(prop[1])
- if type(value) is str:
- value = escape(value)
- elif value is None:
- value = "<em>None</em>"
-
- return value
-
class ActionSet(RenderingItemSet):
def __init__(self, app, name, item_renderer=None):
super(ActionSet, self).__init__(app, name, item_renderer)
@@ -457,3 +434,18 @@
def render_content(self, session, action):
return action[1]
+
+def escape_amp(string):
+ return str(string).replace("&", "&")
+
+def escape_entity(string, exceptions=None):
+ t = ""
+ ex = exceptions or list()
+ for i in string:
+ if ord(i) in entity.codepoint2name and \
+ i not in ex:
+ name = entity.codepoint2name.get(ord(i))
+ t += "&" + name + ";"
+ else:
+ t += i
+ return t
\ No newline at end of file
17 years, 8 months
rhmessaging commits: r2384 - mgmt/trunk/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: eallen
Date: 2008-09-02 16:03:32 -0400 (Tue, 02 Sep 2008)
New Revision: 2384
Modified:
mgmt/trunk/cumin/python/cumin/parameters.py
Log:
Added JobParameter
Modified: mgmt/trunk/cumin/python/cumin/parameters.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/parameters.py 2008-09-02 19:59:39 UTC (rev 2383)
+++ mgmt/trunk/cumin/python/cumin/parameters.py 2008-09-02 20:03:32 UTC (rev 2384)
@@ -65,6 +65,13 @@
def do_marshal(self, exchange):
return str(exchange.id)
+class JobParameter(Parameter):
+ def do_unmarshal(self, string):
+ return Job.get(int(string))
+
+ def do_marshal(self, job):
+ return str(job.id)
+
class PeerParameter(Parameter):
def do_unmarshal(self, string):
return Link.get(int(string))
17 years, 8 months
rhmessaging commits: r2383 - mgmt/trunk/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: eallen
Date: 2008-09-02 15:59:39 -0400 (Tue, 02 Sep 2008)
New Revision: 2383
Modified:
mgmt/trunk/cumin/python/cumin/util.py
Log:
Added function to convert string to int or float
Modified: mgmt/trunk/cumin/python/cumin/util.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/util.py 2008-09-02 18:45:22 UTC (rev 2382)
+++ mgmt/trunk/cumin/python/cumin/util.py 2008-09-02 19:59:39 UTC (rev 2383)
@@ -53,6 +53,17 @@
def __init__(self, id=None):
self.id = id
+def convertStr(s):
+ """Convert string to either int or float."""
+ try:
+ ret = int(s)
+ except ValueError:
+ try:
+ ret = float(s)
+ except ValueError:
+ ret = None
+ return ret
+
class Config(object):
__log = getLogger("cumin.config")
17 years, 8 months
rhmessaging commits: r2382 - mgmt/trunk/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2008-09-02 14:45:22 -0400 (Tue, 02 Sep 2008)
New Revision: 2382
Added:
mgmt/trunk/cumin/python/cumin/submitter.py
mgmt/trunk/cumin/python/cumin/submitter.strings
Modified:
mgmt/trunk/cumin/python/cumin/model.py
mgmt/trunk/cumin/python/cumin/parameters.py
mgmt/trunk/cumin/python/cumin/pool.py
Log:
Add basic submitter UI
Modified: mgmt/trunk/cumin/python/cumin/model.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/model.py 2008-09-02 18:19:54 UTC (rev 2381)
+++ mgmt/trunk/cumin/python/cumin/model.py 2008-09-02 18:45:22 UTC (rev 2382)
@@ -41,6 +41,7 @@
# Grid
CuminScheduler(self)
+ CuminSubmitter(self)
CuminPool(self)
@@ -1488,6 +1489,40 @@
return frame
+class CuminSubmitter(RemoteClass):
+ def __init__(self, model):
+ super(CuminSubmitter, self).__init__(model, "submitter",
+ Submitter, SubmitterStats)
+
+ prop = CuminProperty(self, "Name")
+ prop.title = "Name"
+
+ stat = CuminStat(self, "RunningJobs")
+ stat.title = "Running Jobs"
+
+ stat = CuminStat(self, "IdleJobs")
+ stat.title = "Idle Jobs"
+
+ stat = CuminStat(self, "HeldJobs")
+ stat.title = "Held Jobs"
+
+ def get_title(self, session):
+ return "Submitter"
+
+ def get_object_name(self, sub):
+ return sub.Name
+
+ def show_object(self, session, sub):
+ # XXX temporary solution
+ for pool in Pool.selectBy(name="main"):
+ break
+
+ frame = self.cumin_model.show_main(session)
+ frame = frame.show_pool(session, pool)
+ frame = frame.show_submitter(session, sub).show_view(session)
+
+ return frame
+
class ModelPage(Page):
def __init__(self, app, name):
super(ModelPage, self).__init__(app, name)
Modified: mgmt/trunk/cumin/python/cumin/parameters.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/parameters.py 2008-09-02 18:19:54 UTC (rev 2381)
+++ mgmt/trunk/cumin/python/cumin/parameters.py 2008-09-02 18:45:22 UTC (rev 2382)
@@ -100,6 +100,13 @@
def do_marshal(self, session):
return str(session.id)
+class SubmitterParameter(Parameter):
+ def do_unmarshal(self, string):
+ return Submitter.get(int(string))
+
+ def do_marshal(self, sub):
+ return str(sub.id)
+
class SystemParameter(Parameter):
def do_unmarshal(self, string):
return System.get(int(string))
Modified: mgmt/trunk/cumin/python/cumin/pool.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/pool.py 2008-09-02 18:19:54 UTC (rev 2381)
+++ mgmt/trunk/cumin/python/cumin/pool.py 2008-09-02 18:45:22 UTC (rev 2382)
@@ -13,6 +13,7 @@
from util import *
from job import JobSet
from scheduler import SchedulerSet, SchedulerFrame
+from submitter import SubmitterSet, SubmitterFrame
strings = StringCatalog(__file__)
log = logging.getLogger("cumin.pool")
@@ -53,6 +54,9 @@
self.__sched = SchedulerFrame(app, "sched")
self.add_mode(self.__sched)
+ self.__sub = SubmitterFrame(app, "sub")
+ self.add_mode(self.__sub)
+
def show_job(self, session, job):
return self
@@ -61,6 +65,11 @@
self.page.set_current_frame(session, self.__sched)
return self.show_mode(session, self.__sched)
+ def show_submitter(self, session, sub):
+ self.__sub.set_object(session, sub)
+ self.page.set_current_frame(session, self.__sub)
+ return self.show_mode(session, self.__sub)
+
class PoolView(CuminView):
def __init__(self, app, name):
super(PoolView, self).__init__(app, name)
@@ -77,12 +86,18 @@
scheds = self.SchedulersTab(app, "scheds")
self.__tabs.add_tab(scheds)
+ subs = self.SubmittersTab(app, "subs")
+ self.__tabs.add_tab(subs)
+
class JobsTab(JobSet):
pass
class SchedulersTab(SchedulerSet):
pass
+ class SubmittersTab(SubmitterSet):
+ pass
+
class PoolStatus(CuminStatus):
pass
Added: mgmt/trunk/cumin/python/cumin/submitter.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/submitter.py (rev 0)
+++ mgmt/trunk/cumin/python/cumin/submitter.py 2008-09-02 18:45:22 UTC (rev 2382)
@@ -0,0 +1,95 @@
+import logging
+
+from wooly import *
+from wooly.widgets import *
+from wooly.forms import *
+from wooly.resources import *
+from wooly.tables import *
+
+from stat import *
+from widgets import *
+from parameters import *
+from formats import *
+from util import *
+
+strings = StringCatalog(__file__)
+log = logging.getLogger("cumin.submitter")
+
+class SubmitterSet(CuminTable):
+ def __init__(self, app, name):
+ super(SubmitterSet, self).__init__(app, name)
+
+ col = self.NameColumn(app, "name")
+ self.add_column(col)
+
+ self.set_default_column(col)
+
+ def render_title(self, session):
+ return "Submitters %s" % fmt_count(Submitter.select().count())
+
+ class NameColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Name"
+
+ def render_content(self, session, data):
+ sub = Identifiable(data["id"])
+ branch = session.branch()
+ self.frame.show_submitter(branch, sub).show_view(branch)
+ return fmt_olink(branch, sub, name=data["name"])
+
+class SubmitterFrame(CuminFrame):
+ def __init__(self, app, name):
+ super(SubmitterFrame, self).__init__(app, name)
+
+ self.object = SubmitterParameter(app, "id")
+ self.add_parameter(self.object)
+
+ view = SubmitterView(app, "view")
+ self.add_mode(view)
+ self.set_view_mode(view)
+
+class SubmitterView(CuminView):
+ def __init__(self, app, name):
+ super(SubmitterView, self).__init__(app, name)
+
+ status = SubmitterStatus(app, "status")
+ self.add_child(status)
+
+ self.__tabs = TabbedModeSet(app, "tabs")
+ self.add_child(self.__tabs)
+
+ stats = SubmitterStats(app, "stats")
+ self.__tabs.add_tab(stats)
+
+ details = CuminDetails(app, "details")
+ self.__tabs.add_tab(details)
+
+ def render_script(self, session, sched):
+ data = "model.xml?class=scheduler;id=%i" % sched.id
+ return "wooly.setIntervalUpdate('%s', updateSubmitter, 3000)" % data
+
+class SubmitterStatus(CuminStatus):
+ pass
+
+class SubmitterStats(Widget):
+ def __init__(self, app, name):
+ super(SubmitterStats, self).__init__(app, name)
+
+ stats = StatSet(app, "general", "general")
+ self.add_child(stats)
+
+ chart = self.JobsChart(app, "jobs")
+ self.add_child(chart)
+
+ def render_title(self, session):
+ return "Statistics"
+
+ class JobsChart(StatValueChart):
+ def __init__(self, app, name):
+ super(SubmitterStats.JobsChart, self).__init__ \
+ (app, name)
+
+ self.stats = ("RunningJobs", "IdleJobs", "HeldJobs")
+
+ def render_title(self, session, sched):
+ return "Jobs"
Added: mgmt/trunk/cumin/python/cumin/submitter.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/submitter.strings (rev 0)
+++ mgmt/trunk/cumin/python/cumin/submitter.strings 2008-09-02 18:45:22 UTC (rev 2382)
@@ -0,0 +1,40 @@
+[SubmitterSet.sql]
+select
+ s.id,
+ s.name
+from submitter as s
+
+[SubmitterSet.count_sql]
+select count(*) from submitter
+
+[SubmitterView.javascript]
+function updateSubmitter(data) {
+ var model = data.objectify();
+ var subs = model.submitter;
+ var sub;
+
+ for (var key in subs) {
+ sub = subs[key];
+ break;
+ }
+
+ cumin.runModelListeners(model);
+ cumin.runObjectListeners(sub);
+
+ //throw new Error();
+}
+
+[SubmitterStats.html]
+<table class="twocol">
+ <tbody>
+ <tr>
+ <td>
+ <h2>General</h2>
+ {general}
+ </td>
+ <td>
+ {jobs}
+ </td>
+ </tr>
+ </tbody>
+</table>
17 years, 8 months
rhmessaging commits: r2381 - mgmt/trunk/cumin/resources.
by rhmessaging-commits@lists.jboss.org
Author: eallen
Date: 2008-09-02 14:19:54 -0400 (Tue, 02 Sep 2008)
New Revision: 2381
Modified:
mgmt/trunk/cumin/resources/documentation.css
mgmt/trunk/cumin/resources/help.html
Log:
Help for Edit job Ads
Modified: mgmt/trunk/cumin/resources/documentation.css
===================================================================
--- mgmt/trunk/cumin/resources/documentation.css 2008-09-02 18:19:14 UTC (rev 2380)
+++ mgmt/trunk/cumin/resources/documentation.css 2008-09-02 18:19:54 UTC (rev 2381)
@@ -209,3 +209,20 @@
.author, .editor, .translator, .othercredit{display:block;}
ul li p:last-child{margin-bottom:0em; padding-bottom:0em;}
+
+
+div.inline_help span.edit_string {
+ border: 1px solid #CCCCCC;
+}
+div.inline_help span.edit_number {
+ border: 1px dashed #66CCFF;
+}
+div.inline_help span.numeric_error {
+ border: 1px dashed #FF0000;
+}
+
+div.inline_help div.error {
+ color: #FF0000;
+ font-size: 0.9em;
+}
+
Modified: mgmt/trunk/cumin/resources/help.html
===================================================================
--- mgmt/trunk/cumin/resources/help.html 2008-09-02 18:19:14 UTC (rev 2380)
+++ mgmt/trunk/cumin/resources/help.html 2008-09-02 18:19:54 UTC (rev 2381)
@@ -193,7 +193,44 @@
</li>
</ul>
+ <div class="titlepage">
+ <a name="main.pool.job.editads.help"/>
+ <h3 class="title">Edit Job Attributes</h3>
+ </div>
+ <p>
+ There are three types of job attributes that can be edited:
+ <dl>
+ <dt>Boolean</dt>
+ <dd>Choose between <input type="radio" id="true" value="true" name="tf" checked="checked" /><label for="true">TRUE</label> and <input type="radio" id="false" value="false" name="tf"/><label for="false">FALSE</label>.</dd>
+
+ <dt>Number</dt>
+ <dd><div class="inline_help">Enter any <span class="edit_number">numeric value</span>.
+ Numeric fields are surround by a dashed blue box.
+ <p>
+ If a <span class="numeric_error">non-numeric value</span> is entered in a numeric field, the
+ surrounding box changes to red dashes and an error message is displayed.<br/>
+ <br/>
+ <em>A blank value in a numeric field is considered an error.</em>
+ </p></div>
+ </dd>
+
+ <dt>Text</dt>
+ <dd><div class="inline_help"><span class="edit_string">Enter any sequence of numbers or characters.</span></div>
+ Text fields are surround by a light grey box.
+ <p>If the initial value of a text field is longer than forty characters, a larger input box is provided.</p>
+ </dd>
+ </dl>
+ </p>
+<ul class="docnav">
+ <li class="up">
+ <a accesskey="u" href="#top">
+ <strong>Help Index</strong>
+ </a>
+ </li>
+</ul>
+
+
</div><!-- section -->
<div style="height:1000px;"><!-- --></div>
17 years, 8 months
rhmessaging commits: r2380 - mgmt/trunk/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2008-09-02 14:19:14 -0400 (Tue, 02 Sep 2008)
New Revision: 2380
Modified:
mgmt/trunk/cumin/python/cumin/scheduler.py
mgmt/trunk/cumin/python/cumin/scheduler.strings
Log:
Add scripting for live updates
Modified: mgmt/trunk/cumin/python/cumin/scheduler.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/scheduler.py 2008-09-02 18:09:39 UTC (rev 2379)
+++ mgmt/trunk/cumin/python/cumin/scheduler.py 2008-09-02 18:19:14 UTC (rev 2380)
@@ -64,6 +64,10 @@
details = CuminDetails(app, "details")
self.__tabs.add_tab(details)
+ def render_script(self, session, sched):
+ data = "model.xml?class=scheduler;id=%i" % sched.id
+ return "wooly.setIntervalUpdate('%s', updateScheduler, 3000)" % data
+
class SchedulerStatus(CuminStatus):
pass
Modified: mgmt/trunk/cumin/python/cumin/scheduler.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/scheduler.strings 2008-09-02 18:09:39 UTC (rev 2379)
+++ mgmt/trunk/cumin/python/cumin/scheduler.strings 2008-09-02 18:19:14 UTC (rev 2380)
@@ -7,6 +7,23 @@
[SchedulerSet.count_sql]
select count(*) from scheduler
+[SchedulerView.javascript]
+function updateScheduler(data) {
+ var model = data.objectify();
+ var scheds = model.scheduler;
+ var sched;
+
+ for (var key in scheds) {
+ sched = scheds[key];
+ break;
+ }
+
+ cumin.runModelListeners(model);
+ cumin.runObjectListeners(sched);
+
+ //throw new Error();
+}
+
[SchedulerStats.html]
<table class="twocol">
<tbody>
17 years, 8 months
rhmessaging commits: r2379 - mgmt/trunk/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2008-09-02 14:09:39 -0400 (Tue, 02 Sep 2008)
New Revision: 2379
Modified:
mgmt/trunk/cumin/python/cumin/model.py
mgmt/trunk/cumin/python/cumin/scheduler.py
mgmt/trunk/cumin/python/cumin/scheduler.strings
Log:
Add a users chart to the scheduler stats; reorder sched stats to correspond to the charts, roughly
Modified: mgmt/trunk/cumin/python/cumin/model.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/model.py 2008-09-02 17:45:14 UTC (rev 2378)
+++ mgmt/trunk/cumin/python/cumin/model.py 2008-09-02 18:09:39 UTC (rev 2379)
@@ -1451,25 +1451,26 @@
prop = CuminProperty(self, "Machine")
prop.title = "Machine"
+ prop.summary = True
stat = CuminStat(self, "NumUsers")
stat.title = "Users"
- stat = CuminStat(self, "TotalHeldJobs")
- stat.title = "Held Jobs"
+ stat = CuminStat(self, "TotalRunningJobs")
+ stat.title = "Running Jobs"
stat = CuminStat(self, "TotalIdleJobs")
stat.title = "Idle Jobs"
+ stat = CuminStat(self, "TotalHeldJobs")
+ stat.title = "Held Jobs"
+
stat = CuminStat(self, "TotalJobAds")
stat.title = "Job Ads"
stat = CuminStat(self, "TotalRemovedJobs")
stat.title = "Removed Jobs"
- stat = CuminStat(self, "TotalRunningJobs")
- stat.title = "Running Jobs"
-
def get_title(self, session):
return "Scheduler"
Modified: mgmt/trunk/cumin/python/cumin/scheduler.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/scheduler.py 2008-09-02 17:45:14 UTC (rev 2378)
+++ mgmt/trunk/cumin/python/cumin/scheduler.py 2008-09-02 18:09:39 UTC (rev 2379)
@@ -74,17 +74,30 @@
stats = StatSet(app, "general", "general")
self.add_child(stats)
- chart = self.RunningJobsChart(app, "jobs")
+ chart = self.UsersChart(app, "users")
self.add_child(chart)
+ chart = self.JobsChart(app, "jobs")
+ self.add_child(chart)
+
def render_title(self, session):
return "Statistics"
- class RunningJobsChart(StatValueChart):
+ class UsersChart(StatValueChart):
def __init__(self, app, name):
- super(SchedulerStats.RunningJobsChart, self).__init__(app, name)
+ super(SchedulerStats.UsersChart, self).__init__(app, name)
- self.stats = ("TotalRunningJobs",)
+ self.stats = ("NumUsers",)
def render_title(self, session, sched):
- return "Running Jobs"
+ return "Users"
+
+ class JobsChart(StatValueChart):
+ def __init__(self, app, name):
+ super(SchedulerStats.JobsChart, self).__init__ \
+ (app, name)
+
+ self.stats = ("TotalRunningJobs", "TotalIdleJobs", "TotalHeldJobs")
+
+ def render_title(self, session, sched):
+ return "Jobs"
Modified: mgmt/trunk/cumin/python/cumin/scheduler.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/scheduler.strings 2008-09-02 17:45:14 UTC (rev 2378)
+++ mgmt/trunk/cumin/python/cumin/scheduler.strings 2008-09-02 18:09:39 UTC (rev 2379)
@@ -16,6 +16,7 @@
{general}
</td>
<td>
+ {users}
{jobs}
</td>
</tr>
17 years, 8 months
rhmessaging commits: r2378 - mgmt/trunk/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2008-09-02 13:45:14 -0400 (Tue, 02 Sep 2008)
New Revision: 2378
Modified:
mgmt/trunk/cumin/python/cumin/model.py
mgmt/trunk/cumin/python/cumin/scheduler.py
mgmt/trunk/cumin/python/cumin/scheduler.strings
Log:
Add scheduler stats
Modified: mgmt/trunk/cumin/python/cumin/model.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/model.py 2008-09-02 15:38:17 UTC (rev 2377)
+++ mgmt/trunk/cumin/python/cumin/model.py 2008-09-02 17:45:14 UTC (rev 2378)
@@ -1452,6 +1452,24 @@
prop = CuminProperty(self, "Machine")
prop.title = "Machine"
+ stat = CuminStat(self, "NumUsers")
+ stat.title = "Users"
+
+ stat = CuminStat(self, "TotalHeldJobs")
+ stat.title = "Held Jobs"
+
+ stat = CuminStat(self, "TotalIdleJobs")
+ stat.title = "Idle Jobs"
+
+ stat = CuminStat(self, "TotalJobAds")
+ stat.title = "Job Ads"
+
+ stat = CuminStat(self, "TotalRemovedJobs")
+ stat.title = "Removed Jobs"
+
+ stat = CuminStat(self, "TotalRunningJobs")
+ stat.title = "Running Jobs"
+
def get_title(self, session):
return "Scheduler"
Modified: mgmt/trunk/cumin/python/cumin/scheduler.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/scheduler.py 2008-09-02 15:38:17 UTC (rev 2377)
+++ mgmt/trunk/cumin/python/cumin/scheduler.py 2008-09-02 17:45:14 UTC (rev 2378)
@@ -58,8 +58,33 @@
self.__tabs = TabbedModeSet(app, "tabs")
self.add_child(self.__tabs)
+ stats = SchedulerStats(app, "stats")
+ self.__tabs.add_tab(stats)
+
details = CuminDetails(app, "details")
self.__tabs.add_tab(details)
class SchedulerStatus(CuminStatus):
pass
+
+class SchedulerStats(Widget):
+ def __init__(self, app, name):
+ super(SchedulerStats, self).__init__(app, name)
+
+ stats = StatSet(app, "general", "general")
+ self.add_child(stats)
+
+ chart = self.RunningJobsChart(app, "jobs")
+ self.add_child(chart)
+
+ def render_title(self, session):
+ return "Statistics"
+
+ class RunningJobsChart(StatValueChart):
+ def __init__(self, app, name):
+ super(SchedulerStats.RunningJobsChart, self).__init__(app, name)
+
+ self.stats = ("TotalRunningJobs",)
+
+ def render_title(self, session, sched):
+ return "Running Jobs"
Modified: mgmt/trunk/cumin/python/cumin/scheduler.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/scheduler.strings 2008-09-02 15:38:17 UTC (rev 2377)
+++ mgmt/trunk/cumin/python/cumin/scheduler.strings 2008-09-02 17:45:14 UTC (rev 2378)
@@ -6,3 +6,18 @@
[SchedulerSet.count_sql]
select count(*) from scheduler
+
+[SchedulerStats.html]
+<table class="twocol">
+ <tbody>
+ <tr>
+ <td>
+ <h2>General</h2>
+ {general}
+ </td>
+ <td>
+ {jobs}
+ </td>
+ </tr>
+ </tbody>
+</table>
17 years, 8 months
rhmessaging commits: r2377 - store/branches/java/broker-queue-refactor/java/bdbstore.
by rhmessaging-commits@lists.jboss.org
Author: ritchiem
Date: 2008-09-02 11:38:17 -0400 (Tue, 02 Sep 2008)
New Revision: 2377
Modified:
store/branches/java/broker-queue-refactor/java/bdbstore/build.xml
Log:
RHM-6 : Corrected bug in the jar target.
Modified: store/branches/java/broker-queue-refactor/java/bdbstore/build.xml
===================================================================
--- store/branches/java/broker-queue-refactor/java/bdbstore/build.xml 2008-09-02 15:37:33 UTC (rev 2376)
+++ store/branches/java/broker-queue-refactor/java/bdbstore/build.xml 2008-09-02 15:38:17 UTC (rev 2377)
@@ -74,7 +74,7 @@
<target name="jar" depends="build">
<jar destfile="build/qpid-bdbstore.jar" basedir="${build.classes}"/>
- <jar destfile="build/qpid-tools.jar" basedir="${build.tools.dir}"/>
+ <jar destfile="build/qpid-tools.jar" basedir="${build.tools.classes}"/>
</target>
<target name="test" depends="build-tests" if="src.test.dir.exists"
17 years, 8 months
rhmessaging commits: r2376 - mgmt/trunk/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2008-09-02 11:37:33 -0400 (Tue, 02 Sep 2008)
New Revision: 2376
Modified:
mgmt/trunk/cumin/python/cumin/model.py
mgmt/trunk/cumin/python/cumin/scheduler.py
Log:
Add properties to schedulers; pass None down from CuminProperty rather than formatting it
Modified: mgmt/trunk/cumin/python/cumin/model.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/model.py 2008-09-02 15:36:42 UTC (rev 2375)
+++ mgmt/trunk/cumin/python/cumin/model.py 2008-09-02 15:37:33 UTC (rev 2376)
@@ -122,9 +122,6 @@
if isinstance(value, datetime):
value = fmt_datetime(value)
- if value is None:
- value = fmt_none()
-
return value
class CuminAction(object):
@@ -1437,6 +1434,24 @@
super(CuminScheduler, self).__init__(model, "scheduler",
Scheduler, SchedulerStats)
+ prop = CuminProperty(self, "Name")
+ prop.title = "Name"
+
+ prop = CuminProperty(self, "JobQueueBirthdate")
+ prop.title = "Job Queue Birthdate"
+
+ prop = CuminProperty(self, "MaxJobsRunning")
+ prop.title = "Max Jobs Running"
+
+ prop = CuminProperty(self, "MyAddress")
+ prop.title = "Contact Address"
+
+ prop = CuminProperty(self, "PublicNetworkIpAddr")
+ prop.title = "Public IP Address"
+
+ prop = CuminProperty(self, "Machine")
+ prop.title = "Machine"
+
def get_title(self, session):
return "Scheduler"
Modified: mgmt/trunk/cumin/python/cumin/scheduler.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/scheduler.py 2008-09-02 15:36:42 UTC (rev 2375)
+++ mgmt/trunk/cumin/python/cumin/scheduler.py 2008-09-02 15:37:33 UTC (rev 2376)
@@ -58,5 +58,8 @@
self.__tabs = TabbedModeSet(app, "tabs")
self.add_child(self.__tabs)
+ details = CuminDetails(app, "details")
+ self.__tabs.add_tab(details)
+
class SchedulerStatus(CuminStatus):
pass
17 years, 8 months