rhmessaging commits: r2546 - in mgmt/trunk: cumin/bin and 2 other directories.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2008-09-25 16:11:49 -0400 (Thu, 25 Sep 2008)
New Revision: 2546
Added:
mgmt/trunk/cumin/python/cumin/tools.py
Modified:
mgmt/trunk/bin/reschema
mgmt/trunk/cumin/bin/cumin-admin
mgmt/trunk/mint/python/mint/__init__.py
Log:
Revamps cumin-admin tool, using common command infrastructure from
parsley.
Adds list-roles, assign, and unassign commands for putting users in
roles.
Adds methods on Subject and Role for querying single items by name.
Modified: mgmt/trunk/bin/reschema
===================================================================
--- mgmt/trunk/bin/reschema 2008-09-25 19:47:16 UTC (rev 2545)
+++ mgmt/trunk/bin/reschema 2008-09-25 20:11:49 UTC (rev 2546)
@@ -1,6 +1,7 @@
#!/bin/bash -ex
-cumin-admin drop-schema --force
-cumin-admin create-schema --force
+cumin-admin drop-schema --force || :
+cumin-admin create-schema
cumin-admin add-user guest
+cumin-admin assign guest admin
cumin-load-demo-data
Modified: mgmt/trunk/cumin/bin/cumin-admin
===================================================================
--- mgmt/trunk/cumin/bin/cumin-admin 2008-09-25 19:47:16 UTC (rev 2545)
+++ mgmt/trunk/cumin/bin/cumin-admin 2008-09-25 20:11:49 UTC (rev 2546)
@@ -1,177 +1,12 @@
#!/usr/bin/python
import sys, os
-from sqlobject import connectionForURI
-from traceback import print_exc
-from getpass import getpass
-from random import sample
-from crypt import crypt
-from mint import MintDatabase, Subject, Role
-from psycopg2 import IntegrityError
-from cumin import CuminConfig
-from cumin.util import *
+from cumin.tools import CuminAdminTool
-def print_usage(config):
- config.print_usage("cumin-admin")
-
- print """Commands:
- create-schema Create the database schema
- drop-schema Drop the database schema; requires --force yes
-
- add-user NAME Add user called NAME
- remove-user NAME Remove user called NAME; requires --force yes
- list-users List existing users"""
-
-def parse_command_args():
- args = list()
- parg = ""
-
- for arg in sys.argv[1:]:
- if not arg.startswith("--") and not parg.startswith("--"):
- args.append(arg)
-
- parg = arg
-
- return args
-
-def check_permission():
- curr_uid = os.getuid()
- file_uid = os.stat(__file__).st_uid
-
- if curr_uid == 0 or curr_uid == file_uid:
- pass
- else:
- print "You don't have sufficient privileges"
- sys.exit(1)
-
-def main():
- config = CuminConfig()
- config.add_param("force", bool, False, "Don't complain and just do it")
-
- if "-h" in sys.argv or "--help" in sys.argv:
- print_usage(config)
- sys.exit(0)
-
- # XXX I think we need to avoid using sys.argv inside of CuminConfig
-
- config.init()
-
- if config.debug:
- config.prt()
-
- args = parse_command_args()
-
- if not args:
- print "Error: no command found"
- print_usage(config)
- sys.exit(1)
-
- check_permission()
-
- command = args[0]
-
- database = MintDatabase(config.data)
- database.check()
- database.init()
-
- if command == "create-schema":
- main = os.path.join(config.home, "sql", "schema.sql")
- indexes = os.path.join(config.home, "sql", "indexes.sql")
-
- database.createSchema((main, indexes))
- elif command == "drop-schema":
- if config.force:
- database.dropSchema()
- else:
- print "Error: command create-schema requires --force yes"
- print_usage(config)
- sys.exit(1)
- elif command == "check-schema":
- database.checkSchema()
- elif command == "add-user":
- if len(args) != 2:
- print "Error: no user name given"
- print_usage(config)
- sys.exit(1)
-
- name = args[1]
-
- if Subject.selectBy(name=name).count():
- print "Error: a user called '%s' already exists" % name
- sys.exit(1)
-
- password = None
-
- while password is None:
- once = getpass("Set password: ")
- twice = getpass("Retype password: ")
-
- if once == twice:
- password = once
- else:
- print "Passwords don't match; try again"
-
- chs = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
- crypted = crypt(password, "".join(sample(chs, 2)))
-
- try:
- subject = Subject(name=name, password=crypted)
-
- for role in Role.selectBy(name="user"):
- subject.addRole(role)
- break
-
- assert role
-
- subject.syncUpdate()
- except IntegrityError:
- print "Error: a user called '%s' already exists" % name
- sys.exit(1)
-
- print "User '%s' is added" % name
- elif command == "remove-user":
- if config.force:
- if len(args) != 2:
- print "Error: no user name given"
- sys.exit(1)
-
- name = args[1]
- subjects = Subject.selectBy(name=name)
-
- if subjects.count():
- for subject in subjects:
- subject.destroySelf()
- break
- else:
- print "Error: no such user '%s'" % args[1]
- sys.exit(1)
-
- print "User '%s' is removed" % name
- else:
- print "Error: command remove-user requires --force yes"
- sys.exit(1)
- elif command == "list-users":
- accounts = Subject.select(orderBy='name')
-
- print " id name"
- print "---- " + ("-" * 20)
-
- for account in accounts:
- print "%4i %s" % (account.id, account.name)
-
- count = accounts.count()
- print "(%i user%s found)" % (count, ess(count))
- else:
- print "Error: command '%s' not recognized" % command
- print_usage(config)
- sys.exit(1)
-
if __name__ == "__main__":
try:
- main()
- except SystemExit, e:
- raise e
- except:
- print_exc()
- sys.exit(1)
+ tool = CuminAdminTool("cumin-admin")
+ tool.main()
+ except KeyboardInterrupt:
+ pass
Added: mgmt/trunk/cumin/python/cumin/tools.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/tools.py (rev 0)
+++ mgmt/trunk/cumin/python/cumin/tools.py 2008-09-25 20:11:49 UTC (rev 2546)
@@ -0,0 +1,314 @@
+import sys, os
+
+from parsley.command import *
+from mint import *
+from crypt import crypt
+from getpass import getpass
+from random import sample
+from psycopg2 import IntegrityError
+
+from cumin import CuminConfig
+from util import *
+
+class BaseCuminTool(Command):
+ def __init__(self, name):
+ super(BaseCuminTool, self).__init__(None, name)
+
+ self.config = CuminConfig()
+
+ opt = CommandOption(self, "help", "h")
+ opt.description = "Print this message"
+
+ opt = CommandOption(self, "data")
+ opt.argument = "URI"
+ opt.description = "Connect to database at URI"
+
+ opt = CommandOption(self, "log-file")
+ opt.argument = "PATH"
+ opt.description = "Log to file at PATH"
+
+ opt = CommandOption(self, "log-level")
+ opt.argument = "LEVEL"
+ opt.description = "Log messages at or above LEVEL " + \
+ "('debug', 'info', 'warning', 'error')"
+
+ opt = CommandOption(self, "debug")
+ opt.description = "Enable debugging; print logging to console"
+
+ def check(self):
+ if os.getuid() not in (os.stat(__file__).st_uid, 0):
+ print "Error: You have insufficient privileges"
+ sys.exit(1)
+
+ def init(self):
+ super(BaseCuminTool, self).init()
+
+ args = sys.argv[1:]
+
+ try:
+ opts, remaining = self.parse_options(args)
+ except CommandException, e:
+ print "Error: %s" % e.message
+ e.command.print_help()
+ sys.exit(1)
+
+ self.config.init()
+ self.config.load_string_params(opts)
+
+ def run(self):
+ if self.config.debug:
+ self.config.prt()
+
+ args = sys.argv[1:]
+
+ try:
+ opts, remaining = self.parse_options(args)
+ except CommandException, e:
+ print "Error: %s" % e.message
+ e.command.print_help()
+ sys.exit(1)
+
+ try:
+ scommand = remaining[0]
+ except IndexError:
+ self.print_help()
+ sys.exit(1)
+
+ try:
+ command = self.commands_by_name[scommand]
+ except KeyError:
+ print "Error: Command '%s' is unrecognized" % scommand
+ self.print_help()
+ sys.exit(1)
+
+ try:
+ opts, args = command.parse(remaining)
+
+ if "help" in opts:
+ command.print_help()
+ return
+
+ command.run(opts, args)
+ except CommandException, e:
+ print "Error: %s" % e.message
+ e.command.print_help()
+ sys.exit(1)
+
+ def main(self):
+ self.check()
+ self.init()
+ self.run()
+
+class CuminAdminTool(BaseCuminTool):
+ def __init__(self, name):
+ super(CuminAdminTool, self).__init__(name)
+
+ self.description = "Cumin administration commands"
+ self.database = None # Set in init
+
+ command = self.CreateSchema(self, "create-schema")
+ command.description = "Create the database schema"
+
+ command = self.DropSchema(self, "drop-schema")
+ command.description = "Drop the database schema; requires --force"
+
+ opt = CommandOption(command, "force")
+ opt.description = "Don't complain and just do it"
+
+ command = self.AddUser(self, "add-user")
+ command.arguments = ("NAME",)
+ command.description = "Add a new user called NAME"
+
+ command = self.RemoveUser(self, "remove-user")
+ command.arguments = ("NAME",)
+ command.description = "Remove user called NAME; requires --force"
+
+ opt = CommandOption(command, "force")
+ opt.description = "Don't complain and just do it"
+
+ command = self.ListUsers(self, "list-users")
+ command.description = "List existing users"
+
+ command = self.ListRoles(self, "list-roles")
+ command.description = "List existing roles"
+
+ command = self.Assign(self, "assign")
+ command.description = "Add USER to ROLE"
+ command.arguments = ("USER", "ROLE")
+
+ command = self.Unassign(self, "unassign")
+ command.description = "Remove USER from ROLE"
+ command.arguments = ("USER", "ROLE")
+
+ def init(self):
+ super(CuminAdminTool, self).init()
+
+ self.database = MintDatabase(self.config.data)
+ self.database.check()
+ self.database.init()
+
+ class CreateSchema(Command):
+ def run(self, opts, args):
+ main = os.path.join(self.parent.config.home, "sql", "schema.sql")
+ indexes = os.path.join(self.parent.config.home, "sql", "indexes.sql")
+
+ self.parent.database.createSchema((main, indexes))
+
+ class DropSchema(Command):
+ def run(self, opts, args):
+ if "force" in opts:
+ self.parent.database.dropSchema()
+ print "The schema is dropped"
+ else:
+ raise CommandException \
+ (self, "Command create-schema requires --force")
+
+ class CheckSchema(Command):
+ def run(self, opts, args):
+ self.parent.database.checkSchema()
+
+ class AddUser(Command):
+ def run(self, opts, args):
+ try:
+ name = args[1]
+ except IndexError:
+ raise CommandException(self, "NAME is required")
+
+ if Subject.selectBy(name=name).count():
+ print "Error: a user called '%s' already exists" % name
+ sys.exit(1)
+
+ password = None
+
+ while password is None:
+ once = getpass("Set password: ")
+ twice = getpass("Retype password: ")
+
+ if once == twice:
+ password = once
+ else:
+ print "Passwords don't match; try again"
+
+ chs = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+ crypted = crypt(password, "".join(sample(chs, 2)))
+
+ try:
+ subject = Subject(name=name, password=crypted)
+
+ for role in Role.selectBy(name="user"):
+ subject.addRole(role)
+ break
+
+ assert role
+
+ subject.syncUpdate()
+ except IntegrityError:
+ print "Error: a user called '%s' already exists" % name
+ sys.exit(1)
+
+ print "User '%s' is added" % name
+
+ class RemoveUser(Command):
+ def run(self, opts, args):
+ if "force" in opts:
+ if len(args) != 2:
+ print "Error: no user name given"
+ sys.exit(1)
+
+ name = args[1]
+ subjects = Subject.selectBy(name=name)
+
+ if subjects.count():
+ for subject in subjects:
+ subject.destroySelf()
+ break
+ else:
+ raise CommandException(self, "User '%s' is unknown" % name)
+
+ print "User '%s' is removed" % name
+ else:
+ raise CommandException \
+ (self, "Command remove-user requires --force yes")
+
+ class ListUsers(Command):
+ def run(self, opts, args):
+ subjects = Subject.select(orderBy='name')
+
+ print " ID Name Roles"
+ print "---- -------------------- --------------------"
+
+ for subject in subjects:
+ roles = ", ".join([x.name for x in list(subject.roles)])
+
+ print "%4i %-20s %-20s" % (subject.id, subject.name, roles)
+
+ count = subjects.count()
+ print "(%i user%s found)" % (count, ess(count))
+
+ class ListRoles(Command):
+ def run(self, opts, args):
+ roles = Role.select(orderBy='name')
+
+ print " ID Name"
+ print "---- --------------------"
+
+ for role in roles:
+ print "%4i %s" % (role.id, role.name)
+
+ count = roles.count()
+ print "(%i role%s found)" % (count, ess(count))
+
+ class Assign(Command):
+ def run(self, opts, args):
+ if len(args) != 3:
+ raise CommandException(self, "USER and ROLE are required")
+
+ subject = Subject.getByName(args[1])
+
+ if not subject:
+ raise CommandException \
+ (self, "User '%s' is unknown" % subject.name)
+
+ role = Role.getByName(args[2])
+
+ if not role:
+ raise CommandException \
+ (self, "Role '%s' is unknown" % role.name)
+
+ try:
+ subject.addRole(role)
+ subject.syncUpdate()
+
+ print "User '%s' is added to role '%s'" % \
+ (subject.name, role.name)
+ except IntegrityError:
+ msg = "User '%s' is already assigned to role '%s'" % \
+ (subject.name, role.name)
+ raise CommandException(self, msg)
+
+ class Unassign(Command):
+ def run(self, opts, args):
+ if len(args) != 3:
+ raise CommandException(self, "USER and ROLE are required")
+
+ subject = Subject.getByName(args[1])
+
+ if not subject:
+ raise CommandException \
+ (self, "User '%s' is unknown" % subject.name)
+
+ role = Role.getByName(args[2])
+
+ if not role:
+ raise CommandException \
+ (self, "Role '%s' is unknown" % role.name)
+
+ subject.removeRole(role)
+ subject.syncUpdate()
+
+ print "User '%s' is removed from role '%s'" % \
+ (subject.name, role.name)
+
+ class ChangePassword(Command):
+ def run(self, opts, args):
+ pass
Modified: mgmt/trunk/mint/python/mint/__init__.py
===================================================================
--- mgmt/trunk/mint/python/mint/__init__.py 2008-09-25 19:47:16 UTC (rev 2545)
+++ mgmt/trunk/mint/python/mint/__init__.py 2008-09-25 20:11:49 UTC (rev 2546)
@@ -129,6 +129,14 @@
roles = SQLRelatedJoin("Role", intermediateTable="subject_role_mapping",
createRelatedTable=False)
+ def getByName(cls, name):
+ try:
+ return Subject.selectBy(name=name)[0]
+ except IndexError:
+ pass
+
+ getByName = classmethod(getByName)
+
class Role(SQLObject):
class sqlmeta:
lazyUpdate = True
@@ -138,6 +146,14 @@
intermediateTable="subject_role_mapping",
createRelatedTable=False)
+ def getByName(cls, name):
+ try:
+ return Role.selectBy(name=name)[0]
+ except IndexError:
+ pass
+
+ getByName = classmethod(getByName)
+
class SubjectRoleMapping(SQLObject):
class sqlmeta:
lazyUpdate = True
17 years, 7 months
rhmessaging commits: r2545 - mgmt/trunk/parsley/python/parsley.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2008-09-25 15:47:16 -0400 (Thu, 25 Sep 2008)
New Revision: 2545
Modified:
mgmt/trunk/parsley/python/parsley/
Log:
Ignore pyc files
Property changes on: mgmt/trunk/parsley/python/parsley
___________________________________________________________________
Name: svn:ignore
+ *.pyc
17 years, 7 months
rhmessaging commits: r2544 - in mgmt/trunk: etc and 3 other directories.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2008-09-25 15:42:18 -0400 (Thu, 25 Sep 2008)
New Revision: 2544
Added:
mgmt/trunk/parsley/
mgmt/trunk/parsley/python/
mgmt/trunk/parsley/python/parsley/
mgmt/trunk/parsley/python/parsley/__init__.py
mgmt/trunk/parsley/python/parsley/command.py
Modified:
mgmt/trunk/etc/devel.profile
mgmt/trunk/etc/devel.profile.tcsh
Log:
Introduces the parsley project, for utility code used across the spicy
projects. We're starting with some common code for creating the cumin
(and soon, mint) clis.
Modified: mgmt/trunk/etc/devel.profile
===================================================================
--- mgmt/trunk/etc/devel.profile 2008-09-25 15:26:14 UTC (rev 2543)
+++ mgmt/trunk/etc/devel.profile 2008-09-25 19:42:18 UTC (rev 2544)
@@ -1,5 +1,5 @@
export DEVEL_HOME="$PWD"
-export DEVEL_MODULES="basil mint cumin"
+export DEVEL_MODULES="mint cumin basil parsley"
# PYTHONPATH
Modified: mgmt/trunk/etc/devel.profile.tcsh
===================================================================
--- mgmt/trunk/etc/devel.profile.tcsh 2008-09-25 15:26:14 UTC (rev 2543)
+++ mgmt/trunk/etc/devel.profile.tcsh 2008-09-25 19:42:18 UTC (rev 2544)
@@ -1,5 +1,5 @@
setenv DEVEL_HOME "$PWD"
-set DEVEL_MODULES=(mint cumin)
+set DEVEL_MODULES=(mint cumin basil parsley)
# PYTHONPATH
Added: mgmt/trunk/parsley/python/parsley/__init__.py
===================================================================
Added: mgmt/trunk/parsley/python/parsley/command.py
===================================================================
--- mgmt/trunk/parsley/python/parsley/command.py (rev 0)
+++ mgmt/trunk/parsley/python/parsley/command.py 2008-09-25 19:42:18 UTC (rev 2544)
@@ -0,0 +1,160 @@
+class Command(object):
+ def __init__(self, parent, name):
+ self.parent = parent
+ self.name = name
+ self.aliases = ()
+ self.arguments = ()
+ self.description = None
+
+ self.options = list()
+ self.options_by_param = dict()
+
+ self.commands = list()
+ self.commands_by_name = dict()
+
+ if self.parent:
+ self.parent.commands.append(self)
+ self.parent.commands_by_name[self.name] = self
+
+ def init(self):
+ if self.parent:
+ for alias in self.aliases:
+ self.parent.commands_by_name[alias] = self
+
+ for option in self.options:
+ option.init()
+
+ for command in self.commands:
+ command.init()
+
+ def parse_options(self, argv):
+ opts = dict()
+ opt = None
+ remaining = list()
+
+ def find_opt(key):
+ try:
+ opt = self.options_by_param[key]
+ opts[opt.name] = None
+ return opt
+ except KeyError:
+ msg = "Option '%s' is unrecognized" % key
+ raise CommandException(self, msg)
+
+ for i, arg in enumerate(argv):
+ if arg.startswith("--"):
+ opt = find_opt(arg[2:])
+ elif arg.startswith("-"):
+ opt = find_opt(arg[1])
+ elif opt:
+ if opt.argument:
+ opts[opt.name] = opt.unmarshal(arg)
+ opt = None
+ else:
+ remaining = argv[i:]
+ break
+ else:
+ remaining = argv[i:]
+ break
+
+ return opts, remaining
+
+ def parse(self, argv):
+ opts = dict()
+ args = list()
+ opt = None
+
+ def find_opt(key):
+ try:
+ opt = self.options_by_param[key]
+ opts[opt.name] = None
+ return opt
+ except KeyError:
+ msg = "Option '%s' is unrecognized" % key
+ raise CommandException(self, msg)
+
+ for arg in argv:
+ if arg.startswith("--"):
+ opt = find_opt(arg[2:])
+ elif arg.startswith("-"):
+ opt = find_opt(arg[1])
+ elif opt:
+ if opt.argument:
+ opts[opt.name] = opt.unmarshal(arg)
+ opt = None
+ else:
+ args.append(arg)
+ else:
+ args.append(arg)
+
+ return opts, args
+
+ def print_help(self):
+ usage = list()
+
+ if self.parent:
+ usage.append(self.parent.name)
+
+ usage.append(self.name)
+
+ if self.options:
+ usage.append("[OPTIONS]")
+
+ if self.commands:
+ usage.append("COMMAND")
+ elif self.arguments:
+ usage.extend(self.arguments)
+
+ print "Usage: %s" % " ".join(usage)
+
+ if self.description:
+ print "Description: %s" % self.description
+
+ if self.options:
+ print "Options:"
+
+ for opt in self.options:
+ osummary = "--%s" % opt.name
+
+ if opt.char:
+ osummary = osummary + " (-%s)" % opt.char
+
+ if opt.argument:
+ osummary = osummary + " " + opt.argument
+
+ print " %-30s %s" % (osummary, opt.description)
+
+ if self.commands:
+ print "Commands:"
+
+ for command in self.commands:
+ if command.aliases:
+ names = "%s (%s)" % (command.name, ", ".join(command.aliases))
+ else:
+ names = command.name
+
+ print " %-30s %s" % (names, command.description)
+
+class CommandOption(object):
+ def __init__(self, command, name, char=None):
+ self.command = command
+ self.name = name
+ self.char = char
+ self.argument = None
+ self.description = None
+ self.type = str
+
+ self.command.options.append(self)
+ self.command.options_by_param[self.name] = self
+
+ def init(self):
+ if self.char:
+ self.command.options_by_param[self.char] = self
+
+ def unmarshal(self, value):
+ return self.type(value)
+
+class CommandException(Exception):
+ def __init__(self, command, message):
+ self.command = command
+ self.message = message
17 years, 7 months
rhmessaging commits: r2543 - mgmt/trunk/cumin/resources.
by rhmessaging-commits@lists.jboss.org
Author: eallen
Date: 2008-09-25 11:26:14 -0400 (Thu, 25 Sep 2008)
New Revision: 2543
Modified:
mgmt/trunk/cumin/resources/help.html
Log:
Added help for SetLimit page
Modified: mgmt/trunk/cumin/resources/help.html
===================================================================
--- mgmt/trunk/cumin/resources/help.html 2008-09-25 15:25:36 UTC (rev 2542)
+++ mgmt/trunk/cumin/resources/help.html 2008-09-25 15:26:14 UTC (rev 2543)
@@ -233,7 +233,7 @@
<div class="titlepage">
<a name="main.pool.jobgrouphold.help"/><a name="main.pool.jobgroupremove.help"/><a name="main.pool.jobgrouprelease.help"/>
<a name="main.pool.jobshold.help" /><a name="main.pool.jobsremove.help" /><a name="main.pool.jobsrelease.help" />
- <h3 class="title">Job Group Actions</h3>
+ <h3 class="title">Job Actions</h3>
</div>
<p>
The following actions can be performed on a job:
@@ -251,7 +251,7 @@
</ul> button on the jobs page.
</dd>
</dl>
- When any of these actions are performed on a job group, the action is performed on all the jobs in the group.
+ <p>When any of these actions are performed on a job group, the action is performed on all the jobs in the group.</p>
</p>
<ul class="docnav">
@@ -262,6 +262,23 @@
</li>
</ul>
+ <div class="titlepage">
+ <a name="main.pool.limit.edit.help"/>
+ <h3 class="title">Edit Concurrency Limits</h3>
+ </div>
+ <p>
+ Change the maximum number of jobs that can be run concurrently using a limiter.
+ <p>A Limiter is a resource that must be allocated to a job before the job can run.<p>
+ </p>
+
+<ul class="docnav">
+ <li class="up">
+ <a accesskey="u" href="#top">
+ <strong>Help Index</strong>
+ </a>
+ </li>
+</ul>
+
</div><!-- section -->
<div style="height:1000px;"><!-- --></div>
17 years, 7 months
rhmessaging commits: r2542 - mgmt/trunk/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: eallen
Date: 2008-09-25 11:25:36 -0400 (Thu, 25 Sep 2008)
New Revision: 2542
Modified:
mgmt/trunk/cumin/python/cumin/limits.py
mgmt/trunk/cumin/python/cumin/limits.strings
mgmt/trunk/cumin/python/cumin/model.py
Log:
Added SetLimit
Added Hold/Release/Remove methods to LimitJobSet
Modified: mgmt/trunk/cumin/python/cumin/limits.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/limits.py 2008-09-25 15:23:36 UTC (rev 2541)
+++ mgmt/trunk/cumin/python/cumin/limits.py 2008-09-25 15:25:36 UTC (rev 2542)
@@ -16,7 +16,48 @@
strings = StringCatalog(__file__)
log = logging.getLogger("cumin.Limits")
-class LimitsSet(ItemTable):
+class LimitActions(object):
+ def fetch_limits(self, session):
+ negotiator = self.get_negotiator(session)
+ if negotiator:
+ return self.get_raw_limits(session, negotiator)
+
+ def get_negotiator(self, session):
+#TODO: find better way to get the negotiator. from pool perhaps?
+ negotiators = Negotiator.select()
+ for negotiator in negotiators:
+ if negotiator.managedBroker:
+ return negotiator
+
+ def set_limit(self, session, limit):
+ negotiator = self.get_negotiator(session)
+ action = self.app.model.limit.setlimit
+ action.invoke(limit, negotiator)
+#TODO: this probably shouldn't be called until after the invoke completes
+ def completion():
+ pass
+ negotiator.Reconfig(self.app.model.data, completion)
+
+ def get_raw_limits(self, session, negotiator):
+ self.lim = dict()
+ self.got_data = False
+
+ def completion(status, data):
+ self.lim = data["Limits"]
+ self.got_data = True
+
+ def predicate():
+ return self.got_data
+
+ model = self.app.model
+ negotiator.GetLimits(model.data, completion, self.lim)
+
+ # wait for up to 20 seconds for completion to be called
+ wait(predicate, timeout=20)
+ return self.lim
+
+
+class LimitsSet(ItemTable, LimitActions):
def __init__(self, app, name):
super(LimitsSet, self).__init__(app, name)
@@ -47,33 +88,10 @@
def limit_count(self, session):
limits = self.limits.get(session)
if not limits:
-#TODO: fix this. Where do we get the correct negotiator???
- negotiators = Negotiator.select()
- for negotiator in negotiators:
- if negotiator.managedBroker:
-#TODO:
- limits = self.get_raw_limits(session, negotiator)
- self.limits.set(session, limits)
+ limits = self.fetch_limits(session)
+ self.limits.set(session, limits)
return len(limits)
- def get_raw_limits(self, session, negotiator):
- self.lim = dict()
- self.got_data = False
-
- def completion(status, data):
- self.lim = data["Limits"]
- self.got_data = True
-
- def predicate():
- return self.got_data
-
- model = self.app.model
- negotiator.GetLimits(model.data, completion, self.lim)
-
- # wait for up to 20 seconds for completion to be called
- wait(predicate, timeout=20)
- return self.lim
-
class NameColumn(ItemTableColumn):
def render_title(self, session, data):
return "Name"
@@ -96,7 +114,7 @@
def get_default(self, session):
return dict()
-class LimitsFrame(CuminFrame):
+class LimitsFrame(CuminFrame, JobSetFrame, LimitActions):
def __init__(self, app, name):
super(LimitsFrame, self).__init__(app, name)
@@ -107,19 +125,100 @@
self.add_mode(view)
self.set_view_mode(view)
- def show_job(self, session, job):
- return self.frame.show_job(session, job)
+ edit = LimitEdit(app, "edit")
+ self.add_mode(edit)
+ self.set_edit_mode(edit)
- def show_scheduler(self, session, sched):
- return self.frame.show_scheduler(session, sched)
+ def get_object(self, session):
+ obj = self.object.get(session)
+ if not getattr(obj, "name", None):
+ limits = self.fetch_limits(session)
+ obj.name = obj.id
+ obj.curr = limits[obj.id]["CURRENT"]
+ obj.max = limits[obj.id]["MAX"]
+ self.object.set(session, obj)
- def show_submitter(self, session, submitter):
- return self.frame.show_submitter(session, submitter)
+ return obj
+
- def show_job_group(self, session, job_group):
- return self.frame.show_job_group(session, job_group)
+class LimitEdit(CuminForm):
+ def __init__(self, app, name):
+ super(LimitEdit, self).__init__(app, name)
+ self.max = Parameter(app, "max")
+ self.add_parameter(self.max)
+ self.add_form_parameter(self.max)
+ self.error = self.Errors(self, "error")
+ self.add_attribute(self.error)
+
+ self.error_tmpl = Template(self, "error_html")
+
+ class Errors(Attribute):
+ def get_default(self, session):
+ return dict()
+
+ def get_args(self, session):
+ return self.frame.get_args(session)
+
+ def render_title(self, session, *args):
+ return "Edit Concurrency Limit '%s'" % args[0].id
+
+ def render_input_id(self, session, *args):
+ return self.max.path
+
+ def render_label(self, session, *args):
+ return "Maximum Allowance"
+
+ def render_input_name(self, session, *args):
+ return self.max.path
+
+ def render_input_value(self, session, *args):
+ max = self.max.get(session)
+ if not max:
+ max = args[0].max
+ return str(max)
+
+ def render_inline_help(self, session, *args):
+ return "Set the maximum number of jobs that can run concurrently using this limiter."
+
+ def render_limit_error(self, session, *args):
+ error = self.error.get(session)
+ if "max" in error:
+ writer = Writer()
+ self.error_tmpl.render(writer, session, *args)
+ return writer.to_string()
+
+ def render_error(self, session, *args):
+ error = self.error.get(session)
+ if "max" in error:
+ return error["max"]
+
+ def render_original_value(self, session, *args):
+ error = self.error.get(session)
+ if "max" in error:
+ return "Original value was %s" % str(args[0].max)
+
+ def process_submit(self, session, *args):
+ max = self.max.get(session)
+ imax = 0
+ errors = False
+ try:
+ imax = int(max)
+ if imax < 1 or imax > 99999:
+ raise "out of bounds"
+ except:
+ errors = True
+ error = self.error.get(session)
+ error["max"] = "Numeric value between 1 and 99999 expected"
+ self.error.set(session, error)
+
+ if not errors:
+ limit = args[0]
+ limit.max = imax
+ self.frame.set_limit(session, limit)
+ self.process_cancel(session, *args)
+
class LimitsView(CuminView):
def __init__(self, app, name):
super(LimitsView, self).__init__(app, name)
@@ -139,15 +238,26 @@
class LimitsStatus(CuminStatus):
pass
-class LimitsJobSet(JobSet, Form):
+class LimitsJobSet(JobTab):
def get_visible_columns(self, session):
- return self.get_request_visible_columns(session, ["custom_group", "scheduler", "submitter"])
+ return self.get_request_visible_columns(session,
+ ["custom_group",
+ "scheduler",
+ "submitter"])
def render_sql_where(self, session, limit):
phase_sql = self.get_phase_sql(session)
- Limits_sql = "j.concurrency_limits like '%%%s%%'" % limit.id
- return "where %s" % " and ".join([phase_sql, Limits_sql])
+ limits_sql = self.get_limits_sql(session, limit)
+ return "where %s" % " and ".join([phase_sql, limits_sql])
def render_title(self, session, limit):
- Limits_sql = "concurrency_limits like '%%%s%%'" % limit.id
- return "Jobs %s" % fmt_count(Job.select(Limits_sql).count())
+ limits_sql = self.get_limits_sql(session, limit)
+ return "Jobs %s" % fmt_count(Job.select(limits_sql).count())
+
+ def render_count(self, session, *args):
+ str = super(LimitsJobSet, self).render_count(session, *args)
+ return "%s with Concurrency Limit '%s'" % (str, args[0].id)
+
+ def get_limits_sql(self, session, limit):
+ x = limit.id
+ return "concurrency_limits similar to '(%s|%s,%%|%%,%s|%%,%s,%%)'" % (x, x, x, x)
Modified: mgmt/trunk/cumin/python/cumin/limits.strings
===================================================================
--- mgmt/trunk/cumin/python/cumin/limits.strings 2008-09-25 15:23:36 UTC (rev 2541)
+++ mgmt/trunk/cumin/python/cumin/limits.strings 2008-09-25 15:25:36 UTC (rev 2542)
@@ -10,3 +10,82 @@
</thead>
<tbody>{items}</tbody>
</table>
+
+[LimitEdit.css]
+form.limitform {
+/* padding: 1em; */
+}
+form.limitform div.label, form.limitform div.input {
+ float: left;
+ height: 3em;
+ margin-left: 1em;
+}
+form.limitform div.input input {
+ position: relative;
+ top: -0.2em;
+ width: 4em;
+}
+form.limitform div.foot {
+ clear: left;
+}
+form.limitform div.help {
+ margin: 0.5em 1em 1em 0;
+}
+
+form.limitform div.original_value {
+ color: #333;
+ font-size: 0.9em;
+ font-style: italic;
+}
+
+[LimitEdit.html]
+<form id="{id}" class="mform limitform" method="post" action="?">
+ <div class="head">
+ <h1>{title}</h1>
+ </div>
+ <div class="body">
+ <div class="help">
+ {inline_help}
+ </div>
+ <div class="label">
+ <label for="{input_id}">{label}</label>
+ </div>
+ <div class="input">
+ <input id="{input_id}" type="text" name="{input_name}" value="{input_value}" />
+ <div class="original_value">{original_value}</div>
+ </div>{limit_error}
+ <div style="clear:both;"><!-- --></div>
+ </div>
+ <div class="foot">
+ {help} {submit} {cancel}
+ </div>
+ <div>{hidden_inputs}</div>
+</form>
+
+[LimitEdit.error_html]
+ <ul class="errors"><li>{error}</li></ul>
+
+[LimitsJobSet.html]
+ <div class="rfloat">{phase}</div>
+<form id="{id}" style="clear:right;" method="post" action="?">
+
+ <div class="sactions">
+ <h2>Act on Selected Jobs:</h2>
+ {hold} {release} {remove}
+ </div>
+
+ <table class="mobjects">
+ <thead>
+ <tr>
+ <th class="setnav" colspan="{column_count}">
+ <div class="rfloat">{page}</div>
+ {count}
+ </th>
+ </tr>
+ <tr>{headers}</tr>
+ </thead>
+ <tbody>{items}</tbody>
+ </table>
+ <div>{hidden_inputs}</div>
+</form>
+
\ No newline at end of file
Modified: mgmt/trunk/cumin/python/cumin/model.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/model.py 2008-09-25 15:23:36 UTC (rev 2541)
+++ mgmt/trunk/cumin/python/cumin/model.py 2008-09-25 15:25:36 UTC (rev 2542)
@@ -1541,6 +1541,36 @@
super(CuminLimit, self).__init__ \
(model, "limit", Limit)
+ prop = CuminProperty(self, "name")
+ prop.title = "Name"
+
+ prop = CuminProperty(self, "curr")
+ prop.summary = True
+ prop.title = "Current"
+
+ prop = CuminProperty(self, "max")
+ prop.summary = True
+ prop.title = "Maximum"
+
+ action = self.Edit(self, "edit")
+ action.title = "Edit"
+ action.summary = True
+
+ action = self.SetLimit(self, "setlimit")
+ action.navigable = False
+ action.title = "Set Limit"
+
+ def show_object(self, session, limit):
+ frame = self.cumin_model.show_main(session)
+ frame = frame.children_by_name["pool"]
+ return frame.show_limit(session, limit)
+
+ class Edit(CuminAction):
+ def show(self, session, limit):
+ frame = self.cumin_class.show_object(session, limit)
+ frame = frame.show_edit(session)
+ return frame
+
def get_title(self, session):
return "Concurrency Limit"
@@ -1548,6 +1578,18 @@
title = self.get_title(session)
name = limit.id
return "%s '%s'" % (title, fmt_shorten(name))
+
+ class SetLimit(CuminAction):
+ def show(self, session, job):
+ pass
+
+ def get_title(self, session):
+ return "Set Limit for"
+
+ def do_invoke(self, limit, negotiator, completion):
+ Name = limit.id
+ Max = limit.max
+ negotiator.SetLimit(self.cumin_model.data, completion, Name, str(Max))
class CuminJobGroup(CuminClass):
def __init__(self, model):
@@ -1704,9 +1746,10 @@
prop.writable = False
######## Properties
- prop = CuminProperty(self, "AccountingGroup")
+ prop = self.GroupProperty(self, "CustomGroup")
+ prop.title = "Job Group"
prop.summary = True
- prop.title = "Group"
+ prop.escape = False
prop = self.SchedulerProperty(self, "scheduler")
prop.title = "Scheduler"
@@ -1718,6 +1761,9 @@
prop.summary = True
prop.escape = False
+ prop = CuminProperty(self, "AccountingGroup")
+ prop.title = "Accounting Group"
+
prop = CuminProperty(self, "Args")
prop.title = "Args"
@@ -1730,9 +1776,6 @@
prop = CuminProperty(self, "ConcurrencyLimits")
prop.title = "Concurrency Limits"
- prop = CuminProperty(self, "CustomGroup")
- prop.title = "Custom Group"
-
prop = CuminProperty(self, "CustomId")
prop.title = "Custom ID"
@@ -1797,6 +1840,18 @@
def render_status(self, session, status):
return JobStatusInfo.get_status_string(status)
+ class GroupProperty(CuminProperty):
+ def value(self, session, job):
+ branch = session.branch()
+ frame = self.cumin_class.get_pool_frame(branch)
+ try:
+ group = JobGroup(job.CustomGroup)
+ frame.show_job_group(branch, group)
+ return escape_amp(fmt_olink(branch, group, name=group.get_id()))
+ except Exception, e:
+ return "Unavailable"
+
+
class SubmitterProperty(CuminProperty):
def value(self, session, job):
branch = session.branch()
17 years, 7 months
rhmessaging commits: r2541 - mgmt/trunk/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: eallen
Date: 2008-09-25 11:23:36 -0400 (Thu, 25 Sep 2008)
New Revision: 2541
Modified:
mgmt/trunk/cumin/python/cumin/job.py
mgmt/trunk/cumin/python/cumin/scheduler.py
mgmt/trunk/cumin/python/cumin/submitter.py
Log:
Consolidated some methods in JobFrame class
Modified: mgmt/trunk/cumin/python/cumin/job.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/job.py 2008-09-25 15:22:40 UTC (rev 2540)
+++ mgmt/trunk/cumin/python/cumin/job.py 2008-09-25 15:23:36 UTC (rev 2541)
@@ -82,6 +82,10 @@
def get_phase_sql(self, session):
return self.phase.get_sql_constraint(session)
+
+ def get_phase_title(self, session):
+ state = self.phase.get(session)
+ return self.phase.get_title(state)
class ArgsColumn(SqlTableColumn):
def render_title(self, session, data):
@@ -175,6 +179,61 @@
def render_title(self, session, data):
return "Title"
+class JobTab(JobSet, Form):
+ def __init__(self, app, name):
+ super(JobTab, self).__init__(app, name)
+
+ self.set_default_column_name("global_job_id")
+
+ self.__remove = JobRemoveButton(app, "remove", self)
+ self.add_child(self.__remove)
+
+ self.__hold = JobHoldButton(app, "hold", self)
+ self.add_child(self.__hold)
+
+ self.__release = JobReleaseButton(app, "release", self)
+ self.add_child(self.__release)
+
+ def get_visible_columns(self, session):
+ return self.get_request_visible_columns(session, ["custom_group", "scheduler", "submitter"])
+
+ def render_sql_where(self, session, *args):
+ phase_sql = self.get_phase_sql(session)
+ return "where %s" % phase_sql
+
+ def render_count(self, session, *args):
+ count = self.get_item_count(session, *args)
+ phase = self.get_phase_title(session)
+ if phase == "All":
+ phase = ""
+ return "%i %s %s" % (count, phase, count == 1 and "Job" or "Jobs")
+
+class JobSetFrame(object):
+ """ Intermediate class to consolidate the show_xxx methods associated with a jobset
+
+ Used by LimitsFrame, SchedulerFrame, SubmitterFrame, etc."""
+ def show_job(self, session, job):
+ return self.frame.show_job(session, job)
+
+ def show_scheduler(self, session, sched):
+ return self.frame.show_scheduler(session, sched)
+
+ def show_submitter(self, session, submitter):
+ return self.frame.show_submitter(session, submitter)
+
+ def show_job_group(self, session, job_group):
+ return self.frame.show_job_group(session, job_group)
+
+ def show_jobs_hold(self, session):
+ return self.frame.show_jobs_hold(session)
+
+ def show_jobs_release(self, session):
+ return self.frame.show_jobs_release(session)
+
+ def show_jobs_remove(self, session):
+ return self.frame.show_jobs_remove(session)
+
+
class JobGroupFrame(CuminFrame):
def __init__(self, app, name):
super(JobGroupFrame, self).__init__(app, name)
@@ -351,7 +410,7 @@
phase = self.parent.phase.get(session)
return (phase == "r" or phase == "d") and "disabled" or "enabled"
-class JobGroupJobSet(JobSet, Form):
+class JobGroupJobSet(JobTab):
def __init__(self, app, name):
super(JobGroupJobSet, self).__init__(app, name)
@@ -378,6 +437,10 @@
group_sql = "j.custom_group = '%s'" % group.get_id()
return "where %s" % " and ".join([phase_sql, group_sql])
+ def render_count(self, session, *args):
+ str = super(JobGroupJobSet, self).render_count(session, *args)
+ return "%s in Job Group '%s'" % (str, args[0].id)
+
class JobGroupStatus(CuminStatus):
def render_color(self, session, job_group):
#return JobStatusInfo.get_status_color(job.JobStatus)
@@ -1014,28 +1077,6 @@
if is_group == "g":
return self.job_group_tab.render(session)
-class JobTab(JobSet, Form):
- def __init__(self, app, name):
- super(JobTab, self).__init__(app, name)
-
- self.set_default_column_name("global_job_id")
-
- self.__remove = JobRemoveButton(app, "remove", self)
- self.add_child(self.__remove)
-
- self.__hold = JobHoldButton(app, "hold", self)
- self.add_child(self.__hold)
-
- self.__release = JobReleaseButton(app, "release", self)
- self.add_child(self.__release)
-
- def get_visible_columns(self, session):
- return self.get_request_visible_columns(session, ["custom_group", "scheduler", "submitter"])
-
- def render_sql_where(self, session, *args):
- phase_sql = self.get_phase_sql(session)
- return "where %s" % phase_sql
-
class JobGroupTab(JobGroupSet, Form):
def __init__(self, app, name):
super(JobGroupTab, self).__init__(app, name)
Modified: mgmt/trunk/cumin/python/cumin/scheduler.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/scheduler.py 2008-09-25 15:22:40 UTC (rev 2540)
+++ mgmt/trunk/cumin/python/cumin/scheduler.py 2008-09-25 15:23:36 UTC (rev 2541)
@@ -38,7 +38,7 @@
self.frame.show_scheduler(branch, sched).show_view(branch)
return fmt_olink(branch, sched, name=data["name"])
-class SchedulerFrame(CuminFrame):
+class SchedulerFrame(CuminFrame, JobSetFrame):
def __init__(self, app, name):
super(SchedulerFrame, self).__init__(app, name)
@@ -48,25 +48,7 @@
view = SchedulerView(app, "view")
self.add_mode(view)
self.set_view_mode(view)
-
- def show_job(self, session, job):
- return self.frame.show_job(session, job)
-
- def show_job_group(self, session, job_group):
- return self.frame.show_job_group(session, job_group)
- def show_jobs_hold(self, session):
- return self.frame.show_jobs_hold(session)
-
- def show_jobs_release(self, session):
- return self.frame.show_jobs_release(session)
-
- def show_jobs_remove(self, session):
- return self.frame.show_jobs_remove(session)
-
- def show_submitter(self, session, submitter):
- return self.frame.show_submitter(session, submitter)
-
class SchedulerView(CuminView):
def __init__(self, app, name):
super(SchedulerView, self).__init__(app, name)
@@ -128,21 +110,10 @@
def render_title(self, session, sched):
return "Jobs"
-class SchedulerJobSet(JobSet, Form):
+class SchedulerJobSet(JobTab):
def __init__(self, app, name):
super(SchedulerJobSet, self).__init__(app, name)
- self.set_default_column_name("global_job_id")
-
- self.__remove = JobRemoveButton(app, "remove", self)
- self.add_child(self.__remove)
-
- self.__hold = JobHoldButton(app, "hold", self)
- self.add_child(self.__hold)
-
- self.__release = JobReleaseButton(app, "release", self)
- self.add_child(self.__release)
-
def get_visible_columns(self, session):
return self.get_request_visible_columns(session, ["custom_group", "submitter"])
Modified: mgmt/trunk/cumin/python/cumin/submitter.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/submitter.py 2008-09-25 15:22:40 UTC (rev 2540)
+++ mgmt/trunk/cumin/python/cumin/submitter.py 2008-09-25 15:23:36 UTC (rev 2541)
@@ -38,7 +38,7 @@
self.frame.show_submitter(branch, sub).show_view(branch)
return fmt_olink(branch, sub, name=data["name"])
-class SubmitterFrame(CuminFrame):
+class SubmitterFrame(CuminFrame, JobSetFrame):
def __init__(self, app, name):
super(SubmitterFrame, self).__init__(app, name)
@@ -49,25 +49,7 @@
self.add_mode(view)
self.set_view_mode(view)
- def show_scheduler(self, session, scheduler):
- return self.frame.show_scheduler(session, scheduler)
-
- def show_job(self, session, job):
- return self.frame.show_job(session, job)
-
- def show_job_group(self, session, job_group):
- return self.frame.show_job_group(session, job_group)
- def show_jobs_hold(self, session):
- return self.frame.show_jobs_hold(session)
-
- def show_jobs_release(self, session):
- return self.frame.show_jobs_release(session)
-
- def show_jobs_remove(self, session):
- return self.frame.show_jobs_remove(session)
-
-
class SubmitterView(CuminView):
def __init__(self, app, name):
super(SubmitterView, self).__init__(app, name)
@@ -117,21 +99,10 @@
def render_title(self, session, sched):
return "Jobs"
-class SubmitterJobSet(JobSet, Form):
+class SubmitterJobSet(JobTab):
def __init__(self, app, name):
super(SubmitterJobSet, self).__init__(app, name)
- self.set_default_column_name("global_job_id")
-
- self.__remove = JobRemoveButton(app, "remove", self)
- self.add_child(self.__remove)
-
- self.__hold = JobHoldButton(app, "hold", self)
- self.add_child(self.__hold)
-
- self.__release = JobReleaseButton(app, "release", self)
- self.add_child(self.__release)
-
def get_visible_columns(self, session):
return self.get_request_visible_columns(session, ["custom_group", "scheduler"])
17 years, 7 months
rhmessaging commits: r2540 - mgmt/trunk/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: eallen
Date: 2008-09-25 11:22:40 -0400 (Thu, 25 Sep 2008)
New Revision: 2540
Modified:
mgmt/trunk/cumin/python/cumin/widgets.py
Log:
Removed post_process
Modified: mgmt/trunk/cumin/python/cumin/widgets.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/widgets.py 2008-09-24 16:49:34 UTC (rev 2539)
+++ mgmt/trunk/cumin/python/cumin/widgets.py 2008-09-25 15:22:40 UTC (rev 2540)
@@ -163,8 +163,6 @@
else:
self.process_display(session, *args)
- self.post_process(session, *args)
-
def process_cancel(self, session, *args):
self.page.set_redirect_url(session, self.get_origin(session))
@@ -174,9 +172,6 @@
def process_display(self, session, *args):
pass
- def post_process(self, session, *args):
- pass
-
def render_cancel_content(self, session, *args):
return "Cancel"
17 years, 7 months
rhmessaging commits: r2539 - mgmt/trunk/cumin/python/wooly.
by rhmessaging-commits@lists.jboss.org
Author: eallen
Date: 2008-09-24 12:49:34 -0400 (Wed, 24 Sep 2008)
New Revision: 2539
Modified:
mgmt/trunk/cumin/python/wooly/forms.py
Log:
Only render the FormErrorSet <ul> when there are errors.
Modified: mgmt/trunk/cumin/python/wooly/forms.py
===================================================================
--- mgmt/trunk/cumin/python/wooly/forms.py 2008-09-24 15:19:38 UTC (rev 2538)
+++ mgmt/trunk/cumin/python/wooly/forms.py 2008-09-24 16:49:34 UTC (rev 2539)
@@ -91,9 +91,9 @@
def get_items(self, session, *args):
return self.get(session)
-# def do_render(self, session, *args):
-# if self.get(session):
-# super(FormErrorSet, self).do_render(session, *args)
+ def do_render(self, session, *args):
+ if self.get(session):
+ return super(FormErrorSet, self).do_render(session, *args)
def render_item_content(self, session, item):
return item.get_message(session)
17 years, 7 months
rhmessaging commits: r2538 - mgmt/trunk.
by rhmessaging-commits@lists.jboss.org
Author: justi9
Date: 2008-09-24 11:19:38 -0400 (Wed, 24 Sep 2008)
New Revision: 2538
Removed:
mgmt/trunk/mrg-management.spec
Log:
Remove an obsolete spec file
Deleted: mgmt/trunk/mrg-management.spec
===================================================================
--- mgmt/trunk/mrg-management.spec 2008-09-23 21:21:47 UTC (rev 2537)
+++ mgmt/trunk/mrg-management.spec 2008-09-24 15:19:38 UTC (rev 2538)
@@ -1,37 +0,0 @@
-Summary: MRG - management component
-Name: mrg-management
-Version: 1.0
-Release: 2%{?dist}
-License: LGPL
-Group: System Environment/Libraries
-URL: http://redhat.com/mrg
-BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
-BuildArch: noarch
-
-Requires: cumin
-
-
-%description
-This is the top-level package that includes the MRG management component.
-
-%install
-rm -rf %{buildroot}
-
-%clean
-rm -rf $RPM_BUILD_ROOT
-
-%prep
-
-%build
-
-%files
-%defattr(-,root,root,-)
-
-
-%changelog
-* Mon Feb 11 2008 Rafael Schloming <rafaels(a)redhat.com> - 1.0-2
-- Bump for Beta 3 update
-
-* Fri Jan 18 2008 Nuno Santos <nsantos(a)redhat.com> - 1.0-1
-- Initial build.
-
17 years, 7 months
rhmessaging commits: r2537 - mgmt/trunk/cumin/python/cumin.
by rhmessaging-commits@lists.jboss.org
Author: eallen
Date: 2008-09-23 17:21:47 -0400 (Tue, 23 Sep 2008)
New Revision: 2537
Modified:
mgmt/trunk/cumin/python/cumin/limits.py
mgmt/trunk/cumin/python/cumin/model.py
mgmt/trunk/cumin/python/cumin/parameters.py
mgmt/trunk/cumin/python/cumin/pool.py
Log:
Added LimitsFrame, LimitsView, and LimitsJobSet to Concurrency Limits
Modified: mgmt/trunk/cumin/python/cumin/limits.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/limits.py 2008-09-23 21:20:30 UTC (rev 2536)
+++ mgmt/trunk/cumin/python/cumin/limits.py 2008-09-23 21:21:47 UTC (rev 2537)
@@ -25,9 +25,11 @@
self.set_default_column(col)
col = self.CurrentColumn(app, "curr")
+ col.alignment = "right"
self.add_column(col)
col = self.MaxColumn(app, "max")
+ col.alignment = "right"
self.add_column(col)
self.limits = self.Limits(self, "limits")
@@ -40,15 +42,18 @@
return [{"name":x, "curr":limits[x]["CURRENT"], "max":limits[x]["MAX"]} for x in keys]
def render_title(self, session):
- return "Concurrancy Limits %s" % fmt_count(self.limit_count(session))
+ return "Concurrency Limits %s" % fmt_count(self.limit_count(session))
def limit_count(self, session):
-#TODO: fix this
- negotiator = Negotiator.get(1)
limits = self.limits.get(session)
if not limits:
- limits = self.get_raw_limits(session, negotiator)
- self.limits.set(session, limits)
+#TODO: fix this. Where do we get the correct negotiator???
+ negotiators = Negotiator.select()
+ for negotiator in negotiators:
+ if negotiator.managedBroker:
+#TODO:
+ limits = self.get_raw_limits(session, negotiator)
+ self.limits.set(session, limits)
return len(limits)
def get_raw_limits(self, session, negotiator):
@@ -73,121 +78,76 @@
def render_title(self, session, data):
return "Name"
+ def render_content(self, session, data):
+ limit = Identifiable(data["name"])
+ branch = session.branch()
+ self.frame.show_limit(branch, limit).show_view(branch)
+ return fmt_olink(branch, limit, name=data["name"])
+
class CurrentColumn(ItemTableColumn):
def render_title(self, session, data):
return "Current Usage"
class MaxColumn(ItemTableColumn):
def render_title(self, session, data):
- return "Max Usage"
+ return "Max Allowance"
class Limits(Attribute):
def get_default(self, session):
return dict()
-#class LimitsFrame(CuminFrame):
-# def __init__(self, app, name):
-# super(LimitsFrame, self).__init__(app, name)
-#
-# self.object = LimitsParameter(app, "id")
-# self.add_parameter(self.object)
-#
-# view = LimitsView(app, "view")
-# self.add_mode(view)
-# self.set_view_mode(view)
-#
-# def show_scheduler(self, session, scheduler):
-# return self.frame.show_scheduler(session, scheduler)
-#
-# def show_job(self, session, job):
-# return self.frame.show_job(session, job)
-#
-# def show_job_group(self, session, job_group):
-# return self.frame.show_job_group(session, job_group)
-#
-# def show_jobs_hold(self, session):
-# return self.frame.show_jobs_hold(session)
-#
-# def show_jobs_release(self, session):
-# return self.frame.show_jobs_release(session)
-#
-# def show_jobs_remove(self, session):
-# return self.frame.show_jobs_remove(session)
-#
-#
-#class LimitsView(CuminView):
-# def __init__(self, app, name):
-# super(LimitsView, self).__init__(app, name)
-#
-# status = LimitsStatus(app, "status")
-# self.add_child(status)
-#
-# self.__tabs = TabbedModeSet(app, "tabs")
-# self.add_child(self.__tabs)
-#
-# stats = LimitsStats(app, "stats")
-# self.__tabs.add_tab(stats)
-#
-# jobs = LimitsJobSet(app, "jobs")
-# self.__tabs.add_tab(jobs)
-#
-# details = CuminDetails(app, "details")
-# self.__tabs.add_tab(details)
-#
-# def render_script(self, session, sched):
-# data = "model.xml?class=scheduler;id=%i" % sched.id
-# return "wooly.setIntervalUpdate('%s', updateLimits, 3000)" % data
-#
-#class LimitsStatus(CuminStatus):
-# pass
-#
-#class LimitsStats(Widget):
-# def __init__(self, app, name):
-# super(LimitsStats, self).__init__(app, name)
-#
-# stats = StatSet(app, "general", "general")
-# self.add_child(stats)
-#
-# chart = self.JobsChart(app, "jobs")
-# self.add_child(chart)
-#
-# def render_title(self, session):
-# return "Statistics"
-#
-# class JobsChart(StatValueChart):
-# def __init__(self, app, name):
-# super(LimitsStats.JobsChart, self).__init__ \
-# (app, name)
-#
-# self.stats = ("RunningJobs", "IdleJobs", "HeldJobs")
-#
-# def render_title(self, session, sched):
-# return "Jobs"
-#
-#class LimitsJobSet(JobSet, Form):
-# def __init__(self, app, name):
-# super(LimitsJobSet, self).__init__(app, name)
-#
-# self.set_default_column_name("global_job_id")
-#
-# self.__remove = JobRemoveButton(app, "remove", self)
-# self.add_child(self.__remove)
-#
-# self.__hold = JobHoldButton(app, "hold", self)
-# self.add_child(self.__hold)
-#
-# self.__release = JobReleaseButton(app, "release", self)
-# self.add_child(self.__release)
-#
-# def get_visible_columns(self, session):
-# return self.get_request_visible_columns(session, ["custom_group", "scheduler"])
-#
-# def render_sql_where(self, session, Limits):
-# phase_sql = self.get_phase_sql(session)
-# Limits_sql = "j.Limits_id = %i" % Limits.id
-# return "where %s" % " and ".join([phase_sql, Limits_sql])
-#
-# def render_title(self, session, Limits):
-# Limits_sql = "Limits_id = %i" % Limits.id
-# return "Jobs %s" % fmt_count(Job.select(Limits_sql).count())
+class LimitsFrame(CuminFrame):
+ def __init__(self, app, name):
+ super(LimitsFrame, self).__init__(app, name)
+ self.object = LimitParameter(app, "id")
+ self.add_parameter(self.object)
+
+ view = LimitsView(app, "view")
+ self.add_mode(view)
+ self.set_view_mode(view)
+
+ def show_job(self, session, job):
+ return self.frame.show_job(session, job)
+
+ def show_scheduler(self, session, sched):
+ return self.frame.show_scheduler(session, sched)
+
+ def show_submitter(self, session, submitter):
+ return self.frame.show_submitter(session, submitter)
+
+ def show_job_group(self, session, job_group):
+ return self.frame.show_job_group(session, job_group)
+
+
+class LimitsView(CuminView):
+ def __init__(self, app, name):
+ super(LimitsView, self).__init__(app, name)
+
+ status = LimitsStatus(app, "status")
+ self.add_child(status)
+
+ self.__tabs = TabbedModeSet(app, "tabs")
+ self.add_child(self.__tabs)
+
+ jobs = LimitsJobSet(app, "jobs")
+ self.__tabs.add_tab(jobs)
+
+ details = CuminDetails(app, "details")
+ self.__tabs.add_tab(details)
+
+class LimitsStatus(CuminStatus):
+ pass
+
+class LimitsJobSet(JobSet, Form):
+ def get_visible_columns(self, session):
+ return self.get_request_visible_columns(session, ["custom_group", "scheduler", "submitter"])
+
+ def render_sql_where(self, session, limit):
+ phase_sql = self.get_phase_sql(session)
+ Limits_sql = "j.concurrency_limits like '%%%s%%'" % limit.id
+ return "where %s" % " and ".join([phase_sql, Limits_sql])
+
+ def render_title(self, session, limit):
+ Limits_sql = "concurrency_limits like '%%%s%%'" % limit.id
+ return "Jobs %s" % fmt_count(Job.select(Limits_sql).count())
Modified: mgmt/trunk/cumin/python/cumin/model.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/model.py 2008-09-23 21:20:30 UTC (rev 2536)
+++ mgmt/trunk/cumin/python/cumin/model.py 2008-09-23 21:21:47 UTC (rev 2537)
@@ -47,6 +47,7 @@
CuminSubmitter(self)
CuminJob(self)
CuminJobGroup(self)
+ CuminLimit(self)
CuminPool(self)
@@ -1535,6 +1536,19 @@
def show_object(self, session, pool):
return self.cumin_model.show_main(session).show_pool(session, pool)
+class CuminLimit(CuminClass):
+ def __init__(self, model):
+ super(CuminLimit, self).__init__ \
+ (model, "limit", Limit)
+
+ def get_title(self, session):
+ return "Concurrency Limit"
+
+ def get_object_title(self, session, limit):
+ title = self.get_title(session)
+ name = limit.id
+ return "%s '%s'" % (title, fmt_shorten(name))
+
class CuminJobGroup(CuminClass):
def __init__(self, model):
super(CuminJobGroup, self).__init__ \
Modified: mgmt/trunk/cumin/python/cumin/parameters.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/parameters.py 2008-09-23 21:20:30 UTC (rev 2536)
+++ mgmt/trunk/cumin/python/cumin/parameters.py 2008-09-23 21:21:47 UTC (rev 2537)
@@ -86,6 +86,20 @@
def do_marshal(self, job_group):
return str(job_group.id)
+class Limit(object):
+ def __init__(self, id):
+ self.id = id
+
+ def get_id(self):
+ return self.id
+
+class LimitParameter(Parameter):
+ def do_unmarshal(self, string):
+ return Limit(string)
+
+ def do_marshal(self, limit):
+ return limit.id
+
class PeerParameter(Parameter):
def do_unmarshal(self, string):
return Link.get(int(string))
Modified: mgmt/trunk/cumin/python/cumin/pool.py
===================================================================
--- mgmt/trunk/cumin/python/cumin/pool.py 2008-09-23 21:20:30 UTC (rev 2536)
+++ mgmt/trunk/cumin/python/cumin/pool.py 2008-09-23 21:21:47 UTC (rev 2537)
@@ -14,7 +14,7 @@
from job import *
from scheduler import SchedulerSet, SchedulerFrame
from submitter import SubmitterSet, SubmitterFrame
-from limits import LimitsSet
+from limits import LimitsSet, LimitsFrame
strings = StringCatalog(__file__)
log = logging.getLogger("cumin.pool")
@@ -98,6 +98,9 @@
self.__job_group = JobGroupFrame(app, "jobgroup")
self.add_mode(self.__job_group)
+
+ self.__limit = LimitsFrame(app, "limit")
+ self.add_mode(self.__limit)
self.__job_group_hold = JobGroupHold(app, "jobgrouphold")
self.add_mode(self.__job_group_hold)
@@ -118,6 +121,11 @@
self.page.set_current_frame(session, self.__job_group)
return self.show_mode(session, self.__job_group)
+ def show_limit(self, session, limit):
+ self.__limit.set_object(session, limit)
+ self.page.set_current_frame(session, self.__limit)
+ return self.show_mode(session, self.__limit)
+
def show_scheduler(self, session, sched):
self.__sched.set_object(session, sched)
self.page.set_current_frame(session, self.__sched)
17 years, 7 months