示例#1
0
文件: stat.py 项目: ssorj/boneyard
    def __init__(self, app, name):
        super(StatChartPage, self).__init__(app, name)

        self.rosemary_class = Parameter(app, "rcls")
        self.add_parameter(self.rosemary_class)

        self.rosemary_package = Parameter(app, "rpkg")
        self.add_parameter(self.rosemary_package)

        param = StringParameter(app, "sigparam")
        self.object_signature = ListParameter(app, "signature", param)
        self.add_parameter(self.object_signature)

        param = Parameter(app, "param")
        self.stats = ListParameter(app, "stat", param)
        self.add_parameter(self.stats)

        self.mode = Parameter(app, "mode")
        self.add_parameter(self.mode)

        # In seconds
        self.duration = IntegerParameter(app, "duration")
        self.duration.default = 600
        self.add_parameter(self.duration)

        self.interval = IntegerParameter(app, "interval")
        self.interval.default = -1
        self.add_parameter(self.interval)

        self.method = Parameter(app, "method")
        self.method.default = "avg"
        self.add_parameter(self.method)

        self.samples = BooleanParameter(app, "samples")
        self.add_parameter(self.samples)

        self.container_width = IntegerParameter(app, "width")
        self.container_width.default = 360
        self.add_parameter(self.container_width)

        self.container_height = IntegerParameter(app, "height")
        self.container_height.default = 100
        self.add_parameter(self.container_height)

        self.total_property = Parameter(app, "tp")
        self.add_parameter(self.total_property)

        self.type = Parameter(app, "type")
        self.add_parameter(self.type)
        
        self.maxsamp = IntegerParameter(app, "maxsamp")
        self.maxsamp.default = 0
        self.add_parameter(self.maxsamp)

        self.cache = ImageCache()
示例#2
0
class ObjectSelectorTaskForm(FoldingFieldSubmitForm):
    def __init__(self, app, name, task):
        super(ObjectSelectorTaskForm, self).__init__(app, name)

        self.task = task

        self.cls = task.selector.cls

        item = IntegerParameter(app, "item")

        self.ids = ListParameter(app, "id", item)
        self.add_parameter(self.ids)

        self.selection = SessionAttribute(self, "selection")

        self.content = self.SelectionList(app, "fields")
        self.replace_child(self.content)

        self.app.form_page.modes.add_mode(self)

    def do_process(self, session):
        # If the selection list is zero length,
        # set cancel state and let processing complete.
        if self.get_selection(session) == 0:
            self.cancel(session)
        super(ObjectSelectorTaskForm, self).do_process(session)

    def get_selection(self, session):
        selection = list()

        self.selection.set(session, selection)

        for id in self.ids.get(session):
            try:
                item = self.cls.get_object_by_id(session.cursor, id)
                selection.append(item)
            except:
                pass
        return len(selection)

    def process_submit(self, session):
        selection = self.selection.get(session)

        self.task.invoke(session, selection)
        self.task.exit_with_redirect(session)

    def render_title(self, session):
        return self.task.get_title(session)

    class SelectionList(ItemSet):
        def do_get_items(self, session):
            return self.parent.selection.get(session)

        def render_item_content(self, session, item):
            # already escaped in get_item_content
            return self.parent.task.get_item_content(session, item)

        def render_item_class(self, session, item):
            return "item"
示例#3
0
文件: binding.py 项目: ssorj/boneyard
    def __init__(self, app, name, exchange):
        super(ExchangeKeysField, self).__init__(app, name)

        self.title = "Initial bindings"
        self.exchange = exchange

        name = StringParameter(app, "name")
        self.names = ListParameter(app, "names", name)
        self.add_parameter(self.names)

        value = StringParameter(app, "value")
        self.values = ListParameter(app, "values", value)
        self.add_parameter(self.values)

        self.count = IntegerParameter(app, "count")
        self.count.default = 3
        self.add_parameter(self.count)

        self.inputs_container_tmpl = WidgetTemplate(self, "input_container_html")
        self.inputs_tmpl = WidgetTemplate(self, "inputs_html")
