[rhmessaging-commits] rhmessaging commits: r2250 - mgmt/trunk/cumin/python/cumin.
rhmessaging-commits at lists.jboss.org
rhmessaging-commits at lists.jboss.org
Tue Aug 5 16:51:01 EDT 2008
Author: eallen
Date: 2008-08-05 16:51:01 -0400 (Tue, 05 Aug 2008)
New Revision: 2250
Modified:
mgmt/trunk/cumin/python/cumin/queue.py
mgmt/trunk/cumin/python/cumin/queue.strings
Log:
Added QueueBindingAdd
Modified QueueBindingSet to be a phased set
Modified: mgmt/trunk/cumin/python/cumin/queue.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/queue.py 2008-08-05 20:48:37 UTC (rev 2249)
+++ mgmt/trunk/cumin/python/cumin/queue.py 2008-08-05 20:51:01 UTC (rev 2250)
@@ -1,6 +1,6 @@
import pdb, logging
-from mint import *
+from mint.schema import Queue, Journal, Exchange
from wooly import *
from wooly.widgets import *
from wooly.forms import *
@@ -9,6 +9,7 @@
from datetime import datetime
from sqlobject.sqlbuilder import LEFTJOINOn
+from binding import *
from exchange import ExchangeInputSet
from stat import *
from widgets import *
@@ -201,6 +202,9 @@
self.purge = QueuePurge(app, "purge")
self.add_mode(self.purge)
+
+ self.queue_binding_add = QueueBindingAdd(app, "queuebindingadd")
+ self.add_mode(self.queue_binding_add)
remove = QueueRemove(app, "remove")
self.add_mode(remove)
@@ -209,6 +213,9 @@
def show_purge(self, session):
return self.show_mode(session, self.purge)
+ def show_queue_binding_add(self, session):
+ return self.show_mode(session, self.queue_binding_add)
+
def render_href(self, session, queue):
if queue:
return super(QueueFrame, self).render_href(session, queue)
@@ -272,33 +279,56 @@
data = "model.xml?class=queue;id=%i" % queue.id
return "wooly.setIntervalUpdate('%s', updateQueue, 3000)" % data
-class QueueBindingSet(BindingSet):
- def get_args(self, session):
- return self.frame.get_args(session)
+class QueueBindingSet(BindingSet, Form):
+ def __init__(self, app, name):
+ super(QueueBindingSet, self).__init__(app, name)
- def render_title(self, session, queue):
- count = fmt_count(self.get_item_count(session, queue))
- return "Exchange Bindings %s" % count
+ self.__remove = self.Remove(app, "remove", self)
+ self.add_child(self.__remove)
+
+ def get_name_col(self, app):
+ return self.NameColumn(app, "e_id")
- def get_item_count(self, session, queue):
- return queue.bindings.count()
+ def render_add_queue_binding_url(self, session, vhost):
+ branch = session.branch()
+ self.frame.show_queue_binding_add(branch)
+ return branch.marshal()
+
+ def render_sql_where(self, session, queue):
+ elems = list()
+ elems.append("b.queue_id = %(id)r")
+ elems.append(self.phase.get_sql_constraint(session, queue))
+ return "where %s" % " and ".join(elems)
- def do_get_items(self, session, queue):
- bindings = queue.bindings
+ def render_title(self, session, queue):
+ return "Exchange Bindings %s" % \
+ fmt_count(queue.bindings.count())
- start, end = self.get_bounds(session)
- bindings = bindings[start:end]
+ class NameColumn(SqlTableColumn):
+ def render_title(self, session, data):
+ return "Exchange"
- return bindings
+ def render_content(self, session, data):
+ exchange = Identifiable(data["e_id"])
+ branch = session.branch()
+ self.frame.frame.show_exchange(branch, exchange).show_view(branch)
+ name = Exchange.get(data["e_id"]).name or "<em>Default</em>"
+ return fmt_olink(branch, exchange, name=name)
- def render_item_href(self, session, binding):
- branch = session.branch()
- self.frame.frame.show_exchange(branch, binding.exchange)
- return branch.marshal()
-
- def render_item_name(self, session, binding):
- return binding.exchange.name or "<em>Default</em>"
+ class Remove(FormButton):
+ def process_submit(self, session):
+ ids = self.parent.ids.get(session)
+ self.parent.ids.clear(session)
+ queue = self.frame.get_args(session)[0]
+ branch = session.branch()
+ frame = self.frame.frame.show_queue_bindings_remove(branch, queue)
+ frame.ids.set(branch, ids)
+ self.page.set_redirect_url(session, branch.marshal())
+
+ def render_content(self, session):
+ return "Remove"
+
class QueueForm(CuminFieldForm):
def __init__(self, app, name):
super(QueueForm, self).__init__(app, name)
@@ -318,108 +348,11 @@
self.bindings = ExchangeKeysField(app, "bindings", self)
self.add_field(self.bindings)
-
-class ExchangeKeysInput(FormInput):
- def __init__(self, app, name, form):
- super(ExchangeKeysInput, self).__init__(app, name, form)
-
- self.name_param = Parameter(app, "name_param");
- self.add_parameter(self.name_param)
- form.add_form_parameter(self.name_param)
+ def validate(self, session, queue_name):
+ super_error = super(QueueForm, self).validate(session)
+ (errors, form_binding_info) = self.bindings.get_binding_info(session, queue_name)
+ return (errors or super_error, form_binding_info)
- self.names = ListParameter(app, "name", self.name_param)
- self.add_parameter(self.names)
- form.add_form_parameter(self.names)
-
- self.binding_param = Parameter(app, "binding_param")
- self.add_parameter(self.binding_param)
- form.add_form_parameter(self.binding_param)
-
- self.bindings = ListParameter(app, "binding", self.binding_param)
- self.add_parameter(self.bindings)
- form.add_form_parameter(self.bindings)
-
- self.extra_param = Parameter(app, "extra_param")
- self.add_parameter(self.extra_param)
- form.add_form_parameter(self.extra_param)
-
- self.extras = ListParameter(app, "extra", self.extra_param)
- self.add_parameter(self.extras)
- form.add_form_parameter(self.extras)
-
- self.exchangekey_tmpl = Template(self, "exchangekey_html")
-
- # info to help create the <input> elements for various exchange types
- self.binding_typemap = {"direct":{"type":"text",
- "enable":"disabled='disabled'"},
- "topic":{"type":"text", "enable":None},
- "fanout":{"type":"hidden", "enable":None},
-# "headers":{"type":"text", "enable":None},
-# "xml":{"type":"hidden", "enable":None},
- }
- # exchange names to suppress
- self.binding_omit_by_name = ("", "qpid.management", "amq.match")
- self.binding_omit_by_type = ("xml", "headers")
-
- def do_render(self, session, *args):
- writer = Writer()
- # get the registration from the broker frame
- reg = self.frame.frame.get_object(session)
- vhost = reg.getDefaultVhost()
-
- sortedExchanges = sorted_by(vhost.exchanges)
- # render a row for each exchange we support
- for exchange in sortedExchanges:
- if not exchange.name in self.binding_omit_by_name:
- if not exchange.type in self.binding_omit_by_type:
- self.exchangekey_tmpl.render(writer, session, exchange)
-
- return writer.to_string()
-
- def render_exchange_name(self, session, exchange):
- return exchange.name
-
- def render_exchange_fmt_name(self, session, exchange):
- return fmt_shorten(exchange.name)
-
- def render_exchange_path(self, session, *args):
- return self.names.path
-
- def render_exchange_id(self, session, exchange):
- return exchange.id
-
- def render_binding_path(self, session, exchange):
- return self.bindings.path
-
- def render_exchange_type(self, session, exchange):
- return exchange.type
-
- def render_binding_input_type(self, session, exchange):
- return self.binding_typemap[exchange.type]["type"]
-
- def render_binding_disabled(self, session, exchange):
- return self.binding_typemap[exchange.type]["enable"]
-
-class ExchangeKeysField(FormField):
- def __init__(self, app, name, form):
- super(ExchangeKeysField, self).__init__(app, name, form)
-
- self.__input = ExchangeKeysInput(app, "inputs", form)
- self.add_child(self.__input)
- self.inputs = self.__input
-
- def render_title(self, session):
- return "Exchange Bindings:"
-
- def render_exchange_keys(self, session, *args):
- return self.__input.render(session)
-
- def render_exchange_path(self, session, *args):
- return self.inputs.names.path
-
- def render_queue_name_path(self, session, *args):
- return self.inputs.form.namef.get_parameter().path
-
class QueueAdd(QueueForm):
def process_cancel(self, session):
branch = session.branch()
@@ -427,45 +360,31 @@
self.page.set_redirect_url(session, branch.marshal())
def process_submit(self, session):
- errors = self.validate(session)
+ queue_name = self.namef.get(session)
+ durable = self.durable.get(session)
+ exclusive = self.exclusive.get(session)
+ autodelete = self.autodelete.get(session)
+ (errors, form_binding_info) = self.validate(session, queue_name)
if errors:
pass
else:
+ # since we are adding a queue, we don't have
+ # an existing queue to pass, so create a
+ # blank one
+ queue = Queue()
+ queue.name = queue_name
+ queue.durable = (durable == "durable")
+ queue.exclusive = (exclusive == "exclusive")
+ queue.autoDelete = (autodelete == "autodel")
reg = self.frame.get_object(session)
- vhost = reg.getDefaultVhost()
- queue_name = self.namef.get(session)
- durable = self.durable.get(session)
- exclusive = self.exclusive.get(session)
- autodelete = self.autodelete.get(session)
- binding_names = self.bindings.inputs.names.get(session)
- binding_keys = self.bindings.inputs.bindings.get(session)
- #assumes a 1:1 correlation between names and keys
- exchange_keys = dict(zip(binding_names, binding_keys))
-
- # sanity check: this should have been handled by the javascript
- # on the form submit
- for binding_name in binding_names:
- exchange = self.__get_exchange_named(binding_name, vhost.exchanges)
- if exchange.type == 'direct':
- exchange_keys[exchange.name] = queue_name
-
args = {
- "queue": queue_name,
- "durable": durable,
- "exclusive": exclusive,
- "auto_delete": autodelete,
- "exchange_keys": exchange_keys
- }
- log.info("Adding queue:\n\tname: \
- '%s'\n\tdurablility: \
- %s\n\texclusivity: \
- %s\n\tlongevity: %s" % \
- (queue_name, durable, exclusive, autodelete) )
+ "exchange_keys": form_binding_info,
+ "reg": reg}
action = self.app.model.queue.add
- action.invoke(reg, args)
+ action.invoke(queue, args)
# navigate back to main queue frame
self.process_cancel(session)
@@ -474,11 +393,6 @@
reg = self.frame.get_object(session)
return "Add Queue to the Broker '%s'" % reg.name
- def __get_exchange_named(self, name, exchanges):
- for exchange in exchanges:
- if exchange.name == name:
- return exchange
-
class QueueRemove(CuminConfirmForm):
def get_args(self, session):
return self.frame.get_args(session)
@@ -545,6 +459,7 @@
def render_item_content(self, session, id):
return "Purge Queue '%s'" % Queue.get(id).name
+
class QueueSetRemove(CuminBulkActionForm):
def process_return(self, session):
branch = session.branch()
@@ -563,54 +478,97 @@
def render_item_content(self, session, id):
return "Remove Queue '%s'" % Queue.get(id).name
-class QueueBindingAdd(CuminForm):
- def __init__(self, app, name):
- super(QueueBindingAdd, self).__init__(app, name)
+class BindSummaryPropertiesField(FormField):
+ def __init__(self, app, name, form):
+ super(BindSummaryPropertiesField, self).__init__(app, name, form)
- self.exchanges = self.Exchanges(app, "exchanges", self)
- self.add_child(self.exchanges)
+ self.sum_props = self.SummaryProperties(app, "properties")
+ self.add_child(self.sum_props)
- self.binding_key = TextInput(app, "binding_key", self)
- self.add_child(self.binding_key)
+ self.prop_tmpl = Template(self, "properties_html")
+
+ class SummaryProperties(CuminProperties):
+ def do_get_items(self, session, queue):
+ return [("Name:", queue.name),
+ ("Durable:", queue.durable),
+ ("Exclusive:", queue.exclusive),
+ ("Auto-Delete:", queue.autoDelete)]
+ def render_inputs(self, session, *args):
+ writer = Writer()
+ self.prop_tmpl.render(writer, session, args)
+ return writer.to_string()
+
+ def render_prop_items(self, session, args):
+ return self.sum_props.render_items(session, *args)
+
def get_args(self, session):
- return self.frame.get_args(session)
-
- def process_cancel(self, session, queue):
- branch = session.branch()
- self.page.show_queue(branch, queue).show_view(branch)
- self.page.set_redirect_url(session, branch.marshal())
+ return (self.frame.frame.get_object(session),)
- def validate(self, session):
- valid = True
+class QueueBindingAdd(CuminFieldForm):
+ def __init__(self, app, name):
+ super(QueueBindingAdd, self).__init__(app, name)
- if not self.binding_key.get(session):
- valid = False
- self.binding_key.add_error(session, """
- The binding key is empty; it is required
- """)
+ self.props = BindSummaryPropertiesField(app, "props", self)
+ self.add_field(self.props)
- if not self.exchanges.get(session):
- valid = False
- self.exchanges.add_error(session, """
- No exchange selected; it is required
- """)
+ self.bindings = ExchangeKeysField(app, "bindings", self, title="Bind to Exchange:")
+ self.add_field(self.bindings)
+
+ self.errors = self.Errors(self, "errors")
+ self.add_attribute(self.errors)
- return valid
+ def render_form_error(self, session, *args):
+ errors = self.errors.get(session)
+ if "no_exchanges" in errors:
+ return "<ul class=\"errors\" style=\"margin:0; float:left;\"><li>%s</li></ul>" % \
+ "</li><li>".join(errors["no_exchanges"])
+
+ def process_cancel(self, session):
+ branch = session.branch()
+ self.frame.show_view(branch)
+ self.page.set_redirect_url(session, branch.marshal())
- def process_submit(self, session, queue):
- if self.validate(session):
- raise Exception("Not implemented")
+ def process_submit(self, session):
+ queue = self.frame.get_object(session)
+ (errors, form_binding_info) = self.bindings.get_binding_info(session, queue.name)
- self.process_cancel(session, queue)
+ if not len(form_binding_info):
+ # no exhchanges were selected is not an
+ # error that ExchangeKeysField looks for
+ errors = self.errors.get(session)
+ errs = errors.setdefault("no_exchanges", list())
+ errs.append("At least one exchange must be selected")
+ errors = True
+
+ if errors:
+ pass
+ else:
+ reg = self.frame.frame.get_object(session)
+ 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)
- def render_title(self, session, queue):
- return "Add Binding to Queue '%s'" % queue.name
+ def render_title(self, session, *args):
+ queue = self.frame.get_object(session)
+ return "Add Binding to the Queue '%s'" % queue.name
- class Exchanges(ExchangeInputSet):
- def do_get_items(self, session, queue):
- return sorted_by(queue.virtual_host.exchange_items())
+ def find_match_value(self, binding_info, this_exchange, match_info):
+ for m_info in binding_info[this_exchange]:
+ if m_info.startswith(match_info):
+ if m_info.endswith("nv"):
+ return binding_info[this_exchange][m_info]
+ class Errors(Attribute):
+ def get_default(self, session):
+ return dict()
+
class QueueBindingRemove(CuminConfirmForm):
def get_args(self, session):
return self.frame.get_args(session)
@@ -815,3 +773,4 @@
def render_item_unacked_messages(self, session, consumer):
return self.app.model.consumer.unackedMessages.value(consumer)
+
Modified: mgmt/trunk/cumin/python/cumin/queue.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/queue.strings 2008-08-05 20:48:37 UTC (rev 2249)
+++ mgmt/trunk/cumin/python/cumin/queue.strings 2008-08-05 20:51:01 UTC (rev 2250)
@@ -126,58 +126,54 @@
//throw new Error();
}
-[QueueBindingSet.html]
-<div class="rfloat">{page}</div>
-<ul class="radiotabs"> </ul>
+[QueueBindingSet.sql]
+select
+ b.id,
+ b.exchange_id as e_id,
+ b.binding_key as key
+from binding as b
+left outer join binding_stats as c on c.id = b.stats_curr_id
+{sql_where}
+{sql_orderby}
+{sql_limit}
-<table class="QueueBindingSet mobjects">
- <tr>
- <th>Exchange</th>
- <th>Key</th>
- <th class="ralign" colspan="2">Messages Matched</th>
- </tr>
+[QueueBindingSet.count_sql]
+select count(*)
+from binding as b
+left outer join binding_stats as c on c.id = b.stats_curr_id
+{sql_where}
- {items}
-</table>
+[QueueBindingSet.html]
+<form id="{id}" method="post" action="?">
-[QueueBindingSet.item_html]
-<tr>
- <td><a href="{item_href}">{item_name}</a></td>
- <td>{item_binding_key}</td>
- <td class="ralign">{item_messages_matched_rate}</td>
- <td class="ralign">{item_messages_matched}</td>
-</tr>
-
-[QueueBindingAdd.html]
-<form id="{id}" class="mform" method="post" action="?">
- <div class="head">
- <h1>{title}</h1>
- </div>
- <div class="body">
- <span class="legend">Exchange</span>
- <fieldset>{exchanges}</fieldset>
-
- <span class="legend">Binding Key</span>
- <fieldset>
- <div class="field">{binding_key}</div>
- </fieldset>
-
- {hidden_inputs}
- </div>
- <div class="foot">
- <a class="help action" href="{help_href}" target="help">Help</a>
- {submit}
- {cancel}
- </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>
</form>
-<script type="text/javascript" defer="defer">
-(function() {
- var elem = wooly.doc().elembyid("{id}").node.elements[1];
- elem.focus();
- elem.select();
-}())
-</script>
+[ExchangeBindingSet.item_html]
+<tr>{cells}</tr>
+
[QueueStats.html]
<ul class="radiotabs tabs">{tabs}</ul>
<div class="radiotabs mode">{mode}</div>
@@ -280,105 +276,11 @@
<td class="ralign">{item_unacked_messages}</td>
</tr>
-[QueueAdd.css]
-td.exchange_type {
- font-style: italic;
-}
-
-[QueueAdd.javascript]
-var direct_keys = [];
-var queue_name_field = null;
-
-function attach_submit() {
- var theForm = document.forms[0];
- addEvent(theForm, "submit", associate_keys);
-
- // get list of binding key fields that are 'direct'
- // and add a listener to echo the queue_name
- var inputs = document.getElementsByTagName("input");
- if (inputs) {
- for (var i=0; i<inputs.length; i++) {
- if (inputs[i].className.indexOf("binding_class_direct") != -1) {
- direct_keys[direct_keys.length] = inputs[i];
- }
- }
- var oQueueName = document.forms[0].elements[queue_name];
- if (oQueueName) {
- addEvent(oQueueName, "blur", echo_queue_name);
- addEvent(oQueueName, "keyup", echo_queue_name);
- queue_name_field = oQueueName;
- }
- }
-
-}
-// When the form is submitted, make sure we can correctly associate
-// the input boxes with the checkboxes
-function associate_keys() {
-
- // get the list of exchange chechboxes
- var exchanges = document.forms[0].elements[exchange_path];
- if (exchanges) {
- for (var i=0; i<exchanges.length; i++) {
- var chk_value = exchanges[i].value;
- // get the associated input box
- var oInput = document.getElementById(chk_value);
- if (oInput) {
- oInput.disabled = false; // disabled inputs don't get submitted
- // so there should be a 1:1 relationship
- // between checked boxes and input values
- if (!exchanges[i].checked) {
- oInput.disabled = true;
- oInput.value = '';
- }
- }
- }
- }
-}
-
-// echos the queue_name field into the binding key fields of type 'direct'
-function echo_queue_name() {
- if (queue_name_field) {
- for (var i=0; i<direct_keys.length; i++) {
- direct_keys[i].value = queue_name_field.value;
- }
- }
-}
-
-[ExchangeKeysInput.exchangekey_html]
- <tr>
- <td><input type="checkbox"
- id="{id}.{exchange_id}"
- name="{exchange_path}" value="{exchange_name}" size="15"
- tabindex="100"/></td>
- <td><label for="{id}.{exchange_id}">{exchange_fmt_name}</label></td>
- <td class="exchange_type">{exchange_type}</td>
- <td><input class="binding_class_{exchange_type}"
- type="{binding_input_type}"
- name="{binding_path}" id="{exchange_name}"
- value="" size="32" maxlength="256" tabindex="100" {binding_disabled}/></td>
- </tr>
-
-[ExchangeKeysField.html]
-<div class="field">
- <div class="title">{title}</div>
-
-<div class="inputs">
-<table class="mobjects">
- <thead>
- <tr>
- <th colspan="2">Exchange Name</th>
- <th>Exchange Type</th>
- <th>Binding Key</th>
- </tr>
- </thead>
- <tbody>
- {exchange_keys}
- </tbody>
-</table>
+[BindSummaryPropertiesField.properties_html]
+<div class="properties" style="width:80%">
+ <table class="PropertySet">
+ <tbody>
+ {prop_items}
+ </tbody>
+ </table>
</div>
-</div>
-<script type="text/javascript">
- var exchange_path="{exchange_path}";
- var queue_name="{queue_name_path}";
- addEvent(window, 'load', attach_submit);
-</script>
More information about the rhmessaging-commits
mailing list