Author: tmckay
Date: 2011-03-23 19:40:57 +0000 (Wed, 23 Mar 2011)
New Revision: 4661
Modified:
trunk/cumin/bin/cumin-data
trunk/cumin/etc/cumin.conf
trunk/cumin/python/cumin/config.py
trunk/mint/python/mint/session.py
Log:
Change mechanism for specifying QMF binding by class.
Change mechanism for specifying multiple cumin-* instances.
Add [master] config section, remove 'packages' config parameter,
add 'include-classes' and 'exclude-classes' config parameters.
Add extensive comments and examples in cumin.conf for alternative
configurations.
BZ690283
Modified: trunk/cumin/bin/cumin-data
===================================================================
--- trunk/cumin/bin/cumin-data 2011-03-23 19:26:32 UTC (rev 4660)
+++ trunk/cumin/bin/cumin-data 2011-03-23 19:40:57 UTC (rev 4661)
@@ -15,41 +15,42 @@
sys.stderr = sys.__stderr__
sys.stdout = sys.__stdout__
+def process_classes(mint, values, section_name):
-def process_packages(mint, values, allow_classes=False):
+ return_code = 0
+ pkgs = set()
+ if values and len(values) > 0:
- packages = list()
+ for cls_str in values.split(","):
+ pair = cls_str.strip().split(":")
+ if len(pair) == 2:
+ pname = pair[0]
+ cname = pair[1]
+ else:
+ log.error("Configuration section '%s',"\
+ " class name '%s' is badly formed"\
+ % (section_name, cls_str.strip()))
+ return_code = 1
+ break
- for name in values.split(","):
- name = name.strip()
- if allow_classes and ":" in name:
- pair = name.split(":")
- name = pair[0]
- className = pair[1]
- else:
- className = None
-
- try:
- cls = None
- pkg = mint.model._packages_by_name[name]
- if className != None:
- try:
- cls = pkg._classes_by_name[className]
- except KeyError:
- print "No class found for '%s'" % className
-
- except KeyError:
- print "No package found for '%s'" % name
- continue
+ try:
+ pkg = mint.model._packages_by_name[pname]
+ if cname == "*":
+ pkgs = pkgs.union(set(pkg._classes))
+ else:
+ try:
+ cls = pkg._classes_by_name[cname]
+ pkgs.add(cls)
+ except KeyError:
+ log.warning("Configuration section '%s',"\
+ " class '%s' is not contained in
package"\
+ " '%s'" % (section_name, cname,
pname))
+ except KeyError:
+ log.warning("Configuration section '%s',"\
+ " package '%s' not found" % (section_name,
pname))
- if cls != None:
- pkg = ((pkg,cls))
+ return return_code, pkgs
- packages.append(pkg)
-
- return packages
-
-
def main():
# Do our own simple option check so we can redirect IO early
@@ -130,15 +131,18 @@
mint.check()
mint.init()
+
+ return_code, includes = process_classes(mint,
+ values.include_classes,
+ opts.section)
- if values.packages:
- mint.session.qmf_packages = process_packages(mint, values.packages)
+ return_code, excludes = process_classes(mint,
+ values.exclude_classes,
+ opts.section)
- if values.classes:
- mint.session.qmf_classes = process_packages(mint, values.classes,
- allow_classes=True)
+ mint.session.qmf_classes = includes.difference(excludes)
- if opts.init_only:
+ if opts.init_only or return_code:
return
mint.start()
Modified: trunk/cumin/etc/cumin.conf
===================================================================
--- trunk/cumin/etc/cumin.conf 2011-03-23 19:26:32 UTC (rev 4660)
+++ trunk/cumin/etc/cumin.conf 2011-03-23 19:40:57 UTC (rev 4661)
@@ -1,6 +1,7 @@
# Fields in comments reflect the default values.
# Explanatory comments for some options are included
# at the end of the file.
+# All sections except master inherit from [common]
[common]
# database: dbname=cumin user=cumin host=localhost
@@ -9,6 +10,33 @@
# log-max-mb: 10
# log-max-archives: 1
+# *************** Master configuration ***************
+
+# Controls the number and type of cumin-web and
+# cumin-data processes started by the cumin service
+
+[master]
+# webs: web
+
+# Default cumin-data configuration at installation.
+# Assumes 'persona' setting in web section is 'default'
+datas: data.grid, data.grid-slots, data.grid-submissions, data.sesame, data.other
+
+# If the 'persona' setting in the web section is set to 'grid' then
+# the 'data.other' section name may be omitted from 'datas' as follows
+#datas: data.grid, data.grid-slots, data.grid-submissions, data.sesame
+
+# If the 'persona' setting in the web section is set to 'messaging' then
+# the 'data.grid*' section names may be omitted from 'datas' as follows
+#datas: data.sesame, data.other
+
+# To run a single cumin-data process in a small deployment set 'datas' as
follows
+# and optionally modify 'include-classes' and 'exclude-classes' in the
[data]
+# section based on 'persona'. See additional comments in [data] section.
+#datas: data
+
+# ****************************************************
+
[web]
# log-file: $CUMIN_HOME/log/web.log
# host: localhost ('0.0.0.0' binds to all local interfaces)
@@ -23,27 +51,108 @@
# expire-interval: 3600
# expire-threshold: 86400
# vacuum-interval: 3600
-# packages: [all]
+# include-classes: [all]
+# exclude-classes: [none]
-# *************** Parameter Explanations by Section ***************
+# If 'persona' in the web section is set to 'default'
+# then include-classes and exclude-classes should be
+# left unspecified (the default)
+# If 'persona' in the web section is set to 'grid' then
+# set include-classes as follows and leave exclude-classes unspecified
+#include-classes: com.redhat.grid:*, com.redhat.sesame:*
+
+# If 'persona' in the web section is set to 'messaging' then
+# set exclude-classes as follows and leave include-classes unspecified
+#exclude-classes: com.redhat.grid:*
+
+[data.grid]
+# log-file: $CUMIN_HOME/log/data.grid.log
+# expire-interval: 3600
+# expire-threshold: 86400
+# vacuum-interval: 3600
+include-classes: com.redhat.grid:*
+exclude-classes: com.redhat.grid:Slot, com.redhat.grid:Submission
+
+[data.grid-slots]
+# log-file: $CUMIN_HOME/log/data.grid-slots.log
+# expire-interval: 3600
+# expire-threshold: 86400
+# vacuum-interval: 3600
+include-classes: com.redhat.grid:Slot
+# exclude-classes: [none]
+
+[data.grid-submissions]
+# log-file: $CUMIN_HOME/log/data.grid-submissions.log
+# expire-interval: 3600
+# expire-threshold: 86400
+# vacuum-interval: 3600
+include-classes: com.redhat.grid:Submission
+# exclude-classes: [none]
+
+[data.sesame]
+# log-file: $CUMIN_HOME/log/data.sesame.log
+# expire-interval: 3600
+# expire-threshold: 86400
+# vacuum-interval: 3600
+include-classes: com.redhat.sesame:*
+# exclude-classes: [none]
+
+[data.other]
+# log-file: $CUMIN_HOME/log/data.messaging.log
+# expire-interval: 3600
+# expire-threshold: 86400
+# vacuum-interval: 3600
+# include-classes: [all]
+exclude-classes: com.redhat.grid:*, com.redhat.sesame:*
+
+# *************** Some parameter explanations by section ***************
+
# [common]
+# log-max-mb: 10
# Maximum size in MB of *.log files created by cumin.
# A log file reaching maximum size will be rolled over.
# A value of 0 leaves the log file size unlimited.
-# log-max-mb: 10
+# log-max-archives: 1
# Number of rolled over log files to retain. A retained
# log file will have a "." and a number added to its name.
# A value of 0 will cause a log file to be truncated
# rather than renamed if it reaches maximum size.
-# log-max-archives: 1
# [web]
+# persona: default
# Controls content of the top level page.
# Valid values are "default", "grid", and "messaging".
# The default persona contains content for both grid and
# messaging.
-# persona: default
+
+# [data]
+
+# include-classes: [all]
+# A comma separated list of QMF classes. The default value is all
+# classes in all packages. The cumin-data instance will be bound to
+# classes which appear in 'include-classes' but do not appear in
+# 'exclude-classes'. Classes are specified as package:class for a single
+# class or package:* for all classes in a package.
+
+# exclude-classes: [empty list]
+# A comma separated list of QMF classes. The default value is
+# an empty list. The cumin-data instance will be bound to
+# classes which appear in 'include-classes' but do not appear in
+# 'exclude-classes'. Classes are specified as package:class for a single
+# class or package:* for all classes in a package.
+
+# [master]
+
+# webs: web
+# Comma separated list of sections in this file.
+# Each section specifies the configuration for a separate
+# instance of cumin-web.
+
+# datas: data
+# Comma separated list of sections in this file.
+# Each section specifies the configuration for a separate
+# instance of cumin-data.
Modified: trunk/cumin/python/cumin/config.py
===================================================================
--- trunk/cumin/python/cumin/config.py 2011-03-23 19:26:32 UTC (rev 4660)
+++ trunk/cumin/python/cumin/config.py 2011-03-23 19:40:57 UTC (rev 4661)
@@ -56,8 +56,8 @@
data = CuminConfigSection(self, name, strict_section)
data.log_file.default = os.path.join(self.home, "log", name +
".log")
- param = ConfigParameter(data, "packages", str)
- param = ConfigParameter(data, "classes", str)
+ param = ConfigParameter(data, "include-classes", str)
+ param = ConfigParameter(data, "exclude-classes", str)
param = ConfigParameter(data, "expire-interval", int)
param.default = 60 * 60 # 1 hour
Modified: trunk/mint/python/mint/session.py
===================================================================
--- trunk/mint/python/mint/session.py 2011-03-23 19:26:32 UTC (rev 4660)
+++ trunk/mint/python/mint/session.py 2011-03-23 19:40:57 UTC (rev 4661)
@@ -12,9 +12,11 @@
self.qmf_session = None
self.qmf_brokers = list()
- self.qmf_packages = self.app.model._packages
- self.qmf_classes = list()
+ # This will become a sequence if
+ # class binding is specifed in configuration
+ self.qmf_classes = None
+
def add_broker(self, uri):
log.info("Adding QMF broker at %s", uri)
@@ -44,18 +46,17 @@
self.qmf_session.bindAgent("*")
# Handle bind by class
- already_bound_list = list()
- for pkg in self.qmf_classes:
- if type(pkg) in (tuple,list) and len(pkg) == 2:
- # If a packages shows up in the class binding list,
- # then we cannot wholesale bind that package later.
- already_bound_list.append(pkg[0])
- self.qmf_session.bindClass(pkg[0]._name.lower(), pkg[1]._name.lower())
-
- # Handle bind by package
- for pkg in self.qmf_packages:
- if not pkg in already_bound_list:
+ if self.qmf_classes:
+ for cls in self.qmf_classes:
+ pname = cls._package._name
+ cname = cls._name
+ self.qmf_session.bindClass(pname.lower(), cname.lower())
+ log.info("Binding QMF class %s.%s" % (pname, cname))
+ else:
+ # Handle bind by package
+ for pkg in self.app.model._packages:
self.qmf_session.bindPackage(pkg._name.lower())
+ log.info("Binding QMF package %s" % pkg._name)
for uri in self.broker_uris:
self.add_broker(uri)