示例#4
0
    def __init__(self, app, name, task):
        super(EditDynamicQuotaForm, self).__init__(app, name, task)

        self.field_tmpl = WidgetTemplate(self, "field_html")
        self.unclaimed_tmpl = WidgetTemplate(self, "unclaimed_html")

        quota = Parameter(app, "quota")
        self.add_parameter(quota)

        self.quotas = ListParameter(app, "quotas", quota)
        self.add_parameter(self.quotas)

        self.group_leader = Parameter(app, "group_leader")
        self.add_parameter(self.group_leader)

        self.chart = PriorityPieChart \
            (app, "chart", self.object, self.group_helper, self.group_leader)
        self.add_child(self.chart)
示例#5
0
    def __init__(self, app, name, task):
        super(ObjectSelectorTaskForm, self).__init__(app, name)

        self.task = task

        self.cls = task.selector.cls

        item = IntegerParameter(app, "item")

        self.ids = ListParameter(app, "id", item)
        self.add_parameter(self.ids)

        self.selection = SessionAttribute(self, "selection")

        self.content = self.SelectionList(app, "fields")
        self.replace_child(self.content)

        self.app.form_page.modes.add_mode(self)
示例#6
0
文件: stat.py 项目: ssorj/boneyard
    def __init__(self, app, name):
        super(FlashFullPage, self).__init__(app, name)

        self.updater = Widget(app, "updater")
        self.updater.update_enabled = True
        self.add_child(self.updater)

        param = StringParameter(app, "sigparam")
        self.object_signature = ListParameter(app, "signature", param)
        self.add_parameter(self.object_signature)

        self.rosemary_class = Parameter(app, "rcls")
        self.add_parameter(self.rosemary_class)

        self.rosemary_package = Parameter(app, "rpkg")
        self.add_parameter(self.rosemary_package)

        self.object = self.ObjectAttribute(app, "object")
        self.add_attribute(self.object)

        param = Parameter(app, "param")
        self.stats = ListParameter(app, "stat", param)
        self.add_parameter(self.stats)

        self.container_width = IntegerParameter(app, "width")
        self.container_width.default = 360
        self.add_parameter(self.container_width)

        self.container_height = IntegerParameter(app, "height")
        self.container_height.default = 100
        self.add_parameter(self.container_height)

        self.mode = Parameter(app, "mode")
        self.add_parameter(self.mode)

        self.chart_type = Parameter(app, "type")
        self.add_parameter(self.chart_type)

        self.flash_chart = self.GenericChart(app, "chart", self.object)
        self.add_child(self.flash_chart)

        self.total_property = Parameter(app, "tp")
        self.add_parameter(self.total_property)
