[rhmessaging-commits] rhmessaging commits: r3210 - mgmt/trunk/cumin/python/cumin.
rhmessaging-commits at lists.jboss.org
rhmessaging-commits at lists.jboss.org
Wed Mar 25 14:55:23 EDT 2009
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}
-
More information about the rhmessaging-commits
mailing list