[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