示例#7
0
class EditDynamicQuotaForm(GroupForm):
    def __init__(self, app, name, task):
        super(EditDynamicQuotaForm, self).__init__(app, name, task)

        self.field_tmpl = WidgetTemplate(self, "field_html")
        self.unclaimed_tmpl = WidgetTemplate(self, "unclaimed_html")

        quota = Parameter(app, "quota")
        self.add_parameter(quota)

        self.quotas = ListParameter(app, "quotas", quota)
        self.add_parameter(self.quotas)

        self.group_leader = Parameter(app, "group_leader")
        self.add_parameter(self.group_leader)

        self.chart = PriorityPieChart \
            (app, "chart", self.object, self.group_helper, self.group_leader)
        self.add_child(self.chart)

    def render_title(self, session):
        return "Edit Dynamic Group Quota"

    def render_submit_content(self, session):
        return "Change percentage"

    def render_form_class(self, session):
        return "priorityForm"

    def render_data_col_header(self, session):
        return "Percent"
    
    def render_all_group_values(self, session):
        group_leader = self.group_leader.get(session)
        groups = self.group_helper.get_siblings(session, group_leader)
        info = self.group_helper.get_config_for_groups(session, "GROUP_QUOTA_DYNAMIC", groups)
        values = []
        dynamic_groups = []
        try:
            dynamic_groups = ["%s" % x for x in groups if info[x]["GROUP_QUOTA_DYNAMIC"] != ""]
        except:
            log.error("Error when loading dynamic group values for quota editing.")
        for group in sorted(groups):
            if(group in dynamic_groups):
                values.append(self.render_quota_value(session, group))      
        
       # values.reverse()
        values.append(self.render_unclaimed_value(session, "Unclaimed"))
                
        return values

    def render_all_group_names(self, session):
        group_leader = self.group_leader.get(session)
        groups = self.group_helper.get_siblings(session, group_leader)
        info = self.group_helper.get_config_for_groups(session, "GROUP_QUOTA_DYNAMIC", groups)
        values = []
        dynamic_groups = []
        try:
            dynamic_groups = ["%s" % x for x in groups if info[x]["GROUP_QUOTA_DYNAMIC"] != ""]
        except:
            log.error("Error when loading dynamic group names for quota editing.")
        for group in sorted(groups):
            if(group in dynamic_groups):
                values.append(group)      
        
        values.append("Unclaimed")
                
        return values
    
    def render_groups(self, session):
        writer = Writer()
                
        group_leader = self.group_leader.get(session)
        groups = self.group_helper.get_siblings(session, group_leader)
        info = self.group_helper.get_config_for_groups(session, "GROUP_QUOTA_DYNAMIC", groups)
        dynamic_groups = []
        try:
            dynamic_groups = ["%s" % x for x in groups if info[x]["GROUP_QUOTA_DYNAMIC"] != ""]
        except:
            log.error("Error when loading dynamic groups for quota editing.")
        for group in sorted(groups):
            if(group in dynamic_groups):
                self.field_tmpl.render(writer, session, group)

        self.unclaimed_tmpl.render(writer, session, "Unclaimed")

        return writer.to_string()

    def render_quota_name(self, session, group):
        return self.quotas.path

    def render_quota_value(self, session, group):
        value = self.group_helper.get_config_value(session, group, "GROUP_QUOTA_DYNAMIC")
        try:
            return round(float(value) * 100.0, 2)
        except:
            return 0.0

    def render_unclaimed_value(self, session, group):
        group_leader = self.group_leader.get(session)
        groups = self.group_helper.get_siblings(session, group_leader)
        unclaimed = self.group_helper.get_unclaimed_dyn_quota \
            (session, groups)
        return round(float(unclaimed) * 100.0, 2)

    def render_chart_id(self, session):
        return self.chart.render_id(session)

    def _invoke_tasks(self, session):
        negotiator = self.negotiator.get(session)
        quotas = self.quotas.get(session)
        group_names = self.group_names.get(session)
        original_values = self.original_values.get(session)
        info = self.group_helper.get_config_info(session)

        changed = False
        for group, new_value, original_value in zip(group_names, quotas, original_values):
            if group == "Unclaimed":
                continue
            quota = self.check_quota(new_value, original_value)
            if quota:
                self.task.invoke(session, negotiator,
                                 "GROUP_QUOTA_DYNAMIC_" + group, quota)
                info[group]["GROUP_QUOTA_DYNAMIC"] = quota
                changed = True

        if changed:
            self.task.reconfig(negotiator)
            self.app.model.update_negotiator_config_value(negotiator)

    def process_submit(self, session):
        call_async(None, self._invoke_tasks, session)
        self.task.exit_with_redirect(session)

    def check_quota(self, quota, original):
        try:
            pri = float(quota)
        except:
            return None
        if pri < 0.0 or pri > 100.0:
            return '0'

        try:
            original = float(original)
        except:
            original = 0
        if pri == original:
            return None

        return str(pri / 100)
