Author: eallen
Date: 2011-02-07 16:44:47 +0000 (Mon, 07 Feb 2011)
New Revision: 4505
Added:
trunk/cumin/python/cumin/grid/quota.py
trunk/cumin/python/cumin/grid/quota.strings
Modified:
trunk/cumin/model/cumin.xml
trunk/cumin/model/rosemary.xml
trunk/cumin/python/cumin/grid/negotiator.py
trunk/cumin/python/cumin/grid/negotiator.strings
trunk/cumin/python/cumin/grid/pool.py
trunk/cumin/python/cumin/model.py
trunk/cumin/python/cumin/session.py
Log:
Use an ObjectAdapter and ObjectSelector for quotas to facilitate csv export, exception
handling, and feedback to user.
Modified: trunk/cumin/model/cumin.xml
===================================================================
--- trunk/cumin/model/cumin.xml 2011-02-04 17:46:17 UTC (rev 4504)
+++ trunk/cumin/model/cumin.xml 2011-02-07 16:44:47 UTC (rev 4505)
@@ -41,5 +41,11 @@
<property name="GlobalJobId" type="sstr"/>
<property name="JobId" type="sstr"/>
</class>
+
+ <class name="Quota" storage="none">
+ <property name="id" type="sstr"/>
+ <property name="Name" type="sstr"/>
+ <property name="Quota" type="sstr"/>
+ </class>
</package>
</model>
Modified: trunk/cumin/model/rosemary.xml
===================================================================
--- trunk/cumin/model/rosemary.xml 2011-02-04 17:46:17 UTC (rev 4504)
+++ trunk/cumin/model/rosemary.xml 2011-02-07 16:44:47 UTC (rev 4505)
@@ -19,6 +19,16 @@
<title>Job Status</title>
</property>
</class>
+
+ <class name="Quota">
+ <property name="id">
+ <title />
+ </property>
+
+ <property name="Quota">
+ <title>Dynamic Quota</title>
+ </property>
+ </class>
</package>
<package name="org.apache.qpid.broker">
Modified: trunk/cumin/python/cumin/grid/negotiator.py
===================================================================
--- trunk/cumin/python/cumin/grid/negotiator.py 2011-02-04 17:46:17 UTC (rev 4504)
+++ trunk/cumin/python/cumin/grid/negotiator.py 2011-02-07 16:44:47 UTC (rev 4505)
@@ -1,22 +1,16 @@
-from wooly import *
-from wooly.forms import *
-from wooly.resources import *
-from wooly.tables import *
-from wooly.widgets import *
+from wooly.util import StringCatalog, Writer
+import logging
+from cumin.objectframe import ObjectFrame, ObjectFrameTaskForm, ObjectFrameTask
+from cumin.objectselector import ObjectSelector, ObjectLinkColumn,\
+ MonitorSelfStatColumn
+from wooly import Widget, Attribute, Parameter
+from parsley.stringex import rpartition
+from cumin.parameters import RosemaryObjectParameter
+from wooly.parameters import ListParameter
+from wooly.template import WidgetTemplate
+from cumin.stat import StatFlashChart
+from cumin.model import QmfCall
-from cumin.formats import *
-from cumin.model import FetchRawConfigSet
-from cumin.objectframe import *
-from cumin.objectselector import *
-from cumin.parameters import *
-from cumin.stat import *
-from cumin.util import *
-from cumin.widgets import *
-
-from parsley.stringex import partition, rpartition
-
-from daemon import *
-
strings = StringCatalog(__file__)
log = logging.getLogger("cumin.grid.negotiator")
@@ -26,8 +20,6 @@
super(NegotiatorFrame, self).__init__(app, name, cls)
- #self.edit_dynamic_quota = NegotiatorEditDynamicQuota(app, self)
-
class NegotiatorSelector(ObjectSelector):
def __init__(self, app, name, pool):
cls = app.model.com_redhat_grid.Negotiator
@@ -51,10 +43,6 @@
self.add_column(stat)
stat = MonitorSelfStatColumn(app, cls.MonitorSelfImageSize.name,
cls.MonitorSelfImageSize)
self.add_column(stat)
- #stat = MonitorSelfStatColumn(app, cls.MonitorSelfRegisteredSocketCount.name,
cls.MonitorSelfRegisteredSocketCount)
- #self.add_column(stat)
- #stat = MonitorSelfStatColumn(app, cls.MonitorSelfResidentSetSize.name,
cls.MonitorSelfResidentSetSize)
- #self.add_column(stat)
stat = MonitorSelfStatColumn(app, cls.MonitorSelfTime.name, cls.MonitorSelfTime)
self.add_column(stat)
@@ -65,229 +53,6 @@
self.enable_csv_export(pool)
-class QmfGroupColumn(ItemTableColumn):
- def __init__(self, app, name, getter, negotiator, task):
- super(QmfGroupColumn, self).__init__(app, name)
-
- self.header_class = StaticTableColumnHeader
-
- self.title = None
- self.getter = getter
- #self.align = "right"
- self.user = False
- self.negotiator = negotiator
- self.task = task
- self.user_task = None
-
- def render_title(self, session, *args):
- return self.title
-
- def render_content(self, session, group):
- data = self.getter(session)
- for x in data:
- if x[0] == group:
- return self.render_data(session, x)
-
- return ""
-
- def render_data(self, session, data):
- href = self.task.get_href(session)
- content = data[2][2] and str(data[1]) or "NOT SET"
- return fmt_link(href, content, "", "",
self.fmt_hover(data[0]))
-
- def fmt_hover(self, group):
- return "Edit the %s" % self.title
-
-class NegotiatorOverview(ItemTable):
- def __init__(self, app, name, negotiator, frame):
- super(NegotiatorOverview, self).__init__(app, name)
-
- self.negotiator = negotiator
-
- self.update_enabled = True
- #self.defer_enabled = True
-
- self.group_helper = GroupHelper(app, "groups", negotiator)
- self.add_child(self.group_helper)
-
- self.expand = Parameter(app, "expand")
- self.add_parameter(self.expand)
-
- col = self.ExpandColumn(app, "expand_col", self.expand)
- col.header_class = ItemTableColumnHeader
- col.width = "20px"
- self.add_column(col)
-
- col = self.GroupColumn(app, "group")
- self.add_column(col)
- self.set_default_column(col)
-
- task = frame.edit_dynamic_quota
- col = self.DynamicColumn(app, "dynamic", None, negotiator, task)
- col.title = "Dynamic Quota"
- self.add_column(col)
-
- col = self.SpacerColumn(app, "spacer")
- self.add_column(col)
-
- self.error_tmpl = WidgetTemplate(self, "error_html")
- self.loading_tmpl = WidgetTemplate(self, "deferred_html")
-
- def render_title(self, session):
- return "Quotas"
-
- def render_class(self, session):
- return "class=\"mobjects\""
-
- def render_deferred_content(self, session):
- return "Loading..."
-
- def do_render(self, session):
- tmpl = self.error_tmpl
- msg = None
-
- try:
- info = self.group_helper.get_config_info(session)
- except AssertionError:
- msg = "Missing negotiator"
- except Exception, e:
- msg = len(e.args) > 0 and e.args[0] or ""
- if msg == "Loading":
- tmpl = self.loading_tmpl
- else:
- neg = self.negotiator.get(session)
- neg_name = neg and " for negotiator %s" % neg.Name or
""
- msg = "%s%s" % (e, neg_name)
- log.exception(e)
- else:
- return super(NegotiatorOverview, self).do_render(session)
-
- writer = Writer()
- if "is unknown" in msg:
- msg = "Please try again later"
- err_msg = "The data is not available at this time. <br/>%s" %
msg
- tmpl.render(writer, session, err_msg)
- return writer.to_string()
-
- def render_error_msg(self, session, msg):
- return msg
-
- def do_get_items(self, session):
- info = self.group_helper.get_config_info(session)
-
- names = list(info)
- names = sorted(names)
- if self.reversed.get(session):
- names = reversed(names)
-
- expanded = self.expand.get(session)
-
- # make a list of groups to show based on what is expanded
- parent = expanded and self.group_helper.get_parent(session, expanded) or None
- items = list()
- for name in names:
- # always show top level groups
- if "." not in name:
- items.append(name)
- # add the current expanded item
- elif expanded == name:
- items.append(name)
- # add the ancestors
- elif expanded and expanded.startswith(name+"."):
- items.append(name)
- # add the direct children of expanded item
- elif expanded and name.startswith(expanded+"."):
- sub_name = name[len(expanded) + 1:]
- if "." not in sub_name:
- items.append(name)
- # and direct children of expanded item's parent
- elif parent and name.startswith(parent+"."):
- sub_name = name[len(parent) + 1:]
- if "." not in sub_name:
- items.append(name)
-
- self.group_helper.get_config_for_groups(session, "GROUP_QUOTA_DYNAMIC",
items)
-
- return items
-
- class ExpandColumn(ItemTableColumn):
- def __init__(self, app, name, expand):
- super(NegotiatorOverview.ExpandColumn, self).__init__(app, name)
-
- self.expand = expand
-
- def render_title(self, session, *args):
- return ""
-
- def get_class_list(self, session):
- return ["expand"]
-
- def render_content(self, session, group):
- if not self.parent.group_helper.has_child(session, group):
- return ""
-
- info = self.parent.group_helper.get_config_info(session)
- # return a " or - depending on current expand
- expand = self.expand.get(session)
- if expand and expand.startswith(group):
- state = "-"
- else:
- state = "+"
-
- parent = self.parent.group_helper.get_parent(session, group)
- return self.render_item_link(session, group, parent, state)
-
- def render_item_link(self, session, group, parent, state):
- branch = session.branch()
-
- next_expand = state == "+" and group or parent
- self.expand.set(branch, next_expand)
-
- hover = state == "-" and "Collapse" or
"Expand"
- cls = "action"
-
- return fmt_link(branch.marshal(), state, class_=cls, link_title=hover)
-
- class GroupColumn(NonSortableTableColumn):
- def render_title(self, session, *args):
- return "Name"
-
- def render_content(self, session, group):
- # if a user
- if "." in group:
- parts = group.split('.')
- indent = len(parts) - 1
- user = parts[indent]
- return "<span style='padding-left:
%dem;'>%s</span>" % (indent, user)
-
- return group
-
- class DynamicColumn(QmfGroupColumn):
- def render_content(self, session, group):
- value = self.parent.group_helper.get_config_value(session, group,
"GROUP_QUOTA_DYNAMIC")
- self.task.form.group_leader.set(session, group)
-
- try:
- fval = float(value)
- except ValueError:
- return value
- except TypeError:
- if isinstance(value, Exception):
- content = "<span
class='QuotaError'>error</span>"
- val = len(value.args) > 0 and value.args[0] or ""
- return fmt_link("#", content, "", "",
val)
-
- href = self.task.get_href(session)
- content = "%s%%" % str(round(fval * 100.0, 2))
- return fmt_link(href, content, "", "",
self.fmt_hover(""))
-
- class SpacerColumn(ItemTableColumn):
- def render_title(self, session, *args):
- return ""
-
- def render_content(self, session, _):
- return ""
-
class GroupHelper(Widget):
def __init__(self, app, name, negotiator):
super(GroupHelper, self).__init__(app, name)
@@ -300,37 +65,50 @@
self.loading = Attribute(app, "loading")
self.add_attribute(self.loading)
+ self.results = Attribute(app, "results")
+ self.add_attribute(self.results)
+
def get_config_info(self, session):
negotiator = self.negotiator.get(session)
info = self.info.get(session)
if not info:
- results = self.app.model.get_negotiator_group_names(negotiator)
- groups = results.data
+ info = self.get_group_info(session, negotiator)
+ self.info.set(session, info)
+ return info
+
+ def get_group_info(self, session, negotiator):
+ results = self.app.model.get_negotiator_group_names(negotiator)
+ groups = results.data
+ info = dict()
+
+ if not groups:
+ if (not results.status) and (not results.exception):
+ results.exception = Exception("Loading")
+
+ if not results.exception:
if not groups:
- if (not results.status) and (not results.exception):
- raise Exception("Loading")
- if results.exception:
- raise results.exception
- else:
- if not groups:
- raise Exception(results.status)
- try:
- groups = self.split_group_names(groups)
- except Exception, e:
- log.exception(e)
- groups = []
+ results.exception = Exception(results.status)
+ try:
+ groups = self.split_group_names(groups)
+ except Exception, e:
+ log.exception(e)
+ groups = []
- info = dict()
+ if groups:
for group in groups:
info[group] = dict()
- self.info.set(session, info)
+ self.results.set(session, results)
return info
+ def get_results(self, session):
+ self.get_config_info(session)
+ return self.results.get(session)
+
def has_child(self, session, group):
negotiator = self.negotiator.get(session)
info = self.get_config_info(session)
@@ -440,44 +218,6 @@
val = min(1.0, val)
return val
-class GroupAddForm(ObjectFrameTaskForm):
- def __init__(self, app, name, task):
- super(GroupAddForm, self).__init__(app, name, task)
-
- self.defer_enabled = True
-
- self.group_helper = GroupHelper(app, "groups", self.object)
- self.add_child(self.group_helper)
-
- self.group_name = NameField(app, "name")
- self.add_field(self.group_name)
-
- def render_title(self, session):
- return "Add Group"
-
- def process_submit(self, session):
- negotiator = self.object.get(session)
- group_name = self.group_name.get(session)
- original_groups = self.group_helper.get_group_names(session)
-
- if self.is_valid(group_name):
- if group_name not in original_groups:
- original_groups.append(group_name)
- new_groups = ", ".join(original_groups)
- self.task.invoke(session, negotiator, "GROUP_NAMES",
new_groups)
- self.task.reconfig(negotiator)
-
- info = self.group_helper.get_config_info(session)
- info[group_name] = dict()
-
- self.task.exit_with_redirect(session)
-
- def is_valid(self, group):
- ret = False
- if len(group) and not "." in group and not " " in group:
- ret = True
- return ret
-
class GroupForm(ObjectFrameTaskForm):
def __init__(self, app, name, task):
super(GroupForm, self).__init__(app, name, task)
@@ -515,107 +255,6 @@
def render_form_class(self, session):
return ""
-class EditPrioFactorForm(GroupForm):
- def __init__(self, app, name, task):
- super(EditPrioFactorForm, self).__init__(app, name, task)
-
- self.field_tmpl = WidgetTemplate(self, "field_html")
-
- factor = Parameter(app, "factor")
- self.add_parameter(factor)
-
- self.factors = ListParameter(app, "factors", factor)
- self.add_parameter(self.factors)
-
- def render_title(self, session):
- return "Edit Group Priority Factor"
-
- def render_form_class(self, session):
- return "PrioFactorForm"
-
- def render_data_col_header(self, session):
- return "Priority Factor"
-
- def render_chart(self, session):
- return None
-
- def render_groups(self, session):
- writer = Writer()
-
- groups = self.group_helper.get_priority_factor(session)
- for group in groups:
- self.field_tmpl.render(writer, session, group)
-
- return writer.to_string()
-
- def render_factor_name(self, session, group):
- return self.factors.path
-
- def render_factor_value(self, session, group):
- return group[2][2] and group[1] or "--NOT SET--"
-
- def process_submit(self, session):
- negotiator = self.object.get(session)
- factors = self.factors.get(session)
- group_names = self.group_names.get(session)
- original_values = self.original_values.get(session)
-
- changed = False
- for group, new_value, original_value in zip(group_names, factors,
original_values):
- if new_value != original_value:
- if self.is_valid_factor(new_value):
- self.task.invoke(session, negotiator,
"GROUP_PRIO_FACTOR_"+group, new_value)
- changed = True
- if changed:
- self.task.reconfig(negotiator)
- self.task.exit_with_redirect(session)
-
- def is_valid_factor(self, value):
- try:
- factor = float(value)
- except:
- return False
- return factor >= 1.0
-
-class UserPrioFactorForm(EditPrioFactorForm):
- def __init__(self, app, name, task):
- super(UserPrioFactorForm, self).__init__(app, name, task)
-
- self.group = Parameter(app, "group")
- self.add_parameter(self.group)
-
- def render_title(self, session):
- return "Edit User Priority Factor"
-
- def render_groups(self, session):
- writer = Writer()
-
- group = self.group.get(session)
- users = list(self.group_helper.get_priority_factor(session, [group], True))
- for user in users:
- self.field_tmpl.render(writer, session, user)
-
- return writer.to_string()
-
- def render_form_class(self, session):
- return "UserPrioFactorForm"
-
- def process_submit(self, session):
- negotiator = self.object.get(session)
- factors = self.factors.get(session)
- group = self.group.get(session)
- original_values = self.original_values.get(session)
-
- changed = False
- for user, new_value, original_value in zip([group], factors, original_values):
- if new_value != original_value:
- if self.is_valid_factor(new_value):
- self.task.invoke(session, negotiator,
"GROUP_PRIO_FACTOR_"+user, new_value)
- changed = True
- if changed:
- self.task.reconfig(negotiator)
- self.task.exit_with_redirect(session)
-
class EditDynamicQuotaForm(GroupForm):
def __init__(self, app, name, task):
super(EditDynamicQuotaForm, self).__init__(app, name, task)
@@ -721,176 +360,6 @@
return str(pri / 100)
-class EditStaticQuotaForm(GroupForm):
- def __init__(self, app, name, task):
- super(EditStaticQuotaForm, self).__init__(app, name, task)
-
- self.field_tmpl = WidgetTemplate(self, "field_html")
-
- quota = Parameter(app, "quota")
- self.add_parameter(quota)
-
- self.quotas = ListParameter(app, "quotas", quota)
- self.add_parameter(self.quotas)
-
- def render_title(self, session):
- return "Edit Static Group Quota"
-
- def render_submit_content(self, session):
- return "Change quota"
-
- def render_form_class(self, session):
- return "StaticQuotaForm"
-
- def render_data_col_header(self, session):
- return "Slots"
-
- def render_chart(self, session):
- return None
-
- def render_groups(self, session):
- writer = Writer()
-
- groups = self.group_helper.get_static_quota(session)
- for group in groups:
- self.field_tmpl.render(writer, session, group)
-
- return writer.to_string()
-
- def render_quota_name(self, session, group):
- return self.quotas.path
-
- def render_quota_value(self, session, group):
- return group[1]
-
- def process_submit(self, session):
- negotiator = self.object.get(session)
- quotas = self.quotas.get(session)
- group_names = self.group_names.get(session)
- original_values = self.original_values.get(session)
-
- changed = False
- for group, new_value, original_value in zip(group_names, quotas,
original_values):
- if new_value != original_value:
- self.task.invoke(session, negotiator, "GROUP_QUOTA_"+group,
new_value)
- changed = True
- if changed:
- self.task.reconfig(negotiator)
- self.task.exit_with_redirect(session)
-
-class EditRegroupForm(GroupForm):
- def __init__(self, app, name, task):
- super(EditRegroupForm, self).__init__(app, name, task)
-
- self.field_tmpl = WidgetTemplate(self, "field_html")
-
- self.regroup = DictParameter(app, "regroup")
- self.add_parameter(self.regroup)
-
- original_regroup = Parameter(app, "or")
- self.add_parameter(original_regroup)
-
- self.original_regroups = ListParameter(app, "original_regroups",
original_regroup)
- self.add_parameter(self.original_regroups)
-
- def render_title(self, session):
- return "Edit Autoregroup"
-
- def render_form_class(self, session):
- return "StaticQuotaForm"
-
- def render_data_col_header(self, session):
- return "Autoregroup"
-
- def render_chart(self, session):
- return None
-
- def render_groups(self, session):
- writer = Writer()
-
- regroups = list(self.group_helper.get_regroups(session))
- autoregroup = self.group_helper.get_autoregroup(session)
- autoregroup[0][0] = "Default"
- regroups.append(autoregroup[0])
- for regroup in regroups:
- self.field_tmpl.render(writer, session, regroup)
-
- return writer.to_string()
-
- def render_regroup_selected_TRUE(self, session, regroup):
- if regroup[2][2]:
- return (regroup[1] == 'TRUE') and
"checked=\"checked\"" or ""
-
- def render_regroup_selected_FALSE(self, session, regroup):
- if regroup[2][2]:
- return (regroup[1] == 'FALSE') and
"checked=\"checked\"" or ""
-
- def render_regroup_selected_UNDEFINED(self, session, regroup):
- if not regroup[2][2]:
- return "checked=\"checked\""
-
- def render_regroup_path(self, session, regroup):
- return self.regroup.get_instance_key(regroup[0])
-
- def render_original_regroup_path(self, session, regroup):
- return self.original_regroups.path
-
- def render_regroup_value(self, session, regroup):
- return regroup[2][2] and regroup[1] or "UNDEFINED"
-
- def process_submit(self, session):
- negotiator = self.object.get(session)
- regroup = self.regroup.get(session)
- group_names = self.group_names.get(session)
- original_regroups = self.original_regroups.get(session)
-
- changed = False
- for group, original_value in zip(group_names, original_regroups):
- if regroup[group] != original_value:
- if group == "Default":
- self.task.invoke(session, negotiator, "AUTOREGROUP",
regroup[group])
- else:
- self.task.invoke(session, negotiator,
"GROUP_AUTOREGROUP_"+group, regroup[group])
- changed = True
- if changed:
- self.task.reconfig(negotiator)
- self.task.exit_with_redirect(session)
-
-class UserRegroupForm(EditRegroupForm):
- def __init__(self, app, name, task):
- super(UserRegroupForm, self).__init__(app, name, task)
-
- self.group = Parameter(app, "group")
- self.add_parameter(self.group)
-
- def render_groups(self, session):
- writer = Writer()
-
- group = self.group.get(session)
- regroups = list(self.group_helper.get_regroups(session, [group], True))
- for regroup in regroups:
- self.field_tmpl.render(writer, session, regroup)
-
- return writer.to_string()
-
- def render_form_class(self, session):
- return "UserRegroupForm"
-
- def process_submit(self, session):
- negotiator = self.object.get(session)
- regroup = self.regroup.get(session)
- group = self.group.get(session)
- original_regroups = self.original_regroups.get(session)
-
- changed = False
- for user, original_value in zip([group], original_regroups):
- if regroup[user] != original_value:
- self.task.invoke(session, negotiator,
"GROUP_AUTOREGROUP_"+user, regroup[user])
- changed = True
- if changed:
- self.task.reconfig(negotiator)
- self.task.exit_with_redirect(session)
-
class PriorityPieChart(StatFlashChart):
def __init__(self, app, name, negotiator, group_helper, group_leader):
super(PriorityPieChart, self).__init__(app, name, negotiator)
@@ -962,36 +431,6 @@
action = QmfCall(self.app)
action.execute(negotiator, "Reconfig")
-class NegotiatorGroupAdd(NegotiatorGroupTask):
- def __init__(self, app, frame):
- super(NegotiatorGroupAdd, self).__init__(app, frame)
-
- self.form = GroupAddForm(app, self.name, self)
-
- def get_title(self, session):
- return ""
-
- def get_description(self, session):
- return "Add group"
-
-class NegotiatorEditRegroup(NegotiatorGroupTask):
- def __init__(self, app, frame):
- super(NegotiatorEditRegroup, self).__init__(app, frame)
-
- self.form = EditRegroupForm(app, self.name, self)
-
- def get_title(self, session):
- return "Edit autoregroup"
-
-class NegotiatorEditPrioFactor(NegotiatorGroupTask):
- def __init__(self, app, frame):
- super(NegotiatorEditPrioFactor, self).__init__(app, frame)
-
- self.form = EditPrioFactorForm(app, self.name, self)
-
- def get_title(self, session):
- return "Edit priority factor"
-
class NegotiatorEditDynamicQuota(NegotiatorGroupTask):
def __init__(self, app, frame):
super(NegotiatorEditDynamicQuota, self).__init__(app, frame)
@@ -1010,39 +449,3 @@
negotiator = self.frame.negotiator_attribute.get(osession)
self.form.negotiator.set(session, negotiator)
-
-class NegotiatorEditStaticQuota(NegotiatorGroupTask):
- def __init__(self, app, frame):
- super(NegotiatorEditStaticQuota, self).__init__(app, frame)
-
- self.form = EditStaticQuotaForm(app, self.name, self)
-
- def get_title(self, session):
- return "Edit static quota"
-
-class NegotiatorUserTask(NegotiatorGroupTask):
- def do_enter(self, session, osession):
- #try:
- # negotiator, group = ng
- #except:
- # raise Exception("Must supply group for user forms")
- super(NegotiatorUserTask, self).do_enter(session, osession)
- #self.form.group.set(session, group)
-
-class NegotiatorUserPrioFactor(NegotiatorUserTask):
- def __init__(self, app, frame):
- super(NegotiatorUserPrioFactor, self).__init__(app, frame)
-
- self.form = UserPrioFactorForm(app, self.name, self)
-
- def get_title(self, session):
- return "Edit user priority factor"
-
-class NegotiatorUserRegroup(NegotiatorUserTask):
- def __init__(self, app, frame):
- super(NegotiatorUserRegroup, self).__init__(app, frame)
-
- self.form = UserRegroupForm(app, self.name, self)
-
- def get_title(self, session):
- return "Edit user autoregroup"
Modified: trunk/cumin/python/cumin/grid/negotiator.strings
===================================================================
--- trunk/cumin/python/cumin/grid/negotiator.strings 2011-02-04 17:46:17 UTC (rev 4504)
+++ trunk/cumin/python/cumin/grid/negotiator.strings 2011-02-07 16:44:47 UTC (rev 4505)
@@ -1,85 +1,3 @@
-[NegotiatorOverview.css]
-div.GroupTable ul.actions {
- display: inline;
-}
-div.GroupTable div.sactions {
- padding: 0.75em;
-}
-
-th.ExpandColumn {
- width: 2em;
-}
-td.ExpandColumn a.action {
- width: 1em;
- display: block;
- text-align: center;
-}
-
-th.GroupColumn {
- width: 50%;
-}
-
-th.SpacerColumn {
- width: 25%;
-}
-
-table.mobjects th.DynamicColumn {
- white-space: nowrap;
- text-align: right;
-}
-table.mobjects td.DynamicColumn {
- text-align: right;
- padding-right: 2em;
-}
-
-span.QuotaError {
- font-style: italic;
- color: red;
-}
-
-[NegotiatorOverview.html]
-<div id="{id}" class="CuminTable GroupTable">
- <table {class}>
- <thead><tr>{headers}</tr></thead>
- <tbody>{items}</tbody>
- </table>
-</div>
-
-[NegotiatorOverview.deferred_html]
-<div id="{id}">
- <div class="deferredSpacer">Loading...</div>
-</div>
-<script type="text/javascript">
-<![CDATA[
-(function() {
- window.addEvent("domready", function () {
- setTimeout( function () { window.location.reload(); }, 5000 );
- });
-}())
-]]>
-</script>
-
-[NegotiatorOverview.error_html]
-<div id="{id}">
- <div class="TaskInvocationSet">
- <ul>
- <li>{error_msg}</li>
- </ul>
- </div>
-</div>
-
-[GroupForm.css]
-div.deferredSpacer {
- height: 10em;
- background-color: #FFFFFF;
- padding: 1em;
-}
-
-div.invalid {
- font-size: .8em;
- color: red;
-}
-
[GroupForm.html]
<form id="{id}" class="mform {form_class}" method="post"
action="?">
<div class="head">
@@ -283,196 +201,3 @@
<div class="deferredSpacer">Loading...</div>
</div>
</form>
-
-[EditStaticQuotaForm.css]
-form.StaticQuotaForm {
- width: 30em;
-}
-
-[EditStaticQuotaForm.field_html]
-<tr>
- <td>
- {group_name}
- </td>
- <td>
- <input class="validate-numeric" type="text"
name="{quota_name}" value="{quota_value}"
- size="6" tabindex="100"/>
- <!-- these are here so we don't need to reget the groups and values after a
submit -->
- <input type="hidden" name="{group_name_path}"
value="{group_name}" />
- <input type="hidden" name="{original_value_path}"
value="{quota_value}" />
- </td>
-</tr>
-
-[EditStaticQuotaForm.deferred_html]
-<form id="{id}" class="mform StaticQuotaForm"
method="post" action="?">
- <div class="head">
- <h1>{title}</h1>
- </div>
- <div class="body">
- <div class="deferredSpacer">Loading...</div>
- </div>
-</form>
-<script type="text/javascript">
-<![CDATA[
-cumin.initializeGroupForm = function () {
- var elem = $("{id}").elements[0];
- elem.focus();
-
- var myFormValidator = new FormValidator($('{id}'), {
- evaluateOnSubmit: false,
- evaluateFieldsOnBlur: false
- });
-}
-]]>
-</script>
-
-[EditPrioFactorForm.css]
-form.mform.PrioFactorForm {
- width: 32em;
-}
-form.mform.UserPrioFactorForm {
- width: 40em;
-}
-form.mform.UserRegroupForm {
- width: 48em;
-}
-
-[EditPrioFactorForm.field_html]
-<tr>
- <td>
- {group_name}
- </td>
- <td>
- <input class="validate-numeric OneOrMore" type="text"
name="{factor_name}" value="{factor_value}"
- size="10" tabindex="100"/> <div
class="invalid"></div>
- <!-- these are here so we don't need to reget the groups and values after a
submit -->
- <input type="hidden" name="{group_name_path}"
value="{group_name}" />
- <input type="hidden" name="{original_value_path}"
value="{factor_value}" />
- </td>
-</tr>
-
-[EditPrioFactorForm.deferred_html]
-<form id="{id}" class="mform PrioFactorForm"
method="post" action="?">
- <div class="head">
- <h1>{title}</h1>
- </div>
- <div class="body">
- <div class="deferredSpacer">Loading...</div>
- </div>
-</form>
-<script type="text/javascript">
-<![CDATA[
-cumin.initializeGroupForm = function () {
- var elem = $("{id}").elements[0];
- elem.focus();
-
- var myFormValidator = new FormValidator($('{id}'), {
- evaluateOnSubmit: false,
- evaluateFieldsOnBlur: false,
- onElementFail: function (el, validators) {
- var span = el.getParent("td").getElement("div");
- if (validators[0] == "validate-numeric")
- span.set('text', "Must be a number.");
- else
- span.set('text', "Must be 1.0 or greater.");
- },
- onElementPass: function (el) {
- el.getParent("td").getElement("div").set('text',
"");
- }
- });
-
- myFormValidator.add('OneOrMore', {
- errorMsg: 'Values must be 1 or greater.',
- test: function(element) {
- var val = element.get('value').toFloat();
- return (val >= 1);
- }
- });
-}
-]]>
-</script>
-
-[EditRegroupForm.field_html]
-<tr>
- <td>
- {group_name}
- <input type="hidden" name="{group_name_path}"
value="{group_name}" />
- </td>
- <td>
- <input type="radio" name="{regroup_path}"
{regroup_selected_TRUE} id="regroup_{group_name}_TRUE" value="TRUE"
/> <label for="regroup_{group_name}_TRUE">TRUE</label>
- <input type="radio" name="{regroup_path}"
{regroup_selected_FALSE} id="regroup_{group_name}_FALSE" value="FALSE"
/> <label for="regroup_{group_name}_FALSE">FALSE</label>
- <input type="radio" name="{regroup_path}"
{regroup_selected_UNDEFINED} id="regroup_{group_name}_UNDEFINED"
value="UNDEFINED" /> <label
for="regroup_{group_name}_UNDEFINED">NOT SET</label>
- <input type="hidden" name="{original_regroup_path}"
value="{regroup_value}" />
- </td>
-</tr>
-
-[EditRegroupForm.deferred_html]
-<form id="{id}" class="mform StaticQuotaForm"
method="post" action="?">
- <div class="head">
- <h1>{title}</h1>
- </div>
- <div class="body">
- <div class="deferredSpacer">Loading...</div>
- </div>
-</form>
-
-[AddGroupForm.css]
-form.mform.AddForm {
- width: 30em;
-}
-form.mform.AddForm div.label, form.mform.AddForm input {
- float: left;
- margin: 1em 0 1em 1em;
-}
-
-[AddGroupForm.html]
-<form id="{id}" class="mform AddForm" method="post"
action="?">
- <div class="head">
- <h1>{title}</h1>
- </div>
- <div class="body">
- <div class="label">Group Name</div>
- <input class="validate-nodot" type="text"
name="{group_name_path}" value="" size="20"
maxlength="40" />
- <div style="clear: left;"><!-- --></div>
- <div class="invalid"></div>
- </div>
- <div class="foot">
- {submit}
- {cancel}
- </div>
- <div>{hidden_inputs}</div>
-</form>
-<script type="text/javascript">
-<![CDATA[
-window.addEvent('domready', function () {
- var elem = $("{id}").elements[0];
- elem.focus();
-
- var myFormValidator = new FormValidator($('{id}'), {
- evaluateOnSubmit: false,
- evaluateFieldsOnBlur: false,
- onElementFail: function (el, validators) {
- var span =
el.getParent("div").getElement("div.invalid");
- span.set('text', "Must not contain a .");
- },
- onElementPass: function (el) {
-
el.getParent("div").getElement("div.invalid").set('text',
"");
- }
- });
-
- myFormValidator.add('validate-nodot', {
- errorMsg: '',
- test: function(element) {
- var bool = element.get('value').test(/\./,'i');
- return !bool;
- }
- });
-});
-]]>
-</script>
-
-[ExpandColumn.css]
-th.expand {
- width: 1em;
- padding: 0;
-}
Modified: trunk/cumin/python/cumin/grid/pool.py
===================================================================
--- trunk/cumin/python/cumin/grid/pool.py 2011-02-04 17:46:17 UTC (rev 4504)
+++ trunk/cumin/python/cumin/grid/pool.py 2011-02-07 16:44:47 UTC (rev 4505)
@@ -19,6 +19,7 @@
from job import *
from limit import *
from negotiator import *
+from quota import *
from scheduler import *
from slot import *
from submission import *
@@ -101,7 +102,7 @@
self.add_attribute(self.negotiator_attribute)
self.edit_dynamic_quota = NegotiatorEditDynamicQuota(app, self)
- self.quotas = NegotiatorOverview(app, "quotas",
self.negotiator_attribute, self)
+ self.quotas = QuotaSelector(app, "quotas", self.negotiator_attribute,
self)
self.view.add_tab(self.quotas)
self.limits = LimitSet(app, "limits", self.object)
Added: trunk/cumin/python/cumin/grid/quota.py
===================================================================
--- trunk/cumin/python/cumin/grid/quota.py (rev 0)
+++ trunk/cumin/python/cumin/grid/quota.py 2011-02-07 16:44:47 UTC (rev 4505)
@@ -0,0 +1,278 @@
+from wooly.util import StringCatalog, Writer
+import logging
+from cumin.widgets import StaticColumnHeader
+from cumin.formats import fmt_link
+from cumin.objectselector import ObjectTable, ObjectSelector, ObjectTableColumn
+from wooly.template import WidgetTemplate
+from cumin.qmfadapter import ObjectQmfAdapter
+from negotiator import GroupHelper
+from wooly import Parameter, Widget
+
+strings = StringCatalog(__file__)
+log = logging.getLogger("cumin.grid.quota")
+
+class QmfGroupColumn(ObjectTableColumn):
+ def __init__(self, app, name, attr, getter, negotiator, task):
+ super(QmfGroupColumn, self).__init__(app, name, attr)
+
+ self.header = StaticColumnHeader(app, "header")
+ self.replace_child(self.header)
+
+ self.title = None
+ self.getter = getter
+ #self.align = "right"
+ self.user = False
+ self.negotiator = negotiator
+ self.task = task
+ self.user_task = None
+
+ def render_title(self, session, *args):
+ return self.title
+
+ def render_content(self, session, group):
+ data = self.getter(session)
+ for x in data:
+ if x[0] == group:
+ return self.render_data(session, x)
+
+ return ""
+
+ def render_data(self, session, data):
+ href = self.task.get_href(session)
+ content = data[2][2] and str(data[1]) or "NOT SET"
+ return fmt_link(href, content, "", "",
self.fmt_hover(data[0]))
+
+ def fmt_hover(self, group):
+ return "Edit the %s" % self.title
+
+class QuotaAdapter(ObjectQmfAdapter):
+ def get_data(self, values, options):
+ items = values['items']
+ return items
+
+ def get_count(self, values):
+ return len(values['items'])
+
+class QuotaTable(ObjectTable):
+ def __init__(self, app, name, cls):
+ super(QuotaTable, self).__init__(app, name, cls)
+
+ self.update_enabled = False
+
+ limit = Widget(app, "limit")
+ self.header.replace_child(limit)
+
+ page = Widget(app, "page")
+ self.header.replace_child(page)
+
+ def get_data_values(self, session):
+ values = super(QuotaTable, self).get_data_values(session)
+
+ info = self.parent.group_helper.get_config_info(session)
+ expanded = self.parent.expand.get(session)
+
+ names = list(info)
+ names = sorted(names)
+
+ # get all the values for csv export
+ if session.page == self.app.export_page:
+ items = names
+ else:
+ # make a list of groups to show based on what is expanded
+ parent = expanded and self.parent.group_helper.get_parent(session, expanded)
or None
+ items = list()
+ for name in names:
+ # always show top level groups
+ if "." not in name:
+ items.append(name)
+ # add the current expanded item
+ elif expanded == name:
+ items.append(name)
+ # add the ancestors
+ elif expanded and expanded.startswith(name+"."):
+ items.append(name)
+ # add the direct children of expanded item
+ elif expanded and name.startswith(expanded+"."):
+ sub_name = name[len(expanded) + 1:]
+ if "." not in sub_name:
+ items.append(name)
+ # and direct children of expanded item's parent
+ elif parent and name.startswith(parent+"."):
+ sub_name = name[len(parent) + 1:]
+ if "." not in sub_name:
+ items.append(name)
+
+ self.parent.group_helper.get_config_for_groups(session,
"GROUP_QUOTA_DYNAMIC", items)
+
+ values['items'] = items
+
+ negotiator = self.parent.negotiator.get(session)
+ values["obj"] = negotiator
+
+ return values
+
+class QuotaSelector(ObjectSelector):
+ def __init__(self, app, name, negotiator, frame):
+ cls = app.model.com_redhat_cumin_grid.Quota
+
+ super(QuotaSelector, self).__init__(app, name, cls)
+
+ self.update_enabled = True
+
+ self.negotiator = negotiator
+ self.table.negotiator = negotiator
+ self.table.adapter = QuotaAdapter(app, cls)
+
+ self.group_helper = GroupHelper(app, "groups", negotiator)
+ self.add_child(self.group_helper)
+
+ self.expand = Parameter(app, "expand")
+ self.add_parameter(self.expand)
+
+ col = self.ExpandColumn(app, "id", cls.id, self.expand,
self.group_helper)
+ col.header_class = StaticColumnHeader
+ col.width = "20px"
+ self.add_column(col)
+
+ col = self.GroupColumn(app, "group", cls.Name)
+ col.width = "80%"
+ self.add_column(col)
+
+ task = frame.edit_dynamic_quota
+ col = self.DynamicColumn(app, "dynamic", cls.Quota, None, negotiator,
task, self.group_helper)
+ self.add_column(col)
+
+ self.enable_csv_export(negotiator)
+
+ self.error_tmpl = WidgetTemplate(self, "error_html")
+ self.loading_tmpl = WidgetTemplate(self, "deferred_html")
+
+ def create_table(self, app, name, cls):
+ return QuotaTable(app, name, cls)
+
+ def render_title(self, session):
+ return "Quotas"
+
+ def do_render(self, session):
+ # determine if there is an error getting the data
+ # and show an error message
+ qmf_response = None
+ tmpl = self.error_tmpl
+ m = ""
+
+ try:
+ qmf_response = self.group_helper.get_results(session)
+ if not qmf_response:
+ m = ""
+ elif qmf_response.exception:
+ e = qmf_response.exception
+ m = len(e.args) > 0 and e.args[0] or ""
+ if m == "Loading":
+ tmpl = self.loading_tmpl
+ else:
+ neg = self.negotiator.get(session)
+ neg_name = neg and " for negotiator %s" % neg.Name or
""
+ m = "%s%s" % (m, neg_name)
+ except AssertionError:
+ m = "Missing Negotiator"
+
+ if (not qmf_response) or qmf_response.exception:
+ writer = Writer()
+ if "is unknown" in m:
+ m = "Please try again later"
+ err_msg = "The data is not available at this time. <br/>%s" %
m
+ tmpl.render(writer, session, err_msg)
+ return writer.to_string()
+
+ return super(QuotaSelector, self).do_render(session)
+
+ def render_error_msg(self, session, msg):
+ return msg
+
+ class ExpandColumn(ObjectTableColumn):
+ def __init__(self, app, name, attr, expand, group_helper):
+ super(QuotaSelector.ExpandColumn, self).__init__(app, name, attr)
+
+ self.expand = expand
+ self.group_helper = group_helper
+
+ def get_class_list(self, session):
+ return ["expand"]
+
+ def render_header_content(self, session):
+ return ""
+
+ def render_cell_content(self, session, group):
+ if not self.group_helper.has_child(session, group):
+ return ""
+
+ self.group_helper.get_config_info(session)
+ # return a " or - depending on current expand
+ expand = self.expand.get(session)
+ if expand and expand.startswith(group):
+ state = "-"
+ else:
+ state = "+"
+
+ parent = self.group_helper.get_parent(session, group)
+ return self.render_item_link(session, group, parent, state)
+
+ def render_item_link(self, session, group, parent, state):
+ branch = session.branch()
+
+ next_expand = state == "+" and group or parent
+ self.expand.set(branch, next_expand)
+
+ hover = state == "-" and "Collapse" or
"Expand"
+ cls = "action"
+
+ return fmt_link(branch.marshal(), state, class_=cls, link_title=hover)
+
+ class GroupColumn(ObjectTableColumn):
+ def __init__(self, app, name, attr):
+ super(QuotaSelector.GroupColumn, self).__init__(app, name, attr)
+
+ self.header = StaticColumnHeader(app, "header")
+ self.replace_child(self.header)
+
+ def render_cell_content(self, session, group):
+ if session.page == self.app.export_page:
+ return group
+
+ # if a user
+ if "." in group:
+ parts = group.split('.')
+ indent = len(parts) - 1
+ user = parts[indent]
+ return "<span style='padding-left:
%dem;'>%s</span>" % (indent, user)
+
+ return group
+
+ class DynamicColumn(QmfGroupColumn):
+ def __init__(self, app, name, attr, getter, negotiator, task, group_helper):
+ super(QuotaSelector.DynamicColumn, self).__init__(app, name, attr, getter,
negotiator, task)
+
+ self.group_helper = group_helper
+
+ def render_cell_content(self, session, group):
+ value = self.group_helper.get_config_value(session, group,
"GROUP_QUOTA_DYNAMIC")
+ self.task.form.group_leader.set(session, group)
+
+ try:
+ fval = float(value)
+ except ValueError:
+ return value
+ except TypeError:
+ if isinstance(value, Exception):
+ content = "<span
class='QuotaError'>error</span>"
+ val = len(value.args) > 0 and value.args[0] or ""
+ if session.page == self.app.export_page:
+ return val
+ return fmt_link("#", content, "", "",
val)
+
+ if session.page == self.app.export_page:
+ return value
+
+ href = self.task.get_href(session)
+ content = "%s%%" % str(round(fval * 100.0, 2))
+ return fmt_link(href, content, "", "",
self.fmt_hover(""))
Added: trunk/cumin/python/cumin/grid/quota.strings
===================================================================
--- trunk/cumin/python/cumin/grid/quota.strings (rev 0)
+++ trunk/cumin/python/cumin/grid/quota.strings 2011-02-07 16:44:47 UTC (rev 4505)
@@ -0,0 +1,29 @@
+[QuotaSelector.css]
+
+span.QuotaError {
+ font-style: italic;
+ color: red;
+}
+
+[QuotaSelector.deferred_html]
+<div id="{id}">
+ <div class="deferredSpacer">Loading...</div>
+</div>
+<script type="text/javascript">
+<![CDATA[
+(function() {
+ window.addEvent("domready", function () {
+ setTimeout( function () { window.location.reload(); }, 5000 );
+ });
+}())
+]]>
+</script>
+
+[QuotaSelector.error_html]
+<div id="{id}">
+ <div class="TaskInvocationSet">
+ <ul>
+ <li>{error_msg}</li>
+ </ul>
+ </div>
+</div>
Modified: trunk/cumin/python/cumin/model.py
===================================================================
--- trunk/cumin/python/cumin/model.py 2011-02-04 17:46:17 UTC (rev 4504)
+++ trunk/cumin/python/cumin/model.py 2011-02-07 16:44:47 UTC (rev 4505)
@@ -1,21 +1,19 @@
-from decimal import *
-from mint import *
-from rosemary.model import *
-from struct import unpack, calcsize
-from threading import Thread, Lock
-from types import *
-from wooly import *
-from wooly.parameters import *
-from wooly.widgets import *
-from wooly.datatable import *
+import logging
+import os
+from threading import Lock, Thread
+from datetime import datetime, timedelta
+from time import sleep, mktime
+from decimal import Decimal
+from types import NoneType
-from formats import *
-from parameters import *
-from sqladapter import *
-from util import *
+from cumin.formats import fmt_datetime, fmt_dict, fmt_none_brief, fmt_none,\
+ fmt_duration
+from cumin.util import calc_rate, JobStatusInfo, secs, wait
+from cumin.sqladapter import SqlAdapter
+from rosemary.sqlfilter import SqlComparisonFilter
+from rosemary.sqlquery import SqlQueryOptions
+from rosemary.model import RosemaryModel
-import wooly
-
log = logging.getLogger("cumin.model")
class CuminModel(RosemaryModel):
@@ -107,15 +105,15 @@
for group in needed_groups:
added += store.add_group_config(group, config)
if added > 0:
- store.update(None)
- sleep(1)
+ store.update_new(None)
+ #sleep(1)
except KeyError:
store = NegotiatorGroupConfigValuesStore(self, negotiator, needed_groups,
config)
store.start_updates()
self.group_config_values_by_negotiator[negotiator._qmf_agent_id] = store
- sleep(1)
+ #sleep(1)
return store
finally:
@@ -1011,16 +1009,13 @@
self.id = id
def get_collector(self):
- for collector in Collector.selectBy(Pool=self.id):
- return collector
+ return None
def get_grid(self):
- for grid in Grid.selectBy(Pool=self.id):
- return grid
+ return None
def get_negotiator(self):
- for negotiator in Negotiator.selectBy(Pool=self.id):
- return negotiator
+ return None
class ObjectStore(object):
def __init__(self, model):
@@ -1134,6 +1129,7 @@
self.status = status
try:
self.data = data["Value"]
+ #self.data = "MSG, GRID, MGMT, RT, GRID.SUB_1,
GRID.SUB_1.SUB_A"
except KeyError:
pass
@@ -1175,6 +1171,20 @@
raw_configs = action.execute(self.negotiator, self.configs[config],
config+"_")
self.data[config] = raw_configs
+ def update_new(self, cursor):
+ for config in self.configs:
+ action = FetchRawConfigSet(self.model.app)
+ new_configs = list()
+ for group in self.configs[config]:
+ if group not in self.data[config] or \
+ self.data[config][group].error or \
+ not self.data[config][group].data:
+ new_configs.append(group)
+
+ raw_configs = action.execute(self.negotiator, new_configs,
config+"_")
+ for group in raw_configs:
+ self.data[config][group] = raw_configs[group]
+
def delete(self):
del self.model.group_config_values_by_negotiator[self.negotiator._qmf_agent_id]
Modified: trunk/cumin/python/cumin/session.py
===================================================================
--- trunk/cumin/python/cumin/session.py 2011-02-04 17:46:17 UTC (rev 4504)
+++ trunk/cumin/python/cumin/session.py 2011-02-07 16:44:47 UTC (rev 4505)
@@ -2,7 +2,8 @@
from util import *
from mint.util import make_agent_id
-from qmf.console import Console, Session, ClassKey, ObjectId
+from qmf.console import Console, Session, ObjectId
+from rosemary.model import RosemaryObject
log = logging.getLogger("cumin.session")