[rhmessaging-commits] rhmessaging commits: r3111 - in mgmt/trunk/basil: python/basil and 1 other directory.
rhmessaging-commits at lists.jboss.org
rhmessaging-commits at lists.jboss.org
Mon Feb 9 17:49:51 EST 2009
Author: justi9
Date: 2009-02-09 17:49:51 -0500 (Mon, 09 Feb 2009)
New Revision: 3111
Added:
mgmt/trunk/basil/python/basil/model.py
mgmt/trunk/basil/python/basil/page.py
mgmt/trunk/basil/python/basil/page.strings
mgmt/trunk/basil/python/basil/server.py
mgmt/trunk/basil/python/basil/widgets.py
mgmt/trunk/basil/python/basil/widgets.strings
Modified:
mgmt/trunk/basil/bin/basil
mgmt/trunk/basil/python/basil/__init__.py
Log:
Initial check in of basil web
Modified: mgmt/trunk/basil/bin/basil
===================================================================
--- mgmt/trunk/basil/bin/basil 2009-02-06 16:28:59 UTC (rev 3110)
+++ mgmt/trunk/basil/bin/basil 2009-02-09 22:49:51 UTC (rev 3111)
@@ -1,43 +1,50 @@
#!/usr/bin/env python
import sys, os
-from code import InteractiveConsole
-from basil import *
+from basil.server import *
def usage():
- print "Usage: basil [BROKER-ADDRESS]"
+ print "Usage: basil [BROKER-HOST:BROKER-PORT]"
print "Example: basil localhost:5672"
sys.exit(1)
-def do_main(spec, host, port):
- model = BasilModel(spec)
+def do_main(host, port):
+ app = BasilApplication()
+ server = BasilServer(app, host, port)
- conn = BasilConnection(model, host, port)
- conn.open()
+ print "Initializing"
- console = InteractiveConsole(locals())
+ app.init()
+ app.start()
try:
- console.interact()
+ print "Starting web service at %s:%i" % (host, port)
+
+ try:
+ server.start()
+ finally:
+ server.stop()
finally:
- conn.close()
+ app.stop()
def main():
try:
addr = sys.argv[1]
except IndexError:
- addr = "localhost:5672"
+ addr = "localhost:55672"
- host, port = addr.split(":")
+ try:
+ host, port = addr.split(":")
+ port = int(port)
+ except:
+ print "Error: Malformed address"
+ usage()
- spec = os.environ.get("AMQP_SPEC", "/usr/share/amqp/amqp.0-10.xml")
-
try:
- do_main(spec, host, int(port))
+ do_main(host, port)
except KeyboardInterrupt:
pass
if __name__ == "__main__":
main()
-
Modified: mgmt/trunk/basil/python/basil/__init__.py
===================================================================
--- mgmt/trunk/basil/python/basil/__init__.py 2009-02-06 16:28:59 UTC (rev 3110)
+++ mgmt/trunk/basil/python/basil/__init__.py 2009-02-09 22:49:51 UTC (rev 3111)
@@ -8,7 +8,7 @@
from util import *
-class BasilModel(object):
+class OldBasilModel(object):
def __init__(self, spec_path):
self.spec = qpid.spec.load(spec_path)
Added: mgmt/trunk/basil/python/basil/model.py
===================================================================
--- mgmt/trunk/basil/python/basil/model.py (rev 0)
+++ mgmt/trunk/basil/python/basil/model.py 2009-02-09 22:49:51 UTC (rev 3111)
@@ -0,0 +1,85 @@
+from qmf.console import *
+from threading import Lock
+
+class BasilModel(object):
+ def __init__(self):
+ super(BasilModel, self).__init__()
+
+ self.broker_urls = set()
+
+ self.console = BasilConsole(self)
+ self.session = Session(self.console, manageConnections=True)
+
+ self.lock = Lock()
+
+ self.packages = set()
+ self.classes_by_package = dict()
+ self.objects_by_class = dict()
+ self.objects_by_id = dict()
+ self.stats_by_id = dict()
+
+ def add_broker_url(self, url):
+ self.broker_urls.add(url)
+
+ def init(self):
+ pass
+
+ def start(self):
+ for url in self.broker_urls:
+ self.session.addBroker(url)
+
+ def stop(self):
+ # XXX hack necessary for shutdown; bug rafi
+
+ for url in self.broker_urls:
+ self.session.delBroker(url)
+
+ def __repr__(self):
+ return "%s(%s)" % (self.__class__.__name__, self.session)
+
+class BasilConsole(Console):
+ def __init__(self, model):
+ #Console.__init__(self)
+ #super(BasilConsole, self).__init__()
+
+ self.model = model
+
+ def newPackage(self, name):
+ self.model.lock.acquire()
+
+ try:
+ self.model.packages.add(name)
+ finally:
+ self.model.lock.release()
+
+ def newClass(self, kind, classKey):
+ self.model.lock.acquire()
+
+ try:
+ pkgid = classKey.getPackageName()
+ classes = self.model.classes_by_package.setdefault(pkgid, dict())
+ classes[classKey.getHashString()] = classKey
+ finally:
+ self.model.lock.release()
+
+ def objectProps(self, broker, object):
+ self.model.lock.acquire()
+
+ try:
+ clsid = object.getClassKey().getHashString()
+ objects = self.model.objects_by_class.setdefault(clsid, dict())
+ objects[str(object.getObjectId())] = object
+
+ self.model.objects_by_id[str(object.getObjectId())] = object
+ finally:
+ self.model.lock.release()
+
+ def objectStats(self, broker, object):
+ self.model.lock.acquire()
+
+ try:
+ objid = str(object.getObjectId())
+ stats = self.model.stats_by_id.setdefault(objid, list())
+ stats.append(object)
+ finally:
+ self.model.lock.release()
Added: mgmt/trunk/basil/python/basil/page.py
===================================================================
--- mgmt/trunk/basil/python/basil/page.py (rev 0)
+++ mgmt/trunk/basil/python/basil/page.py 2009-02-09 22:49:51 UTC (rev 3111)
@@ -0,0 +1,182 @@
+import struct
+
+from wooly import *
+from wooly.tables import *
+from wooly.resources import *
+
+from widgets import *
+
+strings = StringCatalog(__file__)
+
+class BasilPage(Page):
+ def __init__(self, app, page):
+ super(BasilPage, self).__init__(app, page)
+
+ self.main = MainView(app, "main")
+ self.add_child(self.main)
+
+ def render_title(self, session):
+ return "Basil"
+
+class MainView(Widget):
+ def __init__(self, app, name):
+ super(MainView, self).__init__(app, name)
+
+ self.tabs = TabbedModeSet(app, "tabs")
+ self.add_child(self.tabs)
+
+ objects = ObjectBrowser(app, "objects")
+ self.tabs.add_tab(objects)
+
+class ObjectBrowser(Widget):
+ def __init__(self, app, name):
+ super(ObjectBrowser, self).__init__(app, name)
+
+ self.pkgid = Parameter(app, "package")
+ self.add_parameter(self.pkgid)
+
+ self.clsid = Parameter(app, "class")
+ self.add_parameter(self.clsid)
+
+ self.objid = Parameter(app, "object")
+ self.add_parameter(self.objid)
+
+ packages = PackageSet(app, "packages", self.pkgid)
+ self.add_child(packages)
+
+ classes = ClassSet(app, "classes", self.pkgid, self.clsid)
+ self.add_child(classes)
+
+ objects = ObjectSet(app, "objects", self.clsid, self.objid)
+ self.add_child(objects)
+
+ view = ObjectView(app, "view", self.objid)
+ self.add_child(view)
+
+ def render_title(self, session):
+ return "Objects"
+
+class PackageSet(ItemTable):
+ def __init__(self, app, name, pkgid):
+ super(PackageSet, self).__init__(app, name)
+
+ self.pkgid = pkgid
+
+ col = self.NameColumn(app, "name", self.pkgid)
+ self.add_column(col)
+
+ def do_get_items(self, session):
+ return sorted(self.app.model.packages)
+
+ def render_title(self, session):
+ return "Packages"
+
+ class NameColumn(SelectableNameColumn):
+ def get_id(self, name):
+ return name
+
+class ClassSet(ItemTable):
+ def __init__(self, app, name, pkgid, clsid):
+ super(ClassSet, self).__init__(app, name)
+
+ self.pkgid = pkgid
+ self.clsid = clsid
+
+ col = self.NameColumn(app, "name", self.clsid)
+ self.add_column(col)
+
+ def do_get_items(self, session):
+ package = self.pkgid.get(session)
+
+ if package:
+ classes = self.app.model.classes_by_package[package].values()
+ return sorted(classes)
+
+ def render_title(self, session):
+ return "Classes"
+
+ class NameColumn(SelectableNameColumn):
+ def get_id(self, clacc):
+ return clacc.getHashString()
+
+ def get_name(self, clacc):
+ name = clacc.getClassName()
+ hash = "%08x" % struct.unpack("!L", clacc.getHash()[:4])
+ return "%s (%s)" % (name, hash)
+
+class ObjectSet(ItemTable):
+ def __init__(self, app, name, clsid, objid):
+ super(ObjectSet, self).__init__(app, name)
+
+ self.clsid = clsid
+ self.objid = objid
+
+ col = self.NameColumn(app, "name", self.objid)
+ self.add_column(col)
+
+ def do_get_items(self, session):
+ clsid = self.clsid.get(session)
+
+ if clsid:
+ objects = self.app.model.objects_by_class.get(clsid)
+
+ if objects:
+ return sorted(objects.values())
+
+ def render_title(self, session):
+ return "Classes"
+
+ class NameColumn(SelectableNameColumn):
+ def get_id(self, object):
+ return str(object.getObjectId())
+
+ def get_name(self, object):
+ return object.getIndex()
+
+# if hasattr(object, "name"):
+# return getattr(object, "name")
+# else:
+# return self.get_id(object)
+ #return getattr(object, "name", self.get_id(object)) # XXX use this
+
+class ObjectView(Widget):
+ def __init__(self, app, name, objid):
+ super(ObjectView, self).__init__(app, name)
+
+ self.objid = objid
+
+ self.props = ObjectProperties(app, "props", self.objid)
+ self.add_child(self.props)
+
+ self.stats = ObjectStatistics(app, "stats", self.objid)
+ self.add_child(self.stats)
+
+class BaseObjectProperties(PropertySet):
+ def __init__(self, app, name, objid):
+ super(BaseObjectProperties, self).__init__(app, name)
+
+ self.objid = objid
+
+ def do_get_items(self, session):
+ id = self.objid.get(session)
+ obj = self.app.model.objects_by_id.get(id)
+
+ if obj:
+ return self.get_properties(obj)
+
+ def get_properties(self, object):
+ return object.getProperties()
+
+ def get_item_name(self, item):
+ return str(item[0])
+
+ def get_item_value(self, item):
+ return str(item[1])
+
+class ObjectProperties(BaseObjectProperties):
+ def get_properties(self, object):
+ return object.getProperties()
+
+class ObjectStatistics(BaseObjectProperties):
+ def get_properties(self, object):
+ return object.getStatistics()
Added: mgmt/trunk/basil/python/basil/page.strings
===================================================================
--- mgmt/trunk/basil/python/basil/page.strings (rev 0)
+++ mgmt/trunk/basil/python/basil/page.strings 2009-02-09 22:49:51 UTC (rev 3111)
@@ -0,0 +1,59 @@
+[BasilPage.css]
+a {
+ text-decoration: none;
+ color: blue;
+}
+
+a.selected {
+ color: black;
+ background-color: #ff6;
+}
+
+[BasilPage.html]
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
+ <head>
+ <title>{title}</title>
+ <link rel="stylesheet" type="text/css" href="index.css"/>
+ </head>
+ <body>
+ {content}
+ </body>
+</html>
+
+[ObjectBrowser.css]
+table.ObjectBrowser tr td {
+ vertical-align: top;
+}
+
+table.ObjectBrowser tr td.view {
+ width: 50%;
+}
+
+[ObjectBrowser.html]
+<table class="ObjectBrowser">
+ <tr>
+ <td>{packages}</td>
+ <td>{classes}</td>
+ <td>{objects}</td>
+ <td class="view">{view}</td>
+ </tr>
+</table>
+
+[ObjectView.html]
+{prev_link} {next_link}
+
+<h2>{name}</h2>
+
+<h3>Agent</h3>
+
+<h3>Timestamps</h3>
+
+<h3>Properties</h3>
+
+{props}
+
+<h3>Statistics</h3>
+
+{stats}
Added: mgmt/trunk/basil/python/basil/server.py
===================================================================
--- mgmt/trunk/basil/python/basil/server.py (rev 0)
+++ mgmt/trunk/basil/python/basil/server.py 2009-02-09 22:49:51 UTC (rev 3111)
@@ -0,0 +1,37 @@
+from qmf.console import *
+from wooly import Application
+from wooly.server import WebServer
+from wooly.pages import CssPage
+
+from model import BasilModel
+from page import BasilPage
+
+class BasilServer(WebServer):
+ def authorized(self, session):
+ return True
+
+class BasilApplication(Application):
+ def __init__(self):
+ super(BasilApplication, self).__init__()
+
+ self.model = BasilModel()
+ self.model.add_broker_url("amqp://north-15.lab.bos.redhat.com")
+
+ self.main_page = BasilPage(self, "index.html")
+
+ self.add_page(self.main_page)
+ self.set_default_page(self.main_page)
+
+ page = CssPage(self, "index.css")
+ self.add_page(page)
+
+ self.enable_debug()
+
+ def init(self):
+ self.model.init()
+
+ def start(self):
+ self.model.start()
+
+ def stop(self):
+ self.model.stop()
Added: mgmt/trunk/basil/python/basil/widgets.py
===================================================================
--- mgmt/trunk/basil/python/basil/widgets.py (rev 0)
+++ mgmt/trunk/basil/python/basil/widgets.py 2009-02-09 22:49:51 UTC (rev 3111)
@@ -0,0 +1,61 @@
+from xml.sax.saxutils import escape
+from wooly import *
+from wooly.tables import *
+from wooly.resources import *
+
+strings = StringCatalog(__file__)
+
+class SelectableNameColumn(ItemTableColumn):
+ def __init__(self, app, name, param):
+ super(SelectableNameColumn, self).__init__(app, name)
+
+ self.param = param
+
+ def render_content(self, session, object):
+ id = self.get_id(object)
+ name = self.get_name(object)
+
+ selected = self.param.get(session) == id
+ class_attr = selected and "class=\"selected\"" or ""
+
+ branch = session.branch()
+ self.param.set(branch, id)
+
+ return "<a %s href=\"%s\">%s</a>" % \
+ (class_attr, branch.marshal(), name)
+
+ def get_id(self, object):
+ return object.id
+
+ def get_name(self, object):
+ return self.get_id(object)
+
+class PropertySet(ItemTable):
+ def __init__(self, app, name):
+ super(PropertySet, self).__init__(app, name)
+
+ self.name_column = self.NameColumn(app, "name")
+ self.add_column(self.name_column)
+
+ self.value_column = self.ValueColumn(app, "value")
+ self.add_column(self.value_column)
+
+ def get_item_name(self, item):
+ pass
+
+ def get_item_value(self, item):
+ pass
+
+ class NameColumn(ItemTableColumn):
+ def render_title(self, session, item):
+ return "Name"
+
+ def render_content(self, session, item):
+ return escape(self.parent.get_item_name(item))
+
+ class ValueColumn(ItemTableColumn):
+ def render_title(self, session, item):
+ return "Value"
+
+ def render_content(self, session, item):
+ return escape(self.parent.get_item_value(item))
Added: mgmt/trunk/basil/python/basil/widgets.strings
===================================================================
More information about the rhmessaging-commits
mailing list