示例#8
0
文件: stat.py 项目: ssorj/boneyard
class FlashFullPage(HtmlPage):
    def __init__(self, app, name):
        super(FlashFullPage, self).__init__(app, name)

        self.updater = Widget(app, "updater")
        self.updater.update_enabled = True
        self.add_child(self.updater)

        param = StringParameter(app, "sigparam")
        self.object_signature = ListParameter(app, "signature", param)
        self.add_parameter(self.object_signature)

        self.rosemary_class = Parameter(app, "rcls")
        self.add_parameter(self.rosemary_class)

        self.rosemary_package = Parameter(app, "rpkg")
        self.add_parameter(self.rosemary_package)

        self.object = self.ObjectAttribute(app, "object")
        self.add_attribute(self.object)

        param = Parameter(app, "param")
        self.stats = ListParameter(app, "stat", param)
        self.add_parameter(self.stats)

        self.container_width = IntegerParameter(app, "width")
        self.container_width.default = 360
        self.add_parameter(self.container_width)

        self.container_height = IntegerParameter(app, "height")
        self.container_height.default = 100
        self.add_parameter(self.container_height)

        self.mode = Parameter(app, "mode")
        self.add_parameter(self.mode)

        self.chart_type = Parameter(app, "type")
        self.add_parameter(self.chart_type)

        self.flash_chart = self.GenericChart(app, "chart", self.object)
        self.add_child(self.flash_chart)

        self.total_property = Parameter(app, "tp")
        self.add_parameter(self.total_property)

    def render_content(self, session):
        self.flash_chart.stats = self.stats.get(session)
        self.flash_chart.mode = self.mode.get(session)
        self.flash_chart.chart_type = self.chart_type.get(session)
        return self.flash_chart.render(session)

    class ObjectAttribute(Attribute):
        def get(self, session):
            obj = super(FlashFullPage.ObjectAttribute, self).get(session)
            if not obj:
                rpackage = self.widget.rosemary_package.get(session)
                rclass = self.widget.rosemary_class.get(session)
                signature = self.widget.object_signature.get(session)
                rosemary_package = self.app.model._packages_by_name[rpackage]
                rosemary_class = rosemary_package._classes_by_name[rclass]

                cursor = self.app.database.get_read_cursor()
                obj = rosemary_class.get_object_by_signature(cursor, signature)

                self.set(session, obj)

            return obj

    class GenericChart(StatFlashChart):
        def render_width(self, session):
            return self.parent.container_width.get(session)

        def render_height(self, session):
            return self.parent.container_height.get(session)

        def render_img_href(self, session):
            params = self.get_href_params(session)
            params.append("width=%i" % self.render_width(session))
            params.append("height=%i" % self.render_height(session))
            return escape_entity("%s?" % self.get_chart_name(session) + ";".join(params))

        def render_href(self, session):
            params = self.get_href_params(session)
            params.append("width=%i" % self.render_width(session))
            params.append("height=%i" % self.render_height(session))
            params.append("high=1")
            tp = self.parent.total_property.get(session)
            if tp:
                params.append("tp=%s" % tp)
            return escape_entity("%s?" % self.get_flash_name(session) + ";".join(params))
