[rhmessaging-commits] rhmessaging commits: r3651 - in mgmt/trunk/cumin/python/cumin: usergrid and 1 other directory.
rhmessaging-commits at lists.jboss.org
rhmessaging-commits at lists.jboss.org
Mon Sep 28 14:44:17 EDT 2009
Author: justi9
Date: 2009-09-28 14:44:17 -0400 (Mon, 28 Sep 2009)
New Revision: 3651
Added:
mgmt/trunk/cumin/python/cumin/usergrid/model.py
mgmt/trunk/cumin/python/cumin/usergrid/model.strings
Modified:
mgmt/trunk/cumin/python/cumin/model.py
mgmt/trunk/cumin/python/cumin/stat.py
mgmt/trunk/cumin/python/cumin/stat.strings
mgmt/trunk/cumin/python/cumin/usergrid/widgets.py
mgmt/trunk/cumin/python/cumin/usergrid/widgets.strings
Log:
* Introduce a new stat widget that can handle queried data rather
than only data from sqlobject data
* Likewise, introduce a statistic object to the metadata that can
handle queried data
* Add stats tables to the usergrid overview
Modified: mgmt/trunk/cumin/python/cumin/model.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/model.py 2009-09-28 17:28:24 UTC (rev 3650)
+++ mgmt/trunk/cumin/python/cumin/model.py 2009-09-28 18:44:17 UTC (rev 3651)
@@ -770,6 +770,24 @@
writer.write("<stat name=\"%s\" value=\"%s\" rate=\"%s\"/>" \
% (self.name, value, rate))
+class CuminStatistic(object):
+ formatters = {
+ None: lambda x: fmt_none(),
+ float: lambda x: "%0.2d" % x
+ }
+
+ def __init__(self, name):
+ self.name = name
+
+ def get_title(self, session):
+ return self.name
+
+ def format_value(self, session, value):
+ try:
+ return self.formatters[type(value)](value)
+ except KeyError:
+ return value
+
class CuminClass(object):
def __init__(self, model, name, mint_class):
self.model = model
Modified: mgmt/trunk/cumin/python/cumin/stat.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/stat.py 2009-09-28 17:28:24 UTC (rev 3650)
+++ mgmt/trunk/cumin/python/cumin/stat.py 2009-09-28 18:44:17 UTC (rev 3651)
@@ -66,6 +66,38 @@
return stat.rate_html(object)
+class NewStatSet(ItemSet):
+ def __init__(self, app, name):
+ super(NewStatSet, self).__init__(app, name)
+
+ self.stats = list()
+ self.update_enabled = True
+
+ def render_rate_text(self, session):
+ return "Per second"
+
+ def get_values(self, session):
+ return list()
+
+ def do_get_items(self, session):
+ items = list()
+
+ values = self.get_values(session)
+
+ return zip(self.stats, values)
+
+ def render_item_title(self, session, item):
+ stat, value = item
+ return stat.get_title(session)
+
+ def render_item_name(self, session, item):
+ stat, value = item
+ return stat.name
+
+ def render_item_value(self, session, item):
+ stat, value = item
+ return stat.format_value(session, value)
+
class DurationSwitch(StateSwitch):
def __init__(self, app, name):
super(DurationSwitch, self).__init__(app, name)
Modified: mgmt/trunk/cumin/python/cumin/stat.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/stat.strings 2009-09-28 17:28:24 UTC (rev 3650)
+++ mgmt/trunk/cumin/python/cumin/stat.strings 2009-09-28 18:44:17 UTC (rev 3651)
@@ -53,6 +53,61 @@
<td class="ralign"> {item_rate}</td>
</tr>
+[NewStatSet.css]
+table.NewStatSet {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 1em 0;
+}
+
+table.NewStatSet tr {
+ border-top: 1px dotted #ccc;
+}
+
+table.NewStatSet td, table.NewStatSet th {
+ padding: 0.35em 0.5em;
+ font-weight: normal;
+}
+
+table.NewStatSet th {
+ color: #444;
+}
+
+table.NewStatSet thead th {
+ font-style: italic;
+ font-size: 0.9em;
+ text-align: right;
+}
+
+table.NewStatSet tbody th {
+ text-align: left;
+}
+
+table.NewStatSet td {
+ text-align: right;
+}
+
+[NewStatSet.html]
+<table id="{id}" class="NewStatSet">
+ <col style="width: 50%; text-align: left"/>
+ <col style="width: 50%"/>
+ <thead>
+ <tr>
+ <th style="text-align: left">Statistic</th>
+ <th>Value</th>
+ </tr>
+ </thead>
+ <tbody>
+ {items}
+ </tbody>
+</table>
+
+[NewStatSet.item_html]
+<tr class="item">
+ <th>{item_title}</th>
+ <td class="ralign"> {item_value}</td>
+</tr>
+
[StatValueChart.css]
div.StatValueChart {
font-size: 0.9em;
@@ -73,6 +128,7 @@
div.StatValueChart object {
margin: 0 0 0 1em;
}
+
div.StatValueChart img.Loading {
opacity: 0.5;
cursor: wait;
Added: mgmt/trunk/cumin/python/cumin/usergrid/model.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/usergrid/model.py (rev 0)
+++ mgmt/trunk/cumin/python/cumin/usergrid/model.py 2009-09-28 18:44:17 UTC (rev 3651)
@@ -0,0 +1,37 @@
+from wooly.sql import *
+
+strings = StringCatalog(__file__)
+
+class Object(object):
+ pass
+
+class UserSqlOperation(SqlOperation):
+ def __init__(self, app, user):
+ super(UserSqlOperation, self).__init__(app)
+
+ self.user = user
+
+ def render_user_name(self, session):
+ return self.user.get(session).name
+
+ def get_connection(self, session):
+ return self.app.model.get_sql_connection()
+
+ def get_object(self, session):
+ cursor = self.execute(session)
+
+ record = cursor.fetchone()
+ description = cursor.description
+
+ obj = Object()
+
+ for value, metadata in zip(record, description):
+ setattr(obj, metadata[0], value)
+
+ return obj
+
+class LoadUserJobStats(UserSqlOperation):
+ pass
+
+class LoadUserSlotStats(UserSqlOperation):
+ pass
Added: mgmt/trunk/cumin/python/cumin/usergrid/model.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/usergrid/model.strings (rev 0)
+++ mgmt/trunk/cumin/python/cumin/usergrid/model.strings 2009-09-28 18:44:17 UTC (rev 3651)
@@ -0,0 +1,23 @@
+[LoadUserJobStats.sql]
+select
+ sum(c.running + c.idle + c.removed + c.held + c.completed) as total,
+ sum(c.running) as running,
+ sum(c.idle) as idle,
+ sum(c.removed) as removed,
+ sum(c.held) as held,
+ sum(c.completed) as completed
+from submission as s
+left outer join submission_stats as c on c.id = s.stats_curr_id
+
+[xxx]
+where s.submitter like '{user_name}@%'
+
+[LoadUserSlotStats.sql]
+select
+ count(*) as total,
+ count(case c.activity when 'Busy' then 1 end) as busy,
+ count(case c.activity when 'Idle' then 1 end) as idle,
+ count(case c.activity when 'Suspended' then 1 end) as suspended
+from slot as s
+left outer join slot_stats as c on c.id = s.stats_curr_id
+where s.remote_owner like '{user_name}@%'
Modified: mgmt/trunk/cumin/python/cumin/usergrid/widgets.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/usergrid/widgets.py 2009-09-28 17:28:24 UTC (rev 3650)
+++ mgmt/trunk/cumin/python/cumin/usergrid/widgets.py 2009-09-28 18:44:17 UTC (rev 3651)
@@ -3,6 +3,7 @@
import cumin.grid
+from cumin.model import CuminStatistic
from cumin.parameters import *
from cumin.widgets import *
from cumin.util import *
@@ -11,6 +12,7 @@
from wooly.widgets import Link
+from model import *
from widgets import *
strings = StringCatalog(__file__)
@@ -19,7 +21,7 @@
def __init__(self, app, name):
super(MainPage, self).__init__(app, name)
- self.main = MainView(app, "main")
+ self.main = MainView(app, "main", self.user)
self.add_mode(self.main)
self.set_default_frame(self.main)
@@ -27,26 +29,54 @@
return "User Grid"
class MainView(CuminMainView):
- def __init__(self, app, name):
+ def __init__(self, app, name, user):
super(MainView, self).__init__(app, name)
- self.overview = OverviewFrame(app, "overview")
+ self.overview = OverviewFrame(app, "overview", user)
self.add_tab(self.overview)
- self.submissions = UserSubmissionSet(app, "submissions")
+ self.submissions = UserSubmissionSet(app, "submissions", user)
self.add_tab(self.submissions)
- self.slots = UserSlotSet(app, "slots")
+ self.slots = UserSlotSet(app, "slots", user)
self.add_tab(self.slots)
-class OverviewFrame(Widget):
+class OverviewFrame(CuminFrame):
+ def __init__(self, app, name, user):
+ super(OverviewFrame, self).__init__(app, name)
+
+ self.view = OverviewView(app, "view", user)
+ self.add_mode(self.view)
+
def render_title(self, session):
return "Overview"
+class OverviewView(Widget):
+ def __init__(self, app, name, user):
+ super(OverviewView, self).__init__(app, name)
+
+ heading = self.Heading(app, "heading")
+ self.add_child(heading)
+
+ self.stats = UserJobStatSet(self.app, "jobs", user)
+ self.add_child(self.stats)
+
+ self.stats = UserSlotStatSet(self.app, "slots", user)
+ self.add_child(self.stats)
+
+ class Heading(CuminHeading):
+ def render_title(self, session):
+ return "Overview"
+
+ def render_icon_href(self, session):
+ return "resource?name=action-36.png"
+
class UserSubmissionSet(SubmissionSet):
- def __init__(self, app, name):
+ def __init__(self, app, name, user):
super(UserSubmissionSet, self).__init__(app, name)
+ self.user = user
+
self.scheduler_col.visible = False
self.submitter_col.visible = False
@@ -62,9 +92,102 @@
return {"name": user.name}
class UserSlotSet(SlotSet):
+ def __init__(self, app, name, user):
+ super(UserSlotSet, self).__init__(app, name)
+
+ self.user = user
+
def render_sql_where(self, session):
return "where s.remote_user like %(name)s"
def get_sql_values(self, session):
- user = self.page.user.get(session)
- return {"name": "%s%%" % user.name}
+ user = self.user.get(session)
+ return {"name": "%s@%%" % user.name}
+
+class UserJobStatSet(NewStatSet):
+ def __init__(self, app, name, user):
+ super(UserJobStatSet, self).__init__(app, name)
+
+ stat = self.TotalJobs("total")
+ self.stats.append(stat)
+
+ stat = self.RunningJobs("running")
+ self.stats.append(stat)
+
+ stat = self.IdleJobs("idle")
+ self.stats.append(stat)
+
+ stat = self.RemovedJobs("removed")
+ self.stats.append(stat)
+
+ stat = self.HeldJobs("held")
+ self.stats.append(stat)
+
+ stat = self.CompletedJobs("completed")
+ self.stats.append(stat)
+
+ self.load = LoadUserJobStats(app, user)
+
+ def get_values(self, session):
+ return self.load.execute(session).fetchone()
+
+ class TotalJobs(CuminStatistic):
+ def get_title(self, session):
+ return "Total"
+
+ class RunningJobs(CuminStatistic):
+ def get_title(self, session):
+ return "Running"
+
+ class IdleJobs(CuminStatistic):
+ def get_title(self, session):
+ return "Idle"
+
+ class RemovedJobs(CuminStatistic):
+ def get_title(self, session):
+ return "Removed"
+
+ class HeldJobs(CuminStatistic):
+ def get_title(self, session):
+ return "Held"
+
+ class CompletedJobs(CuminStatistic):
+ def get_title(self, session):
+ return "Completed"
+
+class UserSlotStatSet(NewStatSet):
+ def __init__(self, app, name, user):
+ super(UserSlotStatSet, self).__init__(app, name)
+
+ stat = self.TotalSlots("total")
+ self.stats.append(stat)
+
+ stat = self.BusySlots("busy")
+ self.stats.append(stat)
+
+ stat = self.IdleSlots("idle")
+ self.stats.append(stat)
+
+ stat = self.SuspendedSlots("suspended")
+ self.stats.append(stat)
+
+ self.load = LoadUserSlotStats(app, user)
+
+ def get_values(self, session):
+ return self.load.execute(session).fetchone()
+
+ class TotalSlots(CuminStatistic):
+ def get_title(self, session):
+ return "Total"
+
+ class BusySlots(CuminStatistic):
+ def get_title(self, session):
+ return "Busy"
+
+ class IdleSlots(CuminStatistic):
+ def get_title(self, session):
+ return "Idle"
+
+ class SuspendedSlots(CuminStatistic):
+ def get_title(self, session):
+ return "Suspended"
Modified: mgmt/trunk/cumin/python/cumin/usergrid/widgets.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/usergrid/widgets.strings 2009-09-28 17:28:24 UTC (rev 3650)
+++ mgmt/trunk/cumin/python/cumin/usergrid/widgets.strings 2009-09-28 18:44:17 UTC (rev 3651)
@@ -0,0 +1,17 @@
+[OverviewView.html]
+{heading}
+
+<table class="twocol">
+ <tbody>
+ <tr>
+ <td>
+ <h2>Jobs</h2>
+ {jobs}
+ <h2>Slots</h2>
+ {slots}
+ </td>
+ <td>
+ </td>
+ </tr>
+ </tbody>
+</table>
More information about the rhmessaging-commits
mailing list