rhmessaging commits: r3217 - mgmt/trunk/notes.
by rhmessaging-commits@lists.jboss.org
Author: eallen
Date: 2009-03-26 15:24:49 -0400 (Thu, 26 Mar 2009)
New Revision: 3217
Modified:
mgmt/trunk/notes/javascript session.txt
Log:
Update notes because session was moved under wooly
Modified: mgmt/trunk/notes/javascript session.txt
===================================================================
--- mgmt/trunk/notes/javascript session.txt 2009-03-26 17:32:44 UTC (rev 3216)
+++ mgmt/trunk/notes/javascript session.txt 2009-03-26 19:24:49 UTC (rev 3217)
@@ -1,21 +1,21 @@
-To modify a cumin url, use the session javascript object included in app.js.
+To modify a cumin url, use the session javascript object under wooly.
Usage follows this patern:
- var branch = session.branch(oldUrl);
+ var branch = wooly.session.branch();
branch.parameter1 = value;
var newUrl = branch.marshal();
Example:
- var oldUrl = "index?frame=main.broker.queue;main.m=broker;main.broker.m=queue;main.broker.id=1;main.broker.queue.id=3119";
+ the current window location is "index.html?frame=main.broker.queue;main.m=broker;main.broker.m=queue;main.broker.id=1;main.broker.queue.id=3119";
- // create a branch object from a url string
- var branch = session.branch(oldUrl);
+ // create a branch object
+ var branch = wooly.session.branch();
/* branch is a javascript object with the following properties:
{
- __page: 'index',
+ __page: 'index.html',
frame: 'main.broker.queue',
main.m: 'broker',
main.broker.m: 'queue',
@@ -47,14 +47,17 @@
In cumin, background update urls contain an encoded session value and one or more widget paths.
- For example:
- index.update?session=index%3Fframe%3Dmain.broker.queue%3Bmain.m%3Dbroker%3Bmain.broker.m%3Dqueue%3Bmain.broker.id%3D1%3Bmain.broker.queue.id%3D3119;widget=main.broker.queue.view.tabs.stats.gen.general;widget=main.broker.queue.view.tabs.stats.gen.io
+ For example, a typical background url is:
+ index.update?session=index.html%3Fframe%3Dmain.broker.queue%3Bmain.m%3Dbroker%3Bmain.broker.m%3Dqueue%3Bmain.broker.id%3D1%3Bmain.broker.queue.id%3D3119;widget=main.broker.queue.view.tabs.stats.gen.general;widget=main.broker.queue.view.tabs.stats.gen.io
- Creating a branch object from this background update url will generate:
+ To create a branch from a specific url instead of window.location, use
+ var branch = wooly.session.branch(url);
+
+ Creating a branch object from the above background update url will generate:
{
__page: 'index.update',
session: {
- __page: 'index',
+ __page: 'index.html',
frame: 'main.broker.queue',
main.m: 'broker',
main.broker.m: 'queue',
@@ -68,22 +71,16 @@
}
You can manipulate this object and then call branch.marshal() to generate a new url string.
-
For example, to add the page parameter that tells the widgets to render themselves in "fullpage" mode:
- var backgroundUrl = wooly.updateInfo.url;
- var branch = session.branch(backgroundUrl);
+ var branch = wooly.branchIntervalUpdate();
- // add the fullpage parameter to the session
- branch.session.fullpage = 1;
+ // add the fullpage parameter to a widget
+ branch.session[widgetPath + ".fullpage"] = 1;
- // rengen the url
- backgroundUrl = branch.marshal();
+ // restart the background updates with the new branch
+ wooly.restartIntervalUpdate(branch.marshal());
- // restart the setInterval timer with the new url
- wooly.cancelUpdate(wooly.updateInfo.timerHandle);
- wooly.newSetIntervalUpdate(backgroundUrl, wooly.updateInfo.callback, wooly.updateInfo.interval);
-
17 years, 1 month
rhmessaging commits: r3216 - mgmt/trunk/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2009-03-26 13:32:44 -0400 (Thu, 26 Mar 2009)
New Revision: 3216
Modified:
mgmt/trunk/cumin/python/cumin/stat.py
mgmt/trunk/cumin/python/cumin/stat.strings
Log:
Use widget update feature in stat tables.
Modified: mgmt/trunk/cumin/python/cumin/stat.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/stat.py 2009-03-26 14:32:55 UTC (rev 3215)
+++ mgmt/trunk/cumin/python/cumin/stat.py 2009-03-26 17:32:44 UTC (rev 3216)
@@ -23,6 +23,8 @@
self.category = category
+ self.update_enabled = True
+
self.object = Attribute(app, "object");
self.add_attribute(self.object);
Modified: mgmt/trunk/cumin/python/cumin/stat.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/stat.strings 2009-03-26 14:32:55 UTC (rev 3215)
+++ mgmt/trunk/cumin/python/cumin/stat.strings 2009-03-26 17:32:44 UTC (rev 3216)
@@ -1,46 +1,3 @@
-[StatSet.javascript]
-function updateStats(id, object) {
- var table = wooly.doc().elembyid(id)
- var trs = table.elem("tbody").elems("tr");
- var tr = trs.next();
-
- while (tr) {
- var attr = tr.getattr("stat");
-
- if (attr) {
- var stat = object.stat[attr];
- var tds = tr.elems("td", null, null, 0, 2);
-
- var td = tds.next();
-
- if (stat.value) {
- td.text().set(stat.value);
- }
-
- td = tds.next();
-
- var phs = td.elems("span", null, null, 0, 2);
- var ph = phs.next();
-
- if (false && ph) { // XXX disabled
- if (stat.high) {
- ph.set(stat.high);
- }
-
- ph = phs.next();
-
- if (stat.low) {
- ph.set(stat.low);
- }
- } else if (stat.rate) {
- td.text().set(stat.rate);
- }
- }
-
- tr = trs.next();
- }
-}
-
[StatSet.css]
table.StatSet {
width: 100%;
@@ -88,12 +45,9 @@
{items}
</tbody>
</table>
-<script type="text/javascript">
- cumin.objectListeners["{id}"] = updateStats;
-</script>
[StatSet.item_html]
-<tr stat="{item_name}" class="item">
+<tr class="item">
<th>{item_title}</th>
<td class="ralign"> {item_value}</td>
<td class="ralign"> {item_rate}</td>
17 years, 1 month
rhmessaging commits: r3215 - mgmt/trunk/notes.
by rhmessaging-commits@lists.jboss.org
Author: eallen
Date: 2009-03-26 10:32:55 -0400 (Thu, 26 Mar 2009)
New Revision: 3215
Added:
mgmt/trunk/notes/fullpage widgets.txt
Log:
Notes on how to make a block of HTML full page.
Added: mgmt/trunk/notes/fullpage widgets.txt
===================================================================
--- mgmt/trunk/notes/fullpage widgets.txt (rev 0)
+++ mgmt/trunk/notes/fullpage widgets.txt 2009-03-26 14:32:55 UTC (rev 3215)
@@ -0,0 +1,53 @@
+How to implement a full page widget
+
+Any block of HTML can be made full page in cumin. By full page, I mean it can be displayed using most of the browser windows width and height.
+
+To do this, you need to add the class "fullpageable" to the block of HTML. If there is no surrounding block, you'll need to add one.
+For example, to make the following HTML fullpage-able:
+ <h2>This is a cool widget</h2>
+ {cool_widget}
+
+you'll need to surround the HTML with an element that has a class of "fullpageable" like this:
+ <div class="fullpageable">
+ <h2>This is a coll widget</h2>
+ {cool_widget}
+ </div>
+
+If the HTML already has a surrounding block, you can just add the "fullpageable" class:
+ <p class="explain">
+ {important_stuff}
+ </p>
+
+ can be made fullpageable like this:
+
+ <p class="explain fullpageable">
+ {important_stuff}
+ </p>
+
+How it looks:
+ A block of HTML that is fullpageable will have a special mouseover style.
+ When the mouse if over any part of the HTML, there will be a light purple bar at the top of the HTML with a
+ small icon in the upper right corner.
+ Clicking on the icon will display the HTML in a block that is about 95% of the page's width and height.
+ If the contents of the HTML automatically sizes to it's container, it should expand to the full page.
+
+ If however, the HTML is a fixed size, it won't expand. Instead, you may want to use the background
+ update ability of cumin to re-render the widget using it's new container size.
+
+Under the kimono:
+ When the page first loads, there is a script that runs and finds all elements containing the class "fullpageable".
+ It then surrounds each of those elements with some divs and wires in some mouseover and click behaviors.
+ When the fullpage icon is clicked, the handler will "promote" the fullpageable HTML to be a direct child
+ of the document.body. This allows the HTML to be positioned and sized to the full window. Clicking the
+ icon again will restore the HTML to it's original position in the DOM.
+
+ Additionally, when any block of HTML is made fullpage, the current background update url is modified to
+ indicate that cumin is in fullpage mode. This allows any widgets contained in the fullpaged HTML to modify
+ how they are rendered to take advantage of the extra screen space. During render, widgets can optionally call the
+ self.page.get_fullpage(session) method to determine if they should render normally, or full page.
+ If the return of self.page.get_fullpage(session) is not None, the widget can render full page.
+ The value returned by self.page.get_fullpage(session) is the new width the widget can occupy.
+
+
+
+
\ No newline at end of file
17 years, 1 month
rhmessaging commits: r3214 - mgmt/trunk/notes.
by rhmessaging-commits@lists.jboss.org
Author: eallen
Date: 2009-03-25 18:08:00 -0400 (Wed, 25 Mar 2009)
New Revision: 3214
Added:
mgmt/trunk/notes/javascript session.txt
Log:
Notes on how to use the session/branch javascript in app.js
Added: mgmt/trunk/notes/javascript session.txt
===================================================================
--- mgmt/trunk/notes/javascript session.txt (rev 0)
+++ mgmt/trunk/notes/javascript session.txt 2009-03-25 22:08:00 UTC (rev 3214)
@@ -0,0 +1,90 @@
+To modify a cumin url, use the session javascript object included in app.js.
+
+Usage follows this patern:
+
+ var branch = session.branch(oldUrl);
+ branch.parameter1 = value;
+ var newUrl = branch.marshal();
+
+Example:
+
+ var oldUrl = "index?frame=main.broker.queue;main.m=broker;main.broker.m=queue;main.broker.id=1;main.broker.queue.id=3119";
+
+ // create a branch object from a url string
+ var branch = session.branch(oldUrl);
+
+ /* branch is a javascript object with the following properties:
+ {
+ __page: 'index',
+ frame: 'main.broker.queue',
+ main.m: 'broker',
+ main.broker.m: 'queue',
+ main.broker.id: '1',
+ main.broker.queue.id: '3119'
+ }
+ */
+
+ // You can change any of the existing properties directly:
+ branch.frame = 'main.broker.exchange';
+ branch.main.broker.m = 'exchange';
+
+ // You can remove properties
+ delete branch.main.broker.queue.id;
+
+ // You can add new properties
+ branch['main.broker.exchange.id'] = 1;
+ // or
+ branch.set('main.broker.exchange.id', 1);
+
+ branch.set('main.tabs.sel', 'mtab');
+ branch.set('main.broker.view.body.tabs.m', 'exchanges');
+
+ // generate a new url with the modified values
+ var newUrl = branch.marshal();
+ // index?frame=main.broker.exchange;main.m=broker;main.tabs.sel=mtab;main.view.m=msg;main.broker.m=exchange;main.broker.id=1;main.broker.view.body.tabs.m=exchanges;main.broker.exchange.id=1
+
+Background update urls:
+
+ In cumin, background update urls contain an encoded session value and one or more widget paths.
+
+ For example:
+ index.update?session=index%3Fframe%3Dmain.broker.queue%3Bmain.m%3Dbroker%3Bmain.broker.m%3Dqueue%3Bmain.broker.id%3D1%3Bmain.broker.queue.id%3D3119;widget=main.broker.queue.view.tabs.stats.gen.general;widget=main.broker.queue.view.tabs.stats.gen.io
+
+ Creating a branch object from this background update url will generate:
+ {
+ __page: 'index.update',
+ session: {
+ __page: 'index',
+ frame: 'main.broker.queue',
+ main.m: 'broker',
+ main.broker.m: 'queue',
+ main.broker.id: '1',
+ main.broker.queue.id: '3119',
+ },
+ widget: [
+ main.broker.queue.view.tabs.stats.gen.general,
+ main.broker.queue.view.tabs.stats.gen.io
+ ]
+ }
+
+ You can manipulate this object and then call branch.marshal() to generate a new url string.
+
+ For example, to add the page parameter that tells the widgets to render themselves in "fullpage" mode:
+
+ var backgroundUrl = wooly.updateInfo.url;
+ var branch = session.branch(backgroundUrl);
+
+ // add the fullpage parameter to the session
+ branch.session.fullpage = 1;
+
+ // rengen the url
+ backgroundUrl = branch.marshal();
+
+ // restart the setInterval timer with the new url
+ wooly.cancelUpdate(wooly.updateInfo.timerHandle);
+ wooly.newSetIntervalUpdate(backgroundUrl, wooly.updateInfo.callback, wooly.updateInfo.interval);
+
+
+
+
+
17 years, 1 month
rhmessaging commits: r3213 - mgmt/trunk/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2009-03-25 17:56:18 -0400 (Wed, 25 Mar 2009)
New Revision: 3213
Modified:
mgmt/trunk/cumin/python/cumin/page.strings
Log:
Remove some obsolete javascript from the old update method
Modified: mgmt/trunk/cumin/python/cumin/page.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/page.strings 2009-03-25 21:54:50 UTC (rev 3212)
+++ mgmt/trunk/cumin/python/cumin/page.strings 2009-03-25 21:56:18 UTC (rev 3213)
@@ -108,36 +108,11 @@
}
[MainFrame.javascript]
-function updateActions(id, model) {
- var pcount = model.invocations.pending;
- var ccount = model.invocations.completed;
- var ecount = model.invocations.failed;
-
- var div = wooly.doc().elembyid(id);
- var phs = div.elems("span", null, null, 0, 3);
- var ph;
-
- ph = phs.next();
- ph.set(pcount);
-
- ph = phs.next();
- ph.set(ccount);
-
- ph = phs.next();
- ph.set(ecount);
-}
-
function popupActions() {
window.open("actions.html", "actions",
"width=640,height=480,scrollbars=yes");
}
-function updateMain(data) {
- var model = data.objectify();
-
- cumin.runModelListeners(model);
-}
-
[MainFrame.html]
<div id="trans0"/>
<div id="head">
17 years, 1 month
rhmessaging commits: r3212 - in mgmt/trunk: cumin/python/cumin and 1 other directories.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2009-03-25 17:54:50 -0400 (Wed, 25 Mar 2009)
New Revision: 3212
Modified:
mgmt/trunk/basil/python/basil/server.py
mgmt/trunk/cumin/python/cumin/__init__.py
mgmt/trunk/wooly/python/wooly/pages.py
mgmt/trunk/wooly/python/wooly/pages.strings
Log:
Restore the .html extension to all the HtmlPage instances
Modified: mgmt/trunk/basil/python/basil/server.py
===================================================================
--- mgmt/trunk/basil/python/basil/server.py 2009-03-25 21:40:28 UTC (rev 3211)
+++ mgmt/trunk/basil/python/basil/server.py 2009-03-25 21:54:50 UTC (rev 3212)
@@ -16,7 +16,7 @@
self.model = BasilModel()
self.model.add_broker_url("amqp://mrg2.lab.bos.redhat.com")
- self.main_page = BasilPage(self, "index")
+ self.main_page = BasilPage(self, "index.html")
self.add_page(self.main_page)
self.set_default_page(self.main_page)
Modified: mgmt/trunk/cumin/python/cumin/__init__.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/__init__.py 2009-03-25 21:40:28 UTC (rev 3211)
+++ mgmt/trunk/cumin/python/cumin/__init__.py 2009-03-25 21:54:50 UTC (rev 3212)
@@ -41,7 +41,7 @@
self.model = CuminModel(self, self.config.data)
- self.main_page = MainPage(self, "index")
+ self.main_page = MainPage(self, "index.html")
self.add_page(self.main_page)
self.set_default_page(self.main_page)
@@ -58,7 +58,7 @@
unprotected.add(self.main_page.javascript_page)
unprotected.add(self.resource_page)
- self.login_page = LoginPage(self, "login")
+ self.login_page = LoginPage(self, "login.html")
self.add_page(self.login_page)
unprotected.add(self.login_page)
Modified: mgmt/trunk/wooly/python/wooly/pages.py
===================================================================
--- mgmt/trunk/wooly/python/wooly/pages.py 2009-03-25 21:40:28 UTC (rev 3211)
+++ mgmt/trunk/wooly/python/wooly/pages.py 2009-03-25 21:54:50 UTC (rev 3212)
@@ -1,3 +1,5 @@
+import os
+
from datetime import datetime
from wooly import *
@@ -76,19 +78,22 @@
def __init__(self, app, name):
super(HtmlPage, self).__init__(app, name)
+ self.base_name = os.path.splitext(name)[0]
+
self.updates = self.UpdatesAttribute(app, "updates")
self.add_attribute(self.updates)
self.update_script = UpdateScript(app, "update_script", self)
self.add_child(self.update_script)
- self.update_page = UpdatePage(app, name + ".update", self)
+ self.update_page = UpdatePage(app, self.base_name + ".update", self)
self.app.add_page(self.update_page)
- self.css_page = CssPage(app, name + ".css", self)
+ self.css_page = CssPage(app, self.base_name + ".css", self)
self.app.add_page(self.css_page)
- self.javascript_page = JavascriptPage(app, name + ".js", self)
+ self.javascript_page = JavascriptPage \
+ (app, self.base_name + ".js", self)
self.app.add_page(self.javascript_page)
def get_content_type(self, session):
@@ -114,6 +119,9 @@
return sess.marshal()
+ def render_base_name(self, session):
+ return self.base_name
+
class UpdatesAttribute(Attribute):
def get_default(self, session):
return list()
Modified: mgmt/trunk/wooly/python/wooly/pages.strings
===================================================================
--- mgmt/trunk/wooly/python/wooly/pages.strings 2009-03-25 21:40:28 UTC (rev 3211)
+++ mgmt/trunk/wooly/python/wooly/pages.strings 2009-03-25 21:54:50 UTC (rev 3212)
@@ -11,12 +11,12 @@
<link rel="stylesheet" type="text/css" href="resource?name=wooly.css"/>
<link rel="stylesheet" type="text/css" href="resource?name=app.css"/>
- <link rel="stylesheet" type="text/css" href="{id}.css"/>
+ <link rel="stylesheet" type="text/css" href="{base_name}.css"/>
<!--[if IE]><link rel="stylesheet" type="text/css" href="resource?name=ie.css"/><![endif]-->
<script type="text/javascript" src="resource?name=wooly.js"> </script>
<script type="text/javascript" src="resource?name=app.js"> </script>
- <script type="text/javascript" src="{id}.js"> </script>
+ <script type="text/javascript" src="{base_name}.js"> </script>
{update_script}
</head>
<body class="{class}">
17 years, 1 month
rhmessaging commits: r3211 - in mgmt/trunk: wooly/python/wooly and 1 other directory.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2009-03-25 17:40:28 -0400 (Wed, 25 Mar 2009)
New Revision: 3211
Modified:
mgmt/trunk/cumin/python/cumin/action.py
mgmt/trunk/cumin/python/cumin/action.strings
mgmt/trunk/cumin/python/cumin/page.py
mgmt/trunk/cumin/python/cumin/page.strings
mgmt/trunk/wooly/python/wooly/pages.py
Log:
Use the new update facility to make action status do updates
Modified: mgmt/trunk/cumin/python/cumin/action.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/action.py 2009-03-25 18:55:22 UTC (rev 3210)
+++ mgmt/trunk/cumin/python/cumin/action.py 2009-03-25 21:40:28 UTC (rev 3211)
@@ -8,6 +8,16 @@
strings = StringCatalog(__file__)
+class ActionPage(HtmlPage):
+ def __init__(self, app, name):
+ super(ActionPage, self).__init__(app, name)
+
+ self.__actions = ActionInvocationSet(app, "actions")
+ self.add_child(self.__actions)
+
+ def render_title(self, session, *args):
+ return "Actions"
+
class ActionInvocationSet(ItemTable):
def __init__(self, app, name):
super(ActionInvocationSet, self).__init__(app, name)
@@ -60,12 +70,19 @@
def do_get_items(self, session, *args):
return reversed(sorted_by(self.app.model.invocations, "when"))
-class ActionPage(HtmlPage):
+class ActionInvocationStatus(Widget):
def __init__(self, app, name):
- super(ActionPage, self).__init__(app, name)
+ super(ActionInvocationStatus, self).__init__(app, name)
- self.__actions = ActionInvocationSet(app, "actions")
- self.add_child(self.__actions)
+ self.update_enabled = True
- def render_title(self, session, *args):
- return "Actions"
+ def render_pending_count(self, session):
+ return self.app.model.count_invocations("pending")
+
+ def render_completed_count(self, session):
+ return self.app.model.count_invocations("OK")
+
+ def render_failed_count(self, session):
+ pcount = self.app.model.count_invocations("pending")
+ ccount = self.app.model.count_invocations("OK")
+ return len(self.app.model.invocations) - pcount - ccount
Modified: mgmt/trunk/cumin/python/cumin/action.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/action.strings 2009-03-25 18:55:22 UTC (rev 3210)
+++ mgmt/trunk/cumin/python/cumin/action.strings 2009-03-25 21:40:28 UTC (rev 3211)
@@ -1,3 +1,8 @@
+[ActionPage.css]
+body {
+ margin: 1em;
+}
+
[ActionInvocationSet.html]
<table class="mobjects">
<thead>
@@ -6,7 +11,12 @@
<tbody>{items}</tbody>
</table>
-[ActionPage.css]
-body {
- margin: 1em;
-}
+[ActionInvocationStatus.html]
+<span id="{id}">
+ Actions:
+ <a href="javascript:popupActions()">
+ <span>{pending_count}</span> pending,
+ <span>{completed_count}</span> completed,
+ <span>{failed_count}</span> failed
+ </a>
+</span>
Modified: mgmt/trunk/cumin/python/cumin/page.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/page.py 2009-03-25 18:55:22 UTC (rev 3210)
+++ mgmt/trunk/cumin/python/cumin/page.py 2009-03-25 21:40:28 UTC (rev 3211)
@@ -43,6 +43,9 @@
self.__tabs = MainFrameTabs(app, "tabs")
self.add_child(self.__tabs)
+ self.actions = ActionInvocationStatus(app, "actions")
+ self.add_child(self.actions)
+
self.view = MainView(app, "view")
self.add_mode(self.view)
self.set_view_mode(self.view)
@@ -89,6 +92,11 @@
(app, "groupsremove", action, item)
self.add_mode(self.broker_groups_remove)
+ def do_process(self, session):
+ self.actions.process(session)
+
+ super(MainFrame, self).do_process(session)
+
def render_title(self, session):
return "Main"
@@ -122,17 +130,6 @@
args = frame.get_args(session)
return frame.render_title(session, *args)
- def render_pending_count(self, session):
- return self.app.model.count_invocations("pending")
-
- def render_completed_count(self, session):
- return self.app.model.count_invocations("OK")
-
- def render_failed_count(self, session):
- pcount = self.app.model.count_invocations("pending")
- ccount = self.app.model.count_invocations("OK")
- return len(self.app.model.invocations) - pcount - ccount
-
def show_grid_tab(self, session):
self.__tabs.set_grid_tab(session)
self.view.set_grid_mode(session)
Modified: mgmt/trunk/cumin/python/cumin/page.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/page.strings 2009-03-25 18:55:22 UTC (rev 3210)
+++ mgmt/trunk/cumin/python/cumin/page.strings 2009-03-25 21:40:28 UTC (rev 3211)
@@ -152,17 +152,7 @@
</div>
<div>
- <div id="actions">
- Actions:
- <a href="javascript:popupActions()">
- <span>{pending_count}</span> pending,
- <span>{completed_count}</span> completed,
- <span>{failed_count}</span> failed
- </a>
- </div>
- <script type="text/javascript">
- cumin.modelListeners["actions"] = updateActions
- </script>
+ <div id="actions">{actions}</div>
<ul id="context">{frames}</ul>
</div>
Modified: mgmt/trunk/wooly/python/wooly/pages.py
===================================================================
--- mgmt/trunk/wooly/python/wooly/pages.py 2009-03-25 18:55:22 UTC (rev 3210)
+++ mgmt/trunk/wooly/python/wooly/pages.py 2009-03-25 21:40:28 UTC (rev 3211)
@@ -102,6 +102,8 @@
return content_type
def enable_update(self, session, widget):
+ #print "Enabling update on widget %s" % widget
+
self.updates.get(session).append(widget)
def get_update_url(self, session, widgets):
17 years, 1 month
rhmessaging commits: r3210 - mgmt/trunk/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2009-03-25 14:55:22 -0400 (Wed, 25 Mar 2009)
New Revision: 3210
Modified:
mgmt/trunk/cumin/python/cumin/__init__.py
mgmt/trunk/cumin/python/cumin/binding.strings
mgmt/trunk/cumin/python/cumin/broker.py
mgmt/trunk/cumin/python/cumin/brokercluster.py
mgmt/trunk/cumin/python/cumin/brokerlink.py
mgmt/trunk/cumin/python/cumin/brokerlink.strings
mgmt/trunk/cumin/python/cumin/charts.py
mgmt/trunk/cumin/python/cumin/client.py
mgmt/trunk/cumin/python/cumin/collector.py
mgmt/trunk/cumin/python/cumin/collector.strings
mgmt/trunk/cumin/python/cumin/demo.py
mgmt/trunk/cumin/python/cumin/exchange.py
mgmt/trunk/cumin/python/cumin/exchange.strings
mgmt/trunk/cumin/python/cumin/job.py
mgmt/trunk/cumin/python/cumin/job.strings
mgmt/trunk/cumin/python/cumin/limits.py
mgmt/trunk/cumin/python/cumin/limits.strings
mgmt/trunk/cumin/python/cumin/model.py
mgmt/trunk/cumin/python/cumin/negotiator.py
mgmt/trunk/cumin/python/cumin/negotiator.strings
mgmt/trunk/cumin/python/cumin/page.strings
mgmt/trunk/cumin/python/cumin/parameters.py
mgmt/trunk/cumin/python/cumin/pool.py
mgmt/trunk/cumin/python/cumin/pool.strings
mgmt/trunk/cumin/python/cumin/queue.py
mgmt/trunk/cumin/python/cumin/queue.strings
mgmt/trunk/cumin/python/cumin/quirk.py
mgmt/trunk/cumin/python/cumin/realm.py
mgmt/trunk/cumin/python/cumin/scheduler.py
mgmt/trunk/cumin/python/cumin/scheduler.strings
mgmt/trunk/cumin/python/cumin/slot.py
mgmt/trunk/cumin/python/cumin/slot.strings
mgmt/trunk/cumin/python/cumin/stat.py
mgmt/trunk/cumin/python/cumin/stat.strings
mgmt/trunk/cumin/python/cumin/submitter.py
mgmt/trunk/cumin/python/cumin/submitter.strings
mgmt/trunk/cumin/python/cumin/system.py
mgmt/trunk/cumin/python/cumin/test.py
mgmt/trunk/cumin/python/cumin/tools.py
mgmt/trunk/cumin/python/cumin/user.strings
mgmt/trunk/cumin/python/cumin/util.py
mgmt/trunk/cumin/python/cumin/visualizations.py
mgmt/trunk/cumin/python/cumin/visualizations.strings
mgmt/trunk/cumin/python/cumin/widgets.py
mgmt/trunk/cumin/python/cumin/widgets.strings
Log:
Whitespace! And also some style fixups.
Modified: mgmt/trunk/cumin/python/cumin/__init__.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/__init__.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/__init__.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -174,7 +174,7 @@
log.removeHandler(handler)
self.init_logging()
-
+
def init_logging(self):
enable_logging("mint", self.log_level, self.log_file)
enable_logging("cumin", self.log_level, self.log_file)
Modified: mgmt/trunk/cumin/python/cumin/binding.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/binding.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/binding.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -1,136 +1,139 @@
-
[ExchangeInput.name_html]
- <td><input type="checkbox"
- id="{id}.{exchange_id}"
- name="{name_path}" value="{exchange_name}" size="15"
- tabindex="100" {exchange_checked}
- {onclick} />
- <input type="hidden"
- name="{exchange_type_path}" value="{exchange_type}" /></td>
- <td><label class="exchange_name" for="{id}.{exchange_id}">{exchange_fmt_name}</label></td>
- <td class="exchange_type">{exchange_type}</td>
+<td>
+ <input type="checkbox" id="{id}.{exchange_id}" name="{name_path}"
+ value="{exchange_name}" size="15" tabindex="100" {exchange_checked}
+ {onclick} />
+ <input type="hidden" name="{exchange_type_path}" value="{exchange_type}" />
+</td>
+<td><label class="exchange_name" for="{id}.{exchange_id}">{exchange_fmt_name}</label></td>
+<td class="exchange_type">{exchange_type}</td>
[ExchangeInput.key_html]
- <td><input type="text"
- name="{key_path}" id="{exchange_name}"
- value="{key_value}" size="32" maxlength="256" tabindex="100" />
- {key_error}</td>
+<td>
+ <input type="text" name="{key_path}" id="{exchange_name}"
+ value="{key_value}" size="32" maxlength="256" tabindex="100" />
+ {key_error}
+</td>
[DirectExchangeInput.html]
- <tr>
- {exchange_name_input}
- {exchange_key_input}
- </tr>
+<tr>
+ {exchange_name_input}
+ {exchange_key_input}
+</tr>
[TopicExchangeInput.html]
- <tr>
- {exchange_name_input}
- {exchange_key_input}
- </tr>
+<tr>
+ {exchange_name_input}
+ {exchange_key_input}
+</tr>
[FanoutExchangeInput.html]
- <tr>
- {exchange_name_input}
- <td> </td>
- </tr>
+<tr>
+ {exchange_name_input}
+ <td> </td>
+</tr>
[XMLExchangeInput.html]
- <tr>
- {exchange_name_input}
- {exchange_key_input}
- </tr>
- <tr id="{xml_extra}" class="{headers_class}"><td colspan="4"><table>
+<tr>
+ {exchange_name_input}
+ {exchange_key_input}
+</tr>
+<tr id="{xml_extra}" class="{headers_class}">
+ <td colspan="4"><table>
<tr>
- <td>XQuery:</td>
- <td colspan="3"><textarea name="{xquery_path}" id="{exchange_name}"
- tabindex="100" rows="4" cols="40">{xquery_value}</textarea>{xquery_error}</td>
- </tr></table></td></tr>
+ <td>XQuery:</td>
+ <td colspan="3"><textarea name="{xquery_path}" id="{exchange_name}" tabindex="100" rows="4" cols="40">{xquery_value}</textarea>{xquery_error}</td>
+ </tr>
+ </table></td>
+</tr>
[HeadersExchangeInput.html]
- <tr>
- {exchange_name_input}
- {exchange_key_input}
+<tr>
+ {exchange_name_input}
+ {exchange_key_input}
+</tr>
+<tr id="{headers_extra}" class="{headers_class}">
+ <td colspan="4"><table>
+ <tr>
+ <td> </td>
+ <td>x-match Type:</td>
+ <td colspan="2">
+ <input type="radio" id="headers.x-match.all" name="{x_match_path}" value="all" {all_checked}/>
+ <label for="headers.x-match.all">All</label>
+ <input type="radio" id="headers.x-match.any" name="{x_match_path}" value="any" {any_checked}/>
+ <label for="headers.x-match.any">Any</label>
+ </td>
</tr>
- <tr id="{headers_extra}" class="{headers_class}"><td colspan="4"><table>
- <tr>
- <td> </td>
- <td>x-match Type:</td>
- <td colspan="2"><input type="radio" id="headers.x-match.all"
- name="{x_match_path}" value="all" {all_checked} />
- <label for="headers.x-match.all">All</label>
- <input type="radio" id="headers.x-match.any"
- name="{x_match_path}" value="any" {any_checked}/>
- <label for="headers.x-match.any">Any</label>
- </td>
+ <tr>
+ <td> </td>
+ <td>Match Keys:</td>
+ <td colspan="2">
+ <table class="xmlExchange">
+ <thead>
+ <tr>
+ <th>Key</th><th>type, value</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><input type="text" name="{mkey_path}.1" value="{mkey1_value}" tabindex="100" />{mkey1_error}</td>
+ <td><input type="text" name="{mkey_path}.1.nv" value="{mnv1_value}" tabindex="100" /></td>
+ </tr>
+ <tr>
+ <td><input type="text" name="{mkey_path}.2" value="{mkey2_value}" tabindex="100" />{mkey2_error}</td>
+ <td><input type="text" name="{mkey_path}.2.nv" value="{mnv2_value}" tabindex="100" /></td>
+ </tr>
+ <tr>
+ <td><input type="text" name="{mkey_path}.3" value="{mkey3_value}" tabindex="100" />{mkey3_error}</td>
+ <td><input type="text" name="{mkey_path}.3.nv" value="{mnv3_value}" tabindex="100" /></td>
+ </tr>
+ </tbody>
+ </table>
+ </td>
</tr>
- <tr>
- <td> </td>
- <td>Match Keys:</td>
- <td colspan="2">
- <table class="xmlExchange">
- <thead>
- <tr>
- <th>Key</th><th>type, value</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td><input type="text" name="{mkey_path}.1" value="{mkey1_value}" tabindex="100" />{mkey1_error}</td>
- <td><input type="text" name="{mkey_path}.1.nv" value="{mnv1_value}" tabindex="100" /></td>
- </tr>
- <tr>
- <td><input type="text" name="{mkey_path}.2" value="{mkey2_value}" tabindex="100" />{mkey2_error}</td>
- <td><input type="text" name="{mkey_path}.2.nv" value="{mnv2_value}" tabindex="100" /></td>
- </tr>
- <tr>
- <td><input type="text" name="{mkey_path}.3" value="{mkey3_value}" tabindex="100" />{mkey3_error}</td>
- <td><input type="text" name="{mkey_path}.3.nv" value="{mnv3_value}" tabindex="100" /></td>
- </tr>
- </tbody>
- </table>
- </td>
- </tr></table></td></tr>
-
+</table></td></tr>
+
[ExchangeKeysField.css]
td.exchange_type {
- font-style: italic;
+ font-style: italic;
}
table.mobjects tr#headers_extra {
- border-top: 0px;
+ border-top: 0px;
}
table.mobjects tr.initial_header_state {
- display:none;
+ display:none;
}
table.xmlExchange {
- border-collapse: collapse;
- border: 1px dotted #ccc;
- margin: 0;
+ border-collapse: collapse;
+ border: 1px dotted #ccc;
+ margin: 0;
}
table.xmlExchange tr {
- border-top: 0px solid #fff;
+ border-top: 0px solid #fff;
}
table.mobjects label.exchange_name {
- font-weight: bold;
+ font-weight: bold;
}
table.mobjects td.exchange_type, table.mobjects th.exchange_type {
- font-style: italic;
+ font-style: italic;
}
[ExchangeKeysField.javascript]
function toggle_row(chk, row_id) {
-
- var display = "none";
- var headers_extra = document.getElementById(row_id);
- if (chk.checked)
- display = "table-row";
-
- headers_extra.style.display = display;
+ var display = "none";
+ var headers_extra = document.getElementById(row_id);
+
+ if (chk.checked) {
+ display = "table-row";
+ }
+
+ headers_extra.style.display = display;
}
[ExchangeKeysField.html]
@@ -138,21 +141,19 @@
<div class="rfloat">{phase}</div>
<div class="title">{title}</div>
<div class="rclear"> </div>
-
-<div class="inputs">
-<table class="mobjects" id="exchange_types">
- <thead>
- <tr>
- <th colspan="2"><label class="exchange_name">Exchange Name</label></th>
- <th class="exchange_type">Exchange Type</th>
- <th>Binding Key</th>
- </tr>
- </thead>
- <tbody>
- {exchanges}
- </tbody>
-
-</table>
+
+ <div class="inputs">
+ <table class="mobjects" id="exchange_types">
+ <thead>
+ <tr>
+ <th colspan="2"><label class="exchange_name">Exchange Name</label></th>
+ <th class="exchange_type">Exchange Type</th>
+ <th>Binding Key</th>
+ </tr>
+ </thead>
+ <tbody>
+ {exchanges}
+ </tbody>
+ </table>
+ </div>
</div>
-</div>
-
Modified: mgmt/trunk/cumin/python/cumin/broker.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/broker.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/broker.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -306,7 +306,7 @@
acts = [(x.get_href(session, broker),
x.get_title(session),
x.get_enabled(session, broker))
- for x in cls.actions
+ for x in cls.actions
if x.navigable and not x.aggregate]
return acts
Modified: mgmt/trunk/cumin/python/cumin/brokercluster.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/brokercluster.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/brokercluster.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -17,7 +17,7 @@
branch = session.branch()
self.page.show_broker_cluster_add(branch)
return branch.marshal()
-
+
def render_title(self, session, *args):
return "Broker Clusters %s" % fmt_count(BrokerCluster.select().count())
@@ -34,7 +34,7 @@
def render_item_status(self, session, cluster):
writer = Writer()
-
+
for broker in sorted_by(cluster.brokers):
writer.write(fmt_ostatus(broker))
@@ -121,11 +121,11 @@
branch = session.branch()
self.page.main.show(branch)
self.page.set_redirect_url(session, branch.marshal())
-
+
def process_submit(self, session):
cluster = BrokerCluster()
self.process_cluster(session, cluster)
-
+
class BrokerClusterEdit(BrokerClusterForm, Frame):
def get_args(self, session):
return self.frame.get_args(session)
Modified: mgmt/trunk/cumin/python/cumin/brokerlink.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/brokerlink.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/brokerlink.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -41,7 +41,7 @@
#col = self.ToPeerColumn(app, "to_peer")
#self.add_column(col)
-
+
self.__close = self.Close(app, "close")
self.add_child(self.__close)
@@ -65,7 +65,7 @@
def disable_closed(self, session, data):
return data["state"] == "Closed"
-
+
class AddressColumn(SqlTableColumn):
def render_title(self, session, data):
return "Address"
@@ -87,7 +87,7 @@
class LastErrorColumn(SqlTableColumn):
def render_title(self, session, data):
return "Last Error"
-
+
class DurableColumn(SqlTableColumn):
def render_title(self, session, data):
return "Durable"
@@ -136,10 +136,10 @@
col = self.KeyColumn(app, "key")
self.add_column(col)
-
+
col = self.TagColumn(app, "tag")
self.add_column(col)
-
+
col = self.ExcludesColumn(app, "excludes")
self.add_column(col)
@@ -155,7 +155,7 @@
def render_sql_where(self, session, link):
return "where l.id = %(link_id)r and b.qmf_delete_time is null"
-
+
def get_sql_values(self, session, link):
return {"link_id": link.id}
@@ -163,7 +163,7 @@
branch = session.branch()
self.frame.show_bridge_add(branch)
return branch.marshal()
-
+
class SourceColumn(SqlTableColumn):
def render_title(self, session, data):
return "Source"
@@ -222,13 +222,13 @@
remove = LinkRemove(app, "remove")
self.add_mode(remove)
self.set_remove_mode(remove)
-
+
self.__bridge_add = BridgeAdd(app, "bridgeadd")
self.add_mode(self.__bridge_add)
-
+
self.__routes_close = PeerRouteSetClose(app, "routesclose")
self.add_mode(self.__routes_close)
-
+
def render_title(self, session, peer):
return super(PeerFrame, self).render_title(session, peer)
@@ -240,7 +240,7 @@
def show_bridge_add(self, session):
self.page.set_frame(session, self.__bridge_add)
- return self.show_mode(session, self.__bridge_add)
+ return self.show_mode(session, self.__bridge_add)
def show_routes_close(self, session):
self.page.set_frame(session, self.__routes_close)
@@ -273,11 +273,11 @@
return "No, Cancel"
class PeerStatus(CuminStatus):
-
+
def render_color(self, session, link):
if link.statsCurr:
return link.statsCurr.lastError and "red" or "green"
-
+
def render_peer_state(self, session, peer):
if peer.statsCurr:
return peer.statsCurr.state
@@ -346,14 +346,14 @@
self.add_parameter(self.param)
self.state = state
-
+
def do_get_items(self, session, *args):
exchanges = list()
-
+
link = self.frame.frame.get_object(session)
vhost = link.vhost
sortedExchanges = sorted_by(vhost.exchanges)
-
+
for exchange in sortedExchanges:
if ExchangeInfo.is_builtin(exchange) or \
(not exchange._get_qmfDeleteTime() and \
@@ -362,7 +362,7 @@
if not self.param.get(session):
self.param.set(session, exchange.id)
exchanges.append(exchange)
-
+
return exchanges
def render_item_value(self, session, exchange):
@@ -381,13 +381,13 @@
self.state = ExchangeState(app, "phase")
self.add_child(self.state)
-
+
self.__exchanges = ExchangeInputSet(app, "inputs", self.state)
self.add_child(self.__exchanges)
-
+
def get(self, session):
return self.__exchanges.get(session)
-
+
def render_title(self, session):
return "Choose an Exchange"
@@ -405,10 +405,10 @@
self.more = MoreFieldSet(app, "more")
self.add_field(self.more)
-
+
self.help = self.BridgeAddHelpField(app, "help")
self.more.add_field(self.help)
-
+
self.tag = TextField(app, "tag")
self.tag.set_required(False)
self.tag.set_title("Tag")
@@ -424,47 +424,47 @@
self.sync = self.SyncField(app, "sync")
self.more.add_field(self.sync)
-
+
def get_args(self, session):
return self.frame.get_args(session)
-
+
def render_title(self, session, link):
return "Add Route to '%s:%d'" % (link.host, link.port)
-
+
def process_display(self, session, *args):
if not self.tag.get(session):
self.tag.set(session, args[0].qmfBrokerId)
-
+
if not self.excludes.get(session):
self.excludes.set(session, "%s:%s" % (args[0].host, args[0].port))
-
+
if not self.sync.get(session):
self.sync.set(session, self.sync.get_default(session))
-
+
class SyncField(IntegerField):
def render_title(self, session):
return "Ack"
-
+
def render_field_help(self, session):
return "Acknowledge transfers over the bridge in batches of N"
def get_default(self, session):
return 0
-
+
class DynamicField(TwoOptionRadioField):
def render_title(self, session):
return "Dynamic Route?"
-
+
def render_field_help(self, session):
return "(Should the added route be dynamic)"
def render_title_1(self, session):
return "Dynamic"
-
+
def render_title_2(self, session):
return "Not dynamic"
-
-
+
+
class BridgeAddHelpField(FormField):
pass
@@ -487,7 +487,7 @@
durable = link.durable
dynamic = self.dynamic.get(session) == "yes"
sync = self.sync.get(session)
-
+
args = {"durable": durable,
"exchange": exchange.name,
"key": key,
@@ -496,12 +496,12 @@
"dynamic": dynamic,
"sync": sync
}
-
+
action = self.app.model.link.bridge
action.invoke(link, args)
self.process_cancel(session, link)
-
+
class BrokerLinkAdd(CuminFieldForm):
def __init__(self, app, name, vhost):
super(BrokerLinkAdd, self).__init__(app, name)
@@ -513,7 +513,7 @@
self.more = self.ShowButton(app, "more")
self.add_field(self.more)
-
+
self.port = self.PortField(app, "port")
self.more.add_field(self.port)
@@ -525,10 +525,10 @@
self.durable = self.DurableField(app, "durable")
self.more.add_field(self.durable)
-
+
self.transport = self.TransportField(app, "transport")
self.more.add_field(self.transport)
-
+
def render_title(self, session):
vhost = self.vhost.get(session)
name = self.app.model.broker.get_object_name(vhost.broker)
@@ -537,10 +537,10 @@
class ShowButton(MoreFieldSet):
def render_more_text(self, session):
return "Show Optional Inputs..."
-
+
def render_less_text(self, session):
return "Hide Optional Inputs..."
-
+
class Host(NameField):
def render_title(self, session):
return "Address"
@@ -548,13 +548,13 @@
class PortField(StringField):
def __init__(self, app, name):
super(BrokerLinkAdd.PortField, self).__init__(app, name)
-
+
self.input.size = 5
self.css_class = "compact first"
-
+
def render_title(self, session):
return "Port"
-
+
def do_validate(self, session, errors):
try:
port = self.get(session)
@@ -562,60 +562,60 @@
int(port)
except:
errors.append(FormError("Port must be a number"))
-
+
class UsernameField(StringField):
def render_title(self, session):
return "Username"
def render_form_field_class(self, session):
return "compact"
-
+
class PassField(PasswordField):
def render_title(self, session):
return "Password"
-
+
def render_form_field_class(self, session):
return "compact last"
-
+
class TransportField(RadioField):
def __init__(self, app, name):
super(BrokerLinkAdd.TransportField, self).__init__(app, name, None)
-
+
self.param = Parameter(app, "param")
self.param.default = "tcp"
self.add_parameter(self.param)
-
+
option = self.TCP(app, "tcp", self.param)
self.add_option(option)
-
+
option = self.SSL(app, "ssl", self.param)
self.add_option(option)
-
+
option = self.RDMA(app, "rdma", self.param)
self.add_option(option)
-
+
def render_title(self, session):
return "Transport-type"
-
+
def render_field_help(self, session):
return "(Transport to use)"
-
+
class TCP(RadioFieldOption):
def render_title(self, session):
return "tcp"
-
+
class SSL(RadioFieldOption):
def render_title(self, session):
return "ssl"
-
+
class RDMA(RadioFieldOption):
def render_title(self, session):
return "rdma"
-
+
class DurableField(TwoOptionRadioField):
def render_title(self, session):
return "Restore if broker restarts?"
-
+
def render_field_help(self, session):
return "(Should the added configuration be durable)"
@@ -672,7 +672,7 @@
def render_title(self, session):
return "Close Broker Link"
-
+
def render_form_heading(self, session, *args):
return "Close Link to"
@@ -695,12 +695,10 @@
def render_title(self, session):
link = self.parent.get_object(session)
return "Remove Route from %s:%i" % (link.host, link.port)
-
+
def render_form_heading(self, session, *args):
return "Remove Route"
def render_item_content(self, session, id):
bridge = Bridge.get(id)
return "<td>%s</td><td>%s</td>" % (bridge.dest, bridge.key)
-
-
Modified: mgmt/trunk/cumin/python/cumin/brokerlink.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/brokerlink.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/brokerlink.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -22,9 +22,8 @@
[PeerSet.html]
<form id="{id}" method="post" action="?">
-
<ul class="actions">
- <li><a class="nav" href="{add_broker_link_url}">Add Broker Link</a></li>
+ <li><a class="nav" href="{add_broker_link_url}">Add Broker Link</a></li>
</ul>
<div class="sactions">
@@ -102,9 +101,8 @@
[PeerRouteSet.html]
<form id="{id}" method="post" action="?">
-
<ul class="actions">
- <li><a class="nav" href="{add_bridge_url}">Add Route</a></li>
+ <li><a class="nav" href="{add_bridge_url}">Add Route</a></li>
</ul>
<div class="sactions">
@@ -142,15 +140,15 @@
</div>
<div class="body">
<span class="legend">{form_heading}</span>
- <table class="mobjects">
- <thead>
- <tr>
- <th>Exchange</th>
- <th>Key</th>
- </tr>
- </thead>
- <tbody>{items}</tbody>
- </table>
+ <table class="mobjects">
+ <thead>
+ <tr>
+ <th>Exchange</th>
+ <th>Key</th>
+ </tr>
+ </thead>
+ <tbody>{items}</tbody>
+ </table>
{hidden_inputs}
</div>
<div class="foot">
@@ -168,27 +166,27 @@
[BridgeAddHelpField.css]
div#bridge_add_help span.tag1 {
- color:red;
+ color:red;
}
div#bridge_add_help span.tag2 {
- color:green;
+ color:green;
}
div#bridge_add_help p.example {
- font-size: 0.9em;
- color: #444444;
+ font-size: 0.9em;
+ color: #444444;
}
[BridgeAddHelpField.html]
<div id="bridge_add_help">
- <p>The <strong>Tag</strong> and <strong>Excludes</strong> are used to prevent a message from routing back
- to the source broker and causing an infinite loop.</p>
- <p>Enter a short <strong>tag</strong> that will be associated with the source exchange.
- Then <strong>exclude</strong> any tags that were used for the destination exchanges.</p>
- <p class="example">
- <em>broker1</em> <==> <em>broker2</em> tag: <span class="tag2">tag2</span> excludes: <span class="tag1">tag1</span><br/>
- <em>broker2</em> <==> <em>broker1</em> tag: <span class="tag1">tag1</span> excludes: <span class="tag2">tag2</span>
- </p>
+ <p>The <strong>Tag</strong> and <strong>Excludes</strong> are used to prevent a message from routing back
+ to the source broker and causing an infinite loop.</p>
+ <p>Enter a short <strong>tag</strong> that will be associated with the source exchange.
+ Then <strong>exclude</strong> any tags that were used for the destination exchanges.</p>
+ <p class="example">
+ <em>broker1</em> <==> <em>broker2</em> tag: <span class="tag2">tag2</span> excludes: <span class="tag1">tag1</span><br/>
+ <em>broker2</em> <==> <em>broker1</em> tag: <span class="tag1">tag1</span> excludes: <span class="tag2">tag2</span>
+ </p>
</div>
[PeerStatus.html]
Modified: mgmt/trunk/cumin/python/cumin/charts.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/charts.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/charts.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -32,7 +32,7 @@
shadox = (102 / 128.0) * width
shadoy = (102 / 128.0) * width
arc = 0.5 * width
-
+
surface = ImageSurface(FORMAT_ARGB32, width, height)
cr = Context(surface)
cr.set_line_width(1)
@@ -41,10 +41,10 @@
radial.add_color_stop_rgba(0, 1, 1, 1, 1)
radial.add_color_stop_rgb(1, *interior)
cr.set_source(radial)
- cr.arc(arc, arc, arc, 0, 2.0 * pi)
+ cr.arc(arc, arc, arc, 0, 2.0 * pi)
cr.fill()
return surface
-
+
def plot_slots(self, slots, zl, zx, zy):
count = len(slots)
slot_size = self.slot_size(count, zl)
@@ -76,14 +76,14 @@
# draw dots if they are big enough
if slot_size >= self.min_sphere_size:
- radial = RadialGradient(x + pnumbx,
- y + pnumby,
- pnumbr, x + shadox,
+ radial = RadialGradient(x + pnumbx,
+ y + pnumby,
+ pnumbr, x + shadox,
y + shadoy, slot_size)
radial.add_color_stop_rgba(0, 1, 1, 1, 1)
radial.add_color_stop_rgb(1, *interior)
cr.set_source(radial)
- cr.arc(x + arc, y + arc, arc, 0, 2.0 * pi)
+ cr.arc(x + arc, y + arc, arc, 0, 2.0 * pi)
cr.fill()
else:
# just draw squares
@@ -122,7 +122,7 @@
size = 2
if size > self.max_size * zoom:
size = self.max_size * zoom
-
+
#if size * cols < self.width:
# if size < self.max_size:
# size = size + 1
@@ -135,7 +135,7 @@
# self.height = self.max_height
self.cols = cols
return size
-
+
def write(self, writer):
self.surface.write_to_png(writer)
@@ -254,7 +254,7 @@
svalue = "%ik" % int(round(value / 1000.0, -1))
else:
svalue = str(value)
-
+
cr.show_text(svalue)
cr.stroke()
Modified: mgmt/trunk/cumin/python/cumin/client.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/client.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/client.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -27,13 +27,13 @@
col = self.SystemConnectionColumn(app, "sysconn")
self.add_column(col)
-
+
col = self.AuthIdentityColumn(app, "authid")
self.add_column(col)
-
+
col = self.FedLinkColumn(app, "fedlink")
self.add_column(col)
-
+
col = self.SentColumn(app, "sent")
col.alignment = "right"
self.add_column(col)
@@ -93,24 +93,24 @@
href = self.frame.connection.get_href(session, conn)
return fmt_link(href, fmt_shorten(data["addr"]))
- class SystemConnectionColumn(SqlTableColumn):
+ class SystemConnectionColumn(SqlTableColumn):
def render_title(self, session, data):
return "Connect Type"
-
+
def render_content(self, session, data):
if data['sysconn']:
return "System"
else:
return "Client"
-
+
class AuthIdentityColumn(SqlTableColumn):
def render_title(self, session, data):
return "Auth Id"
-
+
class FedLinkColumn(SqlTableColumn):
def render_title(self, session, data):
return "Fed Link"
-
+
def render_content(self, session, data):
if data['fedlink']:
return "Yes"
@@ -229,13 +229,13 @@
class ConnectionStatus(CuminStatus):
def render_frames_from(self, session, conn):
return self.app.model.connection.framesFromClient.rate_html(conn)
-
+
def render_frames_to(self, session, conn):
return self.app.model.connection.framesToClient.rate_html(conn)
def render_bytes_from(self, session, conn):
return self.app.model.connection.bytesFromClient.rate_html(conn)
-
+
def render_bytes_to(self, session, conn):
return self.app.model.connection.bytesToClient.rate_html(conn)
@@ -245,7 +245,7 @@
status = ConnectionStatus(app, "status")
self.add_child(status)
-
+
self.__tabs = TabbedModeSet(app, "tabs")
self.add_child(self.__tabs)
@@ -300,7 +300,7 @@
def render_title(self, session):
return "Detach Sessions"
-
+
def render_item_content(self, session, id):
return "Detach Session '%s'" % Session.get(id).name
@@ -318,7 +318,7 @@
def render_title(self, session):
return "Close Sessions"
-
+
def render_item_content(self, session, id):
return "Close Session '%s'" % Session.get(id).name
@@ -351,7 +351,7 @@
def get_args(self, session):
return self.frame.get_args(session)
-
+
def render_title(self, session, conn):
return "Sessions %s" % fmt_count(conn.sessions.count())
Modified: mgmt/trunk/cumin/python/cumin/collector.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/collector.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/collector.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -75,28 +75,28 @@
def process_submit(self, session):
ids = self.parent.ids.get(session)
self.parent.ids.clear(session)
-
+
branch = session.branch()
frame = self.frame.show_colls_start(branch)
frame.ids.set(branch, ids)
self.page.set_redirect_url(session, branch.marshal())
-
+
def render_content(self, session):
return "Start"
-
+
class StopButton(FormButton):
def process_submit(self, session):
ids = self.parent.ids.get(session)
self.parent.ids.clear(session)
-
+
branch = session.branch()
frame = self.frame.show_colls_stop(branch)
frame.ids.set(branch, ids)
self.page.set_redirect_url(session, branch.marshal())
-
+
def render_content(self, session):
return "Stop"
-
+
class CollectorFrame(CuminFrame):
def __init__(self, app, name):
super(CollectorFrame, self).__init__(app, name)
@@ -128,11 +128,11 @@
class CollectorStatus(CuminStatus):
def render_title(self, session, object):
return "Collector Status"
-
+
class CollectorStart(CuminBulkActionForm):
def render_title(self, session, *args):
return "Start Collector"
-
+
def render_form_heading(self, session, *args):
return ""
@@ -148,7 +148,7 @@
class CollectorStop(CuminBulkActionForm):
def render_title(self, session, *args):
return "Stop Collector"
-
+
def render_form_heading(self, session, *args):
return ""
Modified: mgmt/trunk/cumin/python/cumin/collector.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/collector.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/collector.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -35,24 +35,23 @@
[CollectorSet.html]
<form id="{id}" method="post" action="?">
-
- <div class="sactions">
- <h2>Act on Selected Collectors:</h2>
- {start} {stop}
- </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>
+ <div class="sactions">
+ <h2>Act on Selected Collectors:</h2>
+ {start} {stop}
+ </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>
Modified: mgmt/trunk/cumin/python/cumin/demo.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/demo.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/demo.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -96,7 +96,7 @@
measure.add_value(value > 0 and value or 0)
else:
measure.add_value(measure.get_value())
-
+
def frob_errors(self, errors):
if random() < 0.005:
errors.append(object())
@@ -114,10 +114,10 @@
for vhost in broker.virtual_host_items():
self.frob(vhost)
-
+
for exchange in vhost.exchange_items():
self.frob(exchange)
-
+
for binding in exchange.binding_items():
self.frob(binding)
@@ -135,7 +135,7 @@
for session in conn.session_items():
self.frob(session)
-
+
if __name__ == "__main__":
import sys
Modified: mgmt/trunk/cumin/python/cumin/exchange.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/exchange.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/exchange.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -15,7 +15,7 @@
class ExchangeInputSet(RadioInputSet):
def __init__(self, app, name):
super(ExchangeInputSet, self).__init__(app, name)
-
+
param = ExchangeParameter(app, "param")
self.add_parameter(param)
self.set_parameter(param)
@@ -76,7 +76,7 @@
def disable_exchange(self, session, data):
return data["name"] in ExchangeInfo.get_builtins()
-
+
def render_add_exchange_url(self, session):
branch = session.branch()
self.frame.exchange_add.show(branch)
@@ -85,7 +85,7 @@
def render_title(self, session):
vhost = self.vhost.get(session)
return "Exchanges %s" % fmt_count(vhost.exchanges.count())
-
+
def render_sql_where(self, session):
vhost = self.vhost.get(session)
@@ -107,7 +107,7 @@
branch = session.branch()
self.frame.exchanges_remove.show(branch).ids.set(branch, ids)
self.page.set_redirect_url(session, branch.marshal())
-
+
def render_content(self, session):
return "Remove"
@@ -179,7 +179,7 @@
reg = self.frame.get_object(session)
action = self.app.model.exchange.remove
action.invoke(exchange)
-
+
def render_title(self, session):
return "Remove Exchanges"
@@ -196,7 +196,7 @@
self.view = ExchangeView(app, "view")
self.add_mode(self.view)
self.set_view_mode(self.view)
-
+
self.remove = ExchangeRemove(app, "remove")
self.add_mode(self.remove)
self.set_remove_mode(self.remove)
@@ -294,9 +294,9 @@
self.__remove = self.Remove(app, "remove")
self.add_child(self.__remove)
-
+
self.set_default_column_name("q_id")
-
+
def get_visible_columns(self, session):
return self.get_request_visible_columns(session, ["q_id"])
@@ -317,7 +317,7 @@
href = self.page.main.broker.bindings_remove.get_href(session, ids)
self.page.set_redirect_url(session, href)
-
+
def render_content(self, session):
return "Remove"
@@ -329,7 +329,7 @@
def render_title(self, session):
return "Remove Binding"
-
+
def render_form_heading(self, session, *args):
return "Remove Binding between:"
@@ -349,26 +349,26 @@
self.exchange_name = ExchangeNameField(app, "exchange_name")
self.add_field(self.exchange_name)
-
+
self.exchange_type = self.ExchangeTypeField(app, "exchange_type")
self.add_field(self.exchange_type)
-
+
self.more = MoreFieldSet(app, "more")
self.add_field(self.more)
-
+
self.durable = self.ExchangeDurabilityField(app, "durable")
self.more.add_field(self.durable)
-
+
self.sequence = self.SequenceField(app, "sequence")
self.more.add_field(self.sequence)
-
+
self.ive = self.IVEField(app, "ive")
self.more.add_field(self.ive)
-
+
class SequenceField(TwoOptionRadioField):
def render_title(self, session):
return "Insert Sequence?"
-
+
def render_field_help(self, session):
return "(Exchange will insert a 'qpid.msg_sequence' field in the message header)"
@@ -381,7 +381,7 @@
class IVEField(TwoOptionRadioField):
def render_title(self, session):
return "Initial Value Exchange?"
-
+
def render_field_help(self, session):
return "(Exchange will behave as an 'initial-value-exchange', keeping a reference to the last message forwarded and enqueuing that message to newly bound queues)"
@@ -394,7 +394,7 @@
class ExchangeDurabilityField(TwoOptionRadioField):
def render_title(self, session):
return "Durable?"
-
+
def render_field_help(self, session):
return "(Queue is durable)"
@@ -407,67 +407,67 @@
class ExchangeTypeField(RadioField):
def __init__(self, app, name):
super(ExchangeForm.ExchangeTypeField, self).__init__(app, name, None)
-
+
self.param = Parameter(app, "param")
self.param.default = "direct"
self.add_parameter(self.param)
-
+
option = self.Direct(app, "direct", self.param)
self.add_option(option)
option = self.Topic(app, "topic", self.param)
self.add_option(option)
-
+
option = self.Fanout(app, "fanout", self.param)
self.add_option(option)
-
+
option = self.Headers(app, "headers", self.param)
self.add_option(option)
-
+
option = self.XML(app, "xml", self.param)
self.add_option(option)
-
+
def render_title(self, session):
return "Exchange Type"
-
+
def render_field_help(self, session):
return "(Type of exchange to add)"
-
+
class Direct(RadioFieldOption):
def render_value(self, session):
return "direct"
-
+
def render_title(self, session):
return "<em>Direct:</em> Route messages to queues by queue name"
-
+
class Topic(RadioFieldOption):
def render_value(self, session):
return "topic"
-
+
def render_title(self, session):
return "<em>Topic:</em> Route messages to queues by topic keyword match"
-
+
class Fanout(RadioFieldOption):
def render_value(self, session):
return "fanout"
-
+
def render_title(self, session):
return "<em>Fan Out:</em> Route message to all queues attached to this exchange"
-
+
class Headers(RadioFieldOption):
def render_value(self, session):
return "headers"
-
+
def render_title(self, session):
return "<em>Headers:</em> Route message to queues based on content of the message header"
-
+
class XML(RadioFieldOption):
def render_value(self, session):
return "xml"
-
+
def render_title(self, session):
return "<em>XML:</em> Route message to queues based on XML content of the message"
-
+
class ExchangeAdd(ExchangeForm):
def process_cancel(self, session):
branch = session.branch()
Modified: mgmt/trunk/cumin/python/cumin/exchange.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/exchange.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/exchange.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -48,32 +48,32 @@
[ExchangeSet.html]
<form id="{id}" method="post" action="?">
+ <ul class="actions">
+ <li><a class="nav" href="{add_exchange_url}">Add New Exchange</a></li>
+ </ul>
- <ul class="actions">
- <li><a class="nav" href="{add_exchange_url}">Add New Exchange</a></li>
- </ul>
-
- <div class="rfloat">{phase}</div>
- {unit}
-
- <div class="sactions">
- <h2>Act on Selected Exchanges:</h2>
- {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>
+ <div class="rfloat">{phase}</div>
+ {unit}
+
+ <div class="sactions">
+ <h2>Act on Selected Exchanges:</h2>
+ {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>
[ExchangeSet.item_html]
@@ -143,27 +143,27 @@
[ExchangeBindingSet.html]
<form id="{id}" method="post" action="?">
- <div class="rfloat">{phase}</div>
+ <div class="rfloat">{phase}</div>
<ul class="radiotabs"><li> </li></ul>
-
- <div class="sactions">
- <h2>Act on Selected Bindings:</h2>
- {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>
+
+ <div class="sactions">
+ <h2>Act on Selected Bindings:</h2>
+ {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>
[ExchangeBindingSet.item_html]
Modified: mgmt/trunk/cumin/python/cumin/job.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/job.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/job.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -26,11 +26,11 @@
col = self.CustomIdColumn(app, "custom_id")
self.add_column(col)
self.set_default_column(col)
-
+
col = self.GlobalJobIdColumn(app, "global_job_id")
col.visible = False
self.add_column(col)
-
+
col = self.CommandColumn(app, "cmd")
self.add_column(col)
@@ -50,31 +50,31 @@
col.alignment = "right"
col.visible = False
self.add_column(col)
-
+
col = self.ConcurrencyLimitsColumn(app, "concurrency_limits")
#col.visible = False
self.add_column(col)
-
+
col = self.CustomGroupColumn(app, "custom_group")
col.visible = False
self.add_column(col)
-
+
col = self.CustomPriorityColumn(app, "custom_priority")
col.visible = False
self.add_column(col)
-
+
col = self.StatusColumn(app, "job_status")
self.add_column(col)
col = self.TitleColumn(app, "title")
col.visible = False
self.add_column(col)
-
+
col = self.ArgsColumn(app, "args")
col.alignment = "right"
col.visible = False
self.add_column(col)
-
+
self.phase = JobStatusSwitch(app, "phase")
self.add_child(self.phase)
@@ -83,7 +83,7 @@
def get_phase_sql(self, session, phase=None):
return self.phase.get_sql_constraint(session, phase)
-
+
def get_phase_title(self, session):
state = self.phase.get(session)
return self.phase.get_title(state)
@@ -102,19 +102,19 @@
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 "Limits"
-
+
class CustomGroupColumn(SqlTableColumn):
def render_title(self, session, data):
return "Job Group"
-
+
def render_content(self, session, data):
name = data[self.name]
@@ -122,11 +122,11 @@
group = Identifiable(name)
href = self.page.main.pool.job_group.get_href(session, group)
return fmt_link(href, fmt_shorten(name, 12, 3))
-
+
class CustomIdColumn(SqlTableColumn):
def render_title(self, session, data):
return "ID"
-
+
def render_content(self, session, data):
id = data[self.name]
@@ -138,11 +138,11 @@
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):
id = data["id"]
@@ -151,23 +151,23 @@
href = self.frame.job.get_href(session, job)
content = fmt_shorten(data[self.name], 12, 3)
return fmt_link(href, content)
-
+
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)
-
+ 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):
name = data["submitter"]
@@ -175,11 +175,11 @@
sub = Identifiable(data["submitter_id"])
href = self.page.main.pool.submitter.get_href(session, sub)
return fmt_link(href, fmt_shorten(name))
-
+
class SchedulerColumn(SqlTableColumn):
def render_title(self, session, data):
return "Scheduler"
-
+
def render_content(self, session, data):
name = data["scheduler"]
@@ -191,7 +191,7 @@
class CommandColumn(ItemTableColumn):
def render_title(self, session, data):
return "Command"
-
+
def render_content(self, session, data):
return fmt_shorten(data[self.name], 0, 16)
@@ -237,7 +237,7 @@
class JobTab(JobSet):
def __init__(self, app, name):
super(JobTab, self).__init__(app, name)
-
+
self.__remove = JobRemoveButton(app, "remove")
self.add_child(self.__remove)
@@ -261,22 +261,22 @@
try:
first = rows[0]
job = Identifiable(first["id"])
- href = self.app.main_page.main.pool.job.get_href(session, job)
+ href = self.app.main_page.main.pool.job.get_href(session, job)
self.page.set_redirect_url(session, href)
except:
self.job_search.set_not_found(session, search_term)
else:
self.job_search.set_not_found(session, search_term)
-
+
self.job_search.set(session, None)
def render_find_sql_where(self, session, *args):
return "j.custom_id = %(custom_id)s"
-
+
def get_find_sql_values(self, session, pool):
return {"custom_id": self.job_search.get(session)}
#return {"custom_id": self.job_search.get(session), "pool": pool.id}
-
+
def get_full_item_count(self, session, *args):
# request item count will phase=="a"
new_args = (args[0], "a")
@@ -294,39 +294,39 @@
class JobSearch(StringInput):
""" displays the input box and button used to search for job id """
-
+
def __init__(self, app, name):
super(JobTab.JobSearch, self).__init__(app, name)
self.__go = self.JobSearchButton(app, "go")
self.add_child(self.__go)
-
+
self.not_found = Attribute(app, "error")
self.add_attribute(self.not_found)
def set_not_found(self, session, value):
self.not_found.set(session, value)
-
+
def render_search_prompt(self, session):
not_found = self.not_found.get(session)
return not_found and "%s Not Found" % escape_entity(not_found) or self.render_search_default_prompt(session)
-
+
def render_search_default_prompt(self, session):
return "Enter Job ID"
-
+
def render_search_class(self, session):
return self.not_found.get(session) and "search_error" or " "
def find_job(self, session):
self.parent.find_job(session)
-
+
class JobSearchButton(FormButton):
def process_submit(self, session):
self.parent.find_job(session)
-
+
def render_content(self, session):
return "Go"
-
+
from system import SystemFrame, SystemSet
class JobGroupFrame(CuminFrame):
@@ -379,14 +379,14 @@
def render_title(self, session):
return "Statistics"
-
+
class JobGroupStatSet(StatSet):
def __init__(self, app, name, category):
super(JobGroupStatSet, self).__init__(app, name, category)
-
+
self.jobs = Attribute(app, "jobs")
self.add_attribute(self.jobs)
-
+
def process(self, session):
group = self.frame.get_args(session)[0]
if group:
@@ -394,7 +394,7 @@
value = Job.select(where_group).count()
self.jobs.set(session, value)
super(JobGroupStatSet, self).process(session)
-
+
def render_rate_text(self, session, args):
return "Percentage"
@@ -413,7 +413,7 @@
def get_value(self, group, state):
where_group = "custom_group = '%s' \
- and job_status = %i" % (group.get_id(),
+ and job_status = %i" % (group.get_id(),
JobStatusInfo.get_status_int(state))
return Job.select(where_group).count()
@@ -427,7 +427,7 @@
value = self.get_value(group, state)
percent = (value*1.0) / (jobs*1.0) * 100.0
return jobs and "%2.1f" % percent or "-"
-
+
class JobRemoveButton(FormButton):
def process_submit(self, session):
ids = self.parent.ids.get(session)
@@ -435,10 +435,10 @@
href = self.frame.jobs_remove.get_href(session, ids)
self.page.set_redirect_url(session, href)
-
+
def render_content(self, session):
return "Remove"
-
+
def render_disabled_attr(self, session, *args):
phase = self.parent.phase.get(session)
return phase == "d" and "disabled=\"disabled\"" or None
@@ -454,10 +454,10 @@
href = self.frame.jobs_hold.get_href(session, ids)
self.page.set_redirect_url(session, href)
-
+
def render_content(self, session):
return "Hold"
-
+
def render_disabled_attr(self, session, *args):
phase = self.parent.phase.get(session)
return (phase == "h" or phase == "d") and "disabled=\"disabled\"" or None
@@ -473,10 +473,10 @@
href = self.frame.jobs_release.get_href(session, ids)
self.page.set_redirect_url(session, href)
-
+
def render_content(self, session):
return "Release"
-
+
def render_disabled_attr(self, session, *args):
phase = self.parent.phase.get(session)
return (phase == "r" or phase == "d") and "disabled=\"disabled\"" or None
@@ -488,7 +488,7 @@
class JobGroupJobSet(JobTab):
def __init__(self, app, name):
super(JobGroupJobSet, self).__init__(app, name)
-
+
self.__remove = JobRemoveButton(app, "remove")
self.add_child(self.__remove)
@@ -500,7 +500,7 @@
def get_visible_columns(self, session):
return self.get_request_visible_columns(session, ["scheduler", "submitter"])
-
+
def render_title(self, session, group):
where_group = "custom_group = '%s'" % group.get_id()
return "Jobs %s" % fmt_count(Job.select(where_group).count())
@@ -553,20 +553,20 @@
self.__edit_ads = JobAdsEditor(app, "editads")
self.add_mode(self.__edit_ads)
-
+
self.__system = SystemFrame(app, "system")
self.add_mode(self.__system)
def show_ads_edit(self, session):
self.page.set_frame(session, self.__edit_ads)
- return self.show_mode(session, self.__edit_ads)
-
+ return self.show_mode(session, self.__edit_ads)
+
def show_job_group(self, session, jobgroup):
self.__job.set_object(session, jobgroup)
self.page.set_frame(session, self.__job)
self.__job.set_switch(session, "group")
return self.show_mode(session, self.__job)
-
+
def show_system(self, session, system):
frame = self.show_mode(session, self.__system)
frame.set_object(session, system)
@@ -616,7 +616,7 @@
3: "string"}
def get_args(self, session):
return self.frame.get_args(session)
-
+
def do_get_items(self, session, job):
items = self.items.get(session)
if not items:
@@ -629,27 +629,27 @@
def get_raw_ads(self, session, job):
action = self.app.model.job.getad
return action.do_invoke(job)
-
+
def gen_items(self, session, job):
job_ads = self.get_raw_ads(session, job)
-
+
cls = self.app.model.get_class_by_object(job)
return [self.gen_item(x, job_ads[x]["VALUE"], cls, dtype=self.types[job_ads[x]["TYPE"]]) for x in job_ads]
# list of dictionaries
# each disctionary has:
# name:, value:, type: [, error:] [, property:] [,path:]
#return [self.gen_item(x, job_ads[x], cls) for x in job_ads]
-#
+#
def gen_item(self, name, value, cls, path=None, dtype=None, error=None, orig=None):
""" Generate a dict with name, value, type, error, path, property, orig
-
+
This is called with raw GetAd data and with processed data from
a form submit. With raw data, only the name and value will be present.
- With form data, we might have a path, dtype, or error. dtype is the
+ With form data, we might have a path, dtype, or error. dtype is the
data type that was remembered from the raw data.
"""
-
+
idict = dict()
idict["name"] = name
idict["value"] = value
@@ -661,28 +661,28 @@
idict["orig"] = orig
if error:
if "error" in error:
- idict["error"] = error["error"]
+ idict["error"] = error["error"]
if name in cls.ad_properties_by_name:
idict["property"] = cls.ad_properties_by_name[name]
if path:
idict["path"] = path
return idict
-
+
def strip_string_quotes(self, value):
dvalue = value
if value:
if value[:1] == "\"" and value[-1:] == "\"":
dvalue = value[1:-1]
return dvalue
-
+
class JobPropertyRenderer(TemplateRenderer):
def render_title(self, session, item):
title = item["name"]
if "property" in item:
property = item["property"]
if property.title:
- title = property.get_title(session)
+ title = property.get_title(session)
return escape_amp(title)
def render_value(self, session, item):
@@ -693,7 +693,7 @@
value = property.renderer(session, value)
ret = escape_entity(str(value))
return self.insert_breaks(ret)
-
+
def insert_breaks(self, value):
subwords = list()
snippets = parse(value, begin_delim="&", end_delim=";")
@@ -702,7 +702,7 @@
subwords.append(snippet[:40])
snippet = snippet[40:]
subwords.append(snippet)
-
+
return "​".join(subwords)
def render_inline_help(self, session, item):
@@ -719,7 +719,7 @@
def get_args(self, session):
return self.frame.get_args(session)
-
+
def render_title(self, session, job):
return "Attributes"
@@ -737,9 +737,9 @@
item_group = "Other"
if item_group == group:
group_items.append(item)
-
+
return group_items
-
+
def render_properties(self, session, *args):
items = self.do_get_items(session, *args)
writer = Writer()
@@ -763,7 +763,7 @@
def render_group_name(self, session, args):
return args[1]
-
+
class JobAdsEditor(CuminForm, JobAdsViewer):
def __init__(self, app, name):
super(JobAdsEditor, self).__init__(app, name)
@@ -780,15 +780,15 @@
cls = self.app.model.get_class_by_object(job)
ads = self.ads.get(session)
if len(ads):
- return [self.gen_item(x, ads[x]["value"], cls, path=self.ads.path,
- dtype=ads[x]["type"], error=ads[x], orig=ads[x]["orig"]) for x in ads
+ return [self.gen_item(x, ads[x]["value"], cls, path=self.ads.path,
+ dtype=ads[x]["type"], error=ads[x], orig=ads[x]["orig"]) for x in ads
if self.is_group(x, cls, group)]
else:
items = super(JobAdsEditor, self).do_get_items(session, args)
for item in items:
item["path"] = self.ads.path
return items
-
+
def is_group(self, name, cls, group):
if name in cls.ad_properties_by_name:
property = cls.ad_properties_by_name[name]
@@ -803,11 +803,11 @@
self.page.pop_frame(branch)
self.page.get_frame(branch).show_view(branch)
self.page.set_redirect_url(session, branch.marshal())
-
+
def process_submit(self, session, job):
ads = self.ads.get(session)
errors = False
-
+
just_ads = dict()
for field in ads:
try:
@@ -840,7 +840,7 @@
orig = float(orig)
if fval != orig:
just_ads[unicode(field)] = fval
-
+
if not errors:
for field in just_ads:
action = self.app.model.job.setattribute
@@ -853,34 +853,34 @@
self.which_file = self.FileSwitch(app, "file")
self.add_child(self.which_file)
-
+
self.first_last = self.FLSwitch(app, "first_last")
self.add_child(self.first_last)
-
+
self.__fetch = self.FetchButton(app, "refresh")
self.add_child(self.__fetch)
self.ads = JobAdsSet(app, "ads")
self.add_child(self.ads)
-
+
self.out_file = Parameter(app, "out")
self.add_parameter(self.out_file)
-
+
self.err_file = Parameter(app, "err")
self.add_parameter(self.err_file)
-
+
self.user_file = Parameter(app, "user")
self.add_parameter(self.user_file)
-
+
self.output = self.OutputFile(app, "job_output")
self.add_child(self.output)
def get_args(self, session):
return self.frame.get_args(session)
-
+
def render_title(self, session, *args):
return "Output"
-
+
def render(self, session, *args):
out_file = self.out_file.get(session)
err_file = self.err_file.get(session)
@@ -900,7 +900,7 @@
out_file = self.ads.strip_string_quotes(out_file)
err_file = self.ads.strip_string_quotes(err_file)
user_file = self.ads.strip_string_quotes(user_file)
-
+
# remember the file names so we don't need to reget them
self.out_file.set(session, out_file)
self.err_file.set(session, err_file)
@@ -917,13 +917,13 @@
self.which_file.disable(session, "e")
if self.which_file.is_bad(user_file):
self.which_file.disable(session, "u")
-
+
return super(JobOutput, self).render(session, *args)
-
+
def render_loading(self, session, *args):
file = self.which_file.get_current_file_name(session)
return file and "loading..." or "Output, Error, and UserLog file names are invalid."
-
+
def get_file_args(self, session):
first_last = self.first_last.get(session)
if first_last == "t":
@@ -934,7 +934,7 @@
end = 2048
file = self.which_file.get_current_file_name(session)
return (file, start, end)
-
+
class OutputFile(AjaxField):
def get_url(self, session):
job = self.parent.frame.get_args(session)[0]
@@ -945,59 +945,59 @@
args = "%s&%i&%i&%s" % (file, start, end, fl)
args = escape_amp(args)
return "call.xml?class=job;id=%i;method=fetch;xargs=%s" % (job.id, args)
-
+
def do_render(self, session):
return self.render_script(session)
class FetchButton(FormButton):
def render_content(self, session):
return "Refresh"
-
+
class FileSwitch(StateSwitch):
def __init__(self, app, name):
super(JobOutput.FileSwitch, self).__init__(app, name)
-
+
self.add_state("o", "Output")
self.add_state("e", "Error")
self.add_state("u", "UserLog")
self.disabled = self.DisabledList(app, "disabled")
self.add_attribute(self.disabled)
-
+
self.link_titles = self.Titles(app, "link_titles")
self.add_attribute(self.link_titles)
-
+
class DisabledList(Attribute):
def get_default(self, session):
return list()
-
+
class Titles(Attribute):
def get_default(self, session):
return dict()
-
+
def disable(self, session, state):
disabled = self.disabled.get(session)
disabled.append(state)
self.disabled.set(session, disabled)
if state == self.get(session):
self.select_first_enabled(session)
-
+
def set_file_name(self, session, state, link_title):
link_titles = self.link_titles.get(session)
link_titles[state] = link_title
self.link_titles.set(session, link_titles)
-
+
def get_file_name(self, session, state):
link_titles = self.link_titles.get(session)
return state in link_titles and link_titles[state] or ""
-
+
def get_current_file_name(self, session):
state = self.get(session)
return self.get_file_name(session, state)
-
+
def select_first_enabled(self, session):
states = self.get_items(session)
- disabled = self.disabled.get(session)
+ disabled = self.disabled.get(session)
for state in states:
if not state in disabled:
self.set(session, state)
@@ -1006,7 +1006,7 @@
def render_item_link(self, session, state):
branch = session.branch()
self.set(branch, state)
-
+
title = self.get_title(state)
link_titles = self.link_titles.get(session)
link_title = state in link_titles and link_titles[state] or ""
@@ -1026,12 +1026,12 @@
elif "/dev/null" in file.lower():
bad = True
return bad
-
-
+
+
class FLSwitch(StateSwitch):
def __init__(self, app, name):
super(JobOutput.FLSwitch, self).__init__(app, name)
-
+
self.add_state("t", "Tail", "Display end of file")
self.add_state("h", "Head", "Display beginning of file")
@@ -1043,7 +1043,7 @@
def render_job_status(self, session, job):
if job:
return JobStatusInfo.get_status_string(job.JobStatus)
-
+
class JobGroupSet(CuminTable):
def __init__(self, app, name):
super(JobGroupSet, self).__init__(app, name)
@@ -1057,7 +1057,7 @@
col = self.JobsCountColumn(app, "jobs")
col.alignment = "right"
self.add_column(col)
-
+
class GroupColumn(SqlTableColumn):
def render_title(self, session, data):
return "Job Group"
@@ -1069,11 +1069,11 @@
group = Identifiable(name)
href = self.page.main.pool.job_group.get_href(session, group)
return fmt_link(href, fmt_shorten(name))
-
+
class JobsCountColumn(SqlTableColumn):
def render_title(self, session, data):
return "Jobs"
-
+
class JobsAndGroupsTab(Widget):
def __init__(self, app, name):
super(JobsAndGroupsTab, self).__init__(app, name)
@@ -1083,10 +1083,10 @@
self.job_tab = JobTab(app, "jobtab")
self.add_child(self.job_tab)
-
+
self.job_group_tab = JobGroupTab(app, "jobgrouptab")
self.add_child(self.job_group_tab)
-
+
def get_args(self, session):
return self.frame.get_args(session)
@@ -1096,13 +1096,13 @@
def show_status_switch(self, session):
is_group = self.is_group.get(session)
return is_group == "j"
-
+
def set_switch(self, session, switch):
if switch == "group":
self.is_group.set(session, "g")
else:
self.is_group.set(session, "j")
-
+
def render_phase(self, session, *args):
is_group = self.is_group.get(session)
if is_group == "j":
@@ -1112,7 +1112,7 @@
is_group = self.is_group.get(session)
if is_group == "j":
return self.job_tab.render(session)
-
+
def render_job_groups(self, session, *args):
is_group = self.is_group.get(session)
if is_group == "g":
@@ -1121,7 +1121,7 @@
class JobGroupTab(JobGroupSet, Form):
def __init__(self, app, name):
super(JobGroupTab, self).__init__(app, name)
-
+
self.__remove = self.Remove(app, "remove")
self.add_child(self.__remove)
@@ -1140,10 +1140,10 @@
href = self.frame.job_group_remove.get_href(session, ids)
self.page.set_redirect_url(session, href)
-
+
def render_content(self, session):
return "Remove"
-
+
class Hold(FormButton):
def process_submit(self, session):
ids = self.parent.ids.get(session)
@@ -1151,10 +1151,10 @@
href = self.frame.job_group_hold.get_href(session, ids)
self.page.set_redirect_url(session, href)
-
+
def render_content(self, session):
return "Hold"
-
+
class Release(FormButton):
def process_submit(self, session):
ids = self.parent.ids.get(session)
@@ -1162,43 +1162,43 @@
href = self.frame.job_group_release.get_href(session, ids)
self.page.set_redirect_url(session, href)
-
+
def render_content(self, session):
return "Release"
class JobReasonBulkActionForm(CuminBulk):
def __init__(self, app, name):
super(JobReasonBulkActionForm, self).__init__(app, name)
-
+
self.reason = Parameter(app, "reason")
self.add_parameter(self.reason)
-
+
self.error = Attribute(app, "error")
self.add_attribute(self.error)
self.error_tmpl = Template(self, "reason_html")
-
+
def render_reason_text(self, session, *args):
return "Reason"
-
+
def render_reason_path(self, session, *args):
return self.reason.path
-
+
def render_reason_value(self, session, *args):
return escape_entity(self.reason.get(session))
-
+
def render_reason_error(self, session, *args):
if self.error.get(session):
writer = Writer()
self.error_tmpl.render(writer, session, *args)
return writer.to_string()
-
+
def render_reason_error_text(self, session, *args):
return self.error.get(session)
-
+
def render_form_heading(self, session, *args):
pass
-
+
def process_submit(self, session, *args):
reason = self.reason.get(session)
if not reason:
@@ -1218,9 +1218,9 @@
reason = [self.reason.get(session)]
verb_by = "%s by %s" % (verb, session.user_session.subject.name)
reason.insert(0, verb_by)
- return ": ".join(reason)
+ return ": ".join(reason)
-class JobReasonIntBulkActionForm(JobReasonBulkActionForm, CuminIntIdList):
+class JobReasonIntBulkActionForm(JobReasonBulkActionForm, CuminIntIdList):
def get_items(self, session, *args):
return self.ids.get(session)
@@ -1230,7 +1230,7 @@
action = self.app.model.job.hold
reason = self.get_reason(session, "held")
action.invoke(job, reason)
-
+
def render_title(self, session):
ids = self.ids.get(session)
return len(ids) > 1 and "Hold Jobs" or "Hold Job"
@@ -1240,14 +1240,14 @@
def render_reason_text(self, session, *args):
return "Hold Reason"
-
+
class JobSetRelease(JobReasonIntBulkActionForm):
def process_item(self, session, id):
job = Job.get(id)
action = self.app.model.job.release
reason = self.get_reason(session, "released")
action.invoke(job, reason)
-
+
def render_title(self, session):
ids = self.ids.get(session)
return len(ids) > 1 and "Release Jobs" or "Release Job"
@@ -1257,14 +1257,14 @@
def render_reason_text(self, session, *args):
return "Release Reason"
-
+
class JobSetRemove(JobReasonIntBulkActionForm):
def process_item(self, session, id):
job = Job.get(id)
action = self.app.model.job.remove
reason = self.get_reason(session, "removed")
action.invoke(job, reason)
-
+
def render_title(self, session):
ids = self.ids.get(session)
return len(ids) > 1 and "Remove Jobs" or "Remove Job"
@@ -1274,8 +1274,8 @@
def render_reason_text(self, session, *args):
return "Remove Reason"
-
-class JobReasonStringBulkActionForm(JobReasonBulkActionForm, CuminStringIdList):
+
+class JobReasonStringBulkActionForm(JobReasonBulkActionForm, CuminStringIdList):
def get_items(self, session, *args):
return self.ids.get(session)
@@ -1286,7 +1286,7 @@
reason = self.get_reason(session, "held")
for job in Job.select(sel):
action.invoke(job, reason)
-
+
def render_title(self, session):
ids = self.ids.get(session)
return len(ids) > 1 and "Hold Job Groups" or "Hold Job Group"
@@ -1296,7 +1296,7 @@
def render_reason_text(self, session, *args):
return "Hold Reason"
-
+
class JobGroupRelease(JobReasonStringBulkActionForm):
def process_item(self, session, id):
sel = "custom_group='%s'" % id
@@ -1304,7 +1304,7 @@
reason = self.get_reason(session, "released")
for job in Job.select(sel):
action.invoke(job, reason)
-
+
def render_title(self, session):
ids = self.ids.get(session)
return len(ids) > 1 and "Release Job Groups" or "Release Job Group"
@@ -1314,7 +1314,7 @@
def render_reason_text(self, session, *args):
return "Release Reason"
-
+
class JobGroupRemove(JobReasonStringBulkActionForm):
def process_item(self, session, id):
sel = "custom_group='%s'" % id
@@ -1322,7 +1322,7 @@
reason = self.get_reason(session, "removed")
for job in Job.select(sel):
action.invoke(job, reason)
-
+
def render_title(self, session):
ids = self.ids.get(session)
return len(ids) > 1 and "Remove Job Groups" or "Remove Job Group"
@@ -1332,7 +1332,7 @@
def render_reason_text(self, session, *args):
return "Remove Reason"
-
+
class JobStatusSwitch(StateSwitch):
def __init__(self, app, name):
super(JobStatusSwitch, self).__init__(app, name)
@@ -1343,7 +1343,7 @@
self.add_state("h", "Held")
self.add_state("c", "Completed")
self.add_state("d", "Removed")
-
+
def get_sql_constraint(self, session, phase=None):
if not phase:
phase = self.get(session)
@@ -1371,7 +1371,7 @@
else:
not_completed = "(j.qmf_delete_time is not null and j.job_status <> %i )" % JobStatusInfo.get_status_int("Completed")
is_removed = "j.job_status = %i" % JobStatusInfo.get_status_int("Removed")
- sql = " or ".join((not_completed, is_removed))
+ sql = " or ".join((not_completed, is_removed))
return sql
Modified: mgmt/trunk/cumin/python/cumin/job.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/job.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/job.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -27,8 +27,8 @@
[JobSet.find_sql]
select
- j.id,
- j.custom_id
+ j.id,
+ j.custom_id
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
@@ -62,81 +62,87 @@
[JobTab.css]
input.search_input {
- color: #555;
- border: 1px solid #333;
- font-size: 0.9em;
- font-weight: normal;
- padding-left: 0.25em;
+ color: #555;
+ border: 1px solid #333;
+ font-size: 0.9em;
+ font-weight: normal;
+ padding-left: 0.25em;
}
+
input.search_error {
- color: #CC0000 !important;
+ color: #CC0000 !important;
}
+
div.searchbox {
- padding-top: 2px;
+ padding-top: 2px;
}
[JobTab.javascript]
function JobSearchFocus() {
- var val = this.value;
- if (val == job_search_prompt) {
- this.value = "";
- this.style.color = "#000";
- this.className = "search_input"; // remove search_error class
- }
+ var val = this.value;
+
+ if (val == job_search_prompt) {
+ this.value = "";
+ this.style.color = "#000";
+ this.className = "search_input"; // remove search_error class
+ }
}
+
function JobSearchBlur() {
- var val = this.value;
- if (val == "") {
- this.style.color = "#555";
- job_search_prompt = job_search_default_prompt;
- this.value = job_search_prompt;
- }
+ var val = this.value;
+
+ if (val == "") {
+ this.style.color = "#555";
+ job_search_prompt = job_search_default_prompt;
+ this.value = job_search_prompt;
+ }
}
function attachJobSearch() {
- var oInput = document.getElementById("job_search");
- if (oInput) {
- oInput.onfocus = JobSearchFocus;
- oInput.onblur = JobSearchBlur;
- }
+ var oInput = document.getElementById("job_search");
+
+ if (oInput) {
+ oInput.onfocus = JobSearchFocus;
+ oInput.onblur = JobSearchBlur;
+ }
}
+
addEvent(window, "load", attachJobSearch);
[JobTab.html]
<form id="{id}" method="post" action="?">
-
- <div class="sactions">
- {job_search}
- <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>
+ <div class="sactions">
+ {job_search}
+ <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>
[JobSearch.html]
- <div class="rfloat searchbox">
- <h2><label for="job_search">Go To Job:</label></h2>
- <input class="search_input {search_class}" type="text" name="{name}" id="job_search" value="{search_prompt}" />
- {go}
- </div>
- <script type="text/javascript">
- var job_search_default_prompt = "{search_default_prompt}"
- var job_search_prompt = "{search_prompt}"
- </script>
+<div class="rfloat searchbox">
+ <h2><label for="job_search">Go To Job:</label></h2>
+ <input class="search_input {search_class}" type="text" name="{name}" id="job_search" value="{search_prompt}" />
+ {go}
+</div>
+<script type="text/javascript">
+ var job_search_default_prompt = "{search_default_prompt}"
+ var job_search_prompt = "{search_prompt}"
+</script>
[JobGroupSet.sql]
select
@@ -151,7 +157,7 @@
{sql_limit}
[JobGroupSet.count_sql]
-select count(distinct j.custom_group)
+select count(distinct j.custom_group)
from job as j
{sql_where}
@@ -171,50 +177,49 @@
[JobGroupTab.html]
<form id="{id}" method="post" action="?">
+ <div class="sactions">
+ <h2>Act on Selected Groups:</h2>
+ {hold} {release} {remove}
+ </div>
- <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>
+ <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>
[JobGroupJobSet.html]
- <div class="rfloat">{phase}</div>
+<div class="rfloat">{phase}</div>
<form id="{id}" style="clear:right;" method="post" action="?">
- <div class="sactions">
- {job_search}
- <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>
+ <div class="sactions">
+ {job_search}
+ <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>
[JobStatus.html]
@@ -226,19 +231,19 @@
[JobAdsViewer.html]
<ul class="actions">
- <li><a class="nav" href="{edit_ads_url}">Edit Attributes</a></li>
+ <li><a class="nav" href="{edit_ads_url}">Edit Attributes</a></li>
</ul>
<table class="CuminDetails">
- <tbody>
- <tr>
- <td>
- {groups}
- </td>
- </tr>
- </tbody>
+ <tbody>
+ <tr>
+ <td>
+ {groups}
+ </td>
+ </tr>
+ </tbody>
</table>
<ul class="actions">
- <li><a class="nav" href="{edit_ads_url}">Edit Attributes</a></li>
+ <li><a class="nav" href="{edit_ads_url}">Edit Attributes</a></li>
</ul>
[JobAdsViewer.group_html]
@@ -261,59 +266,62 @@
[JobAdsViewer.property_html]
<tr>
- <th>{title}</th><td>{value}</td><td>{inline_help}</td>
+ <th>{title}</th><td>{value}</td><td>{inline_help}</td>
</tr>
[JobAdsEditor.css]
div.inline_help {
- float: right;
+ float: right;
}
div.inline_help h2 {
- display: inline;
+ display: inline;
}
[JobAdsEditor.html]
<form id="{id}" class="mform editform" method="post" action="?">
-<div class="inline_help">
-<h2>Legend</h2>
- <span class="edit_number">Numeric input expected</span>
- <span class="edit_string">String input expected</span>
-</div>
-{help} {submit} {cancel}
-<table class="CuminDetails Editable">
- <tbody>
- <tr>
- <td>
- {groups}
- </td>
- </tr>
- </tbody>
-</table>
-{help} {submit} {cancel}
-<div>{hidden_inputs}</div>
+ <div class="inline_help">
+ <h2>Legend</h2>
+ <span class="edit_number">Numeric input expected</span>
+ <span class="edit_string">String input expected</span>
+ </div>
+ {help} {submit} {cancel}
+ <table class="CuminDetails Editable">
+ <tbody>
+ <tr>
+ <td>
+ {groups}
+ </td>
+ </tr>
+ </tbody>
+ </table>
+ {help} {submit} {cancel}
+ <div>{hidden_inputs}</div>
</form>
[JobReasonBulkActionForm.css]
div.action_reason {
- margin: 1em;
+ margin: 1em;
}
+
div.action_reason label {
- font-weight: bold;
- margin-right: 0.5em;
+ font-weight: bold;
+ margin-right: 0.5em;
}
+
div.action_reason input {
- width: 20em;
+ width: 20em;
}
+
div.action_reason div.reason_error {
- float: right;
- border: 1px solid red;
- color: red;
- padding: 0.5em;
+ float: right;
+ border: 1px solid red;
+ color: red;
+ padding: 0.5em;
}
[JobReasonBulkActionForm.reason_html]
- <div class="reason_error">{reason_error_text}</div>
+ <div class="reason_error">{reason_error_text}</div>
[JobReasonBulkActionForm.html]
<form id="{id}" class="mform" method="post" action="?">
@@ -323,9 +331,9 @@
<div class="body">
<span class="legend">{form_heading}</span>
<div class="action_reason">
- {reason_error}
- <label for="reason">{reason_text}</label> <input type="text" name="{reason_path}" id="reason" value="{reason_value}" maxlength="4000" />
- </div>
+ {reason_error}
+ <label for="reason">{reason_text}</label> <input type="text" name="{reason_path}" id="reason" value="{reason_value}" maxlength="4000" />
+ </div>
<fieldset>
<ul>{items}</ul>
</fieldset>
@@ -344,74 +352,89 @@
//]]>
</script>
-
[JobOutput.css]
textarea#job_output {
- height: 25em;
- width: 100%;
- border: 1px solid #EAEAEA;
- font-family: Fixed, monospace;
- line-height: 1.15em;
- background-color: #FFF;
- color: #333;
+ height: 25em;
+ width: 100%;
+ border: 1px solid #EAEAEA;
+ font-family: Fixed, monospace;
+ line-height: 1.15em;
+ background-color: #FFF;
+ color: #333;
}
+
div.out_actions {
- padding:1em 1em 0 1em;
+ padding:1em 1em 0 1em;
}
+
div.refresh_info h2 {
- position: relative;
- top: -0.5em;
+ position: relative;
+ top: -0.5em;
}
[JobOutput.javascript]
function scrollToEnd (element) {
- if (typeof element.scrollTop != 'undefined' &&
- typeof element.scrollHeight != 'undefined') {
- element.scrollTop = element.scrollHeight;
- }
+ if (typeof element.scrollTop != 'undefined'
+ && typeof element.scrollHeight != 'undefined') {
+ element.scrollTop = element.scrollHeight;
+ }
}
+
function outputEnd() {
var tarea = document.getElementById("job_output");
- if (tarea) {
- scrollToEnd(tarea);
- setTimeout("get_job_output()", 5000);
+
+ if (tarea) {
+ scrollToEnd(tarea);
+ setTimeout("get_job_output()", 5000);
}
}
[JobOutput.html]
<form id="{id}" style="width:100%; border:0px;" class="mform" method="post" action="?">
- <div class="out_actions">
- <div class="rfloat">{first_last}</div>
- {file}
- </div>
-<div class="sactions refresh_info">{refresh} <h2>Last refresh was at <span id="out_time"></span></h2></div>
-<div><textarea name="job_output" id="job_output" rows="20" cols="80">
-{loading}{job_output}
-</textarea>
-{hidden_inputs}</div>
+ <div class="out_actions">
+ <div class="rfloat">{first_last}</div>
+
+ {file}
+ </div>
+
+ <div class="sactions refresh_info">{refresh} <h2>Last refresh was at <span id="out_time"></span></h2></div>
+
+ <div>
+ <textarea name="job_output" id="job_output" rows="20" cols="80">
+ {loading}{job_output}
+ </textarea>
+
+ {hidden_inputs}
+ </div>
</form>
[OutTime.javascript]
function got_out_time(obj, id) {
var elem = document.getElementById(id);
+
if (elem) {
var str = obj.time.value;
elem.innerHTML = str;
}
}
+
[OutputFile.javascript]
function got_job_output(obj, id) {
var elem = document.getElementById(id);
+
if (elem) {
var str = obj.fetch.output;
elem.value = str;
+
if (obj.fetch.tail == "t") {
- outputEnd();
+ outputEnd();
}
+
var d = new Date();
- var out_time = document.getElementById("out_time");
- if (out_time) {
- out_time.innerHTML = d.toLocaleString();
- }
+ var out_time = document.getElementById("out_time");
+
+ if (out_time) {
+ out_time.innerHTML = d.toLocaleString();
+ }
}
}
Modified: mgmt/trunk/cumin/python/cumin/limits.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/limits.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/limits.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -53,7 +53,7 @@
def completion():
pass
negotiator.Reconfig(self.app.model.data, completion)
-
+
def get_raw_limits(self, session, negotiator):
action = self.app.model.negotiator.GetLimits
return action.do_invoke(negotiator)
@@ -69,11 +69,11 @@
col = self.CurrentColumn(app, "curr")
col.alignment = "right"
self.add_column(col)
-
+
col = self.MaxColumn(app, "max")
col.alignment = "right"
self.add_column(col)
-
+
self.limits = self.Limits(self, "limits")
self.add_attribute(self.limits)
@@ -97,7 +97,7 @@
negotiator = self.parent.get_negotiator(session)
return negotiator and \
"call.xml?class=negotiator;id=%i;method=GetLimitCount" % negotiator.id
-
+
def get_title(self, session, title):
script = self.render_script(session)
count = script and "?" or "0"
@@ -107,7 +107,7 @@
class NameColumn(ItemTableColumn):
def render_title(self, session, data):
return "Name"
-
+
def render_content(self, session, data):
limit = Identifiable(data["name"])
href = self.frame.limit.get_href(session, limit)
@@ -116,11 +116,11 @@
class CurrentColumn(ItemTableColumn):
def render_title(self, session, data):
return "Current Usage"
-
+
class MaxColumn(ItemTableColumn):
def render_title(self, session, data):
return "Max Allowance"
-
+
class Limits(Attribute):
def get_default(self, session):
return dict()
@@ -139,7 +139,7 @@
edit = LimitEdit(app, "edit")
self.add_mode(edit)
self.set_edit_mode(edit)
-
+
def get_object(self, session):
obj = self.object.get(session)
if not getattr(obj, "name", None):
@@ -150,8 +150,8 @@
self.object.set(session, obj)
return obj
-
+
class LimitEdit(CuminForm):
def __init__(self, app, name):
super(LimitEdit, self).__init__(app, name)
@@ -163,32 +163,32 @@
self.add_attribute(self.error)
self.error_tmpl = Template(self, "error_html")
-
+
class Errors(Attribute):
def get_default(self, session):
return dict()
-
+
def get_args(self, session):
return self.frame.get_args(session)
-
+
def render_title(self, session, *args):
return "Edit Concurrency Limit '%s'" % args[0].id
-
+
def render_input_id(self, session, *args):
return self.max.path
-
+
def render_label(self, session, *args):
return "Maximum Allowance"
-
+
def render_input_name(self, session, *args):
return self.max.path
-
+
def render_input_value(self, session, *args):
max = self.max.get(session)
if not max:
max = args[0].max
return str(max)
-
+
def render_inline_help(self, session, *args):
return "Set the maximum number of jobs that can run concurrently using this limiter."
@@ -198,17 +198,17 @@
writer = Writer()
self.error_tmpl.render(writer, session, *args)
return writer.to_string()
-
+
def render_error(self, session, *args):
error = self.error.get(session)
if "max" in error:
return error["max"]
-
+
def render_original_value(self, session, *args):
error = self.error.get(session)
if "max" in error:
return "Original value was %s" % str(args[0].max)
-
+
def process_submit(self, session, *args):
max = self.max.get(session)
fmax = 0
@@ -222,13 +222,13 @@
error = self.error.get(session)
error["max"] = "Numeric value between 1 and 99999 expected"
self.error.set(session, error)
-
+
if not errors:
limit = args[0]
limit.max = fmax
self.frame.set_limit(session, limit)
self.process_cancel(session, *args)
-
+
class LimitsView(CuminView):
def __init__(self, app, name):
super(LimitsView, self).__init__(app, name)
@@ -241,7 +241,7 @@
jobs = LimitsJobSet(app, "jobs")
self.__tabs.add_tab(jobs)
-
+
details = CuminDetails(app, "details")
self.__tabs.add_tab(details)
@@ -251,9 +251,9 @@
class LimitsJobSet(JobTab):
def get_visible_columns(self, session):
- return self.get_request_visible_columns(session,
- ["custom_group",
- "scheduler",
+ return self.get_request_visible_columns(session,
+ ["custom_group",
+ "scheduler",
"submitter"])
def get_sql_values(self, session, *args):
@@ -267,7 +267,7 @@
def render_title(self, session, limit):
limits_sql = self.get_limits_sql(session, limit)
return "Jobs %s" % fmt_count(Job.select(limits_sql).count())
-
+
def render_count(self, session, *args):
str = super(LimitsJobSet, self).render_count(session, *args)
return "%s with Concurrency Limit '%s'" % (str, args[0].id)
Modified: mgmt/trunk/cumin/python/cumin/limits.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/limits.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/limits.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -15,6 +15,7 @@
[LimitCount.javascript]
function got_limit_count(obj, id) {
var elem = document.getElementById(id);
+
if (elem) {
var str = "<span class='count'>(" + obj.count.value + ")</span>";
elem.innerHTML = str;
@@ -23,79 +24,82 @@
[LimitEdit.css]
form.limitform {
-/* padding: 1em; */
+ /* padding: 1em; */
}
+
form.limitform div.label, form.limitform div.input {
- float: left;
- height: 3em;
- margin-left: 1em;
+ float: left;
+ height: 3em;
+ margin-left: 1em;
}
+
form.limitform div.input input {
- position: relative;
- top: -0.2em;
- width: 4em;
+ position: relative;
+ top: -0.2em;
+ width: 4em;
}
+
form.limitform div.foot {
- clear: left;
+ clear: left;
}
+
form.limitform div.help {
- margin: 0.5em 1em 1em 0;
+ margin: 0.5em 1em 1em 0;
}
form.limitform div.original_value {
- color: #333;
- font-size: 0.9em;
- font-style: italic;
+ color: #333;
+ font-size: 0.9em;
+ font-style: italic;
}
[LimitEdit.html]
<form id="{id}" class="mform limitform" method="post" action="?">
- <div class="head">
- <h1>{title}</h1>
- </div>
- <div class="body">
- <div class="help">
- {inline_help}
- </div>
- <div class="label">
- <label for="{input_id}">{label}</label>
- </div>
- <div class="input">
- <input id="{input_id}" type="text" name="{input_name}" value="{input_value}" />
- <div class="original_value">{original_value}</div>
- </div>{limit_error}
- <div style="clear:both;"><!-- --></div>
- </div>
- <div class="foot">
- {help} {submit} {cancel}
- </div>
- <div>{hidden_inputs}</div>
+ <div class="head">
+ <h1>{title}</h1>
+ </div>
+ <div class="body">
+ <div class="help">
+ {inline_help}
+ </div>
+ <div class="label">
+ <label for="{input_id}">{label}</label>
+ </div>
+ <div class="input">
+ <input id="{input_id}" type="text" name="{input_name}" value="{input_value}" />
+ <div class="original_value">{original_value}</div>
+ </div>{limit_error}
+ <div style="clear:both;"><!-- --></div>
+ </div>
+ <div class="foot">
+ {help} {submit} {cancel}
+ </div>
+ <div>{hidden_inputs}</div>
</form>
[LimitEdit.error_html]
- <ul class="errors"><li>{error}</li></ul>
+<ul class="errors"><li>{error}</li></ul>
[LimitsJobSet.html]
- <div class="rfloat">{phase}</div>
+<div class="rfloat">{phase}</div>
<form id="{id}" style="clear:right;" method="post" action="?">
- <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>
+ <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>
-
\ No newline at end of file
Modified: mgmt/trunk/cumin/python/cumin/model.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/model.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/model.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -35,7 +35,7 @@
self.frame = None
# Messaging
-
+
CuminBroker(self)
CuminQueue(self)
CuminExchange(self)
@@ -86,7 +86,7 @@
def stop(self):
self.data.stop()
-
+
def add_class(self, cls):
self.classes.append(cls)
setattr(self, cls.cumin_name, cls)
@@ -163,7 +163,7 @@
if isinstance(value, dict):
value = fmt_dict(value, self.prefix)
-
+
return value
class AdProperty(CuminProperty):
@@ -188,7 +188,7 @@
self.writable = True
self.cumin_class.add_ad_property(self)
-
+
@classmethod
def get_ad_groups(cls):
return cls.groups
@@ -244,7 +244,7 @@
def get_enabled(self, session, object):
return True
-
+
def get_verb(self, session):
return None
@@ -490,7 +490,7 @@
def add_ad_property(self, prop):
self.ad_properties.append(prop)
self.ad_properties_by_name[prop.name] = prop
-
+
def add_stat(self, stat):
self.stats.append(stat)
setattr(self, stat.name, stat)
@@ -544,7 +544,7 @@
for action in self.actions:
if action.visualization:
return action
-
+
def write_event_xml(self, writer, object):
writer.write("<events errors=\"%i\" warnings=\"%i\"/>" % (0, 0))
@@ -561,7 +561,7 @@
self.write_event_xml(writer, object)
self.write_stat_xml(session, writer, object)
-
+
writer.write("</%s>" % self.cumin_name)
class RemoteClass(CuminClass):
@@ -586,16 +586,16 @@
class CuminSlot(RemoteClass):
def __init__(self, model):
super(CuminSlot, self).__init__(model, "slot", Slot, SlotStats)
-
+
prop = CuminProperty(self, "Name")
prop.title = "Name"
-
+
prop = CuminProperty(self, "Machine")
prop.title = "Machine"
-
+
prop = CuminProperty(self, "JobId")
prop.title = "Current Job Id"
-
+
stat = CuminStat(self, "Activity")
stat.title = "Activity"
stat.category = "general"
@@ -613,7 +613,7 @@
super(Visualization, self).__init__(cls, name)
self.itemset = None
-
+
def get_boxes(self, session, object):
if self.itemset:
box_list = self.itemset.get_items(session, object)
@@ -627,7 +627,7 @@
prop = CuminProperty(self, "uuid")
prop.title = "System ID"
-
+
prop = CuminProperty(self, "nodeName")
prop.title = "Address"
prop.summary = True
@@ -699,21 +699,21 @@
class SystemSlotVisualization(Visualization):
def __init__(self, cls, name):
super(CuminSystem.SystemSlotVisualization, self).__init__(cls, name)
-
+
self.itemset = self.ModelSystemSlotSet(cls.model.app, "slot")
self.itemset.items.path = "CuminSystem.SystemSlotVisualization.slot"
-
+
def get_slot_count(self, session, system):
items = self.itemset.get_items(session, system)
return len(items)
-
+
class ModelSystemSlotSet(SystemSlotSet):
def render_sql_limit(self, session, *args):
pass
-
+
def render_sql_orderby(self, session, *args):
return "order by machine, name asc"
-
+
class CuminMaster(RemoteClass):
def __init__(self, model):
super(CuminMaster, self).__init__(model, "master", Master, MasterStats)
@@ -741,7 +741,7 @@
except IndexError:
raise Exception("Master daemon not running")
master.Start(self.model.data, completion, args["subsystem"])
-
+
class Stop(CuminAction):
def do_invoke(self, object, args, completion):
system_name = object.System
@@ -750,7 +750,7 @@
except IndexError:
raise Exception("Master daemon not running")
#master.Stop(self.model.data, completion, args["subsystem"])
-
+
class CuminBroker(RemoteClass):
def __init__(self, model):
super(CuminBroker, self).__init__(model, "broker", Broker, BrokerStats)
@@ -782,7 +782,7 @@
prop = CuminProperty(self, "dataDir")
prop.title = "Data Directory"
-
+
stat = self.StatusStat(self, "connection")
stat.category = "status"
@@ -823,7 +823,7 @@
connected = mbroker.connected
except KeyError:
pass
-
+
if connected:
return "Connected"
else:
@@ -850,12 +850,12 @@
def get_verb(self, session):
return "Add"
-
+
def show(self, session, reg):
frame = self.cumin_class.show_object(session, reg)
frame.set_object(session, reg)
return frame.exchange_add.show(session)
-
+
def do_invoke(self, exchange, args, completion):
declArgs = {}
@@ -881,7 +881,7 @@
def get_verb(self, session):
return "Add"
-
+
def show(self, session, reg):
frame = self.cumin_class.show_object(session, reg)
frame.set_object(session, reg)
@@ -924,7 +924,7 @@
def do_bind(session, queue_name, binding_info):
for exchange in binding_info:
if "key" in binding_info[exchange]:
- binding_key = binding_info[exchange]["key"]
+ binding_key = binding_info[exchange]["key"]
else:
binding_key = None
@@ -1105,10 +1105,10 @@
action = self.Purge(self, "purge")
action.summary = True
-
+
action = self.Remove(self, "remove")
action.summary = True
-
+
action = self.Bind(self, "bind")
action.summary = True
@@ -1183,7 +1183,7 @@
def __init__(self, model):
super(CuminExchange, self).__init__(model, "exchange",
Exchange, ExchangeStats)
-
+
prop = CuminProperty(self, "name")
prop.title = "Name"
@@ -1248,7 +1248,7 @@
def get_title(self, session):
return "Exchange"
-
+
def get_icon_href(self, session):
return "resource?name=exchange-36.png"
@@ -1263,15 +1263,15 @@
class Remove(CuminAction):
def get_title(self, session):
return "Remove"
-
+
def show(self, session, exchange):
frame = self.cumin_class.show_object(session, exchange)
return frame.remove.show(session)
-
+
def do_invoke(self, exchange, args, completion):
session = self.get_session_by_object(exchange)
session.exchange_delete(exchange=exchange.name)
-
+
completion("OK")
class CuminBinding(RemoteClass):
@@ -1291,21 +1291,21 @@
def get_title(self, session):
return "Binding"
-
+
def get_object_name(self, binding):
return "between %s and %s" % (binding.exchange.name, binding.queue.name)
class Remove(CuminAction):
def get_title(self, session):
return "Remove"
-
+
def show(self, session, binding):
raise Exception("XXX")
frame = self.cumin_class.show_object(session, binding)
frame = frame.exchange.show_object(session, binding)
return frame.remove.show(session)
-
+
def do_invoke(self, binding, args, completion):
session = self.get_session_by_object(binding)
session.exchange_unbind(queue=binding.queue.name,
@@ -1322,40 +1322,40 @@
prop = CuminProperty(self, "key")
prop.title = "Route Key"
-
+
prop = CuminProperty(self, "tag")
prop.title = "Tag"
-
+
prop = CuminProperty(self, "excludes")
prop.title = "Excludes"
-
+
prop = CuminProperty(self, "durable")
prop.title = "Durable"
-
+
prop = CuminProperty(self, "dest")
prop.title = "Exchange"
-
+
action = self.Remove(self, "remove")
#action.summary = True
def get_title(self, session):
return "Route"
-
+
def get_object_name(self, route):
return route.src
-
+
class Remove(CuminAction):
def get_title(self, session):
return "Remove"
-
+
def show(self, session, peer):
frame = self.cumin_class.show_object(session, peer)
frame = frame.show_peer(session, peer)
return frame.show_remove(session)
-
+
def do_invoke(self, bridge, args, completion):
bridge.close(self.model.data, completion)
-
+
class CuminConnection(RemoteClass):
def __init__(self, model):
super(CuminConnection, self).__init__(model, "connection",
@@ -1365,15 +1365,15 @@
prop = CuminProperty(self, "address")
prop.title = "Address"
- prop = CuminProperty(self, "SystemConnection")
- prop.title = "System Connection?"
+ prop = CuminProperty(self, "SystemConnection")
+ prop.title = "System Connection?"
prop = CuminProperty(self, "authIdentity")
prop.title = "Auth Identity?"
prop = CuminProperty(self, "federationLink")
prop.title = "Federation Link"
-
+
stat = CuminStat(self, "closing")
stat.title = "Closing Down"
stat.category = "general"
@@ -1406,7 +1406,7 @@
def get_title(self, session):
return "Connection"
-
+
def get_icon_href(self, session):
return "resource?name=client-36.png"
@@ -1469,7 +1469,7 @@
def get_title(self, session):
return "Session"
-
+
class Close(CuminAction):
def get_title(self, session):
return "Close"
@@ -1545,13 +1545,13 @@
action = self.Close(self, "close")
action.summary = True
-
+
action = self.Bridge(self, "bridge")
action.summary = True
def init(self):
self.frame = self.model.frame.broker.link
-
+
def get_title(self, session):
return "Broker Link"
@@ -1563,13 +1563,13 @@
frame = self.cumin_class.show_object(session, link)
frame.set_object(session, link)
return frame.show_bridge_add(session)
-
+
def get_title(self, session):
return "Add Route"
-
+
def get_verb(self, session):
return "Add Route"
-
+
def do_invoke(self, link, args, completion):
durable = args["durable"]
src = args["exchange"]
@@ -1579,16 +1579,16 @@
dynamic = args["dynamic"]
excludes = args["excludes"]
sync = args["sync"]
-
- link.bridge(self.model.data, completion,
- durable, src, dest, key,
+
+ link.bridge(self.model.data, completion,
+ durable, src, dest, key,
tag, excludes, False, False, dynamic, sync)
class Close(CuminAction):
def show(self, session, link):
frame = self.cumin_class.show_object(session, link)
return frame.show_remove(session)
-
+
def get_title(self, session):
return "Close"
@@ -1629,57 +1629,57 @@
stat.title = "Record Depth"
stat.unit = "record"
stat.category = "io.journal"
-
+
stat = CuminStat(self, "recordEnqueues")
stat.title = "Record Enqueues"
stat.unit = "record"
stat.category = "io.journal"
-
+
stat = CuminStat(self, "outstandingAIOs")
stat.title = "Outstanding AIOs"
stat.unit = "aio"
stat.category = "io.journal"
-
+
stat = CuminStat(self, "freeFileCount")
stat.title = "Free Files"
stat.unit = "file"
stat.category = "io.journal"
-
+
stat = CuminStat(self, "availableFileCount")
stat.title = "Avail. Files"
stat.unit = "file"
stat.category = "io.journal"
-
+
stat = CuminStat(self, "writeWaitFailures")
stat.title = "Write Wait Failures"
stat.unit = "failure"
stat.category = "io.journal"
-
+
stat = CuminStat(self, "writeBusyFailures")
stat.title = "Write Busy Failures"
stat.unit = "failure"
stat.category = "io.journal"
-
+
stat = CuminStat(self, "readRecordCount")
stat.title = "Read Records"
stat.unit = "record"
stat.category = "io.journal"
-
+
stat = CuminStat(self, "readBusyFailures")
stat.title = "Read Busy Failures"
stat.unit = "failure"
stat.category = "io.journal"
-
+
stat = CuminStat(self, "writePageCacheDepth")
stat.title = "Write Page Cache Depth"
stat.unit = "page"
stat.category = "io.journal"
-
+
stat = CuminStat(self, "readPageCacheDepth")
stat.title = "Read Page Cache Depth"
stat.unit = "page"
stat.category = "io.journal"
-
+
class CuminBrokerAclModule(RemoteClass):
def __init__(self, model):
super(CuminBrokerAclModule, self).__init__ \
@@ -1876,7 +1876,7 @@
self.collector = collector
self.id = self.collector.Pool
self.name = self.collector.Name
-
+
def get(cls, id):
for coll in Collector.select("pool='%s'" % id):
return Pool(coll)
@@ -1892,7 +1892,7 @@
prop = CuminProperty(self, "id")
prop.title = "Collector ID"
prop.summary = True
-
+
stat = self.PercentStat(self, "running")
stat.title = "Running Jobs"
@@ -1999,7 +1999,7 @@
class PoolSlotVisualization(Visualization):
def __init__(self, cls, name):
super(CuminPool.PoolSlotVisualization, self).__init__(cls, name)
-
+
self.itemset = self.ModelPoolSlotSet(cls.model.app, "slot")
self.itemset.items.path = "CuminPool.PoolSlotVisualization.slot"
@@ -2010,7 +2010,7 @@
recent = self.get_recent_sql_where(session)
if recent:
elems.append(recent)
-
+
return "where %s" % " and ".join(elems)
def get_sql_values(self, session, pool):
@@ -2019,7 +2019,7 @@
def render_sql_limit(self, session, *args):
pass
-
+
def render_sql_orderby(self, session, *args):
return "order by machine, name asc"
@@ -2029,7 +2029,7 @@
self.itemset = PoolJobStats(cls.model.app, "stats")
self.itemset.items.path = "CuminPool.FakeJobStats.stats"
-
+
def get_stat_record(self, session, pool):
cursor = self.itemset.get_items(session, pool)
rows = self.itemset.cursor_to_rows(cursor)
@@ -2066,7 +2066,7 @@
def __init__(self, model):
super(CuminLimit, self).__init__ \
(model, "limit", Limit)
-
+
prop = CuminProperty(self, "name")
prop.title = "Name"
@@ -2077,7 +2077,7 @@
prop = CuminProperty(self, "max")
prop.summary = True
prop.title = "Maximum"
-
+
action = self.Edit(self, "edit")
action.title = "Edit"
action.summary = True
@@ -2091,7 +2091,7 @@
def get_title(self, session):
return "Concurrency Limit"
-
+
def get_object_title(self, session, limit):
title = self.get_title(session)
name = limit.id
@@ -2102,20 +2102,20 @@
frame = self.cumin_class.show_object(session, limit)
frame = frame.show_edit(session)
return frame
-
+
class SetLimit(CuminAction):
def show(self, session, job):
pass
-
+
def get_title(self, session):
return "Set Limit for"
-
+
def do_invoke(self, limit, negotiator, completion):
Name = limit.id
Max = limit.max
negotiator.SetLimit(self.model.data, completion, Name, Max)
#negotiator.SetLimit(self.model.data, completion, Name, str(Max))
-
+
class CuminJobGroup(CuminClass):
def __init__(self, model):
super(CuminJobGroup, self).__init__ \
@@ -2161,7 +2161,7 @@
def get_icon_href(self, session):
return "resource?name=group-36.png"
-
+
class Hold(CuminAction):
def show(self, session, group):
frame = self.model.frame.pool.job_group_hold.show(session)
@@ -2234,13 +2234,13 @@
prop.group = "Job Status Info"
prop.title = "Hold Reason Code"
prop.writable = False
-
+
prop = AdProperty(self, "ExitStatus")
prop.description = "Status when job completes"
prop.group = "Job Status Info"
prop.title = "Exit Status"
prop.writable = False
-
+
prop = AdProperty(self, "ProcId")
prop.description = "The id of the job within its cluster. Proc Ids are unique within a cluster."
prop.group = "Job Status Info"
@@ -2257,7 +2257,7 @@
prop.group = "Other"
prop.title = "Cluster ID"
prop.writable = False
-
+
prop = DateAdProperty(self, "QDate")
prop.description = "When the job was submitted"
prop.writable = False
@@ -2265,28 +2265,28 @@
prop = DateAdProperty(self, "JobStartDate")
prop.group = "Main"
prop.writable = False
-
+
prop = DateAdProperty(self, "JobCurrentStartDate")
prop.writable = False
-
+
prop = DateAdProperty(self, "LastSuspensionTime")
prop.writable = False
-
+
prop = DateAdProperty(self, "ShadowBday")
prop.writable = False
-
+
prop = DateAdProperty(self, "LastJobLeaseRenewal")
prop.writable = False
-
+
prop = DateAdProperty(self, "EnteredCurrentStatus")
prop.writable = False
-
+
prop = DateAdProperty(self, "CommittedTime")
prop.writable = False
-
+
prop = DateAdProperty(self, "LastMatchTime")
prop.writable = False
-
+
######## Properties
prop = self.GroupProperty(self, "CustomGroup")
prop.title = "Job Group"
@@ -2354,19 +2354,19 @@
######## Actions
action = self.Hold(self, "hold")
action.summary = True
-
+
action = self.Release(self, "release")
action.summary = True
-
+
action = self.Remove(self, "remove")
action.summary = True
action = self.SetAttribute(self, "setattribute")
action.navigable = False
-
+
action = self.GetAd(self, "getad")
action.navigable = False
-
+
action = self.Fetch(self, "fetch")
action.navigable = False
@@ -2375,7 +2375,7 @@
def get_title(self, session):
return "Job"
-
+
def get_object_name(self, job):
return job.CustomId
@@ -2384,21 +2384,21 @@
class JobStatusProperty(AdProperty):
def render_status(self, session, status):
- return JobStatusInfo.get_status_string(status)
-
+ return JobStatusInfo.get_status_string(status)
+
class GroupProperty(CuminProperty):
def value(self, session, job):
group = JobGroup(job.CustomGroup)
href = self.model.frame.pool.job_group.get_href(session, group)
content = fmt_shorten(group.id, 12, 3)
return fmt_link(href, group.get_id())
-
+
class SubmitterProperty(CuminProperty):
def value(self, session, job):
sub = job.submitter
href = self.model.frame.pool.submitter.get_href(session, sub)
return fmt_link(href, sub.Name)
-
+
class SchedulerProperty(CuminProperty):
def value(self, session, job):
sched = job.scheduler
@@ -2409,37 +2409,37 @@
def do_invoke(self, job):
self.job_ads = {"":{"VALUE": "", "TYPE": 0}}
self.got_data = False
-
+
def completion(status, job_ads):
try:
self.job_ads = job_ads["JobAd"]
self.got_data = True
except:
pass
-
+
def predicate():
return self.got_data
-
+
try:
job.GetAd(self.model.data, completion, None)
except Exception, e:
return self.job_ads
-
+
# wait for up to 20 seconds for completion to be called
wait(predicate, timeout=20)
return self.job_ads
-
+
class Fetch(CuminAction):
def get_xml_response(self, session, job, *args):
file, start, end, tail = args
self.job_output = None
self.got_data = False
self.reason = None
-
+
def completion(status, job_output):
if "Data" in job_output:
raw = job_output["Data"]
- #remove the last partial line from the buffer
+ #remove the last partial line from the buffer
lindex = -1
ord_nl = ord('\n')
while ord(raw[-lindex:][0]) != ord_nl:
@@ -2449,10 +2449,10 @@
self.reason = status
self.got_data = True
-
+
def predicate():
return self.got_data
-
+
try:
data = None
job.Fetch(self.model.data, completion, file, start, end, data)
@@ -2461,11 +2461,11 @@
if not self.got_data:
self.reason = "time out"
except Exception, e:
- self.reason = e
+ self.reason = e
if self.reason:
self.job_output = "Unable to get file at %s. Reason: %s" % (file, self.reason)
-
+
return self.job_output and "<fetch><output>%s</output><tail>%s</tail></fetch>" % (escape_entity(self.job_output), tail)
class Hold(CuminAction):
@@ -2473,24 +2473,24 @@
frame = self.model.frame.pool.jobs_hold.show(session)
frame.ids.set(session, [job.id])
return frame
-
+
def get_title(self, session):
return "Hold"
def do_invoke(self, job, reason, completion):
job.Hold(self.model.data, completion, reason)
-
+
def get_enabled(self, session, job):
is_held = JobStatusInfo.get_status_int("Held") == job.JobStatus
is_deleted = job.qmfDeleteTime is not None
return not (is_held or is_deleted)
-
+
class Release(CuminAction):
def show(self, session, job):
frame = self.model.frame.pool.jobs_release.show(session)
frame.ids.set(session, [job.id])
return frame
-
+
def get_title(self, session):
return "Release"
@@ -2507,7 +2507,7 @@
frame = self.model.frame.pool.jobs_remove.show(session)
frame.ids.set(session, [job.id])
return frame
-
+
def get_title(self, session):
return "Remove"
@@ -2521,10 +2521,10 @@
class SetAttribute(CuminAction):
def show(self, session, job):
pass
-
+
def get_title(self, session):
return "Save Ad for"
-
+
def do_invoke(self, job, args, completion):
Name = args[0]
Value = args[1]
@@ -2534,12 +2534,12 @@
def get_xml_response(self, session, object, *args):
updateTime = object.statsCurr and object.statsCurr.qmfUpdateTime \
or object.qmfUpdateTime
- delta = secs(updateTime) - secs(datetime.now())
+ delta = secs(updateTime) - secs(datetime.now())
conf = "<age>%i</age>" % -delta
rect = "<updatetime>%s</updatetime>" % fmt_duration(delta)
return "%s%s" % (conf, rect)
-
+
class CuminScheduler(RemoteClass):
def __init__(self, model):
super(CuminScheduler, self).__init__(model, "scheduler",
@@ -2587,7 +2587,7 @@
action = self.Start(self, "start")
action.summary = True
-
+
action = self.Stop(self, "stop")
action.summary = True
@@ -2596,7 +2596,7 @@
def init(self):
self.frame = self.model.frame.pool.scheduler
-
+
def get_title(self, session):
return "Scheduler"
@@ -2608,7 +2608,7 @@
frame = self.model.frame.pool.show_scheds_start(session)
frame.ids.set(session, [sched.id])
return frame
-
+
def get_title(self, session):
return "Start"
@@ -2617,7 +2617,7 @@
frame = self.model.frame.pool.show_scheds_stop(session)
frame.ids.set(session, [sched.id])
return frame
-
+
def get_title(self, session):
return "Stop"
@@ -2640,7 +2640,7 @@
def init(self):
self.frame = self.model.frame.pool.submitter
-
+
def get_title(self, session):
return "Submitter"
@@ -2678,7 +2678,7 @@
def init(self):
self.frame = self.model.frame.pool.collector
-
+
def get_title(self, session):
return "Collector"
@@ -2691,7 +2691,7 @@
ids = [collector.id]
frame.ids.set(session, ids)
return frame
-
+
def get_title(self, session):
return "Start"
@@ -2701,7 +2701,7 @@
ids = [collector.id]
frame.ids.set(session, ids)
return frame
-
+
def get_title(self, session):
return "Stop"
@@ -2718,7 +2718,7 @@
prop = CuminProperty(self, "MyAddress")
prop.title = "Address"
-
+
prop = CuminProperty(self, "DaemonStartTime")
prop.title = "Start Time"
@@ -2744,7 +2744,7 @@
action = self.Start(self, "start")
action.summary = True
-
+
action = self.Stop(self, "stop")
action.summary = True
@@ -2759,7 +2759,7 @@
def init(self):
self.frame = self.model.frame.pool.negotiator
-
+
def get_title(self, session):
return "Negotiator"
@@ -2771,7 +2771,7 @@
frame = self.model.frame.pool.show_negs_start(session)
frame.ids.set(session, [neg.id])
return frame
-
+
def get_title(self, session):
return "Start"
@@ -2780,7 +2780,7 @@
frame = self.model.frame.pool.show_negs_stop(session)
frame.ids.set(session, [neg.id])
return frame
-
+
def get_title(self, session):
return "Stop"
@@ -2802,19 +2802,19 @@
def do_invoke(self, negotiator):
self.lim = dict()
self.got_data = False
-
+
def completion(status, data):
self.lim = data["Limits"]
self.got_data = True
-
+
def predicate():
return self.got_data
-
+
try:
negotiator.GetLimits(self.model.data, completion, None)
except Exception, e:
return self.lim
-
+
# wait for up to 5 seconds for completion to be called
wait(predicate, timeout=5)
if not self.got_data:
@@ -2847,9 +2847,9 @@
if cls:
for id in self.__ids.get(session):
objects.append(cls.mint_class.get(id))
-
+
self.app.model.write_xml(session, writer, objects)
-
+
return writer.to_string()
class CallPage(Page):
@@ -2861,7 +2861,7 @@
self.__id = IntegerParameter(app, "id")
self.add_parameter(self.__id)
-
+
self.__method = Parameter(app, "method")
self.add_parameter(self.__method)
@@ -2887,7 +2887,7 @@
args = xargs and xargs.split("&") or list()
data = action.get_xml_response(session, object, *args)
self.write_xml(writer, data)
-
+
return writer.to_string()
def write_xml(self, writer, data):
Modified: mgmt/trunk/cumin/python/cumin/negotiator.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/negotiator.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/negotiator.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -26,7 +26,7 @@
col = self.NameColumn(app, "name")
self.add_column(col)
self.set_default_column(col)
-
+
col = self.SystemColumn(app, "system")
self.add_column(col)
@@ -77,28 +77,28 @@
def process_submit(self, session):
ids = self.parent.ids.get(session)
self.parent.ids.clear(session)
-
+
branch = session.branch()
frame = self.frame.show_negs_start(branch)
frame.ids.set(branch, ids)
self.page.set_redirect_url(session, branch.marshal())
-
+
def render_content(self, session):
return "Start"
-
+
class StopButton(FormButton):
def process_submit(self, session):
ids = self.parent.ids.get(session)
self.parent.ids.clear(session)
-
+
branch = session.branch()
frame = self.frame.show_negs_stop(branch)
frame.ids.set(branch, ids)
self.page.set_redirect_url(session, branch.marshal())
-
+
def render_content(self, session):
return "Stop"
-
+
class NegotiatorFrame(CuminFrame):
def __init__(self, app, name):
super(NegotiatorFrame, self).__init__(app, name)
@@ -128,14 +128,14 @@
negotiator = self.get_args(session)[0]
if negotiator:
return "call.xml?class=negotiator;id=%i;method=GetStarted" % negotiator.id
-
+
def render_title(self, session, *args):
return "Negotiator Status"
-
+
class NegStart(CuminBulkActionForm):
def render_title(self, session, *args):
return "Start Negotiator"
-
+
def render_form_heading(self, session, *args):
return ""
@@ -151,7 +151,7 @@
class NegStop(CuminBulkActionForm):
def render_title(self, session, *args):
return "Stop Negotiator"
-
+
def render_form_heading(self, session, *args):
return ""
@@ -163,4 +163,3 @@
action = self.app.model.master.stop
action.invoke(negotiator, {"subsystem": "NEGOTIATOR"})
self.process_cancel(session)
-
Modified: mgmt/trunk/cumin/python/cumin/negotiator.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/negotiator.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/negotiator.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -35,23 +35,23 @@
[NegotiatorSet.html]
<form id="{id}" method="post" action="?">
-
- <div class="sactions">
- <h2>Act on Selected Negotiators:</h2>
- {start} {stop}
- </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>
+
+ <div class="sactions">
+ <h2>Act on Selected Negotiators:</h2>
+ {start} {stop}
+ </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>
Modified: mgmt/trunk/cumin/python/cumin/page.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/page.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/page.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -1,110 +1,110 @@
[MainFrame.css]
#head {
- padding: 0;
- border-bottom: 1px solid #999;
- color: #ddd;
- background: #666 url("resource?name=mrg-banner.png") no-repeat scroll center;
+ padding: 0;
+ border-bottom: 1px solid #999;
+ color: #ddd;
+ background: #666 url("resource?name=mrg-banner.png") no-repeat scroll center;
}
#trans0 {
- background-color: black;
- height: 0.15em;
- width: 100%;
+ background-color: black;
+ height: 0.15em;
+ width: 100%;
}
#head a {
- color: #c0d0e0;
+ color: #c0d0e0;
}
body.modal #head {
- opacity: 0.2;
+ opacity: 0.2;
}
#head .tabs {
- padding: 0 0 0.25em 0.5em;
+ padding: 0 0 0.25em 0.5em;
}
#head .tabs li {
- display: inline;
+ display: inline;
}
#head .tabs li a {
- padding: 0.225em 0.5em 0.275em 0.5em;
- border-right: 2px solid #444;
- background-color: #333;
- color: #ccc;
- line-height: 1.5em;
- vertical-align: -15%;
+ padding: 0.225em 0.5em 0.275em 0.5em;
+ border-right: 2px solid #444;
+ background-color: #333;
+ color: #ccc;
+ line-height: 1.5em;
+ vertical-align: -15%;
}
#head .tabs li:last-child a {
- border-right: 0;
+ border-right: 0;
}
#head .tabs li a.selected {
- background-color: #000;
- color: #fff;
+ background-color: #000;
+ color: #fff;
}
#body {
- padding: 1em;
+ padding: 1em;
}
#logo {
- vertical-align: -20%;
+ vertical-align: -20%;
}
#user {
- padding: 0.25em 0.5em;
- float: right;
- color: #fff;
- font-size: 0.9em;
+ padding: 0.25em 0.5em;
+ float: right;
+ color: #fff;
+ font-size: 0.9em;
}
#logout {
- color: #06c;
+ color: #06c;
}
#actions {
- padding: 0.25em 0.5em;
- float: right;
- font-size: 0.9em;
+ padding: 0.25em 0.5em;
+ float: right;
+ font-size: 0.9em;
}
#context {
- display: inline;
- list-style: none;
- padding: 0 1em;
- margin: 0;
- line-height: 1.75em;
- font-size: 0.9em;
- color: #fff;
+ display: inline;
+ list-style: none;
+ padding: 0 1em;
+ margin: 0;
+ line-height: 1.75em;
+ font-size: 0.9em;
+ color: #fff;
}
#context li {
- display: inline;
+ display: inline;
}
#context li:before {
- content: " > ";
- font-weight: bold;
- font-size: 0.8em;
- color: #ccc;
+ content: " > ";
+ font-weight: bold;
+ font-size: 0.8em;
+ color: #ccc;
}
#context li:last-child a {
- color: #ddd;
+ color: #ddd;
}
#context li:first-child:before {
- content: "";
+ content: "";
}
#trans1 {
- padding: 0;
- margin: 0;
- border-top: 1px solid #bbb;
- border-bottom: 1px solid #ddd;
+ padding: 0;
+ margin: 0;
+ border-top: 1px solid #bbb;
+ border-bottom: 1px solid #ddd;
}
[MainFrame.javascript]
@@ -189,17 +189,17 @@
[OverviewTab.css]
table.OverviewTab {
- width: 100%;
+ width: 100%;
}
table.OverviewTab > tbody > tr > td {
- width: 50%;
- vertical-align: top;
+ width: 50%;
+ vertical-align: top;
}
table.OverviewTab h2 img {
- vertical-align: -15%;
- margin: 0 0.2em 0 0;
+ vertical-align: -15%;
+ margin: 0 0.2em 0 0;
}
[OverviewTab.html]
@@ -232,16 +232,16 @@
[ManagementServerNotice.css]
div.ManagementServerNotice {
- margin: 0 0 1em 0;
- border: 1px dotted #cec;
- padding: 1em;
- background-color: #dfd;
+ margin: 0 0 1em 0;
+ border: 1px dotted #cec;
+ padding: 1em;
+ background-color: #dfd;
}
div.ManagementServerNotice img {
- vertical-align: top;
- float: left;
- margin: 0 0.5em 0.5em 0;
+ vertical-align: top;
+ float: left;
+ margin: 0 0.5em 0.5em 0;
}
[ManagementServerNotice.html]
@@ -295,28 +295,27 @@
<div class="TabbedModeSet mode">{mode}</div>
</div>
-
[MyGridJobs.html]
- <div class="rfloat">{phase}</div>
- Jobs submitted by {user}
+<div class="rfloat">{phase}</div>
+Jobs submitted by {user}
<form id="{id}" style="clear:right;" method="post" action="?">
- <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>
+ <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>
Modified: mgmt/trunk/cumin/python/cumin/parameters.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/parameters.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/parameters.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -107,14 +107,14 @@
class Limit(object):
def __init__(self, id):
self.id = id
-
+
def get_id(self):
return self.id
-
+
class LimitParameter(Parameter):
def do_unmarshal(self, string):
return Limit(string)
-
+
def do_marshal(self, limit):
return limit.id
Modified: mgmt/trunk/cumin/python/cumin/pool.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/pool.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/pool.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -50,7 +50,7 @@
pool = Identifiable(data["id"])
self.page.main.set_last_pool(session, data["id"])
href = self.frame.pool.get_href(session, pool)
-
+
return fmt_link(href, data["name"])
class JobsColumn(SqlTableColumn):
@@ -80,10 +80,10 @@
self.job = JobFrame(app, "job")
self.add_mode(self.job)
-
+
self.job_group = JobGroupFrame(app, "jobgroup")
self.add_mode(self.job_group)
-
+
self.scheduler = SchedulerFrame(app, "sched")
self.add_mode(self.scheduler)
@@ -107,16 +107,16 @@
self.__startcoll = CollectorStart(app, "startcoll")
self.add_mode(self.__startcoll)
-
+
self.__stopcoll = CollectorStop(app, "stopcoll")
self.add_mode(self.__stopcoll)
-
+
self.__startsched = SchedulerStart(app, "startsched")
self.add_mode(self.__startsched)
-
+
self.__stopsched = SchedulerStop(app, "stopsched")
self.add_mode(self.__stopsched)
-
+
self.jobs_hold = JobSetHold(app, "jobshold")
self.add_mode(self.jobs_hold)
@@ -128,41 +128,41 @@
self.job_group_hold = JobGroupHold(app, "jobgrouphold")
self.add_mode(self.job_group_hold)
-
+
self.job_group_release = JobGroupRelease(app, "jobgrouprelease")
self.add_mode(self.job_group_release)
-
+
self.job_group_remove = JobGroupRemove(app, "jobgroupremove")
self.add_mode(self.job_group_remove)
-
+
def show_job_frame(self, session):
self.page.set_frame(session, self.job)
return self.show_mode(session, self.job)
-
+
def show_negs_start(self, session):
self.page.set_frame(session, self.__startneg)
return self.show_mode(session, self.__startneg)
-
+
def show_negs_stop(self, session):
self.page.set_frame(session, self.__stopneg)
return self.show_mode(session, self.__stopneg)
-
+
def show_scheds_start(self, session):
self.page.set_frame(session, self.__startsched)
return self.show_mode(session, self.__startsched)
-
+
def show_scheds_stop(self, session):
self.page.set_frame(session, self.__stopsched)
return self.show_mode(session, self.__stopsched)
-
+
def show_colls_start(self, session):
self.page.set_frame(session, self.__startcoll)
return self.show_mode(session, self.__startcoll)
-
+
def show_colls_stop(self, session):
self.page.set_frame(session, self.__stopcoll)
return self.show_mode(session, self.__stopcoll)
-
+
class PoolView(CuminView):
def __init__(self, app, name):
super(PoolView, self).__init__(app, name)
@@ -203,13 +203,13 @@
def set_collector_tab(self, session):
self.__tabs.set_selected_mode(session, self.colls)
-
+
def set_negotiator_tab(self, session):
self.__tabs.set_selected_mode(session, self.negs)
-
+
def set_scheduler_tab(self, session):
self.__tabs.set_selected_mode(session, self.scheds)
-
+
class PoolSchedulerSet(SchedulerSet):
def get_args(self, session):
return self.frame.get_args(session)
@@ -237,7 +237,7 @@
def render_sql_where(self, session, pool):
return "where d.pool = %(pool)s"
-
+
class PoolCollectorSet(CollectorSet):
def get_args(self, session):
return self.frame.get_args(session)
@@ -251,7 +251,7 @@
def render_sql_where(self, session, pool):
return "where c.pool = %(pool)s"
-
+
class PoolNegotiatorSet(NegotiatorSet):
def get_args(self, session):
return self.frame.get_args(session)
@@ -276,7 +276,7 @@
recent = self.get_recent_sql_where(session)
if recent:
elems.append(recent)
-
+
return "where %s" % " and ".join(elems)
def get_sql_values(self, session, pool):
@@ -285,7 +285,7 @@
def render_title(self, session, pool):
count = self.get_item_count(session, pool)
return "Slots %s" % fmt_count(count)
-
+
def filter(self, session, system, slots):
return slots
@@ -298,21 +298,21 @@
self.slot_map = self.PoolSlotMap(app, "pool_slot_map")
self.add_child(self.slot_map)
-
+
def render_title(self, session):
return "Statistics"
-
+
class PoolSlotMap(SlotMap):
def get_title_name(self, session, pool):
return pool.name
-
+
def render_slot_clip_size(self, session, *args):
return 400
-
+
class PoolStatSet(StatSet):
def render_rate_text(self, session, args):
return "Percentage"
-
+
def do_get_items(self, session, pool):
stats = super(PoolStatSet, self).do_get_items(session, pool)
@@ -322,7 +322,7 @@
fake_stats = list()
for stat in stats:
fake_stats.append((stat[0], record))
-
+
return fake_stats
class PoolJobStats(CuminTable):
@@ -338,9 +338,9 @@
class PoolStatus(CuminStatus):
def __init__(self, app, name):
super(PoolStatus, self).__init__(app, name)
-
+
self.item_tmpl = Template(self, "status_html")
-
+
def render_title(self, session, pool):
return "Pool Status"
@@ -355,6 +355,6 @@
def render_idle(self, session, record):
return record["idl"]
-
+
def render_total(self, session, record):
return record["all"]
Modified: mgmt/trunk/cumin/python/cumin/pool.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/pool.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/pool.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -33,7 +33,6 @@
[PoolJobStats.count_sql]
1
-
[PoolView.javascript]
function updatePool(data) {
var model = data.objectify();
@@ -54,17 +53,19 @@
[PoolStatus.javascript]
var pool_stats_last_all = "";
-function updatePoolStatus(id, pool) {
+function updatePoolStatus(id, pool) {
var s = pool.stat;
var sdata = {"div": {"span": [s.idl.value, s.all.value]}};
wooly.doc().elembyid(id).update(sdata);
+
if (pool_stats_last_all != "") {
if (s.all.value != pool_stats_last_all) {
- window.location.reload(true);
+ window.location.reload(true);
}
- }
+ }
+
pool_stats_last_all = s.all.value;
}
@@ -72,20 +73,19 @@
<div id="{id}" class="CuminStatus {color}">
<h2>{title}</h2>
- {status}
+ {status}
</div>
<script type="text/javascript">
-//<![CDATA[
+ //<![CDATA[
cumin.objectListeners["{id}"] = updatePoolStatus;
//]]>
</script>
[PoolStatus.status_html]
- <div>
- <span>{idle}</span> of <span>{total}</span> slots idle
- </div>
+<div>
+ <span>{idle}</span> of <span>{total}</span> slots idle
+</div>
-
[PoolStats.html]
<div style="width: 40%; float: left;">
<h2>General</h2>
@@ -97,4 +97,3 @@
{pool_slot_map}
</div>
<div style="clear:left;"><!-- --></div>
-
Modified: mgmt/trunk/cumin/python/cumin/queue.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/queue.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/queue.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -98,7 +98,7 @@
def render_content(self, session):
return "Purge"
-
+
class Remove(FormButton):
def process_submit(self, session):
ids = self.parent.ids.get(session)
@@ -107,10 +107,10 @@
branch = session.branch()
self.frame.queues_remove.show(branch).ids.set(branch, ids)
self.page.set_redirect_url(session, branch.marshal())
-
+
def render_content(self, session):
return "Remove"
-
+
class NameColumn(SqlTableColumn):
def render_title(self, session, data):
return "Name"
@@ -308,9 +308,9 @@
self.__remove = self.Remove(app, "remove")
self.add_child(self.__remove)
-
+
self.set_default_column_name("e_id")
-
+
def get_visible_columns(self, session):
return self.get_request_visible_columns(session, ["e_id"])
@@ -318,7 +318,7 @@
branch = session.branch()
self.frame.binding_add.show(branch)
return branch.marshal()
-
+
def render_sql_where(self, session, queue):
elems = list()
elems.append("b.queue_id = %(id)r")
@@ -337,7 +337,7 @@
href = self.frame.frame.bindings_remove.get_href \
(session, ids)
self.page.set_redirect_url(session, href)
-
+
def render_content(self, session):
return "Remove"
@@ -346,7 +346,7 @@
super(QueueForm, self).__init__(app, name)
assert vhost
-
+
self.vhost = vhost
self.namef = NameField(app, "name")
@@ -354,39 +354,39 @@
self.more = MoreFieldSet(app, "more")
self.add_field(self.more)
-
+
self.durable = self.QueueDurabilityField(app, "durable")
self.more.add_field(self.durable)
-
+
self.cluster_durable = self.ClusterDurabilityField(app, "cluster_durable")
self.more.add_field(self.cluster_durable)
-
+
self.lvq = self.LVQField(app, "lvq")
self.more.add_field(self.lvq)
-
+
self.optimistic = self.OptimisticField(app, "optimistic")
self.more.add_field(self.optimistic)
self.file_count = self.FileCountField(app, "file_count")
self.file_count.input.param.default = 8
self.more.add_field(self.file_count)
-
+
self.file_size = self.FileSizeField(app, "file_size")
self.file_size.input.param.default = 24
self.more.add_field(self.file_size)
-
+
self.policy = self.PolicyField(app, "policy")
self.more.add_field(self.policy)
-
+
self.q_size = self.QSizeField(app, "q_size")
self.more.add_field(self.q_size)
-
+
self.q_count = self.QCountField(app, "q_count")
self.more.add_field(self.q_count)
-
+
self.bindings = ExchangeKeysField(app, "bindings", self.vhost)
self.add_field(self.bindings)
-
+
def validate(self, session, queue_name):
super_error = super(QueueForm, self).validate(session)
(errors, form_binding_info) = self.bindings.get_binding_errors(session, queue_name)
@@ -395,35 +395,35 @@
class QCountField(IntegerField):
def render_title(self, session):
return "<div style=\"padding-left: 1em;\">Max Queue Count</div>"
-
+
def render_field_help(self, session):
return "(Maximum in-memory queue size as a number of messages. Applies if Policy is set.)"
-
+
class QSizeField(IntegerField):
def render_title(self, session):
return "<div style=\"padding-left: 1em;\">Max Queue Size</div>"
-
+
def render_field_help(self, session):
return "(Maximum in-memory queue size as bytes. Applies if Policy is set.)"
-
+
class FileCountField(IntegerField):
def render_title(self, session):
return "File Count"
-
+
def render_field_help(self, session):
return "(Number of files in queue's persistence journal)"
-
+
class FileSizeField(IntegerField):
def render_title(self, session):
return "File Size"
-
+
def render_field_help(self, session):
return "(File size in pages - 64Kb/page)"
-
+
class QueueDurabilityField(TwoOptionRadioField):
def render_title(self, session):
return "Durable?"
-
+
def render_field_help(self, session):
return "(Queue is durable)"
@@ -436,10 +436,10 @@
class ClusterDurabilityField(TwoOptionRadioField):
def render_title(self, session):
return "Cluster Durable?"
-
+
def render_field_help(self, session):
return "(Queue becomes durable if there is only one functioning cluster node)"
-
+
def render_title_1(self, session):
return "Cluster Durable"
@@ -449,10 +449,10 @@
class LVQField(TwoOptionRadioField):
def render_title(self, session):
return "Enable Last Value Queue?"
-
+
def render_field_help(self, session):
return "(Enable LVQ behavior on the queue)"
-
+
def render_title_1(self, session):
return "Enabled"
@@ -462,10 +462,10 @@
class OptimisticField(TwoOptionRadioField):
def render_title(self, session):
return "Enable Optimistic Consume?"
-
+
def render_field_help(self, session):
return "(Enable optimistic consume on the queue)"
-
+
def render_title_1(self, session):
return "Enabled"
@@ -475,64 +475,64 @@
class PolicyField(RadioField):
def __init__(self, app, name):
super(QueueForm.PolicyField, self).__init__(app, name, None)
-
+
self.param = Parameter(app, "param")
self.param.default = "none"
self.add_parameter(self.param)
-
+
option = self.NoneField(app, "none", self.param)
self.add_option(option)
-
+
option = self.Reject(app, "reject", self.param)
self.add_option(option)
-
+
option = self.Flow(app, "flow", self.param)
self.add_option(option)
-
+
option = self.Ring(app, "ring", self.param)
self.add_option(option)
-
+
option = self.RingStrict(app, "ring_strict", self.param)
self.add_option(option)
-
+
def render_title(self, session):
return "Policy-type"
-
+
def render_field_help(self, session):
return "(Action taken when queue limit is reached)"
-
+
class NoneField(RadioFieldOption):
def render_value(self, session):
return "none"
-
+
def render_title(self, session):
return "None"
-
+
class Reject(RadioFieldOption):
def render_value(self, session):
return "reject"
-
+
def render_title(self, session):
return "Reject"
-
+
class Flow(RadioFieldOption):
def render_value(self, session):
return "flow"
-
+
def render_title(self, session):
return "Flow to disc"
-
+
class Ring(RadioFieldOption):
def render_value(self, session):
return "ring"
-
+
def render_title(self, session):
return "Ring"
-
+
class RingStrict(RadioFieldOption):
def render_value(self, session):
return "ring_strict"
-
+
def render_title(self, session):
return "Ring Strict"
@@ -703,7 +703,7 @@
queue = Queue.get(id)
action = self.app.model.queue.remove
action.invoke(queue)
-
+
def render_title(self, session):
return "Remove Queues"
@@ -718,7 +718,7 @@
self.add_child(self.sum_props)
self.prop_tmpl = Template(self, "properties_html")
-
+
class SummaryProperties(CuminProperties):
def do_get_items(self, session, queue):
return [("Name", queue.name),
@@ -752,7 +752,7 @@
self.bindings = ExchangeKeysField(app, "bindings", self.vhost,
title="Bind to Exchange:")
self.add_field(self.bindings)
-
+
self.errors = self.Errors(self, "errors")
self.add_attribute(self.errors)
@@ -765,7 +765,7 @@
if "no_exchanges" in errors:
return "<ul class=\"errors\" style=\"margin:0; float:left;\"><li>%s</li></ul>" % \
"</li><li>".join(errors["no_exchanges"])
-
+
def process_cancel(self, session):
branch = session.branch()
self.frame.show_view(branch)
@@ -782,7 +782,7 @@
errs = errors.setdefault("no_exchanges", list())
errs.append("At least one exchange must be selected")
errors = True
-
+
if errors:
pass
else:
@@ -790,10 +790,10 @@
args = {
"exchange_keys": form_binding_info,
"reg": reg}
-
+
action = self.app.model.queue.bind
action.invoke(queue, args)
-
+
# navigate back to main queue frame
self.process_cancel(session)
@@ -805,14 +805,14 @@
class Errors(Attribute):
def get_default(self, session):
return dict()
-
+
class QueueBindingRemove(CuminConfirmForm):
def get_args(self, session):
return self.frame.get_args(session)
def process_submit(self, session, binding):
log.info("Removing binding %s" % binding)
-
+
self.process_cancel(session, binding)
def render_title(self, session, binding):
@@ -928,13 +928,13 @@
chart = self.EnqueueTransactionRateChart(app, "enqtxn")
self.add_child(chart)
-
+
chart = self.DequeueTransactionRateChart(app, "deqtxn")
self.add_child(chart)
-
+
chart = self.EnqueueDequeueRateChart(app, "enqdeq")
self.add_child(chart)
-
+
def render_title(self, session):
return "Transactions"
@@ -1014,10 +1014,10 @@
param = QueueParameter(app, "param")
self.param = param
self.add_parameter(param)
-
+
self.queue_set = self.QueueInputSet(app, "queue_set", param)
self.add_child(self.queue_set)
-
+
def get(self, session):
return self.param.get(session)
@@ -1042,13 +1042,13 @@
if (_queue.qmfUpdateTime > (datetime.now() - delta)) and (_queue.name != queue.name):
queue_list.append(_queue)
return queue_list
-
+
def render_item_value(self, session, queue):
return queue.id
-
+
def render_item_content(self, session, queue):
return queue.name or "<em>Default</em>"
-
+
def render_item_checked_attr(self, session, queue):
return queue is self.param.get(session) and "checked=\"checked\"" or None
@@ -1092,4 +1092,3 @@
def render_cancel_content(self, session, queue):
return "No, Cancel"
-
Modified: mgmt/trunk/cumin/python/cumin/queue.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/queue.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/queue.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -36,9 +36,8 @@
[QueueSet.html]
<form id="{id}" method="post" action="?">
-
<ul class="actions">
- <li><a class="nav" href="{add_queue_url}">Add New Queue</a></li>
+ <li><a class="nav" href="{add_queue_url}">Add New Queue</a></li>
</ul>
<div class="rfloat">{phase}</div>
{unit}
@@ -147,30 +146,30 @@
[QueueBindingSet.html]
<form id="{id}" method="post" action="?">
+ <div class="rfloat">{phase}</div>
- <div class="rfloat">{phase}</div>
- <ul class="actions">
- <li><a class="nav" href="{add_queue_binding_url}">Add Binding</a></li>
- </ul>
-
- <div class="sactions">
- <h2>Act on Selected Bindings:</h2>
- {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>
+ <ul class="actions">
+ <li><a class="nav" href="{add_queue_binding_url}">Add Binding</a></li>
+ </ul>
+
+ <div class="sactions">
+ <h2>Act on Selected Bindings:</h2>
+ {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>
[ExchangeBindingSet.item_html]
@@ -286,9 +285,9 @@
[BindSummaryPropertiesField.properties_html]
<div class="properties" style="width:80%">
- <table class="PropertySet">
- <tbody>
- {prop_items}
- </tbody>
- </table>
+ <table class="PropertySet">
+ <tbody>
+ {prop_items}
+ </tbody>
+ </table>
</div>
Modified: mgmt/trunk/cumin/python/cumin/quirk.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/quirk.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/quirk.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -65,7 +65,7 @@
def set_payload(self, payload):
self.content.body = payload
-
+
def send(self, session, dest, key=None):
if dest.__class__ is Queue:
self.content["routing_key"] = dest.name
Modified: mgmt/trunk/cumin/python/cumin/realm.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/realm.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/realm.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -22,7 +22,7 @@
class RealmInputSet(CheckboxInputSet):
def __init__(self, app, name):
super(RealmInputSet, self).__init__(app, name)
-
+
param = ListParameter(app, "param", RealmParameter(app, "item"))
self.add_parameter(param)
self.set_parameter(param)
Modified: mgmt/trunk/cumin/python/cumin/scheduler.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/scheduler.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/scheduler.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -88,28 +88,28 @@
def process_submit(self, session):
ids = self.parent.ids.get(session)
self.parent.ids.clear(session)
-
+
branch = session.branch()
frame = self.frame.show_scheds_start(branch)
frame.ids.set(branch, ids)
self.page.set_redirect_url(session, branch.marshal())
-
+
def render_content(self, session):
return "Start"
-
+
class StopButton(FormButton):
def process_submit(self, session):
ids = self.parent.ids.get(session)
self.parent.ids.clear(session)
-
+
branch = session.branch()
frame = self.frame.show_scheds_stop(branch)
frame.ids.set(branch, ids)
self.page.set_redirect_url(session, branch.marshal())
-
+
def render_content(self, session):
return "Stop"
-
+
class SchedulerFrame(CuminFrame):
def __init__(self, app, name):
super(SchedulerFrame, self).__init__(app, name)
@@ -136,7 +136,7 @@
jobs = SchedulerJobSet(app, "jobs")
self.__tabs.add_tab(jobs)
-
+
details = CuminDetails(app, "details")
self.__tabs.add_tab(details)
@@ -149,10 +149,10 @@
scheduler = self.get_args(session)[0]
if scheduler:
return "call.xml?class=scheduler;id=%i;method=GetStarted" % scheduler.id
-
+
def render_title(self, session, *args):
return "Scheduler Status"
-
+
class SchedulerStats(Widget):
def __init__(self, app, name):
super(SchedulerStats, self).__init__(app, name)
@@ -193,7 +193,7 @@
class SchedulerJobSet(JobTab):
def __init__(self, app, name):
super(SchedulerJobSet, self).__init__(app, name)
-
+
def get_visible_columns(self, session):
return self.get_request_visible_columns(session, ["custom_group", "submitter"])
@@ -209,7 +209,7 @@
class SchedulerStart(CuminBulkActionForm):
def render_title(self, session, *args):
return "Start Scheduler"
-
+
def render_form_heading(self, session, *args):
return ""
@@ -225,7 +225,7 @@
class SchedulerStop(CuminBulkActionForm):
def render_title(self, session, *args):
return "Stop Scheduler"
-
+
def render_form_heading(self, session, *args):
return ""
@@ -237,4 +237,3 @@
action = self.app.model.master.stop
action.invoke(scheduler, {"subsystem": "SCHEDD"})
self.process_cancel(session)
-
Modified: mgmt/trunk/cumin/python/cumin/scheduler.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/scheduler.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/scheduler.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -37,25 +37,24 @@
[SchedulerSet.html]
<form id="{id}" method="post" action="?">
-
- <div class="sactions">
- <h2>Act on Selected Schedulers:</h2>
- {start} {stop}
- </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>
+ <div class="sactions">
+ <h2>Act on Selected Schedulers:</h2>
+ {start} {stop}
+ </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>
[SchedulerStats.html]
@@ -75,27 +74,26 @@
</table>
[SchedulerJobSet.html]
- <div class="rfloat">{phase}</div>
+<div class="rfloat">{phase}</div>
+
<form id="{id}" style="clear:right;" method="post" action="?">
+ <div class="sactions">
+ {job_search}
+ <h2>Act on Selected Jobs:</h2>
+ {hold} {release} {remove}
+ </div>
- <div class="sactions">
- {job_search}
- <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>
+ <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>
-
Modified: mgmt/trunk/cumin/python/cumin/slot.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/slot.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/slot.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -30,7 +30,7 @@
col = self.Name(app, "name")
self.add_column(col)
-
+
class Name(SqlTableColumn):
def render_title(self, session, data):
return "Name"
@@ -38,13 +38,13 @@
def render_items(self, session, *args):
""" overridden because a slotset query is expensive.
the rows are cached """
-
+
rows = self.get_items(session, *args)
writer = Writer()
for row in rows:
self.item_tmpl.render(writer, session, row)
-
+
return writer.to_string()
class MachineSet(UniqueSlot):
Modified: mgmt/trunk/cumin/python/cumin/slot.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/slot.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/slot.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -1,5 +1,5 @@
[SlotSet.sql]
-select
+select
s.id,
s.name,
s.machine,
@@ -20,10 +20,10 @@
from (select distinct name from slot as s {sql_where}) as s
[SlotStatSet.sql]
-select
+select
sum(case activity when 'Idle' then 1 else 0 end) as idl,
sum(1) as all
-from (select
+from (select
s.name,
s.pool,
s.qmf_update_time,
@@ -42,8 +42,8 @@
sum(case activity when 'Busy' then 1 else 0 end) as busy,
sum(case activity when 'Idle' then 1 else 0 end) as idle,
sum(1) as total
-from
-(select
+from
+(select
s.name,
s.machine,
s.pool,
@@ -53,7 +53,7 @@
left outer join slot_stats as c on c.id = s.stats_curr_id) as s
{sql_where}
group by machine
-{sql_orderby}
+{sql_orderby}
[MachineSet.count_sql]
select count(1)
Modified: mgmt/trunk/cumin/python/cumin/stat.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/stat.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/stat.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -17,7 +17,7 @@
unit_abbrevs = dict()
unit_abbrevs["message"] = "msg"
unit_abbrevs["transaction"] = "trans"
-
+
def __init__(self, app, name, category):
super(StatSet, self).__init__(app, name)
@@ -36,7 +36,7 @@
for stat in cls.stats:
if self.category == stat.category:
stats.append((stat, object))
-
+
return stats
def render_item_title(self, session, args):
@@ -45,14 +45,14 @@
def render_rate_text(self, session, args):
return "Per Second"
-
+
def render_item_name(self, session, args):
stat, object = args
return stat.name
def render_item_value(self, session, args):
stat, object = args
-
+
#if stat.link_cb:
# branch = session.branch()
# stat.link_cb(self.page, branch, object)
@@ -63,7 +63,7 @@
def render_item_rate(self, session, args):
stat, object = args
-
+
#if False and stat.highlow: #XXX
# return "<small>high</small> <span>%i</span> " + \
# "<small>low</small> <span>%i</span>" \
@@ -146,7 +146,7 @@
class ImageCache(object):
def __init__(self):
self.__files = dict() # {name: {"time": time_created, "file": file object, "cookie": (cookie values)}}
-
+
def find_recent(self, name, max_age):
for cname in self.__files:
if cname == name:
@@ -161,7 +161,7 @@
break
return (None, None)
-
+
def create_cache_file(self, name, args):
if name not in self.__files:
file = tempfile.TemporaryFile()
@@ -174,14 +174,14 @@
return file
class SlotMapPage(Page):
- interiors = {"Idle": (.7,.7,.7),
+ interiors = {"Idle": (.7,.7,.7),
"Busy": (0.0, 0.4, 0.0),
"Suspended": (1,0,0),
"Vacating": (1,.73,.367),
"Killing": (0,0,1),
"Benchmarking": (1,.8,.8),
None: (.8,.8,.8)}
-
+
max_width = 400
max_png_age = 30
def __init__(self, app, name):
@@ -195,7 +195,7 @@
self.zoom_level = IntegerParameter(app, "zl")
self.add_parameter(self.zoom_level)
-
+
self.zoom_x = IntegerParameter(app, "zx")
self.add_parameter(self.zoom_x)
@@ -206,7 +206,7 @@
self.add_parameter(self.dot)
self.cache = ImageCache()
-
+
def get_content_type(self, session):
return "image/png"
@@ -229,7 +229,7 @@
writer = Writer()
surface.write_to_png(writer)
return writer.to_string()
-
+
def do_render(self, session, object):
dot = self.dot.get(session)
if dot:
@@ -245,24 +245,24 @@
#print "returning cached copy of png at zoom %i, x %i, y %i" % (zl, zx, zy)
self.set_cookie(session, args)
return cached_png
-
+
#print "starting rendering png at zoom %i, x %i, y %i" % (zl, zx, zy)
map = HeatMapChart(self.max_width, self.max_width)
-
+
cls = self.class_.get(session)
action = cls.get_visualization_action()
slot_info = action.get_boxes(session, object)
-
+
if len(slot_info) == 0:
return ""
-
+
slots = [ [self.interiors[x["activity"]], x["state"]] for x in slot_info ]
size = map.plot_slots(slots, zl, zx, zy)
args = (size, map.width, map.height, len(slots), map.rows, map.cols)
self.set_cookie(session, args)
self.cache_it(session, zl, map, args)
-
+
writer = Writer()
map.write(writer)
#print "done rendering png at zoom %i, x %i, y %i" % (zl, zx, zy)
@@ -271,12 +271,12 @@
def get_cached(self, session, zl):
filename = self.__gen_filename(session, zl)
return self.cache.find_recent(filename, self.max_png_age)
-
+
def cache_it(self, session, zl, map, args):
filename = self.__gen_filename(session, zl)
writer = self.cache.create_cache_file(filename, args)
map.write(writer)
-
+
def __gen_filename(self, session, zl):
cls = self.class_.get(session)
id = self.id.get(session)
@@ -285,7 +285,7 @@
def set_cookie(self, session, args):
cookie = "|".join((str(x) for x in args))
session.set_cookie("slot_info", cookie)
-
+
class StatChartPage(Page):
def __init__(self, app, name):
super(StatChartPage, self).__init__(app, name)
@@ -393,7 +393,7 @@
for stat, color in zip(stats, colors):
chart.plot_values(samples[stat], color=color)
-
+
chart.plot_frame()
if self.mode.get(session) == "rate":
Modified: mgmt/trunk/cumin/python/cumin/stat.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/stat.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/stat.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -43,36 +43,36 @@
[StatSet.css]
table.StatSet {
- width: 100%;
- border-collapse: collapse;
- margin: 1em 0;
+ width: 100%;
+ border-collapse: collapse;
+ margin: 1em 0;
}
table.StatSet tr {
- border-top: 1px dotted #ccc;
+ border-top: 1px dotted #ccc;
}
table.StatSet td, table.StatSet th {
- padding: 0.35em 0.5em;
- font-weight: normal;
+ padding: 0.35em 0.5em;
+ font-weight: normal;
}
table.StatSet th {
- color: #444;
+ color: #444;
}
table.StatSet thead th {
- font-style: italic;
- font-size: 0.9em;
- text-align: right;
+ font-style: italic;
+ font-size: 0.9em;
+ text-align: right;
}
table.StatSet tbody th {
- text-align: left;
+ text-align: left;
}
table.StatSet td {
- text-align: right;
+ text-align: right;
}
[StatSet.html]
@@ -129,26 +129,27 @@
} else {
src = src.substring(0, sep) + ";" + time;
}
+
return src;
}
[StatValueChart.css]
div.StatValueChart {
- font-size: 0.9em;
- margin: 0 0 1.5em 0;
- width: 30em;
+ font-size: 0.9em;
+ margin: 0 0 1.5em 0;
+ width: 30em;
}
div.StatValueChart div.duration {
- margin: 1em 0 0.5em 1em;
+ margin: 1em 0 0.5em 1em;
}
div.StatValueChart ul.radiotabs {
- margin: 0;
+ margin: 0;
}
div.StatValueChart img {
- margin: 0 0 0 1em;
+ margin: 0 0 0 1em;
}
[StatValueChart.html]
@@ -168,4 +169,3 @@
<span class="swatch" style="background-color: {stat_color}"> </span>
<span class="ph" statname="{stat_name}" statmode="{mode}">{stat_value}</span>
</li>
-
Modified: mgmt/trunk/cumin/python/cumin/submitter.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/submitter.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/submitter.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -63,7 +63,7 @@
jobs = SubmitterJobSet(app, "jobs")
self.__tabs.add_tab(jobs)
-
+
details = CuminDetails(app, "details")
self.__tabs.add_tab(details)
@@ -101,7 +101,7 @@
class SubmitterJobSet(JobTab):
def __init__(self, app, name):
super(SubmitterJobSet, self).__init__(app, name)
-
+
def get_visible_columns(self, session):
return self.get_request_visible_columns(session, ["custom_group", "scheduler"])
@@ -113,4 +113,3 @@
def render_title(self, session, submitter):
submitter_sql = "submitter_id = %i" % submitter.id
return "Jobs %s" % fmt_count(Job.select(submitter_sql).count())
-
Modified: mgmt/trunk/cumin/python/cumin/submitter.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/submitter.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/submitter.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -46,27 +46,26 @@
</table>
[SubmitterJobSet.html]
- <div class="rfloat">{phase}</div>
+<div class="rfloat">{phase}</div>
<form id="{id}" style="clear:right;" method="post" action="?">
- <div class="sactions">
- {job_search}
- <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>
+ <div class="sactions">
+ {job_search}
+ <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>
Modified: mgmt/trunk/cumin/python/cumin/system.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/system.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/system.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -35,10 +35,10 @@
col = self.LoadColumn(app, "load")
col.alignment = "right"
self.add_column(col)
-
+
def render_title(self, session, *args):
return "Systems %s" % fmt_count(self.get_item_count(session, *args))
-
+
class NameColumn(SqlTableColumn):
def render_title(self, session, data):
return "Name"
@@ -143,7 +143,7 @@
vis = self.SystemSlotMap(app, "system_slot_map")
self.add_child(vis)
-
+
def render_title(self, session):
return "Statistics"
@@ -195,7 +195,7 @@
def get_sql_values(self, session, system):
return {"nodeName": system.nodeName}
-
+
from slot import SlotSet
class SystemSlotSet(SlotSet):
@@ -214,16 +214,16 @@
recent = self.get_recent_sql_where(session)
if recent:
elems.append(recent)
-
+
return "where %s" % " and ".join(elems)
-
+
def get_sql_values(self, session, system):
return {"nodeName": system.nodeName}
class SystemServices(ItemSet):
def render_title(self, session, *args):
return "Services"
-
+
def get_args(self, session):
return (self.frame.get_object(session),)
@@ -231,10 +231,10 @@
daemons = list()
daemon_types = [Scheduler, Collector, Negotiator]
sql = "system = '%s'" % system.nodeName
-
+
for daemon in daemon_types:
system_daemons = daemon.select(sql)
- for devil in system_daemons:
+ for devil in system_daemons:
try:
daemons.append(devil)
except Exception, e:
@@ -247,7 +247,7 @@
daemons.append(BrokerRegistration.get(broker.registrationID))
return daemons
-
+
def render_item_content(self, session, item):
if isinstance(item, BrokerRegistration):
reg = Identifiable(item.id)
Modified: mgmt/trunk/cumin/python/cumin/test.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/test.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/test.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -92,7 +92,7 @@
ready = True
break
- print ".",
+ print ".",
self.broker_conn.open()
@@ -184,7 +184,7 @@
self.name = self.__class__.__name__
self.parent = parent
self.children = list()
-
+
if parent:
self.parent.children.append(self)
@@ -278,7 +278,7 @@
class BrokerLinkTest(Test):
def __init__(self, env, parent):
super(BrokerLinkTest, self).__init__(env, parent)
-
+
RouteTest(env, self)
self.LinkRemove(env, self)
@@ -323,7 +323,7 @@
p.process(s)
self.env.check_redirect(p, s)
-
+
def predicate():
return self.env.link.qmfDeleteTime
@@ -332,7 +332,7 @@
class RouteTest(Test):
def __init__(self, env, parent):
super(RouteTest, self).__init__(env, parent)
-
+
self.Add(env, self)
self.Remove(env, self)
@@ -342,7 +342,7 @@
class Add(Test):
def do_run(self, session):
p, s = self.env.page_and_session()
-
+
p.main.broker.set_object(s, self.env.broker)
p.main.broker.link.set_object(s, self.env.link)
@@ -356,20 +356,20 @@
form.key.set(s, "cumin.key")
form.tag.set(s, "cumin.tag")
form.excludes.set(s, "cumin.tag")
-
+
form.submit(s)
p.process(s)
-
+
self.env.check_redirect(p, s)
-
+
def predicate():
for item in Bridge.selectBy(link=self.env.link, dest=self.env.broker_exchange.name, key="cumin.key"):
self.env.bridge = item
return True
-
+
wait(predicate)
-
+
class Remove(Test):
def do_run(self, session):
p, s = self.env.page_and_session()
@@ -385,7 +385,7 @@
p.process(s)
self.env.check_redirect(p, s)
-
+
def predicate():
return self.env.bridge.qmfDeleteTime
@@ -496,7 +496,7 @@
def do_run(self, session):
self.run_children(session)
-
+
class BindDirect(Test):
def __init__(self, env, parent):
super(BindQueueTest.BindDirect, self).__init__(env, parent)
@@ -520,7 +520,7 @@
direct["key"] = "amq.direct.key"
form.bindings.dict_param.set(s, binding)
-
+
form.submit(s)
p.process(s)
@@ -575,7 +575,7 @@
direct["type"] = "topic"
direct["key"] = "topic.key"
form.bindings.dict_param.set(s, binding)
-
+
form.submit(s)
p.process(s)
@@ -628,7 +628,7 @@
direct["name"] = "amq.fanout"
direct["type"] = "fanout"
form.bindings.dict_param.set(s, binding)
-
+
form.submit(s)
p.process(s)
@@ -681,7 +681,7 @@
direct["mkey.1"] = "key1"
direct["mkey.1.nv"] = "name.value.1"
form.bindings.dict_param.set(s, binding)
-
+
form.submit(s)
p.process(s)
@@ -744,7 +744,7 @@
AddQueueTest(env, self)
self.Remove(env, self)
-
+
def do_run(self, session):
vhost = self.env.vhost
name = self.env.broker_queue.name
@@ -805,7 +805,7 @@
return True
wait(predicate)
-
+
class ExchangeTest(Test):
def __init__(self, env, parent):
super(ExchangeTest, self).__init__(env, parent)
@@ -845,9 +845,9 @@
# wait for newly created exchange to get marked as deleted
def predicate():
return self.env.added_exchange.qmfDeleteTime
-
+
wait(predicate)
-
+
class ConnectionTest(Test):
def do_run(self, session):
raise Exception("Not implemented")
Modified: mgmt/trunk/cumin/python/cumin/tools.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/tools.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/tools.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -19,7 +19,7 @@
while password is None:
once = getpass("Enter new password: ")
twice = getpass("Confirm new password: ")
-
+
if once == twice:
password = once
else:
@@ -294,7 +294,7 @@
password = args[2]
except IndexError:
password = prompt_password()
-
+
crypted = crypt_password(password)
try:
@@ -322,7 +322,7 @@
name = args[1]
subjects = Subject.selectBy(name=name)
-
+
if subjects.count():
for subject in subjects:
subject.destroySelf()
@@ -422,7 +422,7 @@
raise CommandException(self, "USER is required")
subject = Subject.getByName(ssubject)
-
+
if not subject:
raise CommandException\
(self, "User '%s' is unknown" % subject.name)
@@ -499,7 +499,7 @@
log.warn("Mint subprocess %i wouldn't go gracefully, killed",
self.proc.pid)
-
+
def do_run(self, opts, args):
self.config.load_dict(opts)
Modified: mgmt/trunk/cumin/python/cumin/user.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/user.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/user.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -1,31 +1,31 @@
[LoginPage.css]
body.LoginPage {
- background: #f7f7f7;
- padding: 4em;
+ background: #f7f7f7;
+ padding: 4em;
}
[LoginForm.css]
form.LoginForm {
- background: #fff;
- width: 16em;
- margin: 0 auto;
- border: 1px solid #ddd;
- -moz-border-radius: 0.5em;
- -webkit-border-radius: 0.5em;
- padding: 2em;
+ background: #fff;
+ width: 16em;
+ margin: 0 auto;
+ border: 1px solid #ddd;
+ -moz-border-radius: 0.5em;
+ -webkit-border-radius: 0.5em;
+ padding: 2em;
}
form.LoginForm > h1 {
- margin: 0 0 1em 0;
+ margin: 0 0 1em 0;
}
form.LoginForm h1 img {
- vertical-align: -60%;
- margin: 0 0.25em 0 0;
+ vertical-align: -60%;
+ margin: 0 0.25em 0 0;
}
form.LoginForm input {
- width: 12em;
+ width: 12em;
}
form.LoginForm input.submit {
@@ -33,11 +33,11 @@
}
form.LoginForm > div.buttons {
- margin: 1.5em 0 0 0;
+ margin: 1.5em 0 0 0;
}
form.LoginForm p.login_invalid {
- color: red;
+ color: red;
}
[LoginForm.html]
@@ -51,16 +51,17 @@
{login_invalid}
- {fields}
+ {fields}
<div class="buttons">{submit}</div>
<div>{hidden_inputs}</div>
</form>
+
<script type="text/javascript">
wooly.doc().elembyid("{id}").node.elements[0].focus();
</script>
[LoginForm.login_invalid]
-<p class="login_invalid">The user name and password you
-entered do not match any account.</p>
+<p class="login_invalid">The user name and password you entered do not
+match any account.</p>
Modified: mgmt/trunk/cumin/python/cumin/util.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/util.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/util.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -115,7 +115,7 @@
end = ocurly
else:
strings.append(begin_delim + text[end + 1:ccurly] + end_delim)
-
+
start = ccurly + 1
end = ocurly
Modified: mgmt/trunk/cumin/python/cumin/visualizations.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/visualizations.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/visualizations.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -18,16 +18,16 @@
class SlotMap(Widget):
def __init__(self, app, name):
super(SlotMap, self).__init__(app, name)
-
+
self.slot_info = self.SlotInfo(app, "slot_info")
self.add_child(self.slot_info)
-
+
self.slot_legend = self.SlotLegend(app, "slot_legend")
self.add_child(self.slot_legend)
-
+
self.wait = self.PleaseWait(app, "please_wait")
self.add_child(self.wait)
-
+
def get_args(self, session):
return self.frame.get_args(session)
@@ -41,10 +41,10 @@
params.append("zy=0") # zoom top
return "slots.png?" + ";".join(params)
-
+
def get_title_name(self, session, object):
return str(object.id)
-
+
def render_title(self, session, object):
return "Slots on '%s'" % self.get_title_name(session, object)
@@ -61,87 +61,87 @@
class PleaseWait(CuminForm):
def __init__(self, app, name):
super(SlotMap.PleaseWait, self).__init__(app, name)
-
+
self.__cancel = self.Cancel(app, "cancel")
self.__cancel.set_tab_index(201)
self.add_child(self.__cancel)
def get_modal(self, session):
return False
-
+
class Cancel(FormButton):
def render_class(self, session, *args):
return "cancel"
-
+
def render_content(self, session, *args):
return "Cancel"
-
+
def render_onclick(self, session, *args):
return "cancel_wait"
-
+
class SlotLegend(Widget):
def __init__(self, app, name):
super(SlotMap.SlotLegend, self).__init__(app, name)
-
+
self.states = self.SlotStates(app, "slot_states")
self.add_child(self.states)
-
+
self.activities = self.SlotActivities(app, "slot_activities")
self.add_child(self.activities)
-
+
class SlotStates(ItemSet):
states = ("Unclaimed", "Claimed", "Owner", "Matched", "Preempting")
-
+
def do_get_items(self, session):
return self.states
def render_initial(self, session, state):
return state[0]
-
+
def render_title(self, session, state):
return state
-
+
class SlotActivities(ItemSet):
- activities = [("Idle", "clear"),
+ activities = [("Idle", "clear"),
("Busy", "green"),
("Suspended", "red"),
("Vacating", "orange"),
("Killing", "blue"),
("Benchmarking", "yellow"),
("Unknown", "grey")]
-
+
def do_get_items(self, session):
return self.activities
def render_title(self, session, activity):
return activity[0]
-
+
def render_href(self, session, activity):
params = list()
- params.append("dot=%s" % activity[0])
-
+ params.append("dot=%s" % activity[0])
+
return "slots.png?" + ";".join(params)
def render_dot_size(self, session, activity):
return 12
-
+
class SlotInfo(ItemSet):
- display_names = {"jid": "jid", "job_id": "Job ID",
- "system": "System", "machine": "Machine",
- "state": "State", "activity": "Activity",
+ display_names = {"jid": "jid", "job_id": "Job ID",
+ "system": "System", "machine": "Machine",
+ "state": "State", "activity": "Activity",
"name": "Name"}
def __init__(self, app, name):
super(SlotMap.SlotInfo, self).__init__(app, name)
-
+
self.info_index = IntegerParameter(app, "i")
self.add_parameter(self.info_index)
-
+
self.info_div_tmpl = Template(self, "bg_html")
-
+
def get_args(self, session):
return self.frame.get_args(session)
-
+
def do_render(self, session, *args):
object = args[0]
info_index = self.info_index.get(session)
@@ -155,26 +155,25 @@
return writer.to_string()
else:
return super(SlotMap.SlotInfo, self).do_render(session, *args)
-
+
def do_get_items(self, session, slot):
- return ((self.display_names[x], slot[x])
+ return ((self.display_names[x], slot[x])
for x in slot if x in self.display_names)
-
+
def render_slot_info_url(self, session, *args):
return self.page.get_update_url(session, [self])
-
+
def render_slot_info_index(self, session, *args):
return self.info_index.path
-
+
def render_title(self, session, item):
return item[0]
-
+
def render_value(self, session, item):
return item[1]
-
+
def render_job_id(self, session, item):
return item[0] == "jid" and "id='job_id'" or ""
-
+
def render_row_class(self, session, item):
return item[0] == "jid" and "class='hidden_row'" or ""
-
Modified: mgmt/trunk/cumin/python/cumin/visualizations.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/visualizations.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/visualizations.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -1,7 +1,9 @@
[SlotMap.javascript]
var vis;
+
(function() {
vis = new Visualization();
+
var slot_clip_left;
var slot_clip_top;
var slot_zoom;
@@ -28,6 +30,7 @@
var now = new Date();
animate_pan(slot_clip_left, Math.min(Math.floor(slot_clip_size / 1.1), -slot_clip_left), (now-0), "slot_clip_left");
}
+
this.pan_right = function () {
var to_pan = Math.floor(slot_clip_size / 1.1);
if (slot_clip_left - slot_clip_size - to_pan < -slot_map_info.width) {
@@ -36,11 +39,13 @@
var now = new Date();
animate_pan(slot_clip_left, -to_pan, (now-0), "slot_clip_left");
}
+
this.pan_up = function () {
if (slot_clip_top == 0) return;
var now = new Date();
animate_pan(slot_clip_top, Math.min(Math.floor(slot_clip_size / 1.1), -slot_clip_top), (now-0), "slot_clip_top");
}
+
this.pan_down = function () {
if (slot_map_info.height < slot_clip_size) return;
@@ -69,6 +74,7 @@
slot_map_info.count = 0;
slot_png_timer = setInterval(update_png, 10000);
}
+
this.img_loaded = function (oImg) {
stop_auto_updates();
var oZooming = document.getElementById("slot_zooming");
@@ -85,7 +91,7 @@
set_pan("slot_pandown", "width", slot_map_info.size * slot_map_info.cols, this.pan_down);
set_pan("slot_panleft", "height", slot_map_info.size * slot_map_info.rows, this.pan_left);
set_pan("slot_panright", "height", slot_map_info.size * slot_map_info.rows, this.pan_right);
-
+
var oMap = document.getElementById(slot_current_id);
if (oMap) {
oMap.style.width = Math.min(oImg.width, slot_clip_size) + "px";
@@ -95,7 +101,7 @@
oMap.style.borderColor = "transparent";
else
oMap.style.borderColor = "#CCCCCC";
-
+
}
var oGlass = document.getElementById("slot_glass");
if (oGlass) {
@@ -128,7 +134,7 @@
}
}
}
-
+
this.moveGlass = function (e) {
if (slot_map_info.size == 0) return;
if (!e) var e = window.event;
@@ -138,11 +144,11 @@
var posxy = get_event_pos(e);
if ((posxy.x - oGlass.down_pos.x > 0) || (posxy.y - oGlass.down_pos.y > 0))
oGlass.down_pos = {x: posxy.x - slot_clip_left, y: posxy.y - slot_clip_top};
-
+
slot_clip_left = Math.min(posxy.x - oGlass.down_pos.x, 0);
slot_clip_top = Math.min(posxy.y - oGlass.down_pos.y, 0);
oGlass.drug = true;
-
+
draw_clipped();
if (e.preventDefault)
e.preventDefault();
@@ -167,7 +173,7 @@
clear_hover();
hide_info();
}
- return false;
+ return false;
}
this.outGlass = function outGlass(e) {
@@ -179,7 +185,7 @@
this.zoom_in_slots = function (posxy) {
if (slot_zoom >= get_max_zoom()) return;
var click_info = get_index(posxy.x, posxy.y);
- slot_center_index = click_info.index;
+ slot_center_index = click_info.index;
do_zoom(slot_zoom + 1);
}
@@ -198,7 +204,7 @@
get_center_index();
do_zoom(level);
-
+
if (e.stopPropagation)
e.stopPropagation()
else if (e.cancelBubble)
@@ -208,7 +214,7 @@
function do_zoom(level) {
var old_zoom = slot_zoom;
slot_zoom = level;
-
+
stop_auto_updates();
var oZooming = document.getElementById("slot_zooming");
if (oZooming) {
@@ -239,9 +245,10 @@
var original_x = oPos.offsetLeft;
var now = new Date();
var x_amount = ((level - 1) * 13) - original_x;
- animate_zoom_pos(original_x, (now-0), x_amount)
+ animate_zoom_pos(original_x, (now-0), x_amount)
}
}
+
function animate_zoom_pos(original_x, original_time, x_amount) {
var oPos = document.getElementById("zoom_pos");
if (oPos) {
@@ -251,7 +258,7 @@
if (delta < 1)
partial = Math.sin(Math.PI/2 * delta);
oPos.style.left = Math.floor(original_x + x_amount * partial) + "px";
-
+
if (delta < 1)
setTimeout(function(){ animate_zoom_pos(original_x, original_time, x_amount) }, 10);
}
@@ -261,7 +268,7 @@
if (slot_png_timer) {
clearInterval(slot_png_timer);
slot_png_timer = null;
- }
+ }
}
function update_png() {
@@ -284,7 +291,6 @@
}
}
-
function slot_cookie_info() {
var slot_info = get_cookie("slot_info");
if (slot_info) {
@@ -302,20 +308,20 @@
function center_on_index() {
if (slot_center_index == -1) return;
-
+
var row = slot_center_index % slot_map_info.cols;
var col = Math.floor(slot_center_index / slot_map_info.cols);
var x = col * slot_map_info.size + slot_map_info.size / 2;
var y = row * slot_map_info.size + slot_map_info.size / 2;
-
+
var cl = (Math.min(slot_clip_size, slot_map_info.width) / 2) - x;
var ct = (Math.min(slot_clip_size, slot_map_info.height) / 2) - y;
if (slot_map_info.width + cl < slot_clip_size)
cl = slot_clip_size - slot_map_info.width;
-
+
if (slot_map_info.height + ct < slot_clip_size)
- ct = slot_clip_size - slot_map_info.height;
+ ct = slot_clip_size - slot_map_info.height;
if (cl > 0) cl = 0;
if (ct > 0) ct = 0;
@@ -328,16 +334,17 @@
function get_center_index() {
var rx = Math.min(slot_clip_size, slot_map_info.width) / 2;
var ry = Math.min(slot_clip_size, slot_map_info.height) / 2;
-
+
var click_info = get_index(rx, ry);
if (click_info)
- slot_center_index = click_info.index;
+ slot_center_index = click_info.index;
}
function get_max_zoom() {
// allow to zoom until each slot is at least 28px wide
return Math.ceil(28 / (slot_map_info.size / slot_zoom));
}
+
function initialize_zoom() {
var max_zoom = get_max_zoom();
var oZoom = document.getElementById("zoom_levels");
@@ -359,7 +366,7 @@
oDiv.className = "zoom_middle_left";
oDiv.onclick = slot_zoom_to;
oDiv.level = i+1;
- oZoom.appendChild(oDiv);
+ oZoom.appendChild(oDiv);
oDiv = document.createElement("div");
oDiv.className = "zoom_middle_right";
oDiv.onclick = slot_zoom_to;
@@ -399,14 +406,14 @@
clip_bottom = slot_map_info.height;
clip_right = slot_map_info.width;
slot_clip_left = 0;
- slot_clip_top = 0;
+ slot_clip_top = 0;
} else {
var iZoom = slot_zoom;
var clip_width = slot_clip_size;
var clip_height = slot_clip_size;
clip_bottom = clip_height - slot_clip_top;
clip_right = clip_width - slot_clip_left;
-
+
if (clip_right > slot_map_info.width) {
slot_clip_left += (clip_right - slot_map_info.width);
clip_right = slot_map_info.width;
@@ -416,7 +423,7 @@
clip_bottom = slot_map_info.height;
}
}
-
+
var oPng = document.getElementById("slot_png");
if (oPng) {
oPng.style.left = slot_clip_left + "px";
@@ -438,7 +445,7 @@
draw_clipped();
if (delta < 1)
setTimeout( function () {animate_pan(original_edge, move, timer, which) }, 10);
-
+
}
function clear_hover() {
@@ -452,6 +459,7 @@
oHover.style.visibility = "hidden";
}
}
+
function hide_info() {
oInfo = get_slot_info_elem();
if (oInfo) {
@@ -459,7 +467,7 @@
}
slot_last_index = -1;
}
-
+
function get_index(x, y) {
var width = slot_map_info.size;
var pngrow = Math.floor((y - slot_clip_top) / width);
@@ -485,7 +493,7 @@
clearTimeout(slot_hover_timer);
slot_hover_timer = null;
}
- slot_info_timer = setTimeout( function() { vis.fire_slot_info(click_info.index) }, 500);
+ slot_info_timer = setTimeout( function() { vis.fire_slot_info(click_info.index) }, 500);
animate_hover(0, click_info.row, click_info.col);
oInfo = get_slot_info_elem();
if (oInfo) {
@@ -494,6 +502,7 @@
}
}
}
+
function animate_hover(leg, row, col) {
var oHover = document.getElementById("slot_hover");
if (oHover) {
@@ -507,9 +516,9 @@
var ry = row * width + slot_clip_top;
oHover.style.width = (width-1) + "px";
oHover.style.height = (width-1) + "px";
-
+
switch (leg) {
- case 0:
+ case 0:
oHover.style.left = rx + "px";
oHover.style.top = ry + "px";
oHover.style.width = width + "px";
@@ -524,7 +533,7 @@
oHover.style.clip = "rect(" + (-cy) + "px " + (cw) + "px " + (ch) + "px " + (-cx) + "px)";
} else {
oHover.style.clip = "rect(0px " + (width+1) + "px " + (width+1) + "px 0px)";
- }
+ }
slot_hover_timer = setTimeout( function() {animate_hover(1)}, 500/3);
break;
case 1: oHover.style.borderColor = "red red pink pink";
@@ -538,10 +547,11 @@
}
}
}
+
function get_slot_info_elem() {
return document.getElementById(slot_info_id);
}
-
+
function refire_info() {
if (slot_last_index > -1) {
do_info_request(slot_last_index)
@@ -555,7 +565,7 @@
sess = sess + ";" + slot_info_index + "=" + index;
sess = escape(sess);
var newreq = replace_value(slot_info_url, "session", sess, ";");
-
+
wooly.directUpdate(newreq, got_slot_info, 0, {index: index});
}
@@ -578,14 +588,14 @@
if (for_jid) {
clicks.doClick(for_jid.x, for_jid.y);
return;
- }
+ }
promote_to_body(oInfo); // so position is absolute to entire page
oInfo.style.left = "-1000px";
oInfo.style.visibility = "hidden";
oInfo.style.display = "block";
-
+
var oMap = document.getElementById(slot_current_id);
if (oMap) {
var abs_pos = findPos(oMap);
@@ -599,7 +609,7 @@
// if off the bottom of the map
if (top + oInfo.offsetHeight > abs_pos.y + oMap.offsetHeight) {
// position popup above clicked slot
- top = (abs_pos.y + y) - oInfo.offsetHeight - Math.floor(slot_map_info.size * .5);
+ top = (abs_pos.y + y) - oInfo.offsetHeight - Math.floor(slot_map_info.size * .5);
}
oInfo.style.top = top + "px";
oInfo.style.left = abs_pos.x + "px";
@@ -607,12 +617,12 @@
oInfo.style.visibility = "visible";
}
}
-
+
}())
+var clicks;
-var clicks;
(function() {
clicks = new Clicks();
@@ -623,9 +633,9 @@
this.doMouseDown = function(e) {
if (!e) var e = window.event;
- var which = e.type;
+ var which = e.type;
switch (which) {
- case "click":
+ case "click":
// If we've just had a doubleclick then ignore it
if (hadDoubleClick()) return false;
// Otherwise set timer to act. It may be preempted by a doubleclick.
@@ -658,7 +668,7 @@
var click_info = get_index(x, y);
var oInfo = get_slot_info_elem();
if (oInfo && click_info) {
- if ((typeof oInfo.click_index != "undefined") &&
+ if ((typeof oInfo.click_index != "undefined") &&
(oInfo.click_index == click_info.index)) {
// we already fetched the info for this slot
var oInfoCell = document.getElementById("job_id");
@@ -673,10 +683,10 @@
// fetch the slot info so we can get the job id
oInfo.for_jid = {fetching: true, x: x, y: y};
vis.fire_slot_info(click_info.index);
- }
+ }
}
function go_to_job(jid) {
- var url = show_slot_job_url.replace("XXX", jid+"");
+ var url = show_slot_job_url.replace("XXX", jid+"");
window.location.href = url;
show_wait();
}
@@ -691,12 +701,12 @@
}
return false;
}
-
+
function doDoubleClick(e) {
var now = new Date();
this.doubleclick_when = now.getTime();
if (this.click_handle != null) {
- clearTimeout(this.click_handle); // Clear pending Click
+ clearTimeout(this.click_handle); // Clear pending Click
this.click_handle = null;
}
if (!e) var e = window.event;
@@ -721,7 +731,7 @@
while (c.charAt(0) == ' ') {
c = c.substring(1, c.length);
}
-
+
if (c.indexOf(name_plus) == 0) {
return c.substring(name_plus.length,c.length);
}
@@ -775,9 +785,9 @@
/* find out what element the event was the event target */
function get_event_target(e) {
var targ = null;
- if (e.target)
+ if (e.target)
targ = e.target;
- else if (e.srcElement)
+ else if (e.srcElement)
targ = e.srcElement;
if (targ.nodeType == 3) // avoid Safari textNode bug
targ = targ.parentNode;
@@ -806,7 +816,6 @@
}
}
}
-
[SlotMap.css]
div#slot_hover {
@@ -820,6 +829,7 @@
height: 28px;
-moz-border-radius: 50%;
}
+
div#slot_zooming {
width: 400px;
height: 400px;
@@ -834,10 +844,12 @@
-moz-opacity: 0.5;
display: none;
}
+
div#slot_zooming p {
margin: 0;
padding: 140px 0 0 0;
}
+
div#slot_controls {
font-size: 0.8em;
float: left;
@@ -853,12 +865,14 @@
width: 18px;
height: 0px;
}
+
div#slot_panright {
float: left;
background: url(resource?name=pan-right.png) scroll no-repeat center;
width: 18px;
height: 0px;
}
+
div#slot_panup {
clear: both;
background: url(resource?name=pan-up.png) scroll no-repeat center;
@@ -868,6 +882,7 @@
left: 18px;
z-index:0;
}
+
div#slot_pandown {
clear: left;
background: url(resource?name=pan-down.png) scroll no-repeat center;
@@ -886,11 +901,13 @@
position:relative;
width: 0px;
}
+
div#slot_png {
clip: rect(0 400px 400px 0);
position:absolute;
z-index: 0;
}
+
div#slot_glass {
height: 0px;
left: 0px;
@@ -899,10 +916,12 @@
width: 0px;
z-index: 100;
}
+
div#slot_visualization {
position: relative;
visibility: hidden;
}
+
div.zoom_node {
background-color: white;
position: absolute;
@@ -910,6 +929,7 @@
top: -8px;
color: #0066CC;
}
+
div.zoom_node_last {
background-color: white;
position: absolute;
@@ -917,6 +937,7 @@
top: -8px;
color: #0066CC;
}
+
div.zoom_first {
width: 6px;
height: 15px;
@@ -927,6 +948,7 @@
margin-left: 0.5em;
cursor: pointer;
}
+
div.zoom_last {
width: 6px;
height: 15px;
@@ -937,6 +959,7 @@
margin-right: 0.5em;
cursor: pointer;
}
+
div.zoom_middle_right {
width: 6px;
height: 15px;
@@ -946,6 +969,7 @@
position: relative;
cursor: pointer;
}
+
div.zoom_middle_left {
width: 6px;
height: 15px;
@@ -953,14 +977,17 @@
float: left;
cursor: pointer;
}
+
div#zoom_text {
margin-right: 1em;
float:left;
}
+
div#zoom_levels {
position:relative;
float: left;
}
+
div#zoom_pos {
background: url(slots.png?dot=Busy) scroll no-repeat center;
width: 12px;
@@ -972,24 +999,24 @@
[SlotMap.html]
<div id="slot_visualization">
- <h2>{title}</h2>
- <div id="slot_controls">
- <div id="zoom_text">Zoom</div><div id="zoom_levels"><div id="zoom_pos"></div></div><div style="clear:left;"><!-- --></div>
+ <h2>{title}</h2>
+ <div id="slot_controls">
+ <div id="zoom_text">Zoom</div><div id="zoom_levels"><div id="zoom_pos"></div></div><div style="clear:left;"><!-- --></div>
+ </div>
+
+ <div id="slot_panup" onclick="vis.pan_up()"></div>
+ <div id="slot_panleft" onclick="vis.pan_left()"></div>
+ <div class="slot_map" id="{id}">
+ <div id="slot_glass"><!-- mouse target to prevent selecting/dragging image --></div>
+ <div id="slot_png">
+ <img name="{id}" src="{href}" border="0" onload="vis.img_loaded(this)" onerror="vis.img_error(this)" alt="slots" />
</div>
-
- <div id="slot_panup" onclick="vis.pan_up()"></div>
- <div id="slot_panleft" onclick="vis.pan_left()"></div>
- <div class="slot_map" id="{id}">
- <div id="slot_glass"><!-- mouse target to prevent selecting/dragging image --></div>
- <div id="slot_png">
- <img name="{id}" src="{href}" border="0" onload="vis.img_loaded(this)" onerror="vis.img_error(this)" alt="slots" />
- </div>
- <div id="slot_hover"><!-- red border around current slot --></div>
- <div id="slot_zooming"><p>Zooming...</p></div>
- </div>
- <div id="slot_panright" onclick="vis.pan_right()"><!-- --></div>
- <div id="slot_pandown" onclick="vis.pan_down()"></div>
- {slot_legend}
+ <div id="slot_hover"><!-- red border around current slot --></div>
+ <div id="slot_zooming"><p>Zooming...</p></div>
+ </div>
+ <div id="slot_panright" onclick="vis.pan_right()"><!-- --></div>
+ <div id="slot_pandown" onclick="vis.pan_down()"></div>
+ {slot_legend}
</div>
{slot_info}
{please_wait}
@@ -1023,9 +1050,11 @@
window.location.href = window.location.href;
return false;
}
+
function show_wait() {
var oGlass = document.getElementById("modal_glass");
var oWait = document.getElementById("please_wait");
+
if (oWait && oGlass) {
oGlass.style.width = document.body.offsetWidth + "px";
oGlass.style.height = document.body.offsetHeight + "px";
@@ -1035,15 +1064,15 @@
promote_to_body(oGlass); // so it covers the entire page
promote_to_body(oWait); // so it can be centered on the page
-
+
var cp = get_center_point();
oWait.style.left = (cp.x - (oWait.offsetWidth / 2)) + "px";
oWait.style.top = (cp.y - (oWait.offsetHeight / 2)) + "px";
oWait.style.visibility = "visible";
}
}
-function get_center_point()
-{
+
+function get_center_point() {
var x = 0;
var y = 0;
@@ -1052,11 +1081,11 @@
var width = document.body.offsetWidth;
var height = document.body.offsetHeight;
-
- return { x: (width + scrollx) / 2, y: (height + scrolly) / 2 };
+
+ return { x: (width + scrollx) / 2, y: (height + scrolly) / 2 };
}
-
+
[PleaseWait.css]
div#modal_glass {
background-color: black;
@@ -1070,6 +1099,7 @@
display: none;
z-index: 200;
}
+
div#please_wait {
position: absolute;
display: none;
@@ -1077,9 +1107,11 @@
left: 100px;
top: 100px;
}
+
div#please_wait form.mform {
width: 20em;
}
+
div#please_wait form.mform div.body, div#please_wait form.mform div.foot {
text-align: center;
}
@@ -1087,17 +1119,17 @@
[PleaseWait.html]
<div id="modal_glass" onclick="cancel_wait()"><!-- --></div>
<div id="please_wait">
- <form class="mform">
- <div class="head">
- <h1>Loading Job</h1>
- </div>
- <div class="body">
- Loading Job. Please wait...
- </div>
- <div class="foot">
- {cancel}
- </div>
- </form>
+ <form class="mform">
+ <div class="head">
+ <h1>Loading Job</h1>
+ </div>
+ <div class="body">
+ Loading Job. Please wait...
+ </div>
+ <div class="foot">
+ {cancel}
+ </div>
+ </form>
</div>
@@ -1113,7 +1145,7 @@
div.slot_container {
position: absolute;
background-color: #ffffaa;
- background-image: url(resource?name=shade.png);
+ background-image: url(resource?name=shade.png);
background-position: bottom left;
background-repeat: repeat-x;
border: 1px solid #cccc99;
@@ -1133,26 +1165,26 @@
}
html>body .outerpair1 {
-background: url(resource?name=upperrightfade.png) right top no-repeat;
+ background: url(resource?name=upperrightfade.png) right top no-repeat;
}
html>body .outerpair2 {
-background: url(resource?name=lowerleftfade.png) left bottom no-repeat;
-padding-top: 8px;
-padding-left: 8px;
+ background: url(resource?name=lowerleftfade.png) left bottom no-repeat;
+ padding-top: 8px;
+ padding-left: 8px;
}
html>body .shadowbox {
-background: url(resource?name=shadow.png) bottom right;
+ background: url(resource?name=shadow.png) bottom right;
}
html>body .innerbox {
-position: relative;
-left: -8px;
-top: -8px;
+ position: relative;
+ left: -8px;
+ top: -8px;
}
tr.hidden_row {
- display: none;
+ display: none;
}
[SlotInfo.html]
@@ -1174,52 +1206,56 @@
</div></div></div></div>
[SlotInfo.item_html]
- <tr {row_class}><td class="slot_info_title">{title}</td>
- <td {job_id} class="slot_info_value">{value}</td></tr>
+<tr {row_class}>
+ <td class="slot_info_title">{title}</td>
+ <td {job_id} class="slot_info_value">{value}</td>
+</tr>
[SlotLegend.css]
div.slot_legend {
margin-top: 1em;
}
+
div.slot_states, div.slot_activities {
float: left;
margin-left: 2em;
}
+
div.slot_states ul, div.slot_activities ul {
margin-top: 0.5em;
margin-left: 0.5em;
font-size: 0.8em;
}
+
div.slot_states ul li span {
font-weight: bold;
}
[SlotLegend.html]
<div class="slot_legend">
- {slot_states}
- {slot_activities}
- <div style="clear:both"><!-- --></div>
+ {slot_states}
+ {slot_activities}
+ <div style="clear:both"><!-- --></div>
</div>
[SlotStates.html]
- <div class="slot_states">
- <h3>States</h3>
- <ul>
- {items}
- </ul>
- </div>
+<div class="slot_states">
+ <h3>States</h3>
+ <ul>
+ {items}
+ </ul>
+</div>
[SlotActivities.html]
- <div class="slot_activities">
- <h3>Activities</h3>
- <ul>
- {items}
- </ul>
- </div>
+<div class="slot_activities">
+ <h3>Activities</h3>
+ <ul>
+ {items}
+ </ul>
+</div>
[SlotStates.item_html]
- <li><span>{initial}</span> {title}</li>
-
+<li><span>{initial}</span> {title}</li>
+
[SlotActivities.item_html]
- <li><img src="{href}" width="{dot_size}" height="{dot_size}" alt="{title}"/> {title}</li>
-
\ No newline at end of file
+<li><img src="{href}" width="{dot_size}" height="{dot_size}" alt="{title}"/> {title}</li>
Modified: mgmt/trunk/cumin/python/cumin/widgets.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/widgets.py 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/widgets.py 2009-03-25 18:55:22 UTC (rev 3210)
@@ -168,7 +168,7 @@
def do_process(self, session, *args):
self.page.set_modal(session, self.get_modal(session))
-
+
if self.__cancel.get(session):
self.__cancel.set(session, False)
@@ -179,7 +179,7 @@
self.process_submit(session, *args)
else:
self.process_display(session, *args)
-
+
def process_cancel(self, session, *args):
self.page.set_redirect_url(session, self.get_origin(session))
@@ -221,7 +221,7 @@
class CuminFieldForm(CuminForm, FieldForm, Frame):
def render_body(self, session, *args):
return self.render_fields(session, *args)
-
+
class CuminConfirmForm(CuminForm):
def __init__(self, app, name):
super(CuminConfirmForm, self).__init__(app, name)
@@ -233,7 +233,7 @@
class CuminIntIdList(Widget):
def __init__(self, app, name):
super(CuminIntIdList, self).__init__(app, name)
-
+
param = IntegerParameter(app, "param")
self.add_parameter(param)
@@ -242,11 +242,11 @@
def render_item_content(self, session, id):
return "Act on object %i" % id
-
+
class CuminStringIdList(Widget):
def __init__(self, app, name):
super(CuminStringIdList, self).__init__(app, name)
-
+
param = Parameter(app, "param")
self.add_parameter(param)
@@ -255,7 +255,7 @@
def render_item_content(self, session, id):
return "Act on object %s" % id
-
+
class CuminBulk(ItemSet, CuminForm, Frame):
def get_href(self, session, ids):
branch = session.branch()
@@ -297,7 +297,7 @@
def render_title(self, session, object):
return "Status"
-
+
def render_color(self, session, object):
if hasattr(object, "errors"):
if object.errors:
@@ -317,8 +317,8 @@
class EditablePropertyRenderer(TemplateRenderer, Widget):
"""Display input fields for editing properties
- Parent class needs to override do_get_items() and return a list of items.
- Each item should be a dictionary.
+ Parent class needs to override do_get_items() and return a list of items.
+ Each item should be a dictionary.
["name"] is required and should be the display label
["value"] is required and should be the value to edit
["type"] is required and should be an input type <"number" | "string">
@@ -342,7 +342,7 @@
if "property" in item:
property = item["property"]
if property.title:
- title = property.get_title(session)
+ title = property.get_title(session)
return escape_amp(title)
def render_value(self, session, item):
@@ -352,7 +352,7 @@
property = "property" in item and item["property"] or None
if property:
writable = property.writable
-
+
writer = Writer()
if not writable:
self.__readonly_template.render(writer, session, item)
@@ -369,36 +369,36 @@
self.__string_template.render(writer, session, item)
return writer.to_string()
-
+
def render_pname(self, session, item):
return DictParameter.sep().join(
(item["path"], escape_entity(item["name"]), "value"))
-
+
def render_ptype_name(self, session, item):
return DictParameter.sep().join(
(item["path"], escape_entity(item["name"]), "type"))
def render_ptype_value(self, session, item):
return item["type"]
-
+
def render_orig_value(self, session, item):
if "orig" in item:
writer = Writer()
self.__orig_template.render(writer, session, item)
return writer.to_string()
-
+
def render_porig_name(self, session, item):
return DictParameter.sep().join(
(item["path"], escape_entity(item["name"]), "orig"))
-
+
def render_porig_value(self, session, item):
value = item["orig"]
return escape_entity(str(value))
-
+
def render_val(self, session, item):
value = self.get_val(session, item)
return escape_entity(str(value))
-
+
def render_display_val(self, session, item):
value = self.get_val(session, item)
property = "property" in item and item["property"] or None
@@ -408,14 +408,14 @@
value = renderer(session, value)
return escape_amp(str(value))
-
+
def get_val(self, session, item):
try:
value = item["value"]
except KeyError:
value = ""
return value
-
+
def render_error(self, session, item):
if "error" in item:
return "<div class=\"error\">%s</div>" % item["error"]
@@ -429,13 +429,13 @@
example = ""
description = property.description or ""
return " ".join((description, example))
-
+
def render_false_selected(self, session, item):
return item["value"].upper() == "FALSE" and "checked=\"checked\"" or ""
-
+
def render_true_selected(self, session, item):
return item["value"].upper() == "TRUE" and "checked=\"checked\"" or ""
-
+
def render_edit_number_class(self, session, item):
return "error" in item and "numeric_error" or "edit_number"
@@ -546,7 +546,7 @@
def get_items(self, session):
return self.__states
-
+
def get_title(self, state):
return state in self.__titles and self.__titles[state]
@@ -561,7 +561,7 @@
a hidden input to set the param value instead
of a link name/value pair """
return self.param.path
-
+
def render_item_link(self, session, state):
branch = session.branch()
self.set(branch, state)
@@ -619,10 +619,10 @@
sql = "qmf_delete_time is not null"
return sql
-
+
class SubmitSwitch(StateSwitch):
- """ Clicking on the link will submit the form.
-
+ """ Clicking on the link will submit the form.
+
This uses javascript and a hidden input to
submit the form when the link is clicked. This
allows other fields on the form to "remember"
@@ -633,7 +633,7 @@
def render_name(self, session, *args):
""" this needs to be the path of the param """
return self.get_param_id()
-
+
def render_item_link(self, session, state):
title = self.get_title(state)
hover = self.get_hover(state)
@@ -647,7 +647,7 @@
class TopTableColumn(SqlTableColumn):
def __init__(self, app, name):
super(TopTableColumn, self).__init__(app, name)
-
+
self.header_class = TopTableColumnHeader
class TopTableColumnHeader(ItemTableColumnHeader):
@@ -798,7 +798,7 @@
self.ids = CheckboxIdColumn(app, "id")
self.add_column(self.ids)
-
+
col = self.QNameColumn(app, "q_id")
col.visible = False
self.add_column(col)
@@ -817,13 +817,13 @@
col = self.MatchedColumn(app, "matched")
col.alignment = "right"
self.add_column(col)
-
+
self.phase = PhaseSwitch(app, "phase")
self.add_child(self.phase)
def get_args(self, session):
return self.frame.get_args(session)
-
+
def get_sql_values(self, session, obj):
return {"id": obj.id}
@@ -869,7 +869,7 @@
class MatchedColumn(ItemTableColumn):
def render_title(self, session, data):
return "Messages Matched"
-
+
def render_content(self, session, data):
binding = Binding.get(data["id"])
return self.app.model.binding.msgMatched.value(binding)
@@ -950,13 +950,13 @@
class FilteredCheckboxIdColumn(CheckboxIdColumn):
def __init__(self, app, name, form, callback=None):
super(FilteredCheckboxIdColumn, self).__init__(app, name)
-
+
# call back that returns True if the checkbox is to be disabled
self.__callback = callback
def do_render(self, session, data):
disabled = self.__callback and self.__callback(session, data) or False
- return super(FilteredCheckboxIdColumn, self).do_render(session, data,
+ return super(FilteredCheckboxIdColumn, self).do_render(session, data,
disabled=disabled)
class NameField(StringField):
@@ -972,7 +972,7 @@
def set_required(self, required):
self.required = required
-
+
def do_validate(self, session, errors):
name = self.get(session)
@@ -992,25 +992,25 @@
class TextField(NameField):
def __init__(self, app, name):
super(TextField, self).__init__(app, name)
-
+
self.__title = "Title"
-
+
def set_title(self, title):
self.__title = title
-
+
def render_title(self, session):
return self.__title
class ExchangeNameField(NameField):
def __init__(self, app, name):
super(ExchangeNameField, self).__init__(app, name)
-
+
self.illegal_chars = " (){}[]-<>&%"
self.legal_chars_desc = """
The exchange name is invalid; allowed characters are
letters, digits, ".", and "_"
"""
-
+
class UniqueNameField(NameField):
def __init__(self, app, name, cls, fld="name"):
super(UniqueNameField, self).__init__(app, name)
@@ -1058,7 +1058,7 @@
option = self.Option1(app, option1, self.param)
self.add_option(option)
-
+
option = self.Option2(app, option2, self.param)
self.add_option(option)
@@ -1067,10 +1067,10 @@
def render_title_1(self, session):
pass
-
+
def render_title_2(self, session):
pass
-
+
class Option1(RadioFieldOption):
def render_title(self, session):
return self.parent.render_title_1(session)
@@ -1112,7 +1112,7 @@
class TopN(RadioFieldOption):
def __init__(self, app, name, param):
super(MultiplicityField.TopN, self).__init__(app, name, param)
-
+
self.__n_value = IntegerParameter(app, "arg")
self.add_parameter(self.__n_value)
@@ -1121,7 +1121,7 @@
def render_arg_name(self, session):
return self.__n_value.path
-
+
def render_arg_value(self, session):
return 0
@@ -1129,17 +1129,17 @@
return self.__n_value.get(session)
def render_title(self, session):
- return
+ return
class AjaxField(Widget):
""" Update a single span or div after the page loads """
-
+
def render_script(self, session):
script = """
<script type="text/javascript">
- function get_%s() {
+ function get_%s() {
var now = new Date();
- wooly.deferredUpdate('%s'+';ts='+now.getTime(), got_%s, "%s");
+ wooly.deferredUpdate('%s'+';ts='+now.getTime(), got_%s, "%s");
}
addEvent(window, "load", get_%s);
</script>
@@ -1148,18 +1148,18 @@
url = self.get_url(session)
got_fn = self.got_fn(session)
elem_id = self.elem_id(session)
-
+
return url and script % (get_fn, url, got_fn, elem_id, get_fn) or ""
-
+
def get_url(self, session):
pass
def get_fn(self, session):
return self.name
-
+
def got_fn(self, session):
return self.name
-
+
def elem_id(self, session):
return self.name
@@ -1169,22 +1169,22 @@
def render_color(self, session, scheduler):
return "clear"
-
+
def got_fn(self, session):
return "startstop_status"
-
+
def elem_id(self, session):
return self.render_id(session)
-
+
class MoreFieldSet(FieldForm, FormField):
""" Displays a button that opens and closes a set of fields
-
+
Used in a FieldForm as a FormField. Instead of calling
add_field on the FieldForm, call add_field on this.
- For example:
+ For example:
self.more = MoreFieldSet(app, "more")
self.add_field(self.more)
-
+
self.name = NameField(app, "name")
self.more.add_field(self.name)
@@ -1193,7 +1193,7 @@
"""
def __init__(self, app, name):
super(MoreFieldSet, self).__init__(app, name)
-
+
self.input = HiddenInput(app, "open")
self.add_child(self.input)
@@ -1202,7 +1202,7 @@
def render_more_text(self, session, *args):
return "Show Advanced Options..."
-
+
def render_less_text(self, session, *args):
return "Hide Advanced Options..."
@@ -1210,12 +1210,12 @@
return self.input.get(session) \
and self.render_less_text(session, *args) \
or self.render_more_text(session, *args)
-
+
def render_open_state(self, session, *args):
return self.input.do_marshal(self.input.get(session))
-
+
def render_open_path(self, session, *args):
return self.input.render_name(session, *args)
-
+
def render_open_display(self, session, *args):
return self.input.get(session) and "block" or "none"
Modified: mgmt/trunk/cumin/python/cumin/widgets.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/widgets.strings 2009-03-25 17:38:55 UTC (rev 3209)
+++ mgmt/trunk/cumin/python/cumin/widgets.strings 2009-03-25 18:55:22 UTC (rev 3210)
@@ -152,48 +152,48 @@
[CuminStatus.css]
div.CuminStatus {
- float: right;
- margin: 0.5em 0;
- padding: 0.5em 0.75em;
- width: 15em;
+ float: right;
+ margin: 0.5em 0;
+ padding: 0.5em 0.75em;
+ width: 15em;
}
div.CuminStatus h2 {
- font-weight: bold;
+ font-weight: bold;
}
div.CuminStatus div, div.CuminStatus h2 {
- margin: 0 0 0.5em 0;
+ margin: 0 0 0.5em 0;
}
div.CuminStatus.red {
- border: 1px dotted #c99;
- background-color: #fcc;
+ border: 1px dotted #c99;
+ background-color: #fcc;
}
div.CuminStatus.yellow {
- border: 1px dotted #cc9;
- background-color: #ffc;
+ border: 1px dotted #cc9;
+ background-color: #ffc;
}
div.CuminStatus.green {
- border: 1px dotted #9c9;
- background-color: #cfc;
+ border: 1px dotted #9c9;
+ background-color: #cfc;
}
div.CuminStatus.clear {
- border: 1px dotted #9c9;
- background-color: transparent;
+ border: 1px dotted #9c9;
+ background-color: transparent;
}
div.CuminStatus table {
- width: 100%;
- font-size: 0.9em;
+ width: 100%;
+ font-size: 0.9em;
}
div.CuminStatus table th, div.CuminStatus table td {
- font-weight: normal;
- text-align: left;
+ font-weight: normal;
+ text-align: left;
}
[CuminStatus.html]
@@ -203,19 +203,19 @@
[CuminDetails.css]
table.CuminDetails {
- width: 100%;
- border-collapse: collapse;
+ width: 100%;
+ border-collapse: collapse;
}
table.CuminDetails > tbody > tr > td {
- width: 50%;
- padding: 0.5em;
- vertical-align: top;
+ width: 50%;
+ padding: 0.5em;
+ vertical-align: top;
}
table.CuminDetails ul.ActionSet {
- font-size: 0.9em;
- margin: 1em 0.5em;
+ font-size: 0.9em;
+ margin: 1em 0.5em;
}
[CuminDetails.html]
@@ -236,12 +236,12 @@
[CuminHeading.css]
h1.CuminHeading {
- margin: 0 0 1em 0;
+ margin: 0 0 1em 0;
}
h1.CuminHeading img {
- vertical-align: -60%;
- margin: 0 0.25em 0 0;
+ vertical-align: -60%;
+ margin: 0 0.25em 0 0;
}
[CuminHeading.html]
@@ -252,36 +252,36 @@
[CuminSummary.css]
div.CuminSummary {
- width: 36em;
- margin: 0 0 2em 0;
- min-height: 6em;
+ width: 36em;
+ margin: 0 0 2em 0;
+ min-height: 6em;
}
div.CuminSummary h1 {
- font-size: 1.1em;
- margin: 0 0 1em 0;
+ font-size: 1.1em;
+ margin: 0 0 1em 0;
}
div.CuminSummary h1 img {
- vertical-align: -60%;
- margin: 0 0.25em 0 0;
+ vertical-align: -60%;
+ margin: 0 0.25em 0 0;
}
div.CuminSummary hr {
- margin: 0.75em 0;
- border: 0;
- border-top: 1px dotted #ccc;
- padding: 0;
+ margin: 0.75em 0;
+ border: 0;
+ border-top: 1px dotted #ccc;
+ padding: 0;
}
div.CuminSummary div.actions {
- font-size: 0.9em;
- width: 16em;
- float: right;
+ font-size: 0.9em;
+ width: 16em;
+ float: right;
}
div.CuminSummary div.properties {
- font-size: 0.9em;
+ font-size: 0.9em;
}
[CuminSummary.html]
@@ -304,10 +304,10 @@
[SummaryProperties.css]
table.SummaryProperties th {
- color: #444;
- font-weight: normal;
- padding: 0 0.5em 0 0;
- text-align: left;
+ color: #444;
+ font-weight: normal;
+ padding: 0 0.5em 0 0;
+ text-align: left;
}
[SummaryProperties.html]
@@ -328,18 +328,20 @@
[SubmitSwitch.javascript]
function submit_state(id, state) {
- var oHidden = document.forms[0].elements[id];
- if (oHidden) {
- if (oHidden.length) {
- for (var i=0; i<oHidden.length; i++) {
- oHidden[i].value = state;
- }
- } else {
- oHidden.value = state;
- }
- document.forms[0].action += "#phase";
- document.forms[0].submit();
- }
+ var oHidden = document.forms[0].elements[id];
+
+ if (oHidden) {
+ if (oHidden.length) {
+ for (var i=0; i<oHidden.length; i++) {
+ oHidden[i].value = state;
+ }
+ } else {
+ oHidden.value = state;
+ }
+
+ document.forms[0].action += "#phase";
+ document.forms[0].submit();
+ }
}
[SubmitSwitch.html]
@@ -360,7 +362,7 @@
[CuminEditableProperties.property_html]
<tr>
- <th>{title}</th><td>{value}</td><td>{inline_help}</td>
+ <th>{title}</th><td>{value}</td><td>{inline_help}</td>
</tr>
[EditablePropertyRenderer.bool_html]
@@ -393,31 +395,31 @@
[TopTable.css]
table.TopTable {
- width: 100%;
- border-collapse: collapse;
- margin: 0;
+ width: 100%;
+ border-collapse: collapse;
+ margin: 0;
}
table.TopTable tr {
- border-top: 1px dotted #ccc;
- vertical-align: top;
+ border-top: 1px dotted #ccc;
+ vertical-align: top;
}
table.TopTable td {
- padding: 0.35em 0.5em;
+ 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;
+ 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;
+ text-align: right;
}
[TopTable.html]
@@ -473,7 +475,7 @@
[TableHeader.css]
th.selected a {
- color: black;
+ color: black;
}
[TableHeader.html]
@@ -511,101 +513,123 @@
[FormHelp.javascript]
function help_window(href) {
- var left = screen.availWidth / 2;
- var height = screen.availHeight - 40;
- var args = "width="+left+",height="+height+",top=0,left="+left+",scrollbars=1,status=1,toolbar=1";
- hwin = window.open(href, "help", args);
- if (hwin.focus)
- hwin.focus();
- return false;
+ var left = screen.availWidth / 2;
+ var height = screen.availHeight - 40;
+ var args = "width="+left+",height="+height+",top=0,left="+left+",scrollbars=1,status=1,toolbar=1";
+
+ hwin = window.open(href, "help", args);
+
+ if (hwin.focus) {
+ hwin.focus();
+ }
+
+ return false;
}
+
function attachHelp() {
- if (document.getElementById("help_link"))
- document.getElementById("help_link").onclick = function() { return help_window(this.href) }
+ if (document.getElementById("help_link")) {
+ document.getElementById("help_link").onclick = function() { return help_window(this.href) }
+ }
}
+
addEvent(window, "load", attachHelp);
[FormHelp.html]
- <a class="help action" id="help_link" href="{help_href}">Help</a>
+<a class="help action" id="help_link" href="{help_href}">Help</a>
[MoreFieldSet.css]
div.more_inputs {
- margin-left: 0.5em;
- margin-right: 0.5em;
- padding: 0.5em;
- border: 1px dashed #333;
- background-color: #FCFCFC;
+ margin-left: 0.5em;
+ margin-right: 0.5em;
+ padding: 0.5em;
+ border: 1px dashed #333;
+ background-color: #FCFCFC;
}
-
+
div.more_field_set {
- margin-bottom: 1em;
+ margin-bottom: 1em;
}
+
div.more_field_set ul.actions {
- margin-bottom: 0.5em;
+ margin-bottom: 0.5em;
}
[MoreFieldSet.html]
<div class="more_field_set">
- <ul class="actions">
- <li>
- <a class="nav" href="#" onclick="toggle_more_fieldset(); return false;"><span id="button_{id}">{state_text}</span></a>
- </li>
- </ul>{open}
- <div id="{id}" class="more_inputs" style="display:{open_display};">
- {inputs}
- </div>
+ <ul class="actions">
+ <li>
+ <a class="nav" href="#" onclick="toggle_more_fieldset(); return false;"><span id="button_{id}">{state_text}</span></a>
+ </li>
+ </ul>{open}
+ <div id="{id}" class="more_inputs" style="display:{open_display};">
+ {inputs}
+ </div>
</div><!-- end of "more_field_set" -->
<script type="text/javascript">
-function toggle_more_fieldset() {
- var oDiv = document.getElementById("{id}");
- var oButton = document.getElementById("button_{id}");
- var oState = document.forms[0].elements["{open_path}"];
- if (oDiv) {
- if (oDiv.style.display == "none") {
- oDiv.style.display = "block";
- if (oButton)
- oButton.innerHTML = "{less_text}";
- if (oState)
- oState.value = "t";
- } else {
- oDiv.style.display = "none"
- if (oButton)
- oButton.innerHTML = "{more_text}";
- if (oState)
- oState.value = "f";
- }
- document.forms[0].submit();
-
- }
-}
+ function toggle_more_fieldset() {
+ var oDiv = document.getElementById("{id}");
+ var oButton = document.getElementById("button_{id}");
+ var oState = document.forms[0].elements["{open_path}"];
+
+ if (oDiv) {
+ if (oDiv.style.display == "none") {
+ oDiv.style.display = "block";
+
+ if (oButton) {
+ oButton.innerHTML = "{less_text}";
+ }
+
+ if (oState) {
+ oState.value = "t";
+ }
+ } else {
+ oDiv.style.display = "none";
+
+ if (oButton) {
+ oButton.innerHTML = "{more_text}";
+ }
+
+ if (oState) {
+ oState.value = "f";
+ }
+
+ document.forms[0].submit();
+ }
+ }
+ }
</script>
-
+
[StartStopStatus.css]
div.status_time {
- font-size: 0.80em;
- color: #444444;
+ font-size: 0.80em;
+ color: #444444;
}
[StartStopStatus.javascript]
function got_startstop_status(obj, id) {
var elem = document.getElementById(id);
+
if (elem) {
var updateTime = obj.updatetime;
var age = obj.age;
var color = "clear";
var oUpdateTime = document.getElementById("updateTime");
+
if (oUpdateTime) {
oUpdateTime.innerHTML = updateTime;
+
if (age > 150) { /* hasn't changed in 2.5 minutes */
color = "yellow";
} else {
color = "green";
}
+
elem.className = "CuminStatus " + color;
}
- setTimeout("get_status()", 5000);
+
+ setTimeout("get_status()", 5000);
}
}
@@ -616,4 +640,3 @@
Last update was <span id="updateTime"></span>
</div>
</div>{start_stop_script}
-
17 years, 1 month
rhmessaging commits: r3209 - in mgmt/trunk: mint/python/mint and 2 other directories.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2009-03-25 13:38:55 -0400 (Wed, 25 Mar 2009)
New Revision: 3209
Added:
mgmt/trunk/cumin/python/cumin/managementserver.py
mgmt/trunk/cumin/python/cumin/managementserver.strings
Modified:
mgmt/trunk/cumin/python/cumin/binding.py
mgmt/trunk/cumin/python/cumin/broker.py
mgmt/trunk/cumin/python/cumin/broker.strings
mgmt/trunk/cumin/python/cumin/brokergroup.py
mgmt/trunk/cumin/python/cumin/brokerlink.py
mgmt/trunk/cumin/python/cumin/brokerprofile.py
mgmt/trunk/cumin/python/cumin/client.py
mgmt/trunk/cumin/python/cumin/exchange.py
mgmt/trunk/cumin/python/cumin/model.py
mgmt/trunk/cumin/python/cumin/page.py
mgmt/trunk/cumin/python/cumin/page.strings
mgmt/trunk/cumin/python/cumin/parameters.py
mgmt/trunk/cumin/python/cumin/queue.py
mgmt/trunk/cumin/python/cumin/queue.strings
mgmt/trunk/cumin/python/cumin/test.py
mgmt/trunk/cumin/python/cumin/tools.py
mgmt/trunk/cumin/python/cumin/virtualhost.py
mgmt/trunk/cumin/python/cumin/widgets.py
mgmt/trunk/mint/python/mint/__init__.py
mgmt/trunk/mint/sql/schema.sql
mgmt/trunk/wooly/python/wooly/tables.py
Log:
Separates brokers from management servers. These were fused in an
awkward way before, but now they are independent. As a result, the
"broker" frame no longer tries to merge data from broker registrations
and brokers, and the broker list under messaging is a list of brokers,
not registrations.
This change also makes an effort to avoid using *args in widget
process and render methods. That's a failed approach that I'm trying
to move away from incrementally. This change also endeavors to use
parameters by passed-down reference rather than having code search in
parent widgets or frames.
In order to support broker status, introduces heartbeat handling in
mint.
Deletes virtualhost.py, which was unused.
Refactors constraint gathering in SqlItemTable.
Modified: mgmt/trunk/cumin/python/cumin/binding.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/binding.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/binding.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -251,9 +251,13 @@
return self.get(session) == "c"
class ExchangeKeysField(FormField):
- def __init__(self, app, name, title="Initial bindings:"):
+ def __init__(self, app, name, vhost, title="Initial bindings:"):
super(ExchangeKeysField, self).__init__(app, name)
+ assert vhost
+
+ self.vhost = vhost
+
self.dict_param = DictParameter(app, "exchange")
self.add_parameter(self.dict_param)
@@ -280,18 +284,15 @@
self.state = ExchangeState(app, "phase")
self.add_child(self.state)
- def get_args(self, session):
- reg = self.frame.get_ancestor("broker").get_object(session)
- return (reg.getDefaultVhost(),)
-
class Errors(Attribute):
def get_default(self, session):
return dict()
- def render_title(self, session, vhost):
+ def render_title(self, session):
return self.title
- def render_exchanges(self, session, vhost):
+ def render_exchanges(self, session):
+ vhost = self.vhost.get(session)
sortedExchanges = sorted_by(vhost.exchanges)
# render each exchange we support
@@ -324,7 +325,6 @@
return writer.to_string()
def get_binding_errors(self, session, queue_name):
-
form_binding_info = self.process_binding_info(session, queue_name)
binding_info = self.dict_param.get(session)
berrs = self.binding_errors.get(session)
Modified: mgmt/trunk/cumin/python/cumin/broker.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/broker.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/broker.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -5,11 +5,11 @@
from psycopg2 import IntegrityError
from configproperty import *
-from virtualhost import *
from queue import *
from exchange import *
from brokerlink import *
from client import *
+from modelwidgets import *
from widgets import *
from parameters import *
from formats import *
@@ -17,112 +17,75 @@
strings = StringCatalog(__file__)
-class BrokerSet(CuminTable, Form):
+class NewBrokerSet(CuminClassTable):
def __init__(self, app, name):
- super(BrokerSet, self).__init__(app, name)
+ super(NewBrokerSet, self).__init__(app, name, app.model.broker)
- self.ids = CheckboxIdColumn(app, "id")
- self.add_column(self.ids)
+ self.group = BrokerGroupParameter(app, "group")
+ self.add_parameter(self.group)
col = self.NameColumn(app, "name")
self.add_column(col)
self.set_default_column(col)
- col = self.GroupsColumn(app, "groups")
+ col = self.StatusColumn(app, "status")
self.add_column(col)
col = self.ClusterColumn(app, "cluster")
self.add_column(col)
- self.groups = self.BrokerSetGroupInput(app, "groups")
- self.add_child(self.groups)
-
- self.__unregister = self.Unregister(app, "unregister")
- self.add_child(self.__unregister)
-
- self.groupify = self.Groupify(app, "groupify")
- self.add_child(self.groupify)
-
- def render_title(self, session, *args):
- count = BrokerRegistration.select().count()
+ def render_title(self, session):
+ count = self.get_item_count(session)
return "Brokers %s" % fmt_count(count)
- class Unregister(FormButton):
- def render_content(self, session):
- return "Unregister"
+ def render_sql_where(self, session):
+ constraints = self.get_sql_where_constraints(session)
- def render_class(self, session):
- return "unregister"
+ if constraints:
+ return "where %s" % " and ".join(constraints)
- def process_submit(self, session):
- ids = self.parent.ids.get(session)
- self.parent.ids.clear(session)
+ def get_sql_where_constraints(self, session):
+ constraints = list()
+ group = self.group.get(session)
- branch = session.branch()
- frame = self.page.main.brokers_remove.show(branch)
- frame.ids.set(branch, ids)
- frame.origin.set(branch, session.marshal())
- self.page.set_redirect_url(session, branch.marshal())
+ if group:
+ subquery = \
+ "select 1 from broker_group_mapping " + \
+ "where broker_group_id = %(group_id)r " + \
+ "and broker_id = b.id"
- class BrokerSetGroupInput(BrokerGroupInput):
- def render_submit_id(self, session):
- return self.parent.groupify.path
+ constraints.append("exists (%s)" % subquery)
- class Groupify(FormButton):
- def render_content(self, session):
- return "Add"
+ return constraints
- def process_submit(self, session):
- group = self.parent.groups.get(session)
+ def get_sql_values(self, session):
+ group = self.group.get(session)
- if group:
- ids = self.parent.ids.get(session)
- self.parent.ids.clear(session)
+ if group:
+ return {"group_id": group.id}
- for id in ids:
- try:
- broker = BrokerRegistration.get(id)
- broker.addBrokerGroup(group)
- except IntegrityError:
- pass
-
- self.page.set_redirect_url(session, session.marshal())
-
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"]))
+ broker = Identifiable(data["id"])
+ href = self.page.main.broker.get_href(session, broker)
+ return fmt_link(href, fmt_shorten(data["name"], 32, 8))
- class GroupsColumn(SqlTableColumn):
+ class StatusColumn(SqlTableColumn):
def render_title(self, session, data):
- return "Groups"
+ return "Status"
- def get_order_by_sql(self, session):
- return None
-
def render_content(self, session, data):
- broker = BrokerRegistration.get(data["id"])
- count = broker.groups.count()
+ scopeId = data["qmf_scope_id"]
+ dt = self.app.model.data.getLatestHeartbeat(scopeId)
- if count == 0:
- link = fmt_none()
- elif count < 3:
- links = list()
-
- for group in broker.groups[:2]:
- href = self.page.main.broker_group.get_href(session, group)
- links.append(fmt_link(href, group.name))
-
- link = ", ".join(links)
+ if dt is None:
+ return fmt_none()
else:
- link = "%i groups" % count
+ return fmt_datetime(dt)
- return link
-
class ClusterColumn(SqlTableColumn):
def render_title(self, session, data):
return "Cluster"
@@ -151,10 +114,13 @@
def __init__(self, app, name):
super(BrokerFrame, self).__init__(app, name)
- self.object = BrokerRegistrationParameter(app, "id")
+ self.object = BrokerParameter(app, "id")
self.add_parameter(self.object)
- self.view = BrokerView(app, "view")
+ self.vhost = self.VhostAttribute(app, "vhost")
+ self.add_attribute(self.vhost)
+
+ self.view = BrokerView(app, "view", self.vhost)
self.add_mode(self.view)
self.set_view_mode(self.view)
@@ -171,13 +137,13 @@
self.queues_remove = QueueSetRemove(app, "queuesremove")
self.add_mode(self.queues_remove)
- self.queue_add = QueueAdd(app, "queueadd")
+ self.queue_add = QueueAdd(app, "queueadd", self.vhost)
self.add_mode(self.queue_add)
self.exchange = ExchangeFrame(app, "exchange")
self.add_mode(self.exchange)
- self.exchange_add = ExchangeAdd(app, "exchangeadd")
+ self.exchange_add = ExchangeAdd(app, "exchangeadd", self.vhost)
self.add_mode(self.exchange_add)
self.exchanges_remove = ExchangeSetRemove(app, "exchangesremove")
@@ -189,7 +155,7 @@
self.link = PeerFrame(app, "link")
self.add_mode(self.link)
- self.link_add = BrokerLinkAdd(app, "linkadd")
+ self.link_add = BrokerLinkAdd(app, "linkadd", self.vhost)
self.add_mode(self.link_add)
self.links_close = BrokerSetClose(app, "linksclose")
@@ -201,20 +167,29 @@
self.connections_close = ConnectionSetClose(app, "connsclose")
self.add_mode(self.connections_close)
+ class VhostAttribute(Attribute):
+ def get_default(self, session):
+ broker = self.widget.object.get(session)
+
+ for vhost in Vhost.selectBy(broker=broker, name="/"):
+ return vhost
+
class BrokerStatus(CuminStatus):
- def __init__(self, app, name):
+ def __init__(self, app, name, vhost):
super(BrokerStatus, self).__init__(app, name)
+ self.vhost = vhost
+
self.connected = self.ConnectedAttribute(app, "conn")
self.add_attribute(self.connected)
- def render_status(self, session, reg):
+ def render_status(self, session, object):
if self.connected.get(session):
return "Connected"
else:
return "Disconnected"
- def render_color(self, session, reg):
+ def render_color(self, session, object):
if self.connected.get(session):
return "green"
else:
@@ -222,6 +197,9 @@
class ConnectedAttribute(Attribute):
def get_default(self, session):
+ # XXXX this should be done with heartbeats instead?
+ return False
+
reg = self.widget.frame.get_object(session)
connected = False
@@ -235,57 +213,34 @@
return connected
class BrokerView(CuminView):
- """
- Despite the name, this is actually a view of two objects, usually
- coupled: a BrokerRegistration and a Broker.
- """
-
- def __init__(self, app, name):
+ def __init__(self, app, name, vhost):
super(BrokerView, self).__init__(app, name)
- status = BrokerStatus(app, "status")
+ self.vhost = vhost
+
+ status = BrokerStatus(app, "status", vhost)
self.add_child(status)
- self.__body = ModeSet(app, "body")
- self.add_child(self.__body)
+ tabs = TabbedModeSet(app, "tabs")
+ self.add_child(tabs)
- self.__tabs = TabbedModeSet(app, "tabs")
- self.__body.add_mode(self.__tabs)
+ #tabs.add_tab(BrokerStats(app, "stats"))
+ tabs.add_tab(self.BrokerQueueTab(app, "queues", self.vhost))
+ tabs.add_tab(ExchangeSet(app, "exchanges", self.vhost))
+ tabs.add_tab(ConnectionSet(app, "conns", self.vhost))
+ tabs.add_tab(PeerSet(app, "peers", self.vhost))
+ tabs.add_tab(BrokerAccessControl(app, "access", self.vhost))
+ tabs.add_tab(BrokerClustering(app, "cluster", self.vhost))
+ tabs.add_tab(self.BrokerDetailsTab(app, "details", self.vhost))
- #self.__tabs.add_tab(BrokerStats(app, "stats"))
- self.__tabs.add_tab(self.BrokerQueueTab(app, "queues"))
- self.__tabs.add_tab(ExchangeSet(app, "exchanges"))
- self.__tabs.add_tab(ConnectionSet(app, "conns"))
- self.__tabs.add_tab(PeerSet(app, "peers"))
- self.__tabs.add_tab(BrokerAccessControl(app, "access"))
- self.__tabs.add_tab(BrokerClustering(app, "cluster"))
- self.__tabs.add_tab(self.BrokerDetailsTab(app, "details"))
+ def render_script(self, session, object):
+ broker = self.vhost.get(session).broker
+ data = "model.xml?class=broker;id=%i" % broker.id
+ return "wooly.setIntervalUpdate('%s', updateBroker, 3000)" % data
- self.__missing = self.BrokerMissing(app, "missing")
- self.__body.add_mode(self.__missing)
+ def render_group_links(self, session, object):
+ return "XXX"
- self.__vhost = Attribute(app, "vhost")
- self.add_attribute(self.__vhost)
-
- class BrokerMissing(Widget):
- pass
-
- def do_process(self, session, reg):
- reg.sync()
-
- if reg.broker:
- self.__vhost.set(session, reg.getDefaultVhost())
- else:
- self.__body.show_mode(session, self.__missing)
-
- super(BrokerView, self).do_process(session, reg)
-
- def render_script(self, session, reg):
- if reg.broker:
- data = "model.xml?class=broker;id=%i" % reg.broker.id
- return "wooly.setIntervalUpdate('%s', updateBroker, 3000)" % data
-
- def render_group_links(self, session, reg):
links = list()
for group in reg.groups:
@@ -296,36 +251,33 @@
return ", ".join(links)
+ # XXX see if we can't get rid of this
class BrokerQueueTab(Widget):
- def __init__(self, app, name):
+ def __init__(self, app, name, vhost):
super(BrokerView.BrokerQueueTab, self).__init__(app, name)
- self.__queues = QueueSet(app, "items")
+ self.__queues = QueueSet(app, "items", vhost)
self.add_child(self.__queues)
- def get_args(self, session):
- return self.frame.get_args(session)
-
- def render_title(self, session, reg):
- vhost = reg.getDefaultVhost()
+ def render_title(self, session):
+ vhost = self.frame.vhost.get(session)
return "Queues %s" % fmt_count(vhost.queues.count())
- def render_add_queue_href(self, session, reg):
+ def render_add_queue_href(self, session):
branch = session.branch()
self.frame.queue.add.show(branch, None)
return branch.marshal()
class BrokerLogTab(Widget):
- def get_args(self, session):
- return self.frame.get_args(session)
-
- def render_title(self, session, reg):
+ def render_title(self, session):
return "Log Messages"
class BrokerDetailsTab(Widget):
- def __init__(self, app, name):
+ def __init__(self, app, name, vhost):
super(BrokerView.BrokerDetailsTab, self).__init__(app, name)
+ self.vhost = vhost
+
props = self.Properties(app, "properties")
self.add_child(props)
@@ -336,30 +288,26 @@
return "Details"
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(session, reg))
+ def do_get_items(self, session, object):
+ broker = self.parent.vhost.get(session).broker
+
+ cls = self.app.model.get_class_by_object(broker)
+ props = [(x.get_title(session),
+ x.value(session, broker))
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(session, reg.broker))
- for x in cls.properties])
-
return props
class Actions(CuminActions):
- def do_get_items(self, session, reg):
- cls = self.app.model.get_class_by_object(reg)
- acts = [(x.get_href(session, reg), x.get_title(session), x.get_enabled(session, reg))
- for x in cls.actions if x.navigable]
+ def do_get_items(self, session, object):
+ broker = self.parent.vhost.get(session).broker
- if reg.broker:
- cls = self.app.model.get_class_by_object(reg.broker)
- acts.extend([(x.get_href(session, reg.broker),
- x.get_title(session), x.get_enabled(session, reg.broker))
- for x in cls.actions if x.navigable])
+ cls = self.app.model.get_class_by_object(broker)
+ acts = [(x.get_href(session, broker),
+ x.get_title(session),
+ x.get_enabled(session, broker))
+ for x in cls.actions
+ if x.navigable and not x.aggregate]
return acts
@@ -368,83 +316,90 @@
return "This module is not enabled"
class BrokerAccessControl(ModeSet):
- def __init__(self, app, name):
+ def __init__(self, app, name, vhost):
super(BrokerAccessControl, self).__init__(app, name)
+ self.vhost = vhost
+
+ self.acl = self.AclModuleAttribute(self, "acl")
+ self.add_attribute(self.acl)
+
mode = ModuleNotEnabled(app, "notenabled")
self.add_mode(mode)
- self.__view = BrokerAccessControlView(app, "view")
+ self.__view = BrokerAccessControlView(app, "view", self.acl)
self.add_mode(self.__view)
- def get_args(self, session):
- broker = self.frame.get_object(session).broker
- acl = None
+ class AclModuleAttribute(Attribute):
+ def get_default(self, session):
+ broker = self.widget.vhost.get(session).broker
- try:
- acl = Acl.selectBy(broker=broker)[0]
- except IndexError:
- pass
+ for acl in Acl.selectBy(broker=broker):
+ return acl
- return (acl,)
-
- def do_process(self, session, acl):
- if acl:
+ def do_process(self, session):
+ if self.acl.get(session):
self.show_mode(session, self.__view)
- def render_title(self, session, acl):
+ def render_title(self, session):
return "Access Control"
class BrokerAccessControlView(Widget):
- def __init__(self, app, name):
+ def __init__(self, app, name, acl):
super(BrokerAccessControlView, self).__init__(app, name)
+ self.acl = acl
+
props = self.Properties(app, "props")
self.add_child(props)
stats = self.Stats(app, "stats", "general")
self.add_child(stats)
+ # XXX don't do this this way
class Properties(CuminProperties):
def get_args(self, session):
- return self.parent.parent.get_args(session)
+ return (self.parent.acl.get(session),)
class Stats(StatSet):
def get_args(self, session):
- return self.parent.parent.get_args(session)
+ return (self.parent.acl.get(session),)
class BrokerClustering(ModeSet):
- def __init__(self, app, name):
+ def __init__(self, app, name, vhost):
super(BrokerClustering, self).__init__(app, name)
+ self.vhost = vhost
+
+ self.cluster = self.ClusteringModuleAttribute(self, "cluster")
+ self.add_attribute(self.cluster)
+
mode = ModuleNotEnabled(app, "notenabled")
self.add_mode(mode)
- self.__view = BrokerClusteringView(app, "view")
+ self.__view = BrokerClusteringView(app, "view", self.cluster)
self.add_mode(self.__view)
- def get_args(self, session):
- broker = self.frame.get_object(session).broker
- cluster = None
+ class ClusteringModuleAttribute(Attribute):
+ def get_default(self, session):
+ broker = self.widget.vhost.get(session).broker
- try:
- cluster = Cluster.selectBy(broker=broker)[0]
- except IndexError:
- pass
+ for cluster in Cluster.selectBy(broker=broker):
+ return cluster
- return (cluster,)
-
- def do_process(self, session, cluster):
- if cluster:
+ def do_process(self, session):
+ if self.cluster.get(session):
self.show_mode(session, self.__view)
- def render_title(self, session, cluster):
+ def render_title(self, session):
return "Clustering"
class BrokerClusteringView(Widget):
- def __init__(self, app, name):
+ def __init__(self, app, name, cluster):
super(BrokerClusteringView, self).__init__(app, name)
+ self.cluster = cluster
+
props = self.Properties(app, "props")
self.add_child(props)
@@ -453,20 +408,17 @@
class Properties(CuminProperties):
def get_args(self, session):
- return self.parent.parent.get_args(session)
+ return (self.parent.cluster.get(session),)
class Stats(StatSet):
def get_args(self, session):
- return self.parent.parent.get_args(session)
+ return (self.parent.cluster.get(session),)
class BrokerStats(Widget):
def __init__(self, app, name):
super(BrokerStats, self).__init__(app, name)
- def get_args(self, session):
- return self.frame.get_args(session)
-
- def render_title(self, session, reg):
+ def render_title(self, session):
return "Statistics"
class BrokerBrowser(Widget):
@@ -477,49 +429,15 @@
self.profile_tmpl = Template(self, "profile_html")
self.cluster_tmpl = Template(self, "cluster_html")
- self.group = BrokerGroupParameter(app, "group")
- self.add_parameter(self.group)
-
- self.profile = BrokerProfileParameter(app, "profile")
- self.add_parameter(self.profile)
-
- self.cluster = BrokerClusterParameter(app, "cluster")
- self.add_parameter(self.cluster)
-
- self.brokers = self.BrowserBrokers(app, "brokers")
+ self.brokers = NewBrokerSet(app, "brokers")
self.add_child(self.brokers)
def render_title(self, session, *args):
- return "Brokers %s" % fmt_count(BrokerRegistration.select().count())
+ return "Brokers %s" % fmt_count(Broker.select().count())
- class BrowserBrokers(BrokerSet):
- def render_sql_where(self, session):
- elems = list()
- group = self.parent.group.get(session)
- #profile = self.parent.profile.get(session)
- #cluster = self.parent.cluster.get(session)
-
- if group:
- subquery = \
- "select 1 from broker_group_mapping " + \
- "where broker_group_id = %i " % group.id + \
- "and broker_registration_id = br.id"
-
- elems.append("exists (%s)" % subquery)
-
- if elems:
- return "where %s" % " and ".join(elems)
-
- def render_add_broker_href(self, session):
- branch = session.branch()
- self.frame.brokers_add.show(branch)
- return branch.marshal()
-
def render_clear_filters_href(self, session):
branch = session.branch()
- self.group.set(branch, None)
- self.profile.set(branch, None)
- self.cluster.set(branch, None)
+ self.brokers.group.set(branch, None)
return branch.marshal()
def render_group_filters(self, session):
@@ -527,7 +445,7 @@
return self._render_filters(session, groups, self.group_tmpl)
def render_group_link(self, session, group):
- return self._render_filter_link(session, group, self.group)
+ return self._render_filter_link(session, group, self.brokers.group)
def render_profile_filters(self, session):
profiles = BrokerProfile.select()
@@ -783,7 +701,7 @@
if errors:
pass
else:
- action = self.app.model.broker_registration.edit
+ action = self.app.model.management_server.edit
args = {"name": self.broker_name.get(session)}
action.invoke(reg, args)
@@ -805,16 +723,11 @@
for group in reg.groups:
self.groups.get(session).append(group)
-class BrokerSetRemove(CuminBulkActionForm, Frame):
- def process_item(self, session, id):
- action = self.app.model.broker_registration.remove
- # XXX need to handle object not found case
- action.invoke(BrokerRegistration.get(id))
+class BrokerSetEngroup(CuminSetActionForm):
+ def __init__(self, app, name):
+ param = BrokerParameter(app, "item")
- def render_title(self, session):
- return "Unregister Brokers"
+ super(BrokerSetEngroup, self).__init__ \
+ (app, name, app.model.broker.engroup_set, param)
- def render_item_content(self, session, id):
- return "Unregister Broker '%s'" % BrokerRegistration.get(id).name
-
from brokergroup import BrokerGroupCheckboxField
Modified: mgmt/trunk/cumin/python/cumin/broker.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/broker.strings 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/broker.strings 2009-03-25 17:38:55 UTC (rev 3209)
@@ -44,6 +44,24 @@
<div>{hidden_inputs}</div>
</form>
+[NewBrokerSet.sql]
+select
+ b.id,
+ b.qmf_scope_id,
+ s.node_name || ':' || b.port as name,
+ c.cluster_name as cluster
+from broker as b
+left outer join system as s on b.system_id = s.id
+left outer join cluster as c on c.broker_id = b.id
+{sql_where}
+{sql_orderby}
+{sql_limit}
+
+[NewBrokerSet.count_sql]
+select count(*)
+from broker as b
+{sql_where}
+
[BrokerView.javascript]
function updateBroker(data) {
var model = data.objectify();
@@ -62,19 +80,6 @@
}
-[BrokerView.html]
-<script type="text/javascript">
-//<![CDATA[
-{script}
-//]]>
-</script>
-
-{status}
-
-{summary}
-
-{body}
-
[BrokerMissing.html]
<div class="notice">
The broker at this address is currently unavailable. This page will
@@ -191,13 +196,7 @@
<h2>Filter by Group</h2>
<ul class="slist">{group_filters}</ul>
</td>
- <td class="view">
- <ul class="actions">
- <li><a class="nav" href="{add_broker_href}">Register New Brokers</a></li>
- </ul>
-
- {brokers}
- </td>
+ <td class="view">{brokers}</td>
</tr>
</table>
@@ -221,76 +220,6 @@
font-style: italic;
}
-[BrokerSetForm.html]
-<form id="{id}" class="mform" method="post" action="?">
- <div class="head">
- <h1>{title}</h1>
- </div>
- <div class="body">
- <fieldset>
- <table class="BrokerSetForm">
- <tr>
- <th>Name</th>
- <th>
- Address
- <br/>
- <span class="example">Examples: example.net, example.net:5672, 172.16.82.10</span>
- </th>
- <th>Initial Group</th>
- </tr>
-
- {fields}
- </table>
-
- {more}
- </fieldset>
-
- {hidden_inputs}
- </div>
- <div class="foot">
- {help}
- {submit}
- {cancel}
- </div>
-</form>
-<script type="text/javascript" defer="defer">
-function click_more(id, value) {
- click_button(id, value);
- document.forms[0].submit();
- return true;
-}
-(function() {
- var elem = wooly.doc().elembyid("{id}").node.elements[1];
- elem.focus();
- elem.select();
-}())
-</script>
-
-[MoreEntries.html]
-<input type="hidden" name="{name}" value="" />
-<button class="more" type="button" tabindex="{tab_index}" {disabled_attr} onclick="return click_more('{name}', '{value}')">{content}</button>
-
-[BrokerSetForm.field_html]
-<tr>
- <td>
- <input type="text" name="{field_name_name}" value="{field_name_value}" size="15" tabindex="100"/>
- {field_name_errors}
- </td>
- <td>
- <input type="text" name="{field_address_name}" value="{field_address_value}" size="35" tabindex="100"/>
- {field_address_errors}
- </td>
- <td>
- <select name="{field_group_name}" tabindex="100">
- <option value="__none__">None</option>
- {groups}
- </select>
- </td>
-</tr>
-
-[BrokerSetForm.group_html]
-<option value="{group_value}" {group_selected_attr}>{group_name}</option>
-
[BrokerGroupInputSet.item_html]
<div class="field">
<input type="checkbox" id="{id}" name="{name}" value="{item_value}" tabindex="{tab_index}" {item_checked_attr}/>
Modified: mgmt/trunk/cumin/python/cumin/brokergroup.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/brokergroup.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/brokergroup.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -3,7 +3,7 @@
from wooly.widgets import *
from wooly.forms import *
-from broker import BrokerSet
+from broker import NewBrokerSet
from model import *
from widgets import *
from modelwidgets import *
@@ -63,7 +63,7 @@
self.object = BrokerGroupParameter(app, "id")
self.add_parameter(self.object)
- self.view = BrokerGroupView(app, "view")
+ self.view = BrokerGroupView(app, "view", self.object)
self.add_child(self.view)
self.set_view_mode(self.view)
@@ -93,34 +93,23 @@
pass
class BrokerGroupView(CuminView):
- def __init__(self, app, name):
+ def __init__(self, app, name, group):
super(BrokerGroupView, self).__init__(app, name)
+ self.group = group
+
status = BrokerGroupStatus(app, "status")
self.add_child(status)
self.__tabs = TabbedModeSet(app, "tabs")
self.add_child(self.__tabs)
- self.__tabs.add_tab(self.GroupBrokerTab(app, "brokers"))
+ brokers = NewBrokerSet(app, "brokers")
+ brokers.group = self.group
+ self.__tabs.add_tab(brokers)
+
self.__tabs.add_tab(CuminDetails(app, "details"))
- class GroupBrokerTab(BrokerSet):
- def get_args(self, session):
- return self.frame.get_args(session)
-
- def render_title(self, session, group):
- return "Brokers %s" % \
- fmt_count(self.get_item_count(session, group))
-
- def render_sql_where(self, session, group):
- subquery = \
- "select 1 from broker_group_mapping " + \
- "where broker_group_id = %i " % group.id + \
- "and broker_registration_id = br.id"
-
- return "where exists (%s)" % subquery
-
class BrokerGroupForm(CuminFieldForm):
def __init__(self, app, name):
super(BrokerGroupForm, self).__init__(app, name)
Modified: mgmt/trunk/cumin/python/cumin/brokerlink.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/brokerlink.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/brokerlink.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -12,9 +12,11 @@
strings = StringCatalog(__file__)
class PeerSet(CuminTable, Form):
- def __init__(self, app, name):
+ def __init__(self, app, name, vhost):
super(PeerSet, self).__init__(app, name)
+ self.vhost = vhost
+
self.ids = FilteredCheckboxIdColumn(app, "id", self, callback=self.disable_closed)
self.add_column(self.ids)
@@ -43,23 +45,22 @@
self.__close = self.Close(app, "close")
self.add_child(self.__close)
- def render_add_broker_link_url(self, session, vhost):
+ def render_add_broker_link_url(self, session):
branch = session.branch()
self.frame.link_add.show(branch)
return branch.marshal()
- def get_args(self, session):
- reg = self.frame.get_object(session)
- return (reg.getDefaultVhost(),)
-
- def render_title(self, session, vhost):
- count = self.get_item_count(session, vhost)
+ def render_title(self, session):
+ count = self.get_item_count(session)
return "Broker Links %s" % fmt_count(count)
- def render_sql_where(self, session, vhost):
- return "where v.id = %(vhost_id)r"
+ def get_sql_where_constraints(self, session):
+ constraints = super(PeerSet, self).get_sql_where_constraints(session)
+ constraints.append("v.id = %(vhost_id)r")
+ return constraints
- def get_sql_values(self, session, vhost):
+ def get_sql_values(self, session):
+ vhost = self.vhost.get(session)
return {"vhost_id": vhost.id}
def disable_closed(self, session, data):
@@ -501,10 +502,12 @@
self.process_cancel(session, link)
-class BrokerLinkAddForm(CuminFieldForm):
- def __init__(self, app, name):
- super(BrokerLinkAddForm, self).__init__(app, name)
+class BrokerLinkAdd(CuminFieldForm):
+ def __init__(self, app, name, vhost):
+ super(BrokerLinkAdd, self).__init__(app, name)
+ self.vhost = vhost
+
self.host = self.Host(app, "host")
self.add_field(self.host)
@@ -526,15 +529,16 @@
self.transport = self.TransportField(app, "transport")
self.more.add_field(self.transport)
- def render_title(self, session, *args):
- reg = self.frame.get_object(session)
- return "Add Broker Link to '%s'" % reg.name
+ def render_title(self, session):
+ vhost = self.vhost.get(session)
+ name = self.app.model.broker.get_object_name(vhost.broker)
+ return "Add Broker Link to '%s'" % name
class ShowButton(MoreFieldSet):
- def render_more_text(self, session, *args):
+ def render_more_text(self, session):
return "Show Optional Inputs..."
- def render_less_text(self, session, *args):
+ def render_less_text(self, session):
return "Hide Optional Inputs..."
class Host(NameField):
@@ -543,7 +547,7 @@
class PortField(StringField):
def __init__(self, app, name):
- super(BrokerLinkAddForm.PortField, self).__init__(app, name)
+ super(BrokerLinkAdd.PortField, self).__init__(app, name)
self.input.size = 5
self.css_class = "compact first"
@@ -575,7 +579,7 @@
class TransportField(RadioField):
def __init__(self, app, name):
- super(BrokerLinkAddForm.TransportField, self).__init__(app, name, None)
+ super(BrokerLinkAdd.TransportField, self).__init__(app, name, None)
self.param = Parameter(app, "param")
self.param.default = "tcp"
@@ -621,16 +625,12 @@
def render_title_2(self, session):
return "No, do not restore if broker restarts"
-class BrokerLinkAdd(BrokerLinkAddForm):
- def get_args(self, session):
- return (self.frame.get_object(session), )
-
- def process_cancel(self, session, *args):
+ def process_cancel(self, session):
branch = session.branch()
self.frame.show_view(branch)
self.page.set_redirect_url(session, branch.marshal())
- def process_submit(self, session, reg):
+ def process_submit(self, session):
if self.validate(session):
pass
else:
@@ -642,22 +642,21 @@
password = self.password.get(session)
durable = self.durable.get(session)
transport = self.transport.get(session)
-
- link = Link()
- link.host = host
- link.port = port
- link.durable = (durable == "yes")
- args = {"reg": reg,
- "username": username,
- "password": password,
- "transport": transport}
-
+ args = {
+ "host": host,
+ "port": port,
+ "durable": durable == "yes",
+ "username": username,
+ "password": password,
+ "transport": transport
+ }
+
action = self.app.model.broker.add_link
- action.invoke(link, args)
-
+ action.invoke(self.vhost.get(session).broker, args)
+
# navigate back to main queue frame
- self.process_cancel(session, (reg,))
+ self.process_cancel(session)
class BrokerSetClose(CuminBulkActionForm):
def process_return(self, session):
Modified: mgmt/trunk/cumin/python/cumin/brokerprofile.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/brokerprofile.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/brokerprofile.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -1,171 +0,0 @@
-from mint import *
-from wooly import *
-from wooly.widgets import *
-
-from configproperty import *
-from broker import *
-from widgets import *
-from parameters import *
-from formats import *
-from util import *
-
-strings = StringCatalog(__file__)
-
-class BrokerProfileSet(object):
- def render_profile_add_href(self, session, *args):
- branch = session.branch()
- self.page.show_broker_profile_add(branch)
- return branch.marshal()
-
- def render_title(self, session, *args):
- return "Broker Profiles %s" % fmt_count(BrokerProfile.select().count())
-
- def do_get_items(self, session, *args):
- return BrokerProfile.select()
-
- def render_item_link(self, session, profile):
- branch = session.branch()
- self.page.show_broker_profile(branch, profile).show_view(branch)
- return fmt_olink(branch, profile)
-
-class BrokerProfileFrame(CuminFrame):
- def __init__(self, app, name):
- super(BrokerProfileFrame, self).__init__(app, name)
-
- self.object = BrokerProfileParameter(app, "id")
- self.add_parameter(self.object)
-
- view = BrokerProfileView(app, "view")
- self.add_mode(view)
- self.set_view_mode(view)
-
- edit = BrokerProfileEdit(app, "edit")
- self.add_mode(edit)
- self.set_edit_mode(edit)
-
- remove = BrokerProfileRemove(app, "remove")
- self.add_mode(remove)
- self.set_remove_mode(remove)
-
-class BrokerProfileView(CuminView):
- def __init__(self, app, name):
- super(BrokerProfileView, self).__init__(app, name)
-
- self.tabs = TabbedModeSet(app, "tabs")
- self.add_child(self.tabs)
-
- self.tabs.add_tab(self.ProfileConfigTab(app, "config"))
- self.tabs.add_tab(self.ProfileBrokerTab(app, "brokers"))
-
- class ProfileConfigTab(ConfigPropertySet):
- def get_args(self, session):
- return self.frame.get_args(session)
-
- def do_get_items(self, session, profile):
- return sorted_by(profile.properties)
-
- def render_title(self, session, profile):
- return "Configuration"
-
- class ProfileBrokerTab(BrokerSet):
- def __init__(self, app, name):
- super(BrokerProfileView.ProfileBrokerTab, self).__init__(app, name)
-
- def get_args(self, session):
- return self.frame.get_args(session)
-
- def render_title(self, session, profile):
- return "Brokers %s" % fmt_count(len(profile.brokers))
-
- def do_get_items(self, session, profile):
- return profile.brokers
-
- def render_item_config_href(self, session, broker):
- branch = session.branch()
- frame = self.page.show_broker(branch, broker)
- frame.show_view(branch).show_config(branch)
- return branch.marshal()
-
- def render_item_config_status(self, session, broker):
- return "0 differences" #XXX
-
- diffs = 0
-
- for prop in broker.profile.properties:
- # XXX need to add assoc for this
- for iprop in broker.config_property_items():
- if iprop.name == prop.name:
- if iprop.value != prop.value:
- diffs += 1
-
- return "%i difference(s)" % diffs
-
-class BrokerProfileForm(CuminForm):
- def __init__(self, app, name):
- super(BrokerProfileForm, self).__init__(app, name)
-
- self.profile_name = StringInput(app, "name")
- self.add_child(self.profile_name)
-
- def process_profile(self, session, profile):
- profile.name = self.profile_name.get(session)
-
- branch = session.branch()
- self.page.show_broker_profile(branch, profile).show_view(branch)
- self.page.set_redirect_url(session, branch.marshal())
-
-class BrokerProfileAdd(BrokerProfileForm, Frame):
- def render_title(self, session):
- return "Add Profile"
-
- def process_cancel(self, session):
- branch = session.branch()
- self.page.main.show(branch)
- self.page.set_redirect_url(session, branch.marshal())
-
- def process_submit(self, session):
- profile = BrokerProfile()
- self.process_profile(session, profile)
-
-class BrokerProfileEdit(BrokerProfileForm, Frame):
- def get_args(self, session):
- return self.frame.get_args(session)
-
- def process_cancel(self, session, profile):
- branch = session.branch()
- self.parent.show_view(branch)
- self.page.set_redirect_url(session, branch.marshal())
-
- def process_submit(self, session, profile):
- self.process_profile(session, profile)
-
- def process_display(self, session, profile):
- self.profile_name.set(session, profile.name)
-
- def render_title(self, session, profile):
- return "Edit Profile '%s'" % profile.name
-
-class BrokerProfileRemove(CuminConfirmForm):
- def get_args(self, session):
- return self.frame.get_args(session)
-
- def process_cancel(self, session, profile):
- branch = session.branch()
- self.page.show_broker_profile(branch, profile).show_view(branch)
- self.page.set_redirect_url(session, branch.marshal())
-
- def process_submit(self, session, profile):
- profile.destroySelf()
-
- branch = session.branch()
- self.page.main.show(branch)
- self.page.set_redirect_url(session, branch.marshal())
-
- def render_title(self, session, profile):
- return "Remove Broker Profile '%s'" % profile.name
-
- def render_submit_content(self, session, profile):
- return "Yes, Remove Broker Profile '%s'" % profile.name
-
- def render_cancel_content(self, session, profile):
- return "No, Cancel"
Modified: mgmt/trunk/cumin/python/cumin/client.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/client.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/client.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -12,9 +12,11 @@
strings = StringCatalog(__file__)
class ConnectionSet(CuminTable, Form):
- def __init__(self, app, name):
+ def __init__(self, app, name, vhost):
super(ConnectionSet, self).__init__(app, name)
+ self.vhost = vhost
+
self.ids = CheckboxIdColumn(app, "id")
self.add_column(self.ids)
@@ -51,23 +53,24 @@
self.__close = self.Close(app, "close")
self.add_child(self.__close)
- def get_args(self, session):
- reg = self.frame.get_object(session)
- return (reg.getDefaultVhost(),)
-
def get_unit_plural(self, session):
return self.unit.get(session) == "b" and "Bytes" or "Frames"
- def render_title(self, session, vhost):
+ def render_title(self, session):
+ vhost = self.vhost.get(session)
return "Connections %s" % fmt_count(vhost.clientConnections.count())
- def render_sql_where(self, session, vhost):
- elems = list()
- elems.append("l.vhost_id = %(id)r")
- elems.append(self.__phase.get_sql_constraint(session, vhost))
- return "where %s" % " and ".join(elems)
+ def render_sql_where(self, session):
+ vhost = self.vhost.get(session)
- def get_sql_values(self, session, vhost):
+ constraints = list()
+ constraints.append("l.vhost_id = %(id)r")
+ constraints.append(self.__phase.get_sql_constraint(session, vhost))
+
+ return "where %s" % " and ".join(constraints)
+
+ def get_sql_values(self, session):
+ vhost = self.vhost.get(session)
return {"id": vhost.id}
class Close(FormButton):
@@ -147,7 +150,7 @@
self.add_mode(view)
self.set_view_mode(view)
- self.__close = ConnectionClose(app, "close")
+ self.__close = ConnectionClose(app, "close", self.object)
self.add_mode(self.__close)
self.__sessions_detach = SessionSetDetach(app, "sessionsdetach")
@@ -178,27 +181,31 @@
#print "did it!"
class ConnectionClose(CuminConfirmForm):
- def get_args(self, session):
- return self.frame.get_args(session)
+ def __init__(self, app, name, conn):
+ super(ConnectionClose, self).__init__(app, name)
- def process_cancel(self, session, conn):
+ self.conn = conn
+
+ def process_cancel(self, session):
branch = session.branch()
self.frame.show_view(branch)
self.page.set_redirect_url(session, branch.marshal())
- def process_submit(self, session, conn):
+ def process_submit(self, session):
+ conn = self.conn.get(session)
+
action = self.app.model.connection.close
action.invoke(conn)
self.process_cancel(session, conn)
- def render_title(self, session, conn):
- return "Close Connection '%s'" % conn.address
+ def render_title(self, session):
+ return "Close Connection '%s'" % self.conn.get(session).address
- def render_submit_content(self, session, conn):
- return "Yes, Close Connection '%s'" % conn.address
+ def render_submit_content(self, session):
+ return "Yes, Close Connection '%s'" % self.conn.get(session).address
- def render_cancel_content(self, session, conn):
+ def render_cancel_content(self, session):
return "No, Cancel"
class ConnectionSetClose(CuminBulkActionForm):
Modified: mgmt/trunk/cumin/python/cumin/exchange.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/exchange.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/exchange.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -33,9 +33,11 @@
return exchange is self.param.get(session) and "checked=\"checked\""
class ExchangeSet(CuminTable, Form):
- def __init__(self, app, name):
+ def __init__(self, app, name, vhost):
super(ExchangeSet, self).__init__(app, name)
+ self.vhost = vhost
+
self.ids = FilteredCheckboxIdColumn(app, "id", self, callback=self.disable_exchange)
self.add_column(self.ids)
@@ -72,28 +74,29 @@
self.__remove = self.Remove(app, "remove")
self.add_child(self.__remove)
- def get_args(self, session):
- reg = self.frame.get_object(session)
- return (reg.getDefaultVhost(),)
-
def disable_exchange(self, session, data):
return data["name"] in ExchangeInfo.get_builtins()
- def render_add_exchange_url(self, session, vhost):
+ def render_add_exchange_url(self, session):
branch = session.branch()
self.frame.exchange_add.show(branch)
return branch.marshal()
- def render_title(self, session, vhost):
+ def render_title(self, session):
+ vhost = self.vhost.get(session)
return "Exchanges %s" % fmt_count(vhost.exchanges.count())
- def render_sql_where(self, session, vhost):
+ def render_sql_where(self, session):
+ vhost = self.vhost.get(session)
+
elems = list()
elems.append("e.vhost_id = %(id)r")
elems.append(self.phase.get_sql_constraint(session, vhost))
+
return "where %s" % " and ".join(elems)
- def get_sql_values(self, session, vhost):
+ def get_sql_values(self, session):
+ vhost = self.vhost.get(session)
return {"id": vhost.id}
class Remove(FormButton):
@@ -175,7 +178,7 @@
exchange = Exchange.get(id)
reg = self.frame.get_object(session)
action = self.app.model.exchange.remove
- action.invoke(exchange, reg)
+ action.invoke(exchange)
def render_title(self, session):
return "Remove Exchanges"
@@ -227,7 +230,7 @@
def process_submit(self, session, exchange):
reg = self.frame.frame.get_object(session)
action = self.app.model.exchange.remove
- action.invoke(exchange, reg)
+ action.invoke(exchange)
branch = session.branch()
self.frame.frame.show_view(branch)
@@ -337,9 +340,13 @@
return "Exchange: %s <i>and</i> Queue: %s" % (ename, qname)
class ExchangeForm(CuminFieldForm):
- def __init__(self, app, name):
+ def __init__(self, app, name, vhost):
super(ExchangeForm, self).__init__(app, name)
+ assert vhost
+
+ self.vhost = vhost
+
self.exchange_name = ExchangeNameField(app, "exchange_name")
self.add_field(self.exchange_name)
@@ -462,38 +469,39 @@
return "<em>XML:</em> Route message to queues based on XML content of the message"
class ExchangeAdd(ExchangeForm):
- def get_args(self, session):
- return (self.frame.get_object(session), )
-
- def process_cancel(self, session, *args):
+ def process_cancel(self, session):
branch = session.branch()
self.frame.show_view(branch)
self.page.set_redirect_url(session, branch.marshal())
- def process_submit(self, session, *args):
+ def process_submit(self, session):
errors = self.validate(session)
if errors:
pass
else:
- reg = self.frame.get_object(session)
+ reg = self.vhost.get(session).broker.registration
+
exchange = Exchange()
exchange.name = self.exchange_name.get(session)
exchange.type = self.exchange_type.get(session)
- exchange.durable = self.durable.get(session) == "yes"
+ exchange.durable = self.durable.get(session) == "yes"
+
args = {}
args["reg"] = reg
args["sequence"] = self.sequence.get(session) == "yes"
args["ive"] = self.ive.get(session) == "yes"
-
+
action = self.app.model.broker.add_exchange
action.invoke(exchange, args)
self.process_cancel(session)
-
- def render_title(self, session, reg):
- return "Add Exchange to the Broker '%s'" % reg.name
-
+
+ def render_title(self, session):
+ broker = self.vhost.get(session).broker
+ title = self.app.model.broker.get_object_title(session, broker)
+ return "Add Exchange to %s" % title
+
class ExchangeStats(TabbedModeSet):
def __init__(self, app, name):
super(ExchangeStats, self).__init__(app, name)
Added: mgmt/trunk/cumin/python/cumin/managementserver.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/managementserver.py (rev 0)
+++ mgmt/trunk/cumin/python/cumin/managementserver.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -0,0 +1,466 @@
+from mint import *
+from wooly import *
+from wooly.widgets import *
+
+from widgets import *
+from modelwidgets import *
+from parameters import *
+from formats import *
+from util import *
+
+strings = StringCatalog(__file__)
+
+class ManagementServerSet(CuminClassTable):
+ def __init__(self, app, name):
+ cls = app.model.management_server
+
+ super(ManagementServerSet, self).__init__(app, name, cls)
+
+ col = self.NameColumn(app, "name")
+ self.add_column(col)
+
+ col = self.UrlColumn(app, "url")
+ self.add_column(col)
+
+ col = self.StatusColumn(app, "status")
+ self.add_column(col)
+
+ class NameColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Name"
+
+ class UrlColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "URL"
+
+ class StatusColumn(ItemTableColumn):
+ def render_title(self, session, data):
+ return "Status"
+
+ def render_content(self, session, data):
+ url = data["url"]
+
+ try:
+ server = self.app.model.data.mintBrokersByUrl[url]
+
+ if server.connected:
+ html = "Connected"
+ else:
+ html = "Disconnected"
+ except KeyError:
+ html = "Unreachable"
+
+ return html
+
+class ManagementServerSetAdd(CuminForm, Frame):
+ def __init__(self, app, name):
+ super(ManagementServerSetAdd, self).__init__(app, name)
+
+ self.name_param = Parameter(app, "name_param");
+ self.add_parameter(self.name_param)
+
+ self.names = ListParameter(app, "name", self.name_param)
+ self.add_parameter(self.names)
+
+ self.name_errors = self.Errors(self, "name_errors")
+ self.add_attribute(self.name_errors)
+
+ self.addr_param = Parameter(app, "addr_param")
+ self.add_parameter(self.addr_param)
+
+ self.addrs = ListParameter(app, "address", self.addr_param)
+ self.add_parameter(self.addrs)
+
+ self.addr_errors = self.Errors(self, "addr_errors")
+ self.add_attribute(self.addr_errors)
+
+ self.fields = IntegerParameter(app, "fields")
+ self.fields.default = 3
+ self.add_parameter(self.fields)
+
+ self.field_tmpl = Template(self, "field_html")
+
+ self.more_button = self.MoreEntries(app, "more_button")
+ self.add_child(self.more_button)
+
+ self.more = self.More(app, "more")
+ self.add_parameter(self.more)
+
+ def process_cancel(self, session):
+ branch = session.branch()
+ self.page.pop_current_frame(branch)
+ self.page.get_current_frame(branch).show_view(branch)
+ self.page.set_redirect_url(session, branch.marshal())
+
+ def process_submit(self, session):
+ action = self.app.model.management_server.add
+
+ addrs = self.addrs.get(session)
+ names = self.names.get(session)
+ fields = self.fields.get(session)
+
+ if self.validate(session, addrs, names):
+ for i in range(0, fields):
+ try:
+ addr = addrs[i]
+ except:
+ addr = None
+
+ if addr:
+ name = names[i]
+ url = "amqp://%s:%i" % parse_broker_addr(addr)
+
+ args = {"name": name, "url": url}
+ reg = action.invoke(None, args)
+
+ self.process_cancel(session)
+
+ def validate(self, session, addrs, names):
+ nerrs = self.name_errors.get(session)
+ aerrs = self.addr_errors.get(session)
+ fields = self.fields.get(session)
+
+ for i in range(0, fields):
+ try:
+ addr, name = addrs[i], names[i]
+ except:
+ addr = name = None
+
+ if not addr and not name:
+ pass # It's just an empty row
+ else:
+ if not name:
+ errs = nerrs.setdefault(i, list())
+ errs.append("The name field is empty; it is required")
+ elif BrokerRegistration.selectBy(name=name).count():
+ errs = nerrs.setdefault(i, list())
+ errs.append("A broker called '%s' already exists" % name)
+
+ if not addr:
+ errs = aerrs.setdefault(i, list())
+ errs.append("The address field is empty; it is required")
+ else:
+ try:
+ parse_broker_addr(addr)
+ except:
+ errs = aerrs.setdefault(i, list())
+ errs.append("The address is malformed")
+ break
+
+ count = BrokerRegistration.selectBy \
+ (url=addr).count()
+
+ if count:
+ errs = aerrs.setdefault(i, list())
+ errs.append("The broker at %s " % (url) +
+ "is already registered")
+
+ return not len(nerrs) and not len(aerrs)
+
+ def render_title(self, session):
+ return "Register New Brokers"
+
+ class Errors(Attribute):
+ def get_default(self, session):
+ return dict()
+
+ class More(Parameter):
+ def get_default(self, session):
+ return ""
+
+ def process_display(self, session):
+ if self.more.get(session):
+ self.fields.set(session, self.fields.get(session) + 3)
+
+ def render_fields(self, session):
+ writer = Writer()
+
+ for i in range(self.fields.get(session)):
+ self.field_tmpl.render(writer, session, i)
+
+ return writer.to_string()
+
+ def render_field_name_name(self, session, index):
+ return self.names.path
+
+ def render_field_name_value(self, session, index):
+ names = self.names.get(session)
+ if len(names) > index:
+ return names[index]
+
+ def render_field_name_errors(self, session, index):
+ errors = self.name_errors.get(session)
+ if index in errors:
+ return "<ul class=\"errors\"><li>%s</li></ul>" % \
+ "</li><li>".join(errors[index])
+
+ def render_field_address_name(self, session, index):
+ return self.addrs.path
+
+ def render_field_address_value(self, session, index):
+ addrs = self.addrs.get(session)
+ if len(addrs) > index:
+ return addrs[index]
+
+ def render_field_address_errors(self, session, index):
+ errors = self.addr_errors.get(session)
+ if index in errors:
+ return "<ul class=\"errors\"><li>%s</li></ul>" % \
+ "</li><li>".join(errors[index])
+
+ def render_more_id(self, session):
+ return self.more_button.path
+
+ def render_more_name(self, session):
+ return self.more.path
+
+ class MoreEntries(FormButton):
+ def render_content(self, session):
+ return "More Entries"
+
+ def render_class(self, session):
+ return "more"
+
+ def render_type(self, session):
+ return "button"
+
+class ManagementServerSetRemove(CuminSetActionForm, Frame):
+ def __init__(self, app, name):
+ action = app.model.management_server.remove_set
+ object = BrokerRegistrationParameter(app, "item")
+
+ super(ManagementServerSetRemove, self).__init__ \
+ (app, name, action, object)
+from mint import *
+from wooly import *
+from wooly.widgets import *
+
+from widgets import *
+from modelwidgets import *
+from parameters import *
+from formats import *
+from util import *
+
+strings = StringCatalog(__file__)
+
+class ManagementServerSet(CuminClassTable):
+ def __init__(self, app, name):
+ cls = app.model.management_server
+
+ super(ManagementServerSet, self).__init__(app, name, cls)
+
+ col = self.NameColumn(app, "name")
+ self.add_column(col)
+
+ col = self.UrlColumn(app, "url")
+ self.add_column(col)
+
+ col = self.StatusColumn(app, "status")
+ self.add_column(col)
+
+ class NameColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Name"
+
+ class UrlColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "URL"
+
+ class StatusColumn(ItemTableColumn):
+ def render_title(self, session, data):
+ return "Status"
+
+ def render_content(self, session, data):
+ url = data["url"]
+
+ try:
+ server = self.app.model.data.mintBrokersByUrl[url]
+
+ if server.connected:
+ html = "Connected"
+ else:
+ html = "Disconnected"
+ except KeyError:
+ html = "Unreachable"
+
+ return html
+
+class ManagementServerSetAdd(CuminForm, Frame):
+ def __init__(self, app, name):
+ super(ManagementServerSetAdd, self).__init__(app, name)
+
+ self.name_param = Parameter(app, "name_param");
+ self.add_parameter(self.name_param)
+
+ self.names = ListParameter(app, "name", self.name_param)
+ self.add_parameter(self.names)
+
+ self.name_errors = self.Errors(self, "name_errors")
+ self.add_attribute(self.name_errors)
+
+ self.addr_param = Parameter(app, "addr_param")
+ self.add_parameter(self.addr_param)
+
+ self.addrs = ListParameter(app, "address", self.addr_param)
+ self.add_parameter(self.addrs)
+
+ self.addr_errors = self.Errors(self, "addr_errors")
+ self.add_attribute(self.addr_errors)
+
+ self.fields = IntegerParameter(app, "fields")
+ self.fields.default = 3
+ self.add_parameter(self.fields)
+
+ self.field_tmpl = Template(self, "field_html")
+
+ self.more_button = self.MoreEntries(app, "more_button")
+ self.add_child(self.more_button)
+
+ self.more = self.More(app, "more")
+ self.add_parameter(self.more)
+
+ def process_cancel(self, session):
+ branch = session.branch()
+ self.page.pop_frame(branch)
+ self.page.get_frame(branch).show_view(branch)
+ self.page.set_redirect_url(session, branch.marshal())
+
+ def process_submit(self, session):
+ action = self.app.model.management_server.add
+
+ addrs = self.addrs.get(session)
+ names = self.names.get(session)
+ fields = self.fields.get(session)
+
+ if self.validate(session, addrs, names):
+ for i in range(0, fields):
+ try:
+ addr = addrs[i]
+ except:
+ addr = None
+
+ if addr:
+ name = names[i]
+ url = "amqp://%s:%i" % parse_broker_addr(addr)
+
+ args = {"name": name, "url": url}
+ reg = action.invoke(None, args)
+
+ self.process_cancel(session)
+
+ def validate(self, session, addrs, names):
+ nerrs = self.name_errors.get(session)
+ aerrs = self.addr_errors.get(session)
+ fields = self.fields.get(session)
+
+ for i in range(0, fields):
+ try:
+ addr, name = addrs[i], names[i]
+ except:
+ addr = name = None
+
+ if not addr and not name:
+ pass # It's just an empty row
+ else:
+ if not name:
+ errs = nerrs.setdefault(i, list())
+ errs.append("The name field is empty; it is required")
+ elif BrokerRegistration.selectBy(name=name).count():
+ errs = nerrs.setdefault(i, list())
+ errs.append("A broker called '%s' already exists" % name)
+
+ if not addr:
+ errs = aerrs.setdefault(i, list())
+ errs.append("The address field is empty; it is required")
+ else:
+ try:
+ parse_broker_addr(addr)
+ except:
+ errs = aerrs.setdefault(i, list())
+ errs.append("The address is malformed")
+ break
+
+ count = BrokerRegistration.selectBy \
+ (url=addr).count()
+
+ if count:
+ errs = aerrs.setdefault(i, list())
+ errs.append("The broker at %s " % (url) +
+ "is already registered")
+
+ return not len(nerrs) and not len(aerrs)
+
+ def render_title(self, session):
+ return "Register New Brokers"
+
+ class Errors(Attribute):
+ def get_default(self, session):
+ return dict()
+
+ class More(Parameter):
+ def get_default(self, session):
+ return ""
+
+ def process_display(self, session):
+ if self.more.get(session):
+ self.fields.set(session, self.fields.get(session) + 3)
+
+ def render_fields(self, session):
+ writer = Writer()
+
+ for i in range(self.fields.get(session)):
+ self.field_tmpl.render(writer, session, i)
+
+ return writer.to_string()
+
+ def render_field_name_name(self, session, index):
+ return self.names.path
+
+ def render_field_name_value(self, session, index):
+ names = self.names.get(session)
+ if len(names) > index:
+ return names[index]
+
+ def render_field_name_errors(self, session, index):
+ errors = self.name_errors.get(session)
+ if index in errors:
+ return "<ul class=\"errors\"><li>%s</li></ul>" % \
+ "</li><li>".join(errors[index])
+
+ def render_field_address_name(self, session, index):
+ return self.addrs.path
+
+ def render_field_address_value(self, session, index):
+ addrs = self.addrs.get(session)
+ if len(addrs) > index:
+ return addrs[index]
+
+ def render_field_address_errors(self, session, index):
+ errors = self.addr_errors.get(session)
+ if index in errors:
+ return "<ul class=\"errors\"><li>%s</li></ul>" % \
+ "</li><li>".join(errors[index])
+
+ def render_more_id(self, session):
+ return self.more_button.path
+
+ def render_more_name(self, session):
+ return self.more.path
+
+ class MoreEntries(FormButton):
+ def render_content(self, session):
+ return "More Entries"
+
+ def render_class(self, session):
+ return "more"
+
+ def render_type(self, session):
+ return "button"
+
+class ManagementServerSetRemove(CuminSetActionForm, Frame):
+ def __init__(self, app, name):
+ action = app.model.management_server.remove_set
+ object = BrokerRegistrationParameter(app, "item")
+
+ super(ManagementServerSetRemove, self).__init__ \
+ (app, name, action, object)
Added: mgmt/trunk/cumin/python/cumin/managementserver.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/managementserver.strings (rev 0)
+++ mgmt/trunk/cumin/python/cumin/managementserver.strings 2009-03-25 17:38:55 UTC (rev 3209)
@@ -0,0 +1,178 @@
+[ManagementServerSet.sql]
+select br.id, br.name, br.url
+from broker_registration as br
+{sql_where}
+{sql_orderby}
+{sql_limit}
+
+[ManagementServerSet.count_sql]
+select count(*)
+from broker_registration as br
+{sql_where}
+
+[ManagementServerSetAdd.css]
+table.ManagementServerSetAdd td, table.ManagementServerSetAdd th {
+ padding: 0.25em;
+}
+
+table.ManagementServerSetAdd span.example {
+ font-weight: normal;
+ font-size: 0.8em;
+ font-style: italic;
+}
+
+[ManagementServerSetAdd.html]
+<form id="{id}" class="mform" method="post" action="?">
+ <div class="head">
+ <h1>{title}</h1>
+ </div>
+ <div class="body">
+ <fieldset>
+ <table class="ManagementServerSetAdd">
+ <tr>
+ <th>Name</th>
+ <th>
+ Address
+ <br/>
+ <span class="example">Examples: example.net, example.net:5672, 172.16.82.10</span>
+ </th>
+ </tr>
+
+ {fields}
+ </table>
+
+ {more_button}<input type="hidden" name="{more_name}" value="" />
+ </fieldset>
+
+ {hidden_inputs}
+ </div>
+ <div class="foot">
+ {help}
+ {submit}
+ {cancel}
+ </div>
+</form>
+<script type="text/javascript" defer="defer">
+<![CDATA[
+(function() {
+ var elem = wooly.doc().elembyid("{id}").node.elements[1];
+ elem.focus();
+ elem.select();
+
+ function attach_more_id() {
+ var oMore = document.getElementById("{more_id}");
+ if (oMore) {
+ oMore.onclick = function() {
+ document.forms[0].elements["{more_name}"].value = "t";
+ document.forms[0].submit();
+ }
+ }
+ }
+
+ addEvent(window, "load", attach_more_id);
+}())
+]]>
+</script>
+
+[ManagementServerSetAdd.field_html]
+<tr>
+ <td>
+ <input type="text" name="{field_name_name}" value="{field_name_value}"
+ size="15" tabindex="100"/>
+ {field_name_errors}
+ </td>
+ <td>
+ <input type="text" name="{field_address_name}" value="{field_address_value}"
+ size="35" tabindex="100"/>
+ {field_address_errors}
+ </td>
+</tr>
+[ManagementServerSet.sql]
+select br.id, br.name, br.url
+from broker_registration as br
+{sql_where}
+{sql_orderby}
+{sql_limit}
+
+[ManagementServerSet.count_sql]
+select count(*)
+from broker_registration as br
+{sql_where}
+
+[ManagementServerSetAdd.css]
+table.ManagementServerSetAdd td, table.ManagementServerSetAdd th {
+ padding: 0.25em;
+}
+
+table.ManagementServerSetAdd span.example {
+ font-weight: normal;
+ font-size: 0.8em;
+ font-style: italic;
+}
+
+[ManagementServerSetAdd.html]
+<form id="{id}" class="mform" method="post" action="?">
+ <div class="head">
+ <h1>{title}</h1>
+ </div>
+ <div class="body">
+ <fieldset>
+ <table class="ManagementServerSetAdd">
+ <tr>
+ <th>Name</th>
+ <th>
+ Address
+ <br/>
+ <span class="example">Examples: example.net, example.net:5672, 172.16.82.10</span>
+ </th>
+ </tr>
+
+ {fields}
+ </table>
+
+ {more_button}<input type="hidden" name="{more_name}" value="" />
+ </fieldset>
+
+ {hidden_inputs}
+ </div>
+ <div class="foot">
+ {help}
+ {submit}
+ {cancel}
+ </div>
+</form>
+<script type="text/javascript" defer="defer">
+<![CDATA[
+(function() {
+ var elem = wooly.doc().elembyid("{id}").node.elements[1];
+ elem.focus();
+ elem.select();
+
+ function attach_more_id() {
+ var oMore = document.getElementById("{more_id}");
+ if (oMore) {
+ oMore.onclick = function() {
+ document.forms[0].elements["{more_name}"].value = "t";
+ document.forms[0].submit();
+ }
+ }
+ }
+
+ addEvent(window, "load", attach_more_id);
+}())
+]]>
+</script>
+
+[ManagementServerSetAdd.field_html]
+<tr>
+ <td>
+ <input type="text" name="{field_name_name}" value="{field_name_value}"
+ size="15" tabindex="100"/>
+ {field_name_errors}
+ </td>
+ <td>
+ <input type="text" name="{field_address_name}" value="{field_address_value}"
+ size="35" tabindex="100"/>
+ {field_address_errors}
+ </td>
+</tr>
Modified: mgmt/trunk/cumin/python/cumin/model.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/model.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/model.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -49,7 +49,7 @@
CuminBrokerAclModule(self)
CuminBrokerClusterModule(self)
- CuminBrokerRegistration(self)
+ CuminManagementServer(self)
CuminBrokerGroup(self)
# Grid
@@ -247,9 +247,39 @@
def get_verb(self, session):
return None
-
+
+ def get_description(self, session, object):
+ verb = self.get_verb(session)
+
+ if not verb:
+ verb = self.get_title(session)
+
+ cls = self.cumin_class
+
+ if cls and object:
+ obj = None
+
+ if type(object) is list:
+ if len(object) == 1:
+ obj = object[0]
+ else:
+ obj = object
+
+ if obj is None:
+ sobject = "%i %s" % \
+ (len(object), cls.get_plural_title(session))
+ else:
+ sobject = cls.get_object_title(session, obj)
+ elif cls:
+ sobject = cls.get_title(session)
+ else:
+ # XXX lame
+ sobject = str(object)
+
+ return "%s %s" % (verb, sobject)
+
def invoke(self, object, args={}):
- invoc = CuminActionInvocation(self, object)
+ invoc = self.begin(object)
def completion(status, args=None):
invoc.status = status
@@ -257,28 +287,30 @@
#invoc.prt()
try:
- try:
- return self.do_invoke(object, args, completion)
- except Exception, e:
- invoc.status = "failed"
- invoc.exception = e
+ return self.do_invoke(object, args, completion)
+ except Exception, e:
+ invoc.status = "failed"
+ invoc.exception = e
- log.exception(e)
- finally:
- self.model.invocations.add(invoc)
+ log.exception(e)
#invoc.prt()
return invoc
def do_invoke(self, object, args, completion):
- pass
+ raise Exception("Not implemented")
- def get_session_by_registration(self, reg):
- assert reg.broker
- assert reg.broker.qmfBrokerId in self.model.data.mintBrokersById
+ def begin(self, object):
+ invoc = CuminActionInvocation(self, object)
+ self.model.invocations.add(invoc)
+ return invoc
- broker = self.model.data.mintBrokersById[reg.broker.qmfBrokerId]
+ def get_session_by_object(self, object):
+ assert object
+
+ broker = self.model.data.mintBrokersById[object.qmfBrokerId]
+
return broker.getAmqpSession()
class CuminActionInvocation(object):
@@ -291,24 +323,8 @@
self.exception = None
def get_description(self, session):
- verb = self.action.get_verb(session)
+ return self.action.get_description(session, self.object)
- if not verb:
- verb = self.action.get_title(session)
-
- if self.object:
- if type(self.object) is list:
- count = len(self.object)
- name = self.action.cumin_class.get_title(session)
- sobject = "%i %s%s" % (count, name, ess(count))
- else:
- cls = self.action.model.get_class_by_object(self.object)
- sobject = cls.get_object_title(session, self.object)
- else:
- sobject = self.action.cumin_class.get_title(session)
-
- return "%s %s" % (verb, sobject)
-
def prt(self):
print "action", self.action.name, self.object, self.when, \
self.status, self.args, self.exception
@@ -762,6 +778,7 @@
prop = CuminProperty(self, "version")
prop.title = "Version"
+ prop.summary = True
prop = CuminProperty(self, "dataDir")
prop.title = "Data Directory"
@@ -769,6 +786,8 @@
stat = self.StatusStat(self, "connection")
stat.category = "status"
+ action = self.EngroupSet(self, "engroup_set")
+
action = self.AddExchange(self, "add_exchange")
action.summary = True
@@ -784,12 +803,16 @@
def get_icon_href(self, session):
return "resource?name=broker-36.png"
- def show_object(self, session, broker):
- reg = broker.registration
- return super(CuminBroker, self).show_object(session, reg)
+ def get_title(self, session):
+ return "Broker"
+# def show_object(self, session, broker):
+# reg = broker.registration
+# return super(CuminBroker, self).show_object(session, reg)
+
def get_object_name(self, broker):
- return broker.id
+ host, port = broker.system.nodeName, broker.port
+ return "%s:%i" % (host, port)
class StatusStat(CuminStat):
def value_text(self, broker):
@@ -809,6 +832,15 @@
def rate_text(self, record):
return ""
+ class EngroupSet(CuminSetAction):
+ def show(self, session, brokers):
+ frame = self.model.frame.brokers_group
+ frame.objects.set(session, brokers)
+ return frame.show(session)
+
+ def get_title(self, session):
+ return "Add to Group"
+
class AddExchange(CuminAction):
MSG_SEQUENCE = "qpid.msg_sequence"
IVE = "qpid.ive"
@@ -825,21 +857,22 @@
return frame.exchange_add.show(session)
def do_invoke(self, exchange, args, completion):
-
- reg = args["reg"]
declArgs = {}
+
if args["sequence"]:
declArgs[self.MSG_SEQUENCE] = 1
if args["ive"]:
declArgs[self.IVE] = 1
-
- session = self.get_session_by_registration(reg)
- session.exchange_declare(exchange=exchange.name,
- type=exchange.type,
- durable=exchange.durable,
+
+ session = self.get_session_by_object(exchange)
+ session.exchange_declare(exchange=exchange.name,
+ type=exchange.type,
+ durable=exchange.durable,
arguments=declArgs)
+
# if the above call fails, an exception is
# raised and we won't get here
+
completion("OK")
class AddLink(CuminAction):
@@ -853,85 +886,49 @@
frame = self.cumin_class.show_object(session, reg)
frame.set_object(session, reg)
return frame.link_add.show(session)
-
- def do_invoke(self, link, args, completion):
- reg = args["reg"]
+
+ def do_invoke(self, broker, args, completion):
+ host = args["host"]
+ port = args["port"]
+ durable = args["durable"]
username = args["username"]
password = args["password"]
transport = args["transport"]
+
if username == "anonymous":
authMechanism = "ANONYMOUS"
else:
authMechanism = "PLAIN"
- broker = reg._get_broker()
- broker.connect(self.model.data, completion,
- link.host, link.port, link.durable,
- authMechanism, username, password, transport)
-
- class AddQueue(CuminAction):
- FILECOUNT = "qpid.file_count"
- FILESIZE = "qpid.file_size"
- MAX_QUEUE_SIZE = "qpid.max_size"
- MAX_QUEUE_COUNT = "qpid.max_count"
- POLICY_TYPE = "qpid.policy_type"
- CLUSTER_DURABLE = "qpid.persist_last_node"
- LVQ = "qpid.last_value_queue"
- OPTIMISTIC_CONSUME = "qpid.optimistic_consume"
+ broker.connect(self.model.data, completion, host, port, durable,
+ authMechanism, username, password, transport)
+ class AddQueue(CuminAction):
def get_title(self, session):
return "Add Queue"
-
+
def get_verb(self, session):
return "Add"
-
+
+ def get_description(self, session, vhost):
+ host = vhost.broker.system.nodeName
+ port = vhost.broker.port
+ return "Add Queue to %s:%i" % (host, port)
+
def show(self, session, reg):
frame = self.cumin_class.show_object(session, reg)
frame.set_object(session, reg)
return frame.queue_add.show(session)
-
- def do_invoke(self, queue, args, completion):
- reg = args["reg"]
- declArgs = {}
- if queue.durable:
- if args["file_count"]:
- declArgs[self.FILECOUNT] = args["file_count"]
- if args["file_size"]:
- declArgs[self.FILESIZE] = args["file_size"]
-
- if args["policy"]:
- declArgs[self.POLICY_TYPE] = args["policy"]
- if args["q_size"]:
- declArgs[self.MAX_QUEUE_SIZE] = args["q_size"]
- if args["q_count"]:
- declArgs[self.MAX_QUEUE_COUNT] = args["q_count"]
-
- if args["cluster_durable"]:
- declArgs[self.CLUSTER_DURABLE] = 1
- if args["lvq"]:
- declArgs[self.LVQ] = 1
- if args["optimistic"]:
- declArgs[self.OPTIMISTIC_CONSUME] = 1
-
- session = self.get_session_by_registration(reg)
- session.queue_declare(queue=queue.name,
- durable=queue.durable,
- arguments=declArgs)
-
- # optionally bind to exchanges
- binding_info = args['exchange_keys']
- do_bind(session, queue, binding_info)
- completion("OK")
-
-def do_bind(session, queue, binding_info):
+# XXX "do_" on this doesn't make sense
+def do_bind(session, queue_name, binding_info):
for exchange in binding_info:
if "key" in binding_info[exchange]:
binding_key = binding_info[exchange]["key"]
else:
binding_key = None
- session.exchange_bind(queue=queue.name,
+ session.exchange_bind(queue=queue_name,
exchange=binding_info[exchange]["name"],
binding_key=binding_key,
arguments=binding_info[exchange]["arguments"])
@@ -939,7 +936,7 @@
class CuminQueue(RemoteClass):
def __init__(self, model):
super(CuminQueue, self).__init__(model, "queue", Queue, QueueStats)
-
+
prop = CuminProperty(self, "name")
prop.title = "Name"
@@ -1149,10 +1146,9 @@
return "Remove"
def do_invoke(self, queue, args, completion):
- reg = queue.vhost.broker.registration
- session = self.get_session_by_registration(reg)
+ session = self.get_session_by_object(queue)
session.queue_delete(queue=queue.name)
-
+
completion("OK")
class Bind(CuminAction):
@@ -1165,10 +1161,9 @@
return "Bind"
def do_invoke(self, queue, args, completion):
- reg = queue.vhost.broker.registration
- session = self.get_session_by_registration(reg)
+ session = self.get_session_by_object(queue)
binding_info = args['exchange_keys']
- do_bind(session, queue, binding_info)
+ do_bind(session, queue.name, binding_info)
completion("OK")
@@ -1273,8 +1268,8 @@
frame = self.cumin_class.show_object(session, exchange)
return frame.remove.show(session)
- def do_invoke(self, exchange, reg, completion):
- session = self.get_session_by_registration(reg)
+ def do_invoke(self, exchange, args, completion):
+ session = self.get_session_by_object(exchange)
session.exchange_delete(exchange=exchange.name)
completion("OK")
@@ -1312,12 +1307,11 @@
return frame.remove.show(session)
def do_invoke(self, binding, args, completion):
- reg = binding.exchange.vhost.broker.registration
- session = self.get_session_by_registration(reg)
- session.exchange_unbind(queue=binding.queue.name,
- exchange=binding.exchange.name,
+ session = self.get_session_by_object(binding)
+ session.exchange_unbind(queue=binding.queue.name,
+ exchange=binding.exchange.name,
binding_key=binding.bindingKey)
-
+
completion("OK")
@@ -1730,40 +1724,38 @@
prop = CuminProperty(self, "members")
prop.title = "Members"
-class CuminBrokerRegistration(CuminClass):
+class CuminManagementServer(CuminClass):
def __init__(self, model):
- super(CuminBrokerRegistration, self).__init__ \
- (model, "broker_registration", BrokerRegistration)
+ super(CuminManagementServer, self).__init__ \
+ (model, "management_server", BrokerRegistration)
prop = CuminProperty(self, "url")
prop.title = "URL"
prop.summary = True
- action = self.Add(self, "add")
- action.title = "Add"
+ action = self.AddSet(self, "add")
action.navigable = False
- action = self.Edit(self, "edit")
- action.title = "Edit"
- action.summary = True
+ action = self.RemoveSet(self, "remove_set")
- action = self.Remove(self, "remove")
- action.title = "Unregister"
- action.summary = True
-
def init(self):
self.frame = self.model.frame.broker
def get_title(self, session):
- return "Broker"
+ return "Management Server"
def get_icon_href(self, session):
return "resource?name=broker-36.png"
- class Add(CuminAction):
- def do_invoke(self, object, args, completion):
- assert object is None
+ class AddSet(CuminAction):
+ def get_title(self, session):
+ return "Add Management Servers"
+ def show(self, session, object):
+ frame = self.model.frame.mservers_add
+ frame.show(session)
+
+ def do_invoke(self, object, args, completion):
try:
object = self.cumin_class.mint_class(**args)
@@ -1774,38 +1766,22 @@
log.exception("Action failed")
completion(e.message or "failed")
- class Edit(CuminAction):
- def show(self, session, object):
- frame = self.cumin_class.show_object(session, object)
- return frame.show_edit(session)
+ class RemoveSet(CuminSetAction):
+ def get_title(self, session):
+ return "Remove"
- def do_invoke(self, object, args, completion):
- try:
- object.set(**args)
- object.syncUpdate()
- completion("OK")
- except Exception, e:
- completion(e.message or "failed")
-
- class Remove(CuminAction):
- def show(self, session, object):
- frame = self.model.frame.brokers_remove
- frame.ids.set(session, [object.id])
-
- branch = session.branch()
- self.model.frame.view.show(branch)
- frame.origin.set(session, branch.marshal())
-
+ def show(self, session, objects):
+ frame = self.model.frame.mservers_remove
+ frame.objects.set(session, objects)
return frame.show(session)
- def do_invoke(self, object, args, completion):
- try:
- object.destroySelf();
- object.syncUpdate()
- completion("OK")
- except Exception, e:
- completion(e.message or "failed")
+ def do_invoke(self, servers, args, completion):
+ for server in servers:
+ server.destroySelf()
+ server.syncUpdate()
+ completion("OK")
+
class CuminBrokerGroup(CuminClass):
def __init__(self, model):
super(CuminBrokerGroup, self).__init__ \
Modified: mgmt/trunk/cumin/python/cumin/page.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/page.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/page.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -5,8 +5,7 @@
from broker import *
from brokergroup import *
-from brokerprofile import *
-from brokercluster import *
+from managementserver import *
from pool import *
from job import *
from system import *
@@ -66,12 +65,15 @@
self.change_password = ChangePasswordForm(app, "password")
self.add_mode(self.change_password)
- self.brokers_add = BrokerSetAdd(app, "brokersadd")
- self.add_mode(self.brokers_add)
+ self.mservers_add = ManagementServerSetAdd(app, "mserversadd")
+ self.add_mode(self.mservers_add)
- self.brokers_remove = BrokerSetRemove(app, "brokersremove")
- self.add_mode(self.brokers_remove)
+ self.mservers_remove = ManagementServerSetRemove(app, "mserversremove")
+ self.add_mode(self.mservers_remove)
+ self.brokers_group = BrokerSetEngroup(app, "brokersengroup")
+ self.add_mode(self.brokers_group)
+
self.jobs_hold = JobSetHold(app, "jobshold")
self.add_mode(self.jobs_hold)
@@ -255,6 +257,7 @@
self.add_tab(self.OverviewTab(app, "over"))
self.add_tab(self.MyGridJobs(app, "jobs"))
self.add_tab(self.AccountTab(app, "acct"))
+ self.add_tab(ManagementServerSet(app, "servers"))
def render_change_password_href(self, session):
branch = session.branch()
@@ -275,6 +278,9 @@
def __init__(self, app, name):
super(HomeView.OverviewTab, self).__init__(app, name)
+ notice = self.ManagementServerNotice(app, "notice")
+ self.add_child(notice)
+
queues = TopQueueSet(app, "queues")
self.add_child(queues)
@@ -287,11 +293,14 @@
def render_title(self, session):
return "Overview"
- def render_add_qmf_source_href(self, session):
- branch = session.branch()
- self.page.main.brokers_add.show(branch)
- return branch.marshal()
+ class ManagementServerNotice(Widget):
+ def do_render(self, session):
+ count = BrokerRegistration.select().count()
+ if count == 0:
+ return super(HomeView.OverviewTab.ManagementServerNotice,
+ self).do_render(session)
+
class AccountTab(ActionSet):
def render_title(self, session):
return "Your Account"
Modified: mgmt/trunk/cumin/python/cumin/page.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/page.strings 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/page.strings 2009-03-25 17:38:55 UTC (rev 3209)
@@ -203,9 +203,7 @@
}
[OverviewTab.html]
-<ul class="actions">
- <li><a class="nav" href="{add_qmf_source_href}">Add Management Data Source</a></li>
-</ul>
+{notice}
<table class="OverviewTab">
<tbody>
@@ -232,6 +230,27 @@
</tbody>
</table>
+[ManagementServerNotice.css]
+div.ManagementServerNotice {
+ margin: 0 0 1em 0;
+ border: 1px dotted #cec;
+ padding: 1em;
+ background-color: #dfd;
+}
+
+div.ManagementServerNotice img {
+ vertical-align: top;
+ float: left;
+ margin: 0 0.5em 0.5em 0;
+}
+
+[ManagementServerNotice.html]
+<div class="ManagementServerNotice">
+ <img src="resource?name=notice-36.png"/> This console is not
+ registered with any management servers. Go to the 'Management Servers'
+ tab above to add a new server.
+</div>
+
[AccountTab.html]
<ul class="actions">
<a class="nav" href="{change_password_href}">Change Password</a>
Modified: mgmt/trunk/cumin/python/cumin/parameters.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/parameters.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/parameters.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -41,6 +41,13 @@
def do_marshal(self, group):
return str(group.id)
+class BrokerParameter(Parameter):
+ def do_unmarshal(self, string):
+ return Broker.get(int(string))
+
+ def do_marshal(self, broker):
+ return str(broker.id)
+
class BrokerRegistrationParameter(Parameter):
def do_unmarshal(self, string):
return BrokerRegistration.get(int(string))
Modified: mgmt/trunk/cumin/python/cumin/queue.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/queue.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/queue.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -21,9 +21,11 @@
log = logging.getLogger("cumin.queue")
class QueueSet(CuminTable, Form):
- def __init__(self, app, name):
+ def __init__(self, app, name, vhost):
super(QueueSet, self).__init__(app, name)
+ self.vhost = vhost
+
self.ids = CheckboxIdColumn(app, "id")
self.add_column(self.ids)
@@ -64,25 +66,25 @@
self.__remove = self.Remove(app, "remove")
self.add_child(self.__remove)
- def render_add_queue_url(self, session, vhost):
+ def render_add_queue_url(self, session):
branch = session.branch()
self.frame.queue_add.show(branch)
return branch.marshal()
-
- def get_args(self, session):
- reg = self.frame.get_object(session)
- return (reg.getDefaultVhost(),)
- def render_title(self, session, vhost):
+ def render_title(self, session):
return "Queues %s" % fmt_count(Queue.select().count())
- def render_sql_where(self, session, vhost):
- elems = list()
- elems.append("q.vhost_id = %(id)r")
- elems.append(self.phase.get_sql_constraint(session, vhost))
- return "where %s" % " and ".join(elems)
+ def render_sql_where(self, session):
+ vhost = self.vhost.get(session)
- def get_sql_values(self, session, vhost):
+ constraints = list()
+ constraints.append("q.vhost_id = %(id)r")
+ constraints.append(self.phase.get_sql_constraint(session, vhost))
+
+ return "where %s" % " and ".join(constraints)
+
+ def get_sql_values(self, session):
+ vhost = self.vhost.get(session)
return {"id": vhost.id}
class Purge(FormButton):
@@ -115,7 +117,7 @@
def render_content(self, session, data):
queue = Identifiable(data["id"])
- href = self.frame.queue.get_href(session, queue)
+ href = self.page.main.broker.queue.get_href(session, queue)
return fmt_link(href, fmt_shorten(data["name"]))
class ConsumersColumn(SqlTableColumn):
@@ -193,13 +195,13 @@
return "Name"
def render_content(self, session, data):
- reg = Identifiable(data["registration_id"])
+ broker = Identifiable(data["broker_id"])
queue = Identifiable(data["id"])
branch = session.branch()
- self.page.main.broker.object.set(session, reg)
- self.page.main.broker.queue.object.set(session, queue)
- self.page.main.broker.queue.show(session)
+ self.page.main.broker.object.set(branch, broker)
+ self.page.main.broker.queue.object.set(branch, queue)
+ self.page.main.broker.queue.show(branch)
return fmt_link(branch.marshal(), fmt_shorten(data["name"]))
class EnqueuesColumn(TopTableColumn):
@@ -219,8 +221,8 @@
self.purge = QueuePurge(app, "purge")
self.add_mode(self.purge)
-
- self.binding_add = QueueBindingAdd(app, "bindingadd")
+
+ self.binding_add = QueueBindingAdd(app, "bindingadd", self.object)
self.add_mode(self.binding_add)
self.remove = QueueRemove(app, "remove")
@@ -231,9 +233,7 @@
self.add_mode(self.move_messages)
def show_object(self, session, queue):
- reg = queue.vhost.broker.registration
- self.page.main.broker.set_object(session, reg)
-
+ self.page.main.broker.object.set(session, queue.vhost.broker)
return super(QueueFrame, self).show_object(session, queue)
def render_href(self, session, queue):
@@ -342,9 +342,13 @@
return "Remove"
class QueueForm(CuminFieldForm):
- def __init__(self, app, name):
+ def __init__(self, app, name, vhost):
super(QueueForm, self).__init__(app, name)
+ assert vhost
+
+ self.vhost = vhost
+
self.namef = NameField(app, "name")
self.add_field(self.namef)
@@ -380,14 +384,14 @@
self.q_count = self.QCountField(app, "q_count")
self.more.add_field(self.q_count)
- self.bindings = ExchangeKeysField(app, "bindings")
+ self.bindings = ExchangeKeysField(app, "bindings", self.vhost)
self.add_field(self.bindings)
def validate(self, session, queue_name):
super_error = super(QueueForm, self).validate(session)
(errors, form_binding_info) = self.bindings.get_binding_errors(session, queue_name)
return (errors or super_error, form_binding_info)
-
+
class QCountField(IntegerField):
def render_title(self, session):
return "<div style=\"padding-left: 1em;\">Max Queue Count</div>"
@@ -533,60 +537,81 @@
return "Ring Strict"
class QueueAdd(QueueForm):
- def get_args(self, session):
- return (self.frame.get_object(session), )
+ def __init__(self, app, name, vhost):
+ super(QueueAdd, self).__init__(app, name, vhost)
- def process_cancel(self, session, *args):
+ def process_cancel(self, session):
branch = session.branch()
self.frame.show_view(branch)
self.page.set_redirect_url(session, branch.marshal())
- def process_submit(self, session, reg):
- queue_name = self.namef.get(session)
+ def process_submit(self, session):
+ vhost = self.vhost.get(session)
+ name = self.namef.get(session)
durable = self.durable.get(session)
+ policy = self.policy.get(session)
- (errors, form_binding_info) = self.validate(session, queue_name)
- if errors:
- pass
- else:
- # since we are adding a queue, we don't have
- # an existing queue to pass, so create a
- # blank one
- queue = Queue()
- queue.name = queue_name
- queue.durable = (durable == "yes")
+ errors, binding_info = self.validate(session, name)
- args = {}
- args["reg"] = reg
- args["exchange_keys"] = form_binding_info
- args["cluster_durable"] = self.cluster_durable.get(session) == "yes"
- args["lvq"] = self.lvq.get(session) == "enable"
- args["optimistic"] = self.optimistic.get(session) == "yes"
- policy = self.policy.get(session)
- if policy == "none":
- policy = None
- args["policy"] = policy
-
- file_count = self.file_count.get(session)
- file_size = self.file_size.get(session)
- if file_count == self.file_count.input.param.default:
- file_count = None
- if file_size == self.file_size.input.param.default:
- file_size = None
- args["file_count"] = file_count
- args["file_size"] = file_size
+ if not errors:
+ action = self.app.model.broker.add_queue
+ invoc = action.begin(vhost)
- args["q_count"] = self.q_count.get(session)
- args["q_size"] = self.q_size.get(session)
-
- action = self.app.model.broker.add_queue
- action.invoke(queue, args)
-
+ try:
+ args = dict()
+
+ if durable:
+ args["qpid.file_count"] = self.file_count.get(session)
+ args["qpid.file_size"] = self.file_size.get(session)
+
+ if policy != "none":
+ args["qpid.policy_type"] = policy
+ args["qpid.max_size"] = self.q_size.get(session)
+ args["qpid.max_count"] = self.q_count.get(session)
+
+ args["qpid.persist_last_node"] = \
+ self.cluster_durable.get(session) == "yes"
+
+ args["qpid.last_value_queue"] = \
+ self.lvq.get(session) == "enable"
+
+ args["qpid.optimistic_consume"] = \
+ self.optimistic.get(session) == "yes"
+
+ qsession = action.get_session_by_object(vhost)
+
+ qsession.queue_declare(queue=name,
+ durable=durable,
+ arguments=args)
+
+ for exchange in binding_info:
+ if "key" in binding_info[exchange]:
+ binding_key = binding_info[exchange]["key"]
+ else:
+ binding_key = None
+
+ ename = binding_info[exchange]["name"]
+ eargs = binding_info[exchange]["arguments"]
+
+ qsession.exchange_bind(queue=name,
+ exchange=ename,
+ binding_key=binding_key,
+ arguments=eargs)
+
+ invoc.status = "OK"
+ except Exception, e:
+ invoc.status = "failed"
+ invoc.exception = e
+
+ log.exception(e)
+
# navigate back to main queue frame
self.process_cancel(session)
- def render_title(self, session, reg):
- return "Add Queue to the Broker '%s'" % reg.name
+ def render_title(self, session):
+ broker = self.vhost.get(session).broker
+ title = self.app.model.broker.get_object_title(session, broker)
+ return "Add Queue to %s" % title
class QueueRemove(CuminConfirmForm):
def get_args(self, session):
@@ -713,33 +738,41 @@
return (self.frame.frame.get_object(session),)
class QueueBindingAdd(CuminFieldForm):
- def __init__(self, app, name):
+ def __init__(self, app, name, queue):
super(QueueBindingAdd, self).__init__(app, name)
+ self.queue = queue
+
+ self.vhost = self.VhostAttribute(self, "vhost")
+ self.add_attribute(self.vhost)
+
self.props = BindSummaryPropertiesField(app, "props")
self.add_field(self.props)
- self.bindings = ExchangeKeysField(app, "bindings", title="Bind to Exchange:")
+ self.bindings = ExchangeKeysField(app, "bindings", self.vhost,
+ title="Bind to Exchange:")
self.add_field(self.bindings)
self.errors = self.Errors(self, "errors")
self.add_attribute(self.errors)
- def get_args(self, session):
- return self.frame.get_args(session)
+ class VhostAttribute(Attribute):
+ def get_default(self, session):
+ return self.widget.queue.get(session).vhost
- def render_form_error(self, session, *args):
+ def render_form_error(self, session):
errors = self.errors.get(session)
if "no_exchanges" in errors:
return "<ul class=\"errors\" style=\"margin:0; float:left;\"><li>%s</li></ul>" % \
"</li><li>".join(errors["no_exchanges"])
- def process_cancel(self, session, *args):
+ def process_cancel(self, session):
branch = session.branch()
self.frame.show_view(branch)
self.page.set_redirect_url(session, branch.marshal())
- def process_submit(self, session, queue):
+ def process_submit(self, session):
+ queue = self.queue.get(session)
(errors, form_binding_info) = self.bindings.get_binding_errors(session, queue.name)
if not len(form_binding_info):
@@ -765,8 +798,9 @@
self.process_cancel(session)
def render_title(self, session, *args):
- queue = self.frame.get_object(session)
- return "Add Binding to the Queue '%s'" % queue.name
+ queue = self.queue.get(session)
+ title = self.app.model.queue.get_object_title(session, queue)
+ return "Add Binding to %s" % title
class Errors(Attribute):
def get_default(self, session):
Modified: mgmt/trunk/cumin/python/cumin/queue.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/queue.strings 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/queue.strings 2009-03-25 17:38:55 UTC (rev 3209)
@@ -67,11 +67,10 @@
select
q.id,
q.name,
- b.registration_id,
+ v.broker_id,
(c.msg_total_enqueues - p.msg_total_enqueues) as enqueues
from queue as q
join vhost as v on v.id = q.vhost_id
-join broker as b on b.id = v.broker_id
join queue_stats as c on c.id = q.stats_curr_id
join queue_stats as p on p.id = q.stats_prev_id
where p.qmf_update_time > now() - interval '60 seconds'
Modified: mgmt/trunk/cumin/python/cumin/test.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/test.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/test.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -55,13 +55,16 @@
class TestEnvironment(object):
def __init__(self, app, broker_host, broker_port, spec_path):
self.app = app
+ self.broker_host = broker_host
+ self.broker_port = broker_port
- self.broker_conn = quirk.Connection(broker_host, broker_port,
- spec_path)
+ broker = TestBroker("qpidd", self.broker_port)
+
+ self.broker_conn = quirk.Connection \
+ (self.broker_host, self.broker_port, spec_path)
self.broker_queue = quirk.Queue("cumin.queue")
self.broker_exchange = quirk.Exchange("cumin.exchange")
- self.broker_registration = None
self.broker = None
self.vhost = None
self.queue = None
@@ -69,7 +72,30 @@
self.broker_group = None
def init(self):
+ name = "test-%s-%s" % (self.broker_host, self.broker_port)
+ url = "amqp://%s:%s" % (self.broker_host, self.broker_port)
+
+ print "Connecting to qmf server at %s" % url
+
+ if not BrokerRegistration.selectBy(name=name, url=url).count():
+ reg = BrokerRegistration(name=name, url=url)
+
+ ready = False
+
+ print "Waiting for the broker to show up...",
+
+ while not ready:
+ time.sleep(1)
+
+ for broker in Broker.select():
+ print "got it."
+ ready = True
+ break
+
+ print ".",
+
self.broker_conn.open()
+
session = quirk.Session(self.broker_conn, "test")
session.open()
@@ -246,8 +272,8 @@
def __init__(self, env):
super(MainTest, self).__init__(env, None)
+ BrokerTest(env, self)
BrokerGroupTest(env, self)
- BrokerRegistrationTest(env, self)
class BrokerLinkTest(Test):
def __init__(self, env, parent):
@@ -259,7 +285,7 @@
def do_run(self, session):
p, s = self.env.page_and_session()
- p.main.broker.set_object(s, self.env.broker_registration)
+ p.main.broker.set_object(s, self.env.broker)
form = p.main.broker.link_add
form.show(s)
@@ -287,7 +313,7 @@
def do_run(self, session):
p, s = self.env.page_and_session()
- p.main.broker.set_object(s, self.env.broker_registration)
+ p.main.broker.set_object(s, self.env.broker)
form = p.main.broker.links_close
form.show(s)
@@ -317,7 +343,7 @@
def do_run(self, session):
p, s = self.env.page_and_session()
- p.main.broker.set_object(s, self.env.broker_registration)
+ p.main.broker.set_object(s, self.env.broker)
p.main.broker.link.set_object(s, self.env.link)
form = p.main.broker.link.bridge_add
@@ -348,7 +374,7 @@
def do_run(self, session):
p, s = self.env.page_and_session()
- p.main.broker.set_object(s, self.env.broker_registration)
+ p.main.broker.set_object(s, self.env.broker)
p.main.broker.link.set_object(s, self.evn.link)
form = p.main.broker.link.routes_close
@@ -365,67 +391,6 @@
wait(predicate)
-class BrokerRegistrationTest(Test):
- def __init__(self, env, parent):
- super(BrokerRegistrationTest, self).__init__(env, parent)
-
- BrokerTest(env, self)
- self.AddToGroup(env, self)
- self.Remove(env, self)
-
- def do_run(self, session):
- p, s = self.env.page_and_session()
-
- form = p.main.brokers_add
- form.show(s)
-
- form.names.get(s).append(session.id)
- addr = "%s:%s" % \
- (self.env.broker_conn.host, self.env.broker_conn.port)
- form.addrs.get(s).append(addr)
- form.groups.get(s).append(None)
- form.submit(s)
-
- p.process(s)
-
- self.env.check_redirect(p, s)
-
- try:
- self.env.broker_registration = BrokerRegistration.selectBy \
- (name=session.id)[0]
- except IndexError:
- raise Exception("Registration not created")
-
- self.run_children(session)
-
- class AddToGroup(Test):
- def do_run(self, session):
- raise Exception("Not implemented")
-
- class Remove(Test):
- def do_run(self, session):
- try:
- reg = BrokerRegistration.selectBy(name=session.id)[0]
- except IndexError:
- raise Exception("Broker missing")
-
- p, s = self.env.page_and_session()
-
- form = p.main.brokers_remove
- form.show(s)
- form.ids.set(s, [reg.id])
- form.submit(s)
-
- p.process(s)
-
- self.env.check_redirect(p, s)
-
- try:
- reg = BrokerRegistration.selectBy(name=session.id)[0]
- raise Exception("Registration not deleted")
- except IndexError:
- pass
-
class BrokerGroupTest(Test):
def __init__(self, env, parent):
super(BrokerGroupTest, self).__init__(env, parent)
@@ -488,12 +453,12 @@
VhostTest(env, self)
def do_run(self, session):
- reg = self.env.broker_registration
+ try:
+ time.sleep(10)
+ self.env.broker = Broker.select()[0]
+ except IndexError:
+ raise Exception("Broker not found")
- wait(lambda: reg.broker)
-
- self.env.broker = reg.broker
-
self.run_children(session)
class VhostTest(Test):
@@ -573,7 +538,7 @@
def do_run(self, session):
p, s = self.env.page_and_session()
- p.main.broker.set_object(s, self.env.broker_registration)
+ p.main.broker.set_object(s, self.env.broker)
form = p.main.broker.bindings_remove.show(s)
form.ids.set([self.env.binding_direct.id])
@@ -627,7 +592,7 @@
def do_run(self, session):
p, s = self.env.page_and_session()
- p.main.broker.set_object(s, self.env.broker_registration)
+ p.main.broker.set_object(s, self.env.broker)
form = p.main.broker.bindings_remove.show(s)
form.ids.set([self.env.binding_topic.id])
@@ -681,7 +646,7 @@
def do_run(self, session):
p, s = self.env.page_and_session()
- p.main.broker.set_object(s, self.env.broker_registration)
+ p.main.broker.set_object(s, self.env.broker)
form = p.main.broker.bindings_remove.show(s)
form.ids.set([self.env.binding_fanout.id])
@@ -744,8 +709,7 @@
name = "cumin.queue.%s" % session.id
p, s = self.env.page_and_session()
- reg = self.env.broker_registration
- p.main.broker.set_object(s, reg)
+ p.main.broker.set_object(s, self.env.broker)
form = p.main.broker.queue_add
form.show(s)
@@ -798,8 +762,7 @@
def do_run(self, session):
p, s = self.env.page_and_session()
- reg = self.env.broker_registration
- p.main.broker.set_object(s, reg)
+ p.main.broker.set_object(s, self.env.broker)
form = p.main.broker.queues_remove
form.show(s)
@@ -821,8 +784,7 @@
name = "cumin.exchange.%s" % session.id
p, s = self.env.page_and_session()
- reg = self.env.broker_registration
- p.main.broker.set_object(s, reg)
+ p.main.broker.set_object(s, self.env.broker)
form = p.main.broker.exchange_add
form.show(s)
@@ -869,8 +831,7 @@
# try to delete it
p, s = self.env.page_and_session()
- reg = self.env.broker_registration
- p.main.broker.set_object(s, reg)
+ p.main.broker.set_object(s, self.env.broker)
form = p.main.broker.exchanges_remove
form.show(s)
Modified: mgmt/trunk/cumin/python/cumin/tools.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/tools.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/tools.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -57,8 +57,9 @@
def init(self):
super(BaseCuminTool, self).init()
+ # Drop privileges
+
if os.getuid() == 0:
- # Drop privileges
os.setuid(os.stat(__file__).st_uid)
self.config.init()
Modified: mgmt/trunk/cumin/python/cumin/virtualhost.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/virtualhost.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/virtualhost.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -1,76 +0,0 @@
-from wooly import *
-from wooly.widgets import *
-
-from queue import *
-from exchange import *
-from client import *
-from widgets import *
-from parameters import *
-from formats import *
-from util import *
-
-strings = StringCatalog(__file__)
-
-class VirtualHostSet(ItemSet):
- def render_title(self, session, *args):
- return "Functional Hosts %s" % \
- fmt_count(len(model.get_virtual_hosts()))
-
- def do_get_items(self, session, *args):
- return sorted_by(model.get_virtual_hosts())
-
- def render_item_link(self, session, vhost):
- branch = session.branch()
- self.page.show_virtual_host(branch, vhost).show_view(branch)
- return fmt_olink(branch, vhost)
-
-class VirtualHostFrame(CuminFrame):
- def __init__(self, app, name):
- super(VirtualHostFrame, self).__init__(app, name)
-
- self.object = VirtualHostParameter(app, "id")
- self.add_parameter(self.object)
-
- self.view = VirtualHostView(app, "view")
- self.add_mode(self.view)
- self.set_view_mode(self.view)
-
- self.queue = QueueFrame(app, "queue")
- self.add_mode(self.queue)
-
- self.__exchange = ExchangeFrame(app, "exchange")
- self.add_mode(self.exchange)
-
- self.conn = ConnectionFrame(app, "conn")
- self.add_mode(self.conn)
-
-class VirtualHostView(CuminView):
- def __init__(self, app, name):
- super(VirtualHostView, self).__init__(app, name)
-
- self.tabs = TabbedModeSet(app, "tabs")
- self.add_child(self.tabs)
-
- self.tabs.add_tab(QueueSet(app, "queues"))
- self.tabs.add_tab(ExchangeSet(app, "exchanges"))
- self.tabs.add_tab(ConnectionSet(app, "conns"))
-
- def render_broker_link(self, session, vhost):
- broker = vhost.get_broker()
-
- if broker:
- branch = session.branch()
- self.page.show_broker(branch, broker).show_view(branch)
- return fmt_olink(branch, broker)
- else:
- return fmt_none()
-
- def render_cluster_link(self, session, vhost):
- cluster = vhost.get_broker_cluster()
-
- if cluster:
- branch = session.branch()
- self.page.show_broker_cluster(branch, cluster).show_view(branch)
- return fmt_olink(branch, cluster)
- else:
- return fmt_none()
Modified: mgmt/trunk/cumin/python/cumin/widgets.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/widgets.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/cumin/python/cumin/widgets.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -716,8 +716,9 @@
if self.filters.children:
return self.filters.render(session, *args)
- def render_sql_where(self, session, *args):
- constraints = list()
+ def get_sql_where_constraints(self, session, *args):
+ constraints = super(CuminTableWithControls, self) \
+ .get_sql_where_constraints(session, *args)
for filter in self.filters.children:
if filter:
@@ -728,7 +729,7 @@
if constraint:
constraints.append(constraint)
- return "where %s" % " and ".join(constraints)
+ return constraints
class NullSortColumn(SqlTableColumn):
def get_order_by_sql(self, session):
Modified: mgmt/trunk/mint/python/mint/__init__.py
===================================================================
--- mgmt/trunk/mint/python/mint/__init__.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/mint/python/mint/__init__.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -245,9 +245,6 @@
name = StringCol(length=1000, default=None, unique=True, notNone=True)
url = StringCol(length=1000, default=None)
broker = ForeignKey("Broker", cascade="null", default=None)
- groups = SQLRelatedJoin("BrokerGroup",
- intermediateTable="broker_group_mapping",
- createRelatedTable=False)
cluster = ForeignKey("BrokerCluster", cascade="null", default=None)
profile = ForeignKey("BrokerProfile", cascade="null", default=None)
@@ -268,7 +265,7 @@
lazyUpdate = True
name = StringCol(length=1000, default=None, unique=True, notNone=True)
- brokers = SQLRelatedJoin("BrokerRegistration",
+ brokers = SQLRelatedJoin("Broker",
intermediateTable="broker_group_mapping",
createRelatedTable=False)
@@ -276,10 +273,9 @@
class sqlmeta:
lazyUpdate = True
- brokerRegistration = ForeignKey("BrokerRegistration", notNull=True,
- cascade=True)
+ broker = ForeignKey("Broker", notNull=True, cascade=True)
brokerGroup = ForeignKey("BrokerGroup", notNull=True, cascade=True)
- unique = DatabaseIndex(brokerRegistration, brokerGroup, unique=True)
+ unique = DatabaseIndex(broker, brokerGroup, unique=True)
class BrokerCluster(SQLObject):
class sqlmeta:
@@ -341,6 +337,11 @@
self.mintBrokersById = dict()
self.mintBrokersByUrl = dict()
+ # Agent heartbeats
+ # (broker bank, agent bank) => latest heartbeat timestamp
+
+ self.heartbeatsByAgentId = dict()
+
self.__lock = RLock()
self.dbConn = None
@@ -450,8 +451,10 @@
self.qmfSession.delBroker(mbroker.qmfBroker)
del self.mintBrokersByQmfBroker[mbroker.qmfBroker]
- del self.mintBrokersById[mbroker.qmfId]
del self.mintBrokersByUrl[mbroker.url]
+
+ if mbroker.qmfId:
+ del self.mintBrokersById[mbroker.qmfId]
finally:
self.unlock()
@@ -548,8 +551,18 @@
pass
def heartbeat(self, agent, timestamp):
- pass
+ key = (agent.getBrokerBank(), agent.getAgentBank())
+ timestamp = timestamp / 1000000000
+ self.heartbeatsByAgentId[key] = datetime.fromtimestamp(timestamp)
+ def getLatestHeartbeat(self, scopeId):
+ scope = int(scopeId)
+ broker = (scope & 0x0000FFFFF0000000) >> 28
+ agent = scope & 0x000000000FFFFFFF
+ key = (broker, agent)
+
+ return self.heartbeatsByAgentId.get(key)
+
def methodResponse(self, broker, seq, response):
mbroker = self.getMintBrokerByQmfBroker(broker)
up = update.MethodUpdate(self, mbroker, seq, response)
Modified: mgmt/trunk/mint/sql/schema.sql
===================================================================
--- mgmt/trunk/mint/sql/schema.sql 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/mint/sql/schema.sql 2009-03-25 17:38:55 UTC (rev 3209)
@@ -10,10 +10,10 @@
CREATE TABLE broker_group_mapping (
id SERIAL PRIMARY KEY,
- broker_registration_id INT NOT NULL,
+ broker_id INT NOT NULL,
broker_group_id INT NOT NULL
);
-CREATE UNIQUE INDEX broker_group_mapping_unique ON broker_group_mapping (broker_registration_id, broker_group_id);
+CREATE UNIQUE INDEX broker_group_mapping_unique ON broker_group_mapping (broker_id, broker_group_id);
CREATE TABLE broker_profile (
id SERIAL PRIMARY KEY,
@@ -969,7 +969,7 @@
vhost_id INT
);
-ALTER TABLE broker_group_mapping ADD CONSTRAINT broker_registration_id_exists FOREIGN KEY (broker_registration_id) REFERENCES broker_registration (id) ON DELETE CASCADE;
+ALTER TABLE broker_group_mapping ADD CONSTRAINT broker_id_exists FOREIGN KEY (broker_id) REFERENCES broker (id) ON DELETE CASCADE;
ALTER TABLE broker_group_mapping ADD CONSTRAINT broker_group_id_exists FOREIGN KEY (broker_group_id) REFERENCES broker_group (id) ON DELETE CASCADE;
Modified: mgmt/trunk/wooly/python/wooly/tables.py
===================================================================
--- mgmt/trunk/wooly/python/wooly/tables.py 2009-03-24 18:55:40 UTC (rev 3208)
+++ mgmt/trunk/wooly/python/wooly/tables.py 2009-03-25 17:38:55 UTC (rev 3209)
@@ -185,8 +185,11 @@
return writer.to_string()
def render_sql_where(self, session, *args):
- pass
+ constraints = self.get_sql_where_constraints(session)
+ if constraints:
+ return "where %s" % " and ".join(constraints)
+
def render_find_sql_where(self, session, *args):
pass
@@ -218,6 +221,9 @@
return writer.to_string()
+ def get_sql_where_constraints(self, session, *args):
+ return list()
+
def get_sql_values(self, session, *args):
return None
17 years, 1 month
rhmessaging commits: r3208 - mgmt/trunk/wooly/python/wooly.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2009-03-24 14:55:40 -0400 (Tue, 24 Mar 2009)
New Revision: 3208
Modified:
mgmt/trunk/wooly/python/wooly/server.py
Log:
Send_response wants a message
Modified: mgmt/trunk/wooly/python/wooly/server.py
===================================================================
--- mgmt/trunk/wooly/python/wooly/server.py 2009-03-24 18:50:37 UTC (rev 3207)
+++ mgmt/trunk/wooly/python/wooly/server.py 2009-03-24 18:55:40 UTC (rev 3208)
@@ -177,7 +177,7 @@
def send_error(self, response, headers, session):
headers.append(("Content-Type", "text/plain"))
- self.send_response(response, headers, session)
+ self.send_response(response, headers, session, "500 Internal Error")
writer = Writer()
writer.write("APPLICATION ERROR\n")
17 years, 1 month