示例#9
0
文件: stat.py 项目: ssorj/boneyard
class StatChartPage(Page):
    # handles stats.png request
    def __init__(self, app, name):
        super(StatChartPage, self).__init__(app, name)

        self.rosemary_class = Parameter(app, "rcls")
        self.add_parameter(self.rosemary_class)

        self.rosemary_package = Parameter(app, "rpkg")
        self.add_parameter(self.rosemary_package)

        param = StringParameter(app, "sigparam")
        self.object_signature = ListParameter(app, "signature", param)
        self.add_parameter(self.object_signature)

        param = Parameter(app, "param")
        self.stats = ListParameter(app, "stat", param)
        self.add_parameter(self.stats)

        self.mode = Parameter(app, "mode")
        self.add_parameter(self.mode)

        # In seconds
        self.duration = IntegerParameter(app, "duration")
        self.duration.default = 600
        self.add_parameter(self.duration)

        self.interval = IntegerParameter(app, "interval")
        self.interval.default = -1
        self.add_parameter(self.interval)

        self.method = Parameter(app, "method")
        self.method.default = "avg"
        self.add_parameter(self.method)

        self.samples = BooleanParameter(app, "samples")
        self.add_parameter(self.samples)

        self.container_width = IntegerParameter(app, "width")
        self.container_width.default = 360
        self.add_parameter(self.container_width)

        self.container_height = IntegerParameter(app, "height")
        self.container_height.default = 100
        self.add_parameter(self.container_height)

        self.total_property = Parameter(app, "tp")
        self.add_parameter(self.total_property)

        self.type = Parameter(app, "type")
        self.add_parameter(self.type)
        
        self.maxsamp = IntegerParameter(app, "maxsamp")
        self.maxsamp.default = 0
        self.add_parameter(self.maxsamp)

        self.cache = ImageCache()

    def get_content_type(self, session):
        return self.samples.get(session) and "text/plain" or "image/png"

    def get_object_property(self, session, property):
        rpackage = self.rosemary_package.get(session)
        rclass = self.rosemary_class.get(session)
        signature = self.object_signature.get(session)

        rosemary_package = self.app.model._packages_by_name[rpackage]
        cls = rosemary_package._classes_by_name[rclass]
        cursor = self.app.database.get_read_cursor()
        object = cls.get_object_by_signature(cursor, signature)

        return object.get_value(property)

    def get_adapter_stats(self, session):
        rpackage = self.rosemary_package.get(session)
        rclass = self.rosemary_class.get(session)
        rosemary_package = self.app.model._packages_by_name[rpackage]
        rosemary_class = rosemary_package._classes_by_name[rclass]

        signature = self.object_signature.get(session)
        
        stats = [getattr(rosemary_class, x) for x in self.stats.get(session)]
        adapters = dict()
        for stat in stats:
            filters = list()
            if self.user_selection.get(session) is not None and self.user_selection.get(session).lower() != "<none>" and self.user_selection.get(session) != "": 
                filters.append(self.UserFilter(rosemary_class, self.user_selection.get(session)))
            if self.group_selection.get(session) is not None and self.group_selection.get(session).lower() != "<none>" and self.group_selection.get(session) != "": 
                filters.append(self.UserFilter(rosemary_class, self.group_selection.get(session)))
            adapters[stat] = SamplesSqlAdapter(self.app, rosemary_class, signature, session, filters)
            
            
        return (adapters, stats)
    
    class UserFilter(SqlFilter):
        def __init__(self, cls, value):
    
            table = cls.sql_samples_table
    
            fmt = "(%s like '%s')"
            args = (table.user.identifier, value)
    
            self.text = fmt % args
    
        def emit(self):
            return self.text
    # builds an object that is similar to a RosemaryStatistic that can 
    # be used later in the chart rendering to give values to the chart items
    class Pseudostat(object):
        def __init__(self, statname):
            name, title = statname.split('|')
            self.name = name
            self.title = title
            self.short_title = None

    def get_cache_control(self, session):
        return "no-cache"

    def gen_filename(self, session):
        return session.marshal()

    def get_cached(self, session, recent):
        filename = self.gen_filename(session)
        chart, args = self.cache.find_recent(filename, 30)
        if args:
            last_recent, samples, xy = args
            if recent == last_recent:
                return chart

    def get_cached_samples(self, session, recent):
        branch = session.branch()
        self.samples.set(branch, False)
        filename = self.gen_filename(branch)
        chart, args = self.cache.get_current(filename)
        if args:
            return (args['samples'], args['title_xy'])

    def cache_it(self, session, chart, args):
        filename = self.gen_filename(session)
        writer = self.cache.create_cache_file(filename, args)
        chart.write(writer)

    def get_interval(self, session, duration, width):
        interval = self.interval.get(session)
        if interval != -1:
            return interval
        else:
            max_samples = int(width * 1.5)
            return max(int(duration / max_samples), 1)

    def render_samples(self, session, recent):
        c = {(1,0,0): "red", (0,0,1): "blue", (0,1,0): "green"}
        cached_samples, title_xy = self.get_cached_samples(session, recent)
        if cached_samples:
            rets = dict()
            for stat in cached_samples:
                ret = dict()
                ret["color"] = c[cached_samples[stat][1]]
                ret["points"] = cached_samples[stat][0]
                ret["xy"] = title_xy[cached_samples[stat][1]]
                rets[stat.name] = ret
            return str(rets)
