Author: justi9
Date: 2008-12-09 16:17:25 -0500 (Tue, 09 Dec 2008)
New Revision: 2956
Modified:
mgmt/trunk/cumin/python/cumin/broker.py
mgmt/trunk/cumin/python/cumin/job.py
mgmt/trunk/cumin/python/cumin/job.strings
mgmt/trunk/cumin/python/cumin/page.py
mgmt/trunk/cumin/python/cumin/page.strings
mgmt/trunk/cumin/python/cumin/queue.py
mgmt/trunk/cumin/python/cumin/queue.strings
mgmt/trunk/cumin/python/cumin/system.py
mgmt/trunk/cumin/python/cumin/system.strings
mgmt/trunk/cumin/python/cumin/widgets.py
mgmt/trunk/cumin/python/cumin/widgets.strings
Log:
Fill in the overview screen with 'top 5' lists of notable objects
Modified: mgmt/trunk/cumin/python/cumin/broker.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/broker.py 2008-12-09 20:44:04 UTC (rev 2955)
+++ mgmt/trunk/cumin/python/cumin/broker.py 2008-12-09 21:17:25 UTC (rev 2956)
@@ -120,6 +120,23 @@
return link
+class TopBrokerSet(CuminTable):
+ def __init__(self, app, name):
+ super(TopBrokerSet, self).__init__(app, name)
+
+ col = self.NameColumn(app, "name")
+ self.add_column(col)
+ self.set_default_column(col)
+
+ class NameColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Name"
+
+ def render_content(self, session, data):
+ reg = Identifiable(data["id"])
+ href = self.page.main.broker.get_href(session, reg)
+ return fmt_link(href, fmt_shorten(data["name"]))
+
class BrokerFrame(CuminFrame):
def __init__(self, app, name):
super(BrokerFrame, self).__init__(app, name)
Modified: mgmt/trunk/cumin/python/cumin/job.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/job.py 2008-12-09 20:44:04 UTC (rev 2955)
+++ mgmt/trunk/cumin/python/cumin/job.py 2008-12-09 21:17:25 UTC (rev 2956)
@@ -5,6 +5,7 @@
from wooly.forms import *
from wooly.resources import *
from wooly.tables import *
+from time import clock
from stat import *
from widgets import *
@@ -198,6 +199,36 @@
def render_title(self, session, data):
return "Title"
+class TopJobSet(TopTable):
+ def __init__(self, app, name):
+ super(TopJobSet, self).__init__(app, name)
+
+ col = self.NameColumn(app, "name")
+ self.add_column(col)
+
+ self.set_default_column(col)
+
+ col = self.DurationColumn(app, "name")
+ col.alignment = "right"
+ self.add_column(col)
+
+ class NameColumn(TopTableColumn):
+ def render_title(self, session, data):
+ return "Name"
+
+ def render_content(self, session, data):
+ job = Identifiable(data["id"])
+ href = self.page.main.pool.job.get_href(session, job)
+ return fmt_link(href, fmt_shorten(data["name"]))
+
+ class DurationColumn(TopTableColumn):
+ def render_title(self, session, data):
+ return "Duration"
+
+ def render_content(self, session, data):
+ since = data["q_date"]
+ return fmt_duration(clock() - secs(since))
+
class JobTab(JobSet):
def __init__(self, app, name):
super(JobTab, self).__init__(app, name)
Modified: mgmt/trunk/cumin/python/cumin/job.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/job.strings 2008-12-09 20:44:04 UTC (rev 2955)
+++ mgmt/trunk/cumin/python/cumin/job.strings 2008-12-09 21:17:25 UTC (rev 2956)
@@ -44,6 +44,20 @@
inner join submitter as b on b.id = j.submitter_id
{sql_where}
+[TopJobSet.sql]
+select
+ j.id,
+ j.custom_id as name,
+ j.q_date
+from job as j
+where j.job_status = 2
+ and j.qmf_update_time > now() - interval '60 seconds'
+order by j.q_date asc
+limit 5
+
+[TopJobSet.count_sql]
+--
+
[JobTab.css]
input.search_input {
color: #555;
Modified: mgmt/trunk/cumin/python/cumin/page.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/page.py 2008-12-09 20:44:04 UTC (rev 2955)
+++ mgmt/trunk/cumin/python/cumin/page.py 2008-12-09 21:17:25 UTC (rev 2956)
@@ -254,6 +254,18 @@
return "MRG Management"
class OverviewTab(Widget):
+ def __init__(self, app, name):
+ super(HomeView.OverviewTab, self).__init__(app, name)
+
+ queues = TopQueueSet(app, "queues")
+ self.add_child(queues)
+
+ jobs = TopJobSet(app, "jobs")
+ self.add_child(jobs)
+
+ systems = TopSystemSet(app, "systems")
+ self.add_child(systems)
+
def render_title(self, session):
return "Overview"
Modified: mgmt/trunk/cumin/python/cumin/page.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/page.strings 2008-12-09 20:44:04 UTC (rev 2955)
+++ mgmt/trunk/cumin/python/cumin/page.strings 2008-12-09 21:17:25 UTC (rev 2956)
@@ -184,11 +184,51 @@
<div class="TabbedModeSet mode">{mode}</div>
</div>
+[OverviewTab.css]
+table.OverviewTab {
+ width: 100%;
+}
+
+table.OverviewTab > tbody > tr > td {
+ width: 50%;
+ vertical-align: top;
+}
+
+table.OverviewTab h2 img {
+ vertical-align: -15%;
+ margin: 0 0.2em 0 0;
+}
+
[OverviewTab.html]
<ul class="actions">
<li><a class="nav" href="{add_qmf_source_href}">Add
Management Data Source</a></li>
</ul>
+<table class="OverviewTab">
+ <tbody>
+ <tr>
+ <td>
+ <h2><img src="resource?name=queue-20.png"/> Busiest Message
Queues</h2>
+
+ <div class="iblock">{queues}</div>
+ </td>
+ <td>
+ <h2><img src="resource?name=job-20.png"/> Longest Running
Grid Jobs</h2>
+ <div class="iblock">{jobs}</div>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <h2><img src="resource?name=system-20.png"/> Busiest
Systems</h2>
+
+ <div class="iblock">{systems}</div>
+ </td>
+ <td>
+ </td>
+ </tr>
+ </tbody>
+</table>
+
[AccountTab.html]
<ul class="actions">
<a class="nav" href="{change_password_href}">Change
Password</a>
Modified: mgmt/trunk/cumin/python/cumin/queue.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/queue.py 2008-12-09 20:44:04 UTC (rev 2955)
+++ mgmt/trunk/cumin/python/cumin/queue.py 2008-12-09 21:17:25 UTC (rev 2956)
@@ -164,6 +164,35 @@
unit = self.parent.unit.get(session)
return unit == "b" and "bdepth" or "mdepth"
+class TopQueueSet(TopTable):
+ def __init__(self, app, name):
+ super(TopQueueSet, self).__init__(app, name)
+
+ col = self.NameColumn(app, "name")
+ self.add_column(col)
+
+ self.set_default_column(col)
+
+ col = self.EnqueuesColumn(app, "enqueues")
+ col.alignment = "right"
+ self.add_column(col)
+
+ class NameColumn(TopTableColumn):
+ def render_title(self, session, data):
+ return "Name"
+
+ def render_content(self, session, data):
+ queue = Identifiable(data["id"])
+ href = self.page.main.broker.queue.get_href(session, queue)
+ return fmt_link(href, fmt_shorten(data["name"]))
+
+ class EnqueuesColumn(TopTableColumn):
+ def render_title(self, session, data):
+ return "Recent Enqueues"
+
+ def render_content(self, session, data):
+ return int(data["avg_enqueues"])
+
class QueueFrame(CuminFrame):
def __init__(self, app, name):
super(QueueFrame, self).__init__(app, name)
Modified: mgmt/trunk/cumin/python/cumin/queue.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/queue.strings 2008-12-09 20:44:04 UTC (rev 2955)
+++ mgmt/trunk/cumin/python/cumin/queue.strings 2008-12-09 21:17:25 UTC (rev 2956)
@@ -63,6 +63,21 @@
<div>{hidden_inputs}</div>
</form>
+[TopQueueSet.sql]
+select
+ q.id,
+ q.name,
+ avg(s.msg_total_enqueues) as avg_enqueues
+from queue as q
+join queue_stats as s on s.queue_id = q.id
+where s.qmf_update_time > now() - interval '10 minutes'
+group by q.id, q.name
+order by avg_enqueues desc
+limit 5
+
+[TopQueueSet.count_sql]
+--
+
[QueueStatus.javascript]
function updateQueueStatus(id, queue) {
updateStatus(id, queue);
Modified: mgmt/trunk/cumin/python/cumin/system.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/system.py 2008-12-09 20:44:04 UTC (rev 2955)
+++ mgmt/trunk/cumin/python/cumin/system.py 2008-12-09 21:17:25 UTC (rev 2956)
@@ -33,6 +33,35 @@
href = self.page.main.system.get_href(session, system)
return fmt_link(href, fmt_shorten(data["name"]))
+class TopSystemSet(TopTable):
+ def __init__(self, app, name):
+ super(TopSystemSet, self).__init__(app, name)
+
+ col = self.NameColumn(app, "name")
+ self.add_column(col)
+
+ self.set_default_column(col)
+
+ col = self.LoadColumn(app, "load")
+ col.alignment = "right"
+ self.add_column(col)
+
+ class NameColumn(TopTableColumn):
+ def render_title(self, session, data):
+ return "Name"
+
+ def render_content(self, session, data):
+ system = Identifiable(data["id"])
+ href = self.page.main.system.get_href(session, system)
+ return fmt_link(href, fmt_shorten(data["name"]))
+
+ class LoadColumn(TopTableColumn):
+ def render_title(self, session, data):
+ return "Load Average"
+
+ def render_content(self, session, data):
+ return "%0.3f" % data["load_avg"]
+
class SystemFrame(CuminFrame):
def __init__(self, app, name):
super(SystemFrame, self).__init__(app, name)
Modified: mgmt/trunk/cumin/python/cumin/system.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/system.strings 2008-12-09 20:44:04 UTC (rev 2955)
+++ mgmt/trunk/cumin/python/cumin/system.strings 2008-12-09 21:17:25 UTC (rev 2956)
@@ -24,6 +24,19 @@
<div>{hidden_inputs}</div>
</form>
+[TopSystemSet.sql]
+select
+ s.id,
+ s.node_name as name,
+ c.load_average1_min as load_avg
+from sysimage s
+join sysimage_stats as c on s.stats_curr_id = c.id
+order by load_avg desc
+limit 5
+
+[TopSystemSet.count_sql]
+--
+
[SlotUtilizationGrid.javascript]
function got_slot_grid(obj, id) {
for (var cell in obj.slots.slot) {
Modified: mgmt/trunk/cumin/python/cumin/widgets.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/widgets.py 2008-12-09 20:44:04 UTC (rev 2955)
+++ mgmt/trunk/cumin/python/cumin/widgets.py 2008-12-09 21:17:25 UTC (rev 2956)
@@ -643,6 +643,36 @@
return fmt_link("", title, class_, link_title=hover, bm=bm,
click=click)
+class TopTableColumn(SqlTableColumn):
+ def __init__(self, app, name):
+ super(TopTableColumn, self).__init__(app, name)
+
+ self.header_class = TopTableColumnHeader
+
+class TopTableColumnHeader(ItemTableColumnHeader):
+ pass
+
+class TopTable(SqlTable):
+ def __init__(self, app, name):
+ super(TopTable, self).__init__(app, name)
+
+ col = self.CountColumn(app, "name")
+ col.alignment = "right"
+ self.add_column(col)
+
+ self.count = Attribute(app, "count")
+ self.count.default = 1
+ self.add_attribute(self.count)
+
+ def get_connection(self, session):
+ return sqlhub.getConnection().getConnection()
+
+ class CountColumn(TopTableColumn):
+ def render_content(self, session, data):
+ count = self.parent.count.get(session)
+ self.parent.count.set(session, count + 1)
+ return count
+
class CuminTable(SqlTable):
def __init__(self, app, name):
super(CuminTable, self).__init__(app, name)
Modified: mgmt/trunk/cumin/python/cumin/widgets.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/widgets.strings 2008-12-09 20:44:04 UTC (rev 2955)
+++ mgmt/trunk/cumin/python/cumin/widgets.strings 2008-12-09 21:17:25 UTC (rev 2956)
@@ -924,6 +924,44 @@
[EditablePropertyRenderer.orig_html]
<input type="hidden" name="{porig_name}"
value="{porig_value}"/>
+[TopTable.css]
+table.TopTable {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 0;
+}
+
+table.TopTable tr {
+ border-top: 1px dotted #ccc;
+ vertical-align: top;
+}
+
+table.TopTable td {
+ padding: 0.35em 0.5em;
+}
+
+table.TopTable th {
+ padding: 0.35em 0.5em;
+ text-align: left;
+ font-weight: normal;
+ font-style: italic;
+ color: #444;
+ font-size: 0.9em;
+}
+
+table.TopTable th.ralign {
+ text-align: right;
+}
+
+[TopTable.html]
+<table class="TopTable">
+ <thead><tr>{headers}</tr></thead>
+ <tbody>{items}</tbody>
+</table>
+
+[TopTableColumnHeader.html]
+<th {class_attr}>{content}</th>
+
[CuminTable.css]
table.mobjects th.setnav {
font-size: 0.9em;