示例#10
0
文件: binding.py 项目: ssorj/boneyard
class ExchangeKeysField(FormField):
    def __init__(self, app, name, exchange):
        super(ExchangeKeysField, self).__init__(app, name)

        self.title = "Initial bindings"
        self.exchange = exchange

        name = StringParameter(app, "name")
        self.names = ListParameter(app, "names", name)
        self.add_parameter(self.names)

        value = StringParameter(app, "value")
        self.values = ListParameter(app, "values", value)
        self.add_parameter(self.values)

        self.count = IntegerParameter(app, "count")
        self.count.default = 3
        self.add_parameter(self.count)

        self.inputs_container_tmpl = WidgetTemplate(self, "input_container_html")
        self.inputs_tmpl = WidgetTemplate(self, "inputs_html")

    def init(self):
        """ we added parameters directly to the FormField instead
            of adding FormInputs. XXX should this logic be moved up to FormField? """
        super(ExchangeKeysField, self).init()
        for param in self.parameters:
            self.form.form_params.add(param)

    def render_title(self, session):
        return self.title

    def render_input_fields(self, session, *args):
        count = self.count.get(session)
        writer = Writer()
        for i in range(count):
            self.inputs_tmpl.render(writer, session, i)
        return writer.to_string()

    def render_inputs(self, session, *args):
        writer = Writer()
        self.inputs_container_tmpl.render(writer, session, *args)
        return writer.to_string()

    def render_n_name(self, session, i):
        return self.names.path

    def render_v_name(self, session, i):
        return self.values.path

    def render_n_value(self, session, i):
        names = self.names.get(session)
        return len(names) > i and xml_escape(names[i]) or ""

    def render_v_value(self, session, i):
        values = self.values.get(session)
        return len(values) > i and xml_escape(values[i]) or ""

    def get_exchange(self, session):
        exchange_string = self.exchange.get(session)
        if exchange_string:
            if exchange_string == "Default exchange":
                exchange_string = ""
            obj = self.form.object.get(session)
            cls = self.app.model.org_apache_qpid_broker.Exchange
            vhostid = obj._class._name == "Vhost" and obj._id or obj._vhostRef_id
            exchanges = cls.get_selection(session.cursor, name=exchange_string, _vhostRef_id=vhostid)
            if len(exchanges):
                return exchanges[0]
        return None

    def get(self, session):
        ret_dict = dict()
        exchange = self.get_exchange(session)
        if exchange:
            if exchange.type == "headers" or exchange.type == "xml":
                names = self.names.get(session)
                values = self.values.get(session)

                for name, value in zip(names, values):
                    if name:
                        ret_dict[name] = value
        return ret_dict

    def validate(self, session):
        exchange = self.get_exchange(session)
        names = self.names.get(session)
        values = self.values.get(session)

        if exchange:
            if exchange.type == "headers":
                if not "x-match" in names:
                    error = FormError("x-match argument is required for this exchange")
                    self.form.errors.add(session, error)

                for i in range(len(names)):
                    if names[i]:
                        if names[i] == "x-match":
                            if not values[i] == "all" and not values[i] == "any":
                                error = FormError("Argument name x-match must have a value of <i>all</i> or <i>any</i>")
                                self.form.errors.add(session, error)
                        else:
                            if not values[i]:
                                error = FormError("Missing argument value for name: %s" % names[i])
                                self.form.errors.add(session, error)

                for i in range(len(values)):
                    if values[i]:
                        if not names[i]:
                            error = FormError("Missing argument name for value: %s" % values[i])
                            self.form.errors.add(session, error)

            elif exchange.type == "xml":
                if not "xquery" in names:
                    error = FormError("xquery argument is required for this exchange")
                    self.form.errors.add(session, error)