Darryl L. Pierce
2010-Feb-11 17:52 UTC
[Ovirt-devel] [PATCH] Provides a reference implementation management server.
The reference implementation server is based on TG2. The majority of the boiler plate code has been stripped out to focus the server solely on the functionality necessary for a management server. Signed-off-by: Darryl L. Pierce <dpierce at redhat.com> --- server/.gitignore | 4 + server/MANIFEST.in | 4 + server/README.txt | 24 ++ server/development.ini | 130 ++++++++++ server/ez_setup/README.txt | 14 ++ server/ez_setup/__init__.py | 247 ++++++++++++++++++++ server/ovirtserver/__init__.py | 18 ++ server/ovirtserver/config/__init__.py | 16 ++ server/ovirtserver/config/app_cfg.py | 54 +++++ server/ovirtserver/config/deployment.ini_tmpl | 104 ++++++++ server/ovirtserver/config/environment.py | 25 ++ server/ovirtserver/config/middleware.py | 55 +++++ server/ovirtserver/controllers/__init__.py | 18 ++ server/ovirtserver/controllers/controller.template | 36 +++ server/ovirtserver/controllers/error.py | 46 ++++ server/ovirtserver/controllers/root.py | 55 +++++ server/ovirtserver/controllers/secure.py | 21 ++ server/ovirtserver/controllers/template.py | 51 ++++ .../ovirtserver/i18n/ru/LC_MESSAGES/ovirtserver.po | 24 ++ server/ovirtserver/lib/__init__.py | 16 ++ server/ovirtserver/lib/app_globals.py | 33 +++ server/ovirtserver/lib/base.py | 44 ++++ server/ovirtserver/lib/helpers.py | 20 ++ server/ovirtserver/model/__init__.py | 77 ++++++ server/ovirtserver/model/auth.py | 27 +++ server/ovirtserver/model/model.template | 37 +++ server/ovirtserver/public/favicon.ico | Bin 0 -> 1104 bytes server/ovirtserver/templates/__init__.py | 18 ++ server/ovirtserver/templates/error.html | 19 ++ server/ovirtserver/templates/index.html | 20 ++ server/ovirtserver/tests/__init__.py | 80 +++++++ server/ovirtserver/tests/functional/__init__.py | 18 ++ .../tests/functional/test_authentication.py | 16 ++ server/ovirtserver/tests/functional/test_root.py | 48 ++++ server/ovirtserver/tests/models/__init__.py | 68 ++++++ server/ovirtserver/tests/models/test_auth.py | 22 ++ server/ovirtserver/websetup.py | 42 ++++ server/server.egg-info/PKG-INFO | 10 + server/server.egg-info/SOURCES.txt | 68 ++++++ server/server.egg-info/dependency_links.txt | 1 + server/server.egg-info/entry_points.txt | 7 + server/server.egg-info/paster_plugins.txt | 4 + server/server.egg-info/requires.txt | 6 + server/server.egg-info/top_level.txt | 1 + server/setup.cfg | 32 +++ server/setup.py | 63 +++++ server/test.ini | 42 ++++ 47 files changed, 1785 insertions(+), 0 deletions(-) create mode 100644 server/.gitignore create mode 100644 server/MANIFEST.in create mode 100644 server/README.txt create mode 100644 server/development.ini create mode 100644 server/ez_setup/README.txt create mode 100644 server/ez_setup/__init__.py create mode 100644 server/ovirtserver/__init__.py create mode 100644 server/ovirtserver/config/__init__.py create mode 100644 server/ovirtserver/config/app_cfg.py create mode 100644 server/ovirtserver/config/deployment.ini_tmpl create mode 100644 server/ovirtserver/config/environment.py create mode 100644 server/ovirtserver/config/middleware.py create mode 100644 server/ovirtserver/controllers/__init__.py create mode 100644 server/ovirtserver/controllers/controller.template create mode 100644 server/ovirtserver/controllers/error.py create mode 100644 server/ovirtserver/controllers/root.py create mode 100644 server/ovirtserver/controllers/secure.py create mode 100644 server/ovirtserver/controllers/template.py create mode 100644 server/ovirtserver/i18n/ru/LC_MESSAGES/ovirtserver.po create mode 100644 server/ovirtserver/lib/__init__.py create mode 100644 server/ovirtserver/lib/app_globals.py create mode 100644 server/ovirtserver/lib/base.py create mode 100644 server/ovirtserver/lib/helpers.py create mode 100644 server/ovirtserver/model/__init__.py create mode 100644 server/ovirtserver/model/auth.py create mode 100644 server/ovirtserver/model/model.template create mode 100644 server/ovirtserver/public/favicon.ico create mode 100644 server/ovirtserver/templates/__init__.py create mode 100644 server/ovirtserver/templates/error.html create mode 100644 server/ovirtserver/templates/index.html create mode 100644 server/ovirtserver/tests/__init__.py create mode 100644 server/ovirtserver/tests/functional/__init__.py create mode 100644 server/ovirtserver/tests/functional/test_authentication.py create mode 100644 server/ovirtserver/tests/functional/test_root.py create mode 100644 server/ovirtserver/tests/models/__init__.py create mode 100644 server/ovirtserver/tests/models/test_auth.py create mode 100644 server/ovirtserver/websetup.py create mode 100644 server/server.egg-info/PKG-INFO create mode 100644 server/server.egg-info/SOURCES.txt create mode 100644 server/server.egg-info/dependency_links.txt create mode 100644 server/server.egg-info/entry_points.txt create mode 100644 server/server.egg-info/paster_plugins.txt create mode 100644 server/server.egg-info/requires.txt create mode 100644 server/server.egg-info/top_level.txt create mode 100644 server/setup.cfg create mode 100644 server/setup.py create mode 100644 server/test.ini diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..41bf6ae --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,4 @@ +build/ +data/ +dist/ +devdata.db diff --git a/server/MANIFEST.in b/server/MANIFEST.in new file mode 100644 index 0000000..e9c47eb --- /dev/null +++ b/server/MANIFEST.in @@ -0,0 +1,4 @@ +recursive-include ovirtserver/public * +include ovirtserver/public/favicon.ico +recursive-include ovirtserver/i18n * +recursive-include ovirtserver/templates * diff --git a/server/README.txt b/server/README.txt new file mode 100644 index 0000000..809ebf3 --- /dev/null +++ b/server/README.txt @@ -0,0 +1,24 @@ +This file is for you to describe the server application. Typically +you would include information such as the information below: + +Installation and Setup +=====================+ +Install ``server`` using the setup.py script:: + + $ cd server + $ python setup.py install + +Create the project database for any model classes defined:: + + $ paster setup-app development.ini + +Start the paste http server:: + + $ paster serve development.ini + +While developing you may want the server to reload after changes in package files (or its dependencies) are saved. This can be achieved easily by adding the --reload option:: + + $ paster serve --reload development.ini + +Then you are ready to go. diff --git a/server/development.ini b/server/development.ini new file mode 100644 index 0000000..2295b25 --- /dev/null +++ b/server/development.ini @@ -0,0 +1,130 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +[DEFAULT] +debug = true +# Uncomment and replace with the address which should receive any error reports +#email_to = you at yourdomain.com +smtp_server = localhost +error_email_from = paste at localhost + +[server:main] +use = egg:Paste#http +host = 127.0.0.1 +port = 8080 + +[app:main] +use = egg:server +full_stack = true +#lang = ru +cache_dir = %(here)s/data +beaker.session.key = ovirtserver +beaker.session.secret = somesecret + +# If you'd like to fine-tune the individual locations of the cache data dirs +# for the Cache data, or the Session saves, un-comment the desired settings +# here: +#beaker.cache.data_dir = %(here)s/data/cache +#beaker.session.data_dir = %(here)s/data/sessions + +# pick the form for your database +# %(here) may include a ':' character on Windows environments; this can +# invalidate the URI when specifying a SQLite db via path name +# sqlalchemy.url=postgres://username:password at hostname:port/databasename +# sqlalchemy.url=mysql://username:password at hostname:port/databasename + + +# If you have sqlite, here's a simple default to get you started +# in development + +sqlalchemy.url = sqlite:///%(here)s/devdata.db +#echo shouldn't be used together with the logging module. +sqlalchemy.echo = false +sqlalchemy.echo_pool = false +sqlalchemy.pool_recycle = 3600 + +# if you are using Mako and want to be able to reload +# the mako template from disk during the development phase +# you should say 'true' here +# This option is only used for mako templating engine +# WARNING: if you want to deploy your application using a zipped egg +# (ie: if your application's setup.py defines zip-safe=True, then you +# MUST put "false" for the production environment because there will +# be no disk and real files to compare time with. +# On the contrary if your application defines zip-safe=False and is +# deployed in an unzipped manner, then you can leave this option to true +templating.mako.reloadfromdisk = true + +# the compiled template dir is a directory that must be readable by your +# webserver. It will be used to store the resulting templates once compiled +# by the TemplateLookup system. +# During development you generally don't need this option since paste's HTTP +# server will have access to you development directories, but in production +# you'll most certainly want to have apache or nginx to write in a directory +# that does not contain any source code in any form for obvious security reasons. +# +#templating.mako.compiled_templates_dir = /some/dir/where/webserver/has/access + +# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* +# Debug mode will enable the interactive debugging tool, allowing ANYONE to +# execute malicious code after an exception is raised. +#set debug = false + +# Logging configuration +# Add additional loggers, handlers, formatters here +# Uses python's logging config file format +# http://docs.python.org/lib/logging-config-fileformat.html + +[loggers] +keys = root, ovirtserver, sqlalchemy + +[handlers] +keys = console + +[formatters] +keys = generic + +# If you create additional loggers, add them as a key to [loggers] +[logger_root] +level = INFO +handlers = console + +[logger_ovirtserver] +level = DEBUG +handlers +qualname = ovirtserver + +[logger_sqlalchemy] +level = INFO +handlers +qualname = sqlalchemy.engine +# "level = INFO" logs SQL queries. +# "level = DEBUG" logs SQL queries and results. +# "level = WARN" logs neither. (Recommended for production systems.) + + +# If you create additional handlers, add them as a key to [handlers] +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +# If you create additional formatters, add them as a key to [formatters] +[formatter_generic] +format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/server/ez_setup/README.txt b/server/ez_setup/README.txt new file mode 100644 index 0000000..77c986d --- /dev/null +++ b/server/ez_setup/README.txt @@ -0,0 +1,14 @@ +This directory exists so that Subversion-based projects can share a single +copy of the ``ez_setup`` bootstrap module for ``setuptools``, and have it +automatically updated in their projects when ``setuptools`` is updated. + +For your convenience, you may use the following svn:externals definition:: + + ez_setup svn://svn.eby-sarna.com/svnroot/ez_setup + +You can set this by executing this command in your project directory:: + + svn propedit svn:externals . + +And then adding the line shown above to the file that comes up for editing. +Then, whenever you update your project, ``ez_setup`` will be updated as well. diff --git a/server/ez_setup/__init__.py b/server/ez_setup/__init__.py new file mode 100644 index 0000000..8d35412 --- /dev/null +++ b/server/ez_setup/__init__.py @@ -0,0 +1,247 @@ +#!python +# +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Bootstrap setuptools installation + +If you want to use setuptools in your package's setup.py, just include this +file in the same directory with it, and add this to the top of your setup.py:: + + from ez_setup import use_setuptools + use_setuptools() + +If you want to require a specific version of setuptools, set a download +mirror, or use an alternate download directory, you can do so by supplying +the appropriate options to ``use_setuptools()``. + +This file can also be run as a script to install or upgrade setuptools. +""" +import sys +DEFAULT_VERSION = "0.6c7" +DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3] + +md5_data = { + 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca', + 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb', + 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b', + 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a', + 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618', + 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac', + 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5', + 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4', + 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c', + 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b', + 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27', + 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277', + 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa', + 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e', + 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e', + 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f', + 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2', + 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc', + 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167', + 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64', + 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d', + 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20', + 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab', + 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53', + 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2', + 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e', + 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372', +} + +import sys, os + +def _validate_md5(egg_name, data): + if egg_name in md5_data: + from md5 import md5 + digest = md5(data).hexdigest() + if digest != md5_data[egg_name]: + print >>sys.stderr, ( + "md5 validation of %s failed! (Possible download problem?)" + % egg_name + ) + sys.exit(2) + return data + + +def use_setuptools( + version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, + download_delay=15 +): + """Automatically find/download setuptools and make it available on sys.path + + `version` should be a valid setuptools version number that is available + as an egg for download under the `download_base` URL (which should end with + a '/'). `to_dir` is the directory where setuptools will be downloaded, if + it is not already available. If `download_delay` is specified, it should + be the number of seconds that will be paused before initiating a download, + should one be required. If an older version of setuptools is installed, + this routine will print a message to ``sys.stderr`` and raise SystemExit in + an attempt to abort the calling script. + """ + try: + import setuptools + if setuptools.__version__ == '0.0.1': + print >>sys.stderr, ( + "You have an obsolete version of setuptools installed. Please\n" + "remove it from your system entirely before rerunning this script." + ) + sys.exit(2) + except ImportError: + egg = download_setuptools(version, download_base, to_dir, download_delay) + sys.path.insert(0, egg) + import setuptools; setuptools.bootstrap_install_from = egg + + import pkg_resources + try: + pkg_resources.require("setuptools>="+version) + + except pkg_resources.VersionConflict, e: + # XXX could we install in a subprocess here? + print >>sys.stderr, ( + "The required version of setuptools (>=%s) is not available, and\n" + "can't be installed while this script is running. Please install\n" + " a more recent version first.\n\n(Currently using %r)" + ) % (version, e.args[0]) + sys.exit(2) + +def download_setuptools( + version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, + delay = 15 +): + """Download setuptools from a specified location and return its filename + + `version` should be a valid setuptools version number that is available + as an egg for download under the `download_base` URL (which should end + with a '/'). `to_dir` is the directory where the egg will be downloaded. + `delay` is the number of seconds to pause before an actual download attempt. + """ + import urllib2, shutil + egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3]) + url = download_base + egg_name + saveto = os.path.join(to_dir, egg_name) + src = dst = None + if not os.path.exists(saveto): # Avoid repeated downloads + try: + from distutils import log + if delay: + log.warn(""" +--------------------------------------------------------------------------- +This script requires setuptools version %s to run (even to display +help). I will attempt to download it for you (from +%s), but +you may need to enable firewall access for this script first. +I will start the download in %d seconds. + +(Note: if this machine does not have network access, please obtain the file + + %s + +and place it in this directory before rerunning this script.) +---------------------------------------------------------------------------""", + version, download_base, delay, url + ); from time import sleep; sleep(delay) + log.warn("Downloading %s", url) + src = urllib2.urlopen(url) + # Read/write all in one block, so we don't create a corrupt file + # if the download is interrupted. + data = _validate_md5(egg_name, src.read()) + dst = open(saveto,"wb"); dst.write(data) + finally: + if src: src.close() + if dst: dst.close() + return os.path.realpath(saveto) + +def main(argv, version=DEFAULT_VERSION): + """Install or upgrade setuptools and EasyInstall""" + + try: + import setuptools + except ImportError: + egg = None + try: + egg = download_setuptools(version, delay=0) + sys.path.insert(0,egg) + from setuptools.command.easy_install import main + return main(list(argv)+[egg]) # we're done here + finally: + if egg and os.path.exists(egg): + os.unlink(egg) + else: + if setuptools.__version__ == '0.0.1': + # tell the user to uninstall obsolete version + use_setuptools(version) + + req = "setuptools>="+version + import pkg_resources + try: + pkg_resources.require(req) + except pkg_resources.VersionConflict: + try: + from setuptools.command.easy_install import main + except ImportError: + from easy_install import main + main(list(argv)+[download_setuptools(delay=0)]) + sys.exit(0) # try to force an exit + else: + if argv: + from setuptools.command.easy_install import main + main(argv) + else: + print "Setuptools version",version,"or greater has been installed." + print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)' + + + +def update_md5(filenames): + """Update our built-in md5 registry""" + + import re + from md5 import md5 + + for name in filenames: + base = os.path.basename(name) + f = open(name,'rb') + md5_data[base] = md5(f.read()).hexdigest() + f.close() + + data = [" %r: %r,\n" % it for it in md5_data.items()] + data.sort() + repl = "".join(data) + + import inspect + srcfile = inspect.getsourcefile(sys.modules[__name__]) + f = open(srcfile, 'rb'); src = f.read(); f.close() + + match = re.search("\nmd5_data = {\n([^}]+)}", src) + if not match: + print >>sys.stderr, "Internal error!" + sys.exit(2) + + src = src[:match.start(1)] + repl + src[match.end(1):] + f = open(srcfile,'w') + f.write(src) + f.close() + + +if __name__=='__main__': + if len(sys.argv)>2 and sys.argv[1]=='--md5update': + update_md5(sys.argv[2:]) + else: + main(sys.argv[1:]) diff --git a/server/ovirtserver/__init__.py b/server/ovirtserver/__init__.py new file mode 100644 index 0000000..1d14a09 --- /dev/null +++ b/server/ovirtserver/__init__.py @@ -0,0 +1,18 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""The server package""" diff --git a/server/ovirtserver/config/__init__.py b/server/ovirtserver/config/__init__.py new file mode 100644 index 0000000..90ca87c --- /dev/null +++ b/server/ovirtserver/config/__init__.py @@ -0,0 +1,16 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/server/ovirtserver/config/app_cfg.py b/server/ovirtserver/config/app_cfg.py new file mode 100644 index 0000000..8882a6b --- /dev/null +++ b/server/ovirtserver/config/app_cfg.py @@ -0,0 +1,54 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +""" +Global configuration file for TG2-specific settings in server. + +This file complements development/deployment.ini. + +Please note that **all the argument values are strings**. If you want to +convert them into boolean, for example, you should use the +:func:`paste.deploy.converters.asbool` function, as in:: + + from paste.deploy.converters import asbool + setting = asbool(global_conf.get('the_setting')) + +""" + +from tg.configuration import AppConfig + +import ovirtserver +from ovirtserver import model +from ovirtserver.lib import app_globals, helpers + +base_config = AppConfig() +base_config.renderers = [] + +base_config.package = ovirtserver + +#Set the default renderer +base_config.default_renderer = 'genshi' +base_config.renderers.append('genshi') +# if you want raw speed and have installed chameleon.genshi +# you should try to use this renderer instead. +# warning: for the moment chameleon does not handle i18n translations +#base_config.renderers.append('chameleon_genshi') + +#Configure the base SQLALchemy Setup +base_config.use_sqlalchemy = True +base_config.model = ovirtserver.model +base_config.DBSession = ovirtserver.model.DBSession diff --git a/server/ovirtserver/config/deployment.ini_tmpl b/server/ovirtserver/config/deployment.ini_tmpl new file mode 100644 index 0000000..7b1403c --- /dev/null +++ b/server/ovirtserver/config/deployment.ini_tmpl @@ -0,0 +1,104 @@ +# Copyright (C) yyyy, your name. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# +# server - TurboGears configuration +# +# The %(here)s variable will be replaced with the parent directory of this file +# +[DEFAULT] +# WARGING == If debug is not set to false, you'll get the interactive +# debugger on production, which is a huge security hole. + +debug = false +email_to = you at yourdomain.com +smtp_server = localhost +error_email_from = paste at localhost + +[server:main] +use = egg:Paste#http +host = 0.0.0.0 +port = 8080 + +[app:main] +use = egg:server +full_stack = true +cache_dir = %(here)s/data +beaker.session.key = ovirtserver +beaker.session.secret = ${app_instance_secret} +app_instance_uuid = ${app_instance_uuid} + +# If you'd like to fine-tune the individual locations of the cache data dirs +# for the Cache data, or the Session saves, un-comment the desired settings +# here: +#beaker.cache.data_dir = %(here)s/data/cache +#beaker.session.data_dir = %(here)s/data/sessions +# Specify the database for SQLAlchemy to use via +# turbogears.database +# %(here) may include a ':' character on Windows environments; this can +# invalidate the URI when specifying a SQLite db via path name +sqlalchemy.url = sqlite:///%(here)s/somedb.db +sqlalchemy.echo = False + +# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* +# Debug mode will enable the interactive debugging tool, allowing ANYONE to +# execute malicious code after an exception is raised. +#set debug = false + +# Logging configuration +# Add additional loggers, handlers, formatters here +# Uses python's logging config file format +# http://docs.python.org/lib/logging-config-fileformat.html + +[loggers] +keys = root, ovirtserver, sqlalchemy + +[handlers] +keys = console + +[formatters] +keys = generic + +# If you create additional loggers, add them as a key to [loggers] +[logger_root] +level = INFO +handlers = console + +[logger_ovirtserver] +level = INFO +handlers +qualname = ovirtserver + +[logger_sqlalchemy] +level = WARN +handlers +qualname = sqlalchemy.engine +# "level = INFO" logs SQL queries. +# "level = DEBUG" logs SQL queries and results. +# "level = WARN" logs neither. (Recommended for production systems.) + + +# If you create additional handlers, add them as a key to [handlers] +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +# If you create additional formatters, add them as a key to [formatters] +[formatter_generic] +format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/server/ovirtserver/config/environment.py b/server/ovirtserver/config/environment.py new file mode 100644 index 0000000..01b0275 --- /dev/null +++ b/server/ovirtserver/config/environment.py @@ -0,0 +1,25 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""WSGI environment setup for server.""" + +from ovirtserver.config.app_cfg import base_config + +__all__ = ['load_environment'] + +#Use base_config to setup the environment loader function +load_environment = base_config.make_load_environment() diff --git a/server/ovirtserver/config/middleware.py b/server/ovirtserver/config/middleware.py new file mode 100644 index 0000000..b5f47da --- /dev/null +++ b/server/ovirtserver/config/middleware.py @@ -0,0 +1,55 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""WSGI middleware initialization for the server application.""" + +from ovirtserver.config.app_cfg import base_config +from ovirtserver.config.environment import load_environment + + +__all__ = ['make_app'] + +# Use base_config to setup the necessary PasteDeploy application factory. +# make_base_app will wrap the TG2 app with all the middleware it needs. +make_base_app = base_config.setup_tg_wsgi_app(load_environment) + + +def make_app(global_conf, full_stack=True, **app_conf): + """ + Set server up with the settings found in the PasteDeploy configuration + file used. + + :param global_conf: The global settings for server (those + defined under the ``[DEFAULT]`` section). + :type global_conf: dict + :param full_stack: Should the whole TG2 stack be set up? + :type full_stack: str or bool + :return: The server application with all the relevant middleware + loaded. + + This is the PasteDeploy factory for the server application. + + ``app_conf`` contains all the application-specific settings (those defined + under ``[app:main]``. + + + """ + app = make_base_app(global_conf, full_stack=True, **app_conf) + + # Wrap your base TurboGears 2 application with custom middleware here + + return app diff --git a/server/ovirtserver/controllers/__init__.py b/server/ovirtserver/controllers/__init__.py new file mode 100644 index 0000000..417d5ed --- /dev/null +++ b/server/ovirtserver/controllers/__init__.py @@ -0,0 +1,18 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Controllers for the server application.""" diff --git a/server/ovirtserver/controllers/controller.template b/server/ovirtserver/controllers/controller.template new file mode 100644 index 0000000..2de6832 --- /dev/null +++ b/server/ovirtserver/controllers/controller.template @@ -0,0 +1,36 @@ +# Copyright (C) yyyy, your name +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Sample controller module""" + +# turbogears imports +from tg import expose +#from tg import redirect, validate, flash + +# third party imports +#from pylons.i18n import ugettext as _ +#from repoze.what import predicates + +# project specific imports +from ovirtserver.lib.base import BaseController +#from ovirtserver.model import DBSession, metadata + + +class SampleController(BaseController): + + @expose('ovirtserver.templates.index') + def index(self): + return dict(page='index') diff --git a/server/ovirtserver/controllers/error.py b/server/ovirtserver/controllers/error.py new file mode 100644 index 0000000..6a14218 --- /dev/null +++ b/server/ovirtserver/controllers/error.py @@ -0,0 +1,46 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Error controller""" + +from tg import request, expose + +__all__ = ['ErrorController'] + + +class ErrorController(object): + """ + Generates error documents as and when they are required. + + The ErrorDocuments middleware forwards to ErrorController when error + related status codes are returned from the application. + + This behaviour can be altered by changing the parameters to the + ErrorDocuments middleware in your config/middleware.py file. + + """ + + @expose('ovirtserver.templates.error') + def document(self, *args, **kwargs): + """Render the error document""" + resp = request.environ.get('pylons.original_response') + default_message = ("<p>We're sorry but we weren't able to process " + " this request.</p>") + values = dict(prefix=request.environ.get('SCRIPT_NAME', ''), + code=request.params.get('code', resp.status_int), + message=request.params.get('message', default_message)) + return values diff --git a/server/ovirtserver/controllers/root.py b/server/ovirtserver/controllers/root.py new file mode 100644 index 0000000..cfd682b --- /dev/null +++ b/server/ovirtserver/controllers/root.py @@ -0,0 +1,55 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Main Controller""" + +from tg import expose, flash, require, url, request, redirect +from pylons.i18n import ugettext as _, lazy_ugettext as l_ + +from ovirtserver.lib.base import BaseController +from ovirtserver.model import DBSession, metadata +from ovirtserver.controllers.error import ErrorController + +__all__ = ['RootController'] + + +class RootController(BaseController): + """ + The root controller for the server application. + + All the other controllers and WSGI applications should be mounted on this + controller. For example:: + + panel = ControlPanelController() + another_app = AnotherWSGIApplication() + + Keep in mind that WSGI applications shouldn't be mounted directly: They + must be wrapped around with :class:`tg.controllers.WSGIAppController`. + + """ + + error = ErrorController() + + @expose('ovirtserver.templates.index') + def index(self): + """Handle the front-page.""" + return dict(page='index') + + @expose('ovirtserver.templates.about') + def about(self): + """Handle the 'about' page.""" + return dict(page='about') diff --git a/server/ovirtserver/controllers/secure.py b/server/ovirtserver/controllers/secure.py new file mode 100644 index 0000000..adb98f7 --- /dev/null +++ b/server/ovirtserver/controllers/secure.py @@ -0,0 +1,21 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Sample controller with all its actions protected.""" + +# This controller is only used when you activate auth. You can safely remove +# this file from your project. diff --git a/server/ovirtserver/controllers/template.py b/server/ovirtserver/controllers/template.py new file mode 100644 index 0000000..77a1fcb --- /dev/null +++ b/server/ovirtserver/controllers/template.py @@ -0,0 +1,51 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Fallback controller.""" + +from ovirtserver.lib.base import BaseController + +__all__ = ['TemplateController'] + + +class TemplateController(BaseController): + """ + The fallback controller for server. + + By default, the final controller tried to fulfill the request + when no other routes match. It may be used to display a template + when all else fails, e.g.:: + + def view(self, url): + return render('/%s' % url) + + Or if you're using Mako and want to explicitly send a 404 (Not + Found) response code when the requested template doesn't exist:: + + import mako.exceptions + + def view(self, url): + try: + return render('/%s' % url) + except mako.exceptions.TopLevelLookupException: + abort(404) + + """ + + def view(self, url): + """Abort the request with a 404 HTTP status code.""" + abort(404) diff --git a/server/ovirtserver/i18n/ru/LC_MESSAGES/ovirtserver.po b/server/ovirtserver/i18n/ru/LC_MESSAGES/ovirtserver.po new file mode 100644 index 0000000..36532d4 --- /dev/null +++ b/server/ovirtserver/i18n/ru/LC_MESSAGES/ovirtserver.po @@ -0,0 +1,24 @@ +# Russian translations for ${package}. +# Copyright (C) 2008 ORGANIZATION +# This file is distributed under the same license as the ${package} project. +# FIRST AUTHOR <EMAIL at ADDRESS>, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: ${package} 0.0.0\n" +"Report-Msgid-Bugs-To: EMAIL at ADDRESS\n" +"POT-Creation-Date: 2008-01-13 14:00+0200\n" +"PO-Revision-Date: 2008-01-13 14:00+0200\n" +"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n" +"Language-Team: ru <LL at li.org>\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 0.9.1\n" + +#: ${package}/controllers/root.py:13 +msgid "Your application is now running" +msgstr "???????? ???????????????????? ?????????????? ????????????????" + diff --git a/server/ovirtserver/lib/__init__.py b/server/ovirtserver/lib/__init__.py new file mode 100644 index 0000000..90ca87c --- /dev/null +++ b/server/ovirtserver/lib/__init__.py @@ -0,0 +1,16 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/server/ovirtserver/lib/app_globals.py b/server/ovirtserver/lib/app_globals.py new file mode 100644 index 0000000..d5d2abe --- /dev/null +++ b/server/ovirtserver/lib/app_globals.py @@ -0,0 +1,33 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""The application's Globals object""" + +__all__ = ['Globals'] + + +class Globals(object): + """Container for objects available throughout the life of the application. + + One instance of Globals is created during application initialization and + is available during requests via the 'app_globals' variable. + + """ + + def __init__(self): + """Do nothing, by default.""" + pass diff --git a/server/ovirtserver/lib/base.py b/server/ovirtserver/lib/base.py new file mode 100644 index 0000000..90772cc --- /dev/null +++ b/server/ovirtserver/lib/base.py @@ -0,0 +1,44 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""The base Controller API.""" + +from tg import TGController, tmpl_context +from tg.render import render +from pylons.i18n import _, ungettext, N_ +from tw.api import WidgetBunch +import ovirtserver.model as model + +__all__ = ['Controller', 'BaseController'] + + +class BaseController(TGController): + """ + Base class for the controllers in the application. + + Your web application should have one of these. The root of + your application is used to compute URLs used by your app. + + """ + + def __call__(self, environ, start_response): + """Invoke the Controller""" + # TGController.__call__ dispatches to the Controller method + # the request is routed to. This routing information is + # available in environ['pylons.routes_dict'] + + return TGController.__call__(self, environ, start_response) diff --git a/server/ovirtserver/lib/helpers.py b/server/ovirtserver/lib/helpers.py new file mode 100644 index 0000000..88cdc0f --- /dev/null +++ b/server/ovirtserver/lib/helpers.py @@ -0,0 +1,20 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""WebHelpers used in server.""" + +from webhelpers import date, feedgenerator, html, number, misc, text diff --git a/server/ovirtserver/model/__init__.py b/server/ovirtserver/model/__init__.py new file mode 100644 index 0000000..1b37524 --- /dev/null +++ b/server/ovirtserver/model/__init__.py @@ -0,0 +1,77 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""The application's model objects""" + +from zope.sqlalchemy import ZopeTransactionExtension +from sqlalchemy.orm import scoped_session, sessionmaker +#from sqlalchemy import MetaData +from sqlalchemy.ext.declarative import declarative_base + +# Global session manager: DBSession() returns the Thread-local +# session object appropriate for the current web request. +maker = sessionmaker(autoflush=True, autocommit=False, + extension=ZopeTransactionExtension()) +DBSession = scoped_session(maker) + +# Base class for all of our model classes: By default, the data model is +# defined with SQLAlchemy's declarative extension, but if you need more +# control, you can switch to the traditional method. +DeclarativeBase = declarative_base() + +# There are two convenient ways for you to spare some typing. +# You can have a query property on all your model classes by doing this: +# DeclarativeBase.query = DBSession.query_property() +# Or you can use a session-aware mapper as it was used in TurboGears 1: +# DeclarativeBase = declarative_base(mapper=DBSession.mapper) + +# Global metadata. +# The default metadata is the one from the declarative base. +metadata = DeclarativeBase.metadata + +# If you have multiple databases with overlapping table names, you'll need a +# metadata for each database. Feel free to rename 'metadata2'. +#metadata2 = MetaData() + +##### +# Generally you will not want to define your table's mappers, and data objects +# here in __init__ but will want to create modules them in the model directory +# and import them at the bottom of this file. +# +###### + +def init_model(engine): + """Call me before using any of the tables or classes in the model.""" + + DBSession.configure(bind=engine) + # If you are using reflection to introspect your database and create + # table objects for you, your tables must be defined and mapped inside + # the init_model function, so that the engine is available if you + # use the model outside tg2, you need to make sure this is called before + # you use the model. + + # + # See the following example: + + #global t_reflected + + #t_reflected = Table("Reflected", metadata, + # autoload=True, autoload_with=engine) + + #mapper(Reflected, t_reflected) + +# Import your model modules here. diff --git a/server/ovirtserver/model/auth.py b/server/ovirtserver/model/auth.py new file mode 100644 index 0000000..d7ea74b --- /dev/null +++ b/server/ovirtserver/model/auth.py @@ -0,0 +1,27 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +""" +Auth* related model. + +This is where the models used by :mod:`repoze.who` and :mod:`repoze.what` are +defined. + +It's perfectly fine to re-use this definition in the server application, +though. + +""" diff --git a/server/ovirtserver/model/model.template b/server/ovirtserver/model/model.template new file mode 100644 index 0000000..716807e --- /dev/null +++ b/server/ovirtserver/model/model.template @@ -0,0 +1,37 @@ +# Copyright (C) yyyy, your name. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Sample model module.""" + +from sqlalchemy import * +from sqlalchemy.orm import mapper, relation +from sqlalchemy import Table, ForeignKey, Column +from sqlalchemy.types import Integer, Unicode +#from sqlalchemy.orm import relation, backref + +from ovirtserver.model import DeclarativeBase, metadata, DBSession + + +class SampleModel(DeclarativeBase): + __tablename__ = 'sample_model' + + #{ Columns + + id = Column(Integer, primary_key=True) + + data = Column(Unicode(255), nullable=False) + + #} diff --git a/server/ovirtserver/public/favicon.ico b/server/ovirtserver/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..840986e4705befe9beb4275e2807fd358a362497 GIT binary patch literal 1104 zcmV-W1h4xaiwFP!000000|7Y%#`{M}MmRZP5C9MW=S=`zU0s?(6{e=9adB~piHWPL ztMKsf<mBXhe0;dLxYLng)6>)U_xHB8w!DmPpP!#EEiT>N-OZzotgNilw50s}{OQ-t z^78VNlas>2!U6&U#KgqR%*?*NzOJsW&d$!SbyBdfu%Muz$;rva#>TX?w3(Ti+uPgs z&04auvZ$!2y1Kf(y}gex2j}PK(9qCSktL<vVARyqhlhvUZDREF^lmT{>!dMnZf at o5 z^=WBo?eqTG!L-)a*6Ql&*x1;RX;!tCefaqJQBhIy=HN$1M}|Wt-{0TEn}yfO!GVE+ zq*N-`-RJ-R|LpASW at ct!U|@4WF3Wo@$oPbyO(IuUSF(ar`tX0OW<jP}GRDi*+u-Zs z>F<|!XSIN1g<D9uzQ^z4+w=PUzN3)M(%kl<k=f77aIGXhY%!Q at I`xi%a8OC)&A_Ir zviJS}+||(e^zxp*oN8=wl81+Zu}tCS?f9;wnx3WY at bUQZ?!Lp!o}#J1u%hAQ=CZcG z>F at gA;^d5tjqK&(Vr6Ob_W0=R?)?A%)7RUD!9CjD-;a-v=<Do_kc4h=c6WM!`}g(E z#J<3<Nd5cz at bvbpueWt|cA=%Mj**z|_4(Y`)q;hK`1}3l-`vvJ;!I6VQ&m~EsiWE3 z-FkyVq=s}IHWu^q^ITtJ{rvj-`uXtl_TAs$6B878czF8w_~-BQg^7>j<Kyx1@$K#H zPEb=_U}Up0E^mi!IyyR%mYwzO>A}IlqoboyQ&+&&w#&=Qrjm-vP)P6Z at 9ysI`}_OK z%F4jN!2bUJ`uh6f;^M)^&t_<C{{R2~{{HLn{6RuO{{H{@`T70*{rda+_VxAq{r>Rs z^3l at O)Y8(|)Y8MYtj4>w=-kzvNgU77)ZyXb;o{@<_4W4l_V at Pn&CShIQ&aBl?dj?1 z>+9>x$HQV{Wy{OVfpc@~>*{A`XINNRT3TDkzqtPX{d|9grlg}C92_JgBg at duy1Tij zr=`o!%<J#*;^XA%>gmD1y~4r3mYSg<{uM)VWnpw>WFU8GbZ8({Xk{QrNlj1yEC2ui z01yBW000R70Gl*n*5r*DAr*v}c{5O;!(~W<1i at wwn?xk>911*^&58pDNEBGHl1-Y! zV+_iHa4-fQI!I$2baBGqn6V%Zf~2u`ViBH2C-SAi8N`^CG-*<Jd$FXc8E at IrSdl`l z&{0)KTF_7<rNt3dQe6oF*X0W!bS<PP=nARNmo7D;QH!#s4>}uEuuy4%&c&K2(ToAH z@#V*fF*a<p7;_ at R7aKsD7>N?4%eiatvSoO&s7n+hMhu}Fm8LSRK7Cxk>S9DHBxp6v z^#Ky)%NHQGqX60GqJ}YJ6~YCHVxu;3Bfr8`Fy^oVBqLu=oJjP=2&4)cn?$>?=$ot> WvS0=+x)9A_Kma>NIMN(B1ONa82$stL literal 0 HcmV?d00001 diff --git a/server/ovirtserver/templates/__init__.py b/server/ovirtserver/templates/__init__.py new file mode 100644 index 0000000..14d408b --- /dev/null +++ b/server/ovirtserver/templates/__init__.py @@ -0,0 +1,18 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Templates package for the application.""" diff --git a/server/ovirtserver/templates/error.html b/server/ovirtserver/templates/error.html new file mode 100644 index 0000000..001f8f4 --- /dev/null +++ b/server/ovirtserver/templates/error.html @@ -0,0 +1,19 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:py="http://genshi.edgewall.org/" + xmlns:xi="http://www.w3.org/2001/XInclude"> + + <xi:include href="master.html" /> + +<head> + <meta content="text/html; charset=UTF-8" http-equiv="content-type" py:replace="''"/> + <title>A ${code} Error has Occurred </title> +</head> + +<body> +<h1>Error ${code}</h1> + +<div>${XML(message)}</div> +</body> +</html> diff --git a/server/ovirtserver/templates/index.html b/server/ovirtserver/templates/index.html new file mode 100644 index 0000000..1c2496b --- /dev/null +++ b/server/ovirtserver/templates/index.html @@ -0,0 +1,20 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:py="http://genshi.edgewall.org/" + xmlns:xi="http://www.w3.org/2001/XInclude"> + + <head> + <meta content="text/html; charset=UTF-8" http-equiv="content-type" py:replace="''"/> + <title>Welcome to the oVirt management server</title> + </head> + + <body> + <h1>Welcome To The oVirt Server Reference Implementation</h1> + + <p> + This server provides a reference implementation for how a management server should interact + with the oVirt managed node. + </p> + </body> +</html> diff --git a/server/ovirtserver/tests/__init__.py b/server/ovirtserver/tests/__init__.py new file mode 100644 index 0000000..7c1a4a9 --- /dev/null +++ b/server/ovirtserver/tests/__init__.py @@ -0,0 +1,80 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Unit and functional test suite for server.""" + +from os import path +import sys + +from tg import config +from paste.deploy import loadapp +from paste.script.appinstall import SetupCommand +from routes import url_for +from webtest import TestApp +from nose.tools import eq_ + +from ovirtserver import model + +__all__ = ['setup_db', 'teardown_db', 'TestController', 'url_for'] + +def setup_db(): + """Method used to build a database""" + engine = config['pylons.app_globals'].sa_engine + model.init_model(engine) + model.metadata.create_all(engine) + +def teardown_db(): + """Method used to destroy a database""" + engine = config['pylons.app_globals'].sa_engine + model.metadata.drop_all(engine) + + +class TestController(object): + """ + Base functional test case for the controllers. + + The server application instance (``self.app``) set up in this test + case (and descendants) has authentication disabled, so that developers can + test the protected areas independently of the :mod:`repoze.who` plugins + used initially. This way, authentication can be tested once and separately. + + Check ovirtserver.tests.functional.test_authentication for the repoze.who + integration tests. + + This is the officially supported way to test protected areas with + repoze.who-testutil (http://code.gustavonarea.net/repoze.who-testutil/). + + """ + + application_under_test = 'main_without_authn' + + def setUp(self): + """Method called by nose before running each test""" + # Loading the application: + conf_dir = config.here + wsgiapp = loadapp('config:test.ini#%s' % self.application_under_test, + relative_to=conf_dir) + self.app = TestApp(wsgiapp) + # Setting it up: + test_file = path.join(conf_dir, 'test.ini') + cmd = SetupCommand('setup-app') + cmd.run([test_file]) + + def tearDown(self): + """Method called by nose after running each test""" + # Cleaning up the database: + teardown_db() diff --git a/server/ovirtserver/tests/functional/__init__.py b/server/ovirtserver/tests/functional/__init__.py new file mode 100644 index 0000000..be0e5fb --- /dev/null +++ b/server/ovirtserver/tests/functional/__init__.py @@ -0,0 +1,18 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Functional test suite for the controllers of the application.""" diff --git a/server/ovirtserver/tests/functional/test_authentication.py b/server/ovirtserver/tests/functional/test_authentication.py new file mode 100644 index 0000000..90ca87c --- /dev/null +++ b/server/ovirtserver/tests/functional/test_authentication.py @@ -0,0 +1,16 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/server/ovirtserver/tests/functional/test_root.py b/server/ovirtserver/tests/functional/test_root.py new file mode 100644 index 0000000..5a7a55e --- /dev/null +++ b/server/ovirtserver/tests/functional/test_root.py @@ -0,0 +1,48 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +""" +Functional test suite for the root controller. + +This is an example of how functional tests can be written for controllers. + +As opposed to a unit-test, which test a small unit of functionality, +functional tests exercise the whole application and its WSGI stack. + +Please read http://pythonpaste.org/webtest/ for more information. + +""" +from nose.tools import assert_true + +from ovirtserver.tests import TestController + + +class TestRootController(TestController): + def test_index(self): + response = self.app.get('/') + msg = 'TurboGears 2 is rapid web application development toolkit '\ + 'designed to make your life easier.' + # You can look for specific strings: + assert_true(msg in response) + + # You can also access a BeautifulSoup'ed response in your tests + # (First run $ easy_install BeautifulSoup + # and then uncomment the next two lines) + + #links = response.html.findAll('a') + #print links + #assert_true(links, "Mummy, there are no links here!") diff --git a/server/ovirtserver/tests/models/__init__.py b/server/ovirtserver/tests/models/__init__.py new file mode 100644 index 0000000..354b222 --- /dev/null +++ b/server/ovirtserver/tests/models/__init__.py @@ -0,0 +1,68 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Unit test suite for the models of the application.""" +from nose.tools import assert_equals + +from ovirtserver.model import DBSession +from ovirtserver.tests import setup_db, teardown_db + +__all__ = ['ModelTest'] + +#Create an empty database before we start our tests for this module +def setup(): + """Function called by nose on module load""" + setup_db() + +#Teardown that database +def teardown(): + """Function called by nose after all tests in this module ran""" + teardown_db() + +class ModelTest(object): + """Base unit test case for the models.""" + + klass = None + attrs = {} + + def setup(self): + try: + new_attrs = {} + new_attrs.update(self.attrs) + new_attrs.update(self.do_get_dependencies()) + self.obj = self.klass(**new_attrs) + DBSession.add(self.obj) + DBSession.flush() + return self.obj + except: + DBSession.rollback() + raise + + def tearDown(self): + DBSession.rollback() + + def do_get_dependencies(self): + """Use this method to pull in other objects that need to be created for this object to be build properly""" + return {} + + def test_create_obj(self): + pass + + def test_query_obj(self): + obj = DBSession.query(self.klass).one() + for key, value in self.attrs.iteritems(): + assert_equals(getattr(obj, key), value) diff --git a/server/ovirtserver/tests/models/test_auth.py b/server/ovirtserver/tests/models/test_auth.py new file mode 100644 index 0000000..eb0fce0 --- /dev/null +++ b/server/ovirtserver/tests/models/test_auth.py @@ -0,0 +1,22 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Test suite for the TG app's models""" +from nose.tools import eq_ + +from ovirtserver import model +from ovirtserver.tests.models import ModelTest diff --git a/server/ovirtserver/websetup.py b/server/ovirtserver/websetup.py new file mode 100644 index 0000000..36e3d8c --- /dev/null +++ b/server/ovirtserver/websetup.py @@ -0,0 +1,42 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +"""Setup the server application""" + +import logging + +import transaction +from tg import config + +from ovirtserver.config.environment import load_environment + +__all__ = ['setup_app'] + +log = logging.getLogger(__name__) + + +def setup_app(command, conf, vars): + """Place any commands to setup ovirtserver here""" + load_environment(conf.global_conf, conf.local_conf) + # Load the models + from ovirtserver import model + print "Creating tables" + model.metadata.create_all(bind=config['pylons.app_globals'].sa_engine) + + + transaction.commit() + print "Successfully setup" diff --git a/server/server.egg-info/PKG-INFO b/server/server.egg-info/PKG-INFO new file mode 100644 index 0000000..2ad8b9b --- /dev/null +++ b/server/server.egg-info/PKG-INFO @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: server +Version: 0.1dev +Summary: UNKNOWN +Home-page: UNKNOWN +Author: UNKNOWN +Author-email: UNKNOWN +License: UNKNOWN +Description: UNKNOWN +Platform: UNKNOWN diff --git a/server/server.egg-info/SOURCES.txt b/server/server.egg-info/SOURCES.txt new file mode 100644 index 0000000..4632e06 --- /dev/null +++ b/server/server.egg-info/SOURCES.txt @@ -0,0 +1,68 @@ +MANIFEST.in +README.txt +setup.cfg +setup.py +ovirtserver/__init__.py +ovirtserver/websetup.py +ovirtserver/config/__init__.py +ovirtserver/config/app_cfg.py +ovirtserver/config/environment.py +ovirtserver/config/middleware.py +ovirtserver/controllers/__init__.py +ovirtserver/controllers/error.py +ovirtserver/controllers/root.py +ovirtserver/controllers/secure.py +ovirtserver/controllers/template.py +ovirtserver/i18n/ru/LC_MESSAGES/ovirtserver.po +ovirtserver/lib/__init__.py +ovirtserver/lib/app_globals.py +ovirtserver/lib/base.py +ovirtserver/lib/helpers.py +ovirtserver/model/__init__.py +ovirtserver/model/auth.py +ovirtserver/public/favicon.ico +ovirtserver/public/css/style.css +ovirtserver/public/images/contentbg.png +ovirtserver/public/images/error.png +ovirtserver/public/images/header_inner2.png +ovirtserver/public/images/headerbg.png +ovirtserver/public/images/info.png +ovirtserver/public/images/inputbg.png +ovirtserver/public/images/loginbg.png +ovirtserver/public/images/loginbottombg.png +ovirtserver/public/images/loginheader-left.png +ovirtserver/public/images/loginheader-right.png +ovirtserver/public/images/menu-item-actibg-first.png +ovirtserver/public/images/menu-item-actibg.png +ovirtserver/public/images/menu-item-border.png +ovirtserver/public/images/menubg.png +ovirtserver/public/images/ok.png +ovirtserver/public/images/pagebg.png +ovirtserver/public/images/star.png +ovirtserver/public/images/strype2.png +ovirtserver/public/images/under_the_hood_blue.png +ovirtserver/public/images/warning.png +ovirtserver/templates/__init__.py +ovirtserver/templates/about.html +ovirtserver/templates/authentication.html +ovirtserver/templates/debug.html +ovirtserver/templates/error.html +ovirtserver/templates/footer.html +ovirtserver/templates/header.html +ovirtserver/templates/index.html +ovirtserver/templates/login.html +ovirtserver/templates/master.html +ovirtserver/templates/sidebars.html +ovirtserver/tests/__init__.py +ovirtserver/tests/functional/__init__.py +ovirtserver/tests/functional/test_authentication.py +ovirtserver/tests/functional/test_root.py +ovirtserver/tests/models/__init__.py +ovirtserver/tests/models/test_auth.py +server.egg-info/PKG-INFO +server.egg-info/SOURCES.txt +server.egg-info/dependency_links.txt +server.egg-info/entry_points.txt +server.egg-info/paster_plugins.txt +server.egg-info/requires.txt +server.egg-info/top_level.txt \ No newline at end of file diff --git a/server/server.egg-info/dependency_links.txt b/server/server.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/server/server.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/server/server.egg-info/entry_points.txt b/server/server.egg-info/entry_points.txt new file mode 100644 index 0000000..da62946 --- /dev/null +++ b/server/server.egg-info/entry_points.txt @@ -0,0 +1,7 @@ + + [paste.app_factory] + main = ovirtserver.config.middleware:make_app + + [paste.app_install] + main = pylons.util:PylonsInstaller + \ No newline at end of file diff --git a/server/server.egg-info/paster_plugins.txt b/server/server.egg-info/paster_plugins.txt new file mode 100644 index 0000000..ab508e5 --- /dev/null +++ b/server/server.egg-info/paster_plugins.txt @@ -0,0 +1,4 @@ +PasteScript +Pylons +TurboGears2 +tg.devtools diff --git a/server/server.egg-info/requires.txt b/server/server.egg-info/requires.txt new file mode 100644 index 0000000..661a57b --- /dev/null +++ b/server/server.egg-info/requires.txt @@ -0,0 +1,6 @@ +TurboGears2 >= 2.0b7 +Catwalk >= 2.0.2 +Babel >=0.9.4 +toscawidgets >= 0.9.7.1 +zope.sqlalchemy >= 0.4 +repoze.tm2 >= 1.0a4 \ No newline at end of file diff --git a/server/server.egg-info/top_level.txt b/server/server.egg-info/top_level.txt new file mode 100644 index 0000000..4e4dbeb --- /dev/null +++ b/server/server.egg-info/top_level.txt @@ -0,0 +1 @@ +ovirtserver diff --git a/server/setup.cfg b/server/setup.cfg new file mode 100644 index 0000000..cb01cf9 --- /dev/null +++ b/server/setup.cfg @@ -0,0 +1,32 @@ +[egg_info] +tag_build = dev +tag_svn_revision = true + +[easy_install] +find_links = http://www.pylonshq.com/download/ + +[nosetests] +with-pylons=test.ini + +# Babel configuration +[compile_catalog] +domain = ovirtserver +directory = ovirtserver/i18n +statistics = true + +[extract_messages] +add_comments = TRANSLATORS: +output_file = ovirtserver/i18n/ovirtserver.pot +width = 80 +keywords = l_ + +[init_catalog] +domain = ovirtserver +input_file = ovirtserver/i18n/ovirtserver.pot +output_dir = ovirtserver/i18n + +[update_catalog] +domain = ovirtserver +input_file = ovirtserver/i18n/ovirtserver.pot +output_dir = ovirtserver/i18n +previous = true diff --git a/server/setup.py b/server/setup.py new file mode 100644 index 0000000..bf646ad --- /dev/null +++ b/server/setup.py @@ -0,0 +1,63 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +try: + from setuptools import setup, find_packages +except ImportError: + from ez_setup import use_setuptools + use_setuptools() + from setuptools import setup, find_packages + +setup( + name='server', + version='0.1', + description='', + author='', + author_email='', + #url='', + install_requires=[ + "TurboGears2 >= 2.0b7", + "Catwalk >= 2.0.2", + "Babel >=0.9.4", + #can be removed iif use_toscawidgets = False + "toscawidgets >= 0.9.7.1", + "zope.sqlalchemy >= 0.4 ", + "repoze.tm2 >= 1.0a4", + ], + setup_requires=["PasteScript >= 1.7"], + paster_plugins=['PasteScript', 'Pylons', 'TurboGears2', 'tg.devtools'], + packages=find_packages(exclude=['ez_setup']), + include_package_data=True, + test_suite='nose.collector', + tests_require=['WebTest', 'BeautifulSoup'], + package_data={'ovirtserver': ['i18n/*/LC_MESSAGES/*.mo', + 'templates/*/*', + 'public/*/*']}, + message_extractors={'ovirtserver': [ + ('**.py', 'python', None), + ('templates/**.mako', 'mako', None), + ('templates/**.html', 'genshi', None), + ('public/**', 'ignore', None)]}, + + entry_points=""" + [paste.app_factory] + main = ovirtserver.config.middleware:make_app + + [paste.app_install] + main = pylons.util:PylonsInstaller + """, +) diff --git a/server/test.ini b/server/test.ini new file mode 100644 index 0000000..415fcb0 --- /dev/null +++ b/server/test.ini @@ -0,0 +1,42 @@ +# Copyright (C) 2010, Red Hat, Inc. +# Written by Darryl L. Pierce +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# +# server - TurboGears 2 testing environment configuration +# +# The %(here)s variable will be replaced with the parent directory of this file +# +[DEFAULT] +debug = true +# Uncomment and replace with the address which should receive any error reports +# email_to = you at yourdomain.com +smtp_server = localhost +error_email_from = paste at localhost + +[server:main] +use = egg:Paste#http +host = 0.0.0.0 +port = 5000 + +[app:main] +use = config:development.ini + +[app:main_without_authn] +use = main +skip_authentication = True + +# Add additional test specific configuration options as necessary. -- 1.6.6
David Huff
2010-Feb-12 21:48 UTC
[Ovirt-devel] [PATCH] Provides a reference implementation management server.
ACK On 02/11/2010 12:52 PM, Darryl L. Pierce wrote:> The reference implementation server is based on TG2. The majority of the > boiler plate code has been stripped out to focus the server solely on > the functionality necessary for a management server. > > Signed-off-by: Darryl L. Pierce<dpierce at redhat.com> > --- > server/.gitignore | 4 + > server/MANIFEST.in | 4 + > server/README.txt | 24 ++ > server/development.ini | 130 ++++++++++ > server/ez_setup/README.txt | 14 ++ > server/ez_setup/__init__.py | 247 ++++++++++++++++++++ > server/ovirtserver/__init__.py | 18 ++ > server/ovirtserver/config/__init__.py | 16 ++ > server/ovirtserver/config/app_cfg.py | 54 +++++ > server/ovirtserver/config/deployment.ini_tmpl | 104 ++++++++ > server/ovirtserver/config/environment.py | 25 ++ > server/ovirtserver/config/middleware.py | 55 +++++ > server/ovirtserver/controllers/__init__.py | 18 ++ > server/ovirtserver/controllers/controller.template | 36 +++ > server/ovirtserver/controllers/error.py | 46 ++++ > server/ovirtserver/controllers/root.py | 55 +++++ > server/ovirtserver/controllers/secure.py | 21 ++ > server/ovirtserver/controllers/template.py | 51 ++++ > .../ovirtserver/i18n/ru/LC_MESSAGES/ovirtserver.po | 24 ++ > server/ovirtserver/lib/__init__.py | 16 ++ > server/ovirtserver/lib/app_globals.py | 33 +++ > server/ovirtserver/lib/base.py | 44 ++++ > server/ovirtserver/lib/helpers.py | 20 ++ > server/ovirtserver/model/__init__.py | 77 ++++++ > server/ovirtserver/model/auth.py | 27 +++ > server/ovirtserver/model/model.template | 37 +++ > server/ovirtserver/public/favicon.ico | Bin 0 -> 1104 bytes > server/ovirtserver/templates/__init__.py | 18 ++ > server/ovirtserver/templates/error.html | 19 ++ > server/ovirtserver/templates/index.html | 20 ++ > server/ovirtserver/tests/__init__.py | 80 +++++++ > server/ovirtserver/tests/functional/__init__.py | 18 ++ > .../tests/functional/test_authentication.py | 16 ++ > server/ovirtserver/tests/functional/test_root.py | 48 ++++ > server/ovirtserver/tests/models/__init__.py | 68 ++++++ > server/ovirtserver/tests/models/test_auth.py | 22 ++ > server/ovirtserver/websetup.py | 42 ++++ > server/server.egg-info/PKG-INFO | 10 + > server/server.egg-info/SOURCES.txt | 68 ++++++ > server/server.egg-info/dependency_links.txt | 1 + > server/server.egg-info/entry_points.txt | 7 + > server/server.egg-info/paster_plugins.txt | 4 + > server/server.egg-info/requires.txt | 6 + > server/server.egg-info/top_level.txt | 1 + > server/setup.cfg | 32 +++ > server/setup.py | 63 +++++ > server/test.ini | 42 ++++ > 47 files changed, 1785 insertions(+), 0 deletions(-) > create mode 100644 server/.gitignore > create mode 100644 server/MANIFEST.in > create mode 100644 server/README.txt > create mode 100644 server/development.ini > create mode 100644 server/ez_setup/README.txt > create mode 100644 server/ez_setup/__init__.py > create mode 100644 server/ovirtserver/__init__.py > create mode 100644 server/ovirtserver/config/__init__.py > create mode 100644 server/ovirtserver/config/app_cfg.py > create mode 100644 server/ovirtserver/config/deployment.ini_tmpl > create mode 100644 server/ovirtserver/config/environment.py > create mode 100644 server/ovirtserver/config/middleware.py > create mode 100644 server/ovirtserver/controllers/__init__.py > create mode 100644 server/ovirtserver/controllers/controller.template > create mode 100644 server/ovirtserver/controllers/error.py > create mode 100644 server/ovirtserver/controllers/root.py > create mode 100644 server/ovirtserver/controllers/secure.py > create mode 100644 server/ovirtserver/controllers/template.py > create mode 100644 server/ovirtserver/i18n/ru/LC_MESSAGES/ovirtserver.po > create mode 100644 server/ovirtserver/lib/__init__.py > create mode 100644 server/ovirtserver/lib/app_globals.py > create mode 100644 server/ovirtserver/lib/base.py > create mode 100644 server/ovirtserver/lib/helpers.py > create mode 100644 server/ovirtserver/model/__init__.py > create mode 100644 server/ovirtserver/model/auth.py > create mode 100644 server/ovirtserver/model/model.template > create mode 100644 server/ovirtserver/public/favicon.ico > create mode 100644 server/ovirtserver/templates/__init__.py > create mode 100644 server/ovirtserver/templates/error.html > create mode 100644 server/ovirtserver/templates/index.html > create mode 100644 server/ovirtserver/tests/__init__.py > create mode 100644 server/ovirtserver/tests/functional/__init__.py > create mode 100644 server/ovirtserver/tests/functional/test_authentication.py > create mode 100644 server/ovirtserver/tests/functional/test_root.py > create mode 100644 server/ovirtserver/tests/models/__init__.py > create mode 100644 server/ovirtserver/tests/models/test_auth.py > create mode 100644 server/ovirtserver/websetup.py > create mode 100644 server/server.egg-info/PKG-INFO > create mode 100644 server/server.egg-info/SOURCES.txt > create mode 100644 server/server.egg-info/dependency_links.txt > create mode 100644 server/server.egg-info/entry_points.txt > create mode 100644 server/server.egg-info/paster_plugins.txt > create mode 100644 server/server.egg-info/requires.txt > create mode 100644 server/server.egg-info/top_level.txt > create mode 100644 server/setup.cfg > create mode 100644 server/setup.py > create mode 100644 server/test.ini > > diff --git a/server/.gitignore b/server/.gitignore > new file mode 100644 > index 0000000..41bf6ae > --- /dev/null > +++ b/server/.gitignore > @@ -0,0 +1,4 @@ > +build/ > +data/ > +dist/ > +devdata.db > diff --git a/server/MANIFEST.in b/server/MANIFEST.in > new file mode 100644 > index 0000000..e9c47eb > --- /dev/null > +++ b/server/MANIFEST.in > @@ -0,0 +1,4 @@ > +recursive-include ovirtserver/public * > +include ovirtserver/public/favicon.ico > +recursive-include ovirtserver/i18n * > +recursive-include ovirtserver/templates * > diff --git a/server/README.txt b/server/README.txt > new file mode 100644 > index 0000000..809ebf3 > --- /dev/null > +++ b/server/README.txt > @@ -0,0 +1,24 @@ > +This file is for you to describe the server application. Typically > +you would include information such as the information below: > + > +Installation and Setup > +=====================> + > +Install ``server`` using the setup.py script:: > + > + $ cd server > + $ python setup.py install > + > +Create the project database for any model classes defined:: > + > + $ paster setup-app development.ini > + > +Start the paste http server:: > + > + $ paster serve development.ini > + > +While developing you may want the server to reload after changes in package files (or its dependencies) are saved. This can be achieved easily by adding the --reload option:: > + > + $ paster serve --reload development.ini > + > +Then you are ready to go. > diff --git a/server/development.ini b/server/development.ini > new file mode 100644 > index 0000000..2295b25 > --- /dev/null > +++ b/server/development.ini > @@ -0,0 +1,130 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +[DEFAULT] > +debug = true > +# Uncomment and replace with the address which should receive any error reports > +#email_to = you at yourdomain.com > +smtp_server = localhost > +error_email_from = paste at localhost > + > +[server:main] > +use = egg:Paste#http > +host = 127.0.0.1 > +port = 8080 > + > +[app:main] > +use = egg:server > +full_stack = true > +#lang = ru > +cache_dir = %(here)s/data > +beaker.session.key = ovirtserver > +beaker.session.secret = somesecret > + > +# If you'd like to fine-tune the individual locations of the cache data dirs > +# for the Cache data, or the Session saves, un-comment the desired settings > +# here: > +#beaker.cache.data_dir = %(here)s/data/cache > +#beaker.session.data_dir = %(here)s/data/sessions > + > +# pick the form for your database > +# %(here) may include a ':' character on Windows environments; this can > +# invalidate the URI when specifying a SQLite db via path name > +# sqlalchemy.url=postgres://username:password at hostname:port/databasename > +# sqlalchemy.url=mysql://username:password at hostname:port/databasename > + > + > +# If you have sqlite, here's a simple default to get you started > +# in development > + > +sqlalchemy.url = sqlite:///%(here)s/devdata.db > +#echo shouldn't be used together with the logging module. > +sqlalchemy.echo = false > +sqlalchemy.echo_pool = false > +sqlalchemy.pool_recycle = 3600 > + > +# if you are using Mako and want to be able to reload > +# the mako template from disk during the development phase > +# you should say 'true' here > +# This option is only used for mako templating engine > +# WARNING: if you want to deploy your application using a zipped egg > +# (ie: if your application's setup.py defines zip-safe=True, then you > +# MUST put "false" for the production environment because there will > +# be no disk and real files to compare time with. > +# On the contrary if your application defines zip-safe=False and is > +# deployed in an unzipped manner, then you can leave this option to true > +templating.mako.reloadfromdisk = true > + > +# the compiled template dir is a directory that must be readable by your > +# webserver. It will be used to store the resulting templates once compiled > +# by the TemplateLookup system. > +# During development you generally don't need this option since paste's HTTP > +# server will have access to you development directories, but in production > +# you'll most certainly want to have apache or nginx to write in a directory > +# that does not contain any source code in any form for obvious security reasons. > +# > +#templating.mako.compiled_templates_dir = /some/dir/where/webserver/has/access > + > +# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* > +# Debug mode will enable the interactive debugging tool, allowing ANYONE to > +# execute malicious code after an exception is raised. > +#set debug = false > + > +# Logging configuration > +# Add additional loggers, handlers, formatters here > +# Uses python's logging config file format > +# http://docs.python.org/lib/logging-config-fileformat.html > + > +[loggers] > +keys = root, ovirtserver, sqlalchemy > + > +[handlers] > +keys = console > + > +[formatters] > +keys = generic > + > +# If you create additional loggers, add them as a key to [loggers] > +[logger_root] > +level = INFO > +handlers = console > + > +[logger_ovirtserver] > +level = DEBUG > +handlers > +qualname = ovirtserver > + > +[logger_sqlalchemy] > +level = INFO > +handlers > +qualname = sqlalchemy.engine > +# "level = INFO" logs SQL queries. > +# "level = DEBUG" logs SQL queries and results. > +# "level = WARN" logs neither. (Recommended for production systems.) > + > + > +# If you create additional handlers, add them as a key to [handlers] > +[handler_console] > +class = StreamHandler > +args = (sys.stderr,) > +level = NOTSET > +formatter = generic > + > +# If you create additional formatters, add them as a key to [formatters] > +[formatter_generic] > +format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s > +datefmt = %H:%M:%S > diff --git a/server/ez_setup/README.txt b/server/ez_setup/README.txt > new file mode 100644 > index 0000000..77c986d > --- /dev/null > +++ b/server/ez_setup/README.txt > @@ -0,0 +1,14 @@ > +This directory exists so that Subversion-based projects can share a single > +copy of the ``ez_setup`` bootstrap module for ``setuptools``, and have it > +automatically updated in their projects when ``setuptools`` is updated. > + > +For your convenience, you may use the following svn:externals definition:: > + > + ez_setup svn://svn.eby-sarna.com/svnroot/ez_setup > + > +You can set this by executing this command in your project directory:: > + > + svn propedit svn:externals . > + > +And then adding the line shown above to the file that comes up for editing. > +Then, whenever you update your project, ``ez_setup`` will be updated as well. > diff --git a/server/ez_setup/__init__.py b/server/ez_setup/__init__.py > new file mode 100644 > index 0000000..8d35412 > --- /dev/null > +++ b/server/ez_setup/__init__.py > @@ -0,0 +1,247 @@ > +#!python > +# > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""Bootstrap setuptools installation > + > +If you want to use setuptools in your package's setup.py, just include this > +file in the same directory with it, and add this to the top of your setup.py:: > + > + from ez_setup import use_setuptools > + use_setuptools() > + > +If you want to require a specific version of setuptools, set a download > +mirror, or use an alternate download directory, you can do so by supplying > +the appropriate options to ``use_setuptools()``. > + > +This file can also be run as a script to install or upgrade setuptools. > +""" > +import sys > +DEFAULT_VERSION = "0.6c7" > +DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3] > + > +md5_data = { > + 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca', > + 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb', > + 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b', > + 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a', > + 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618', > + 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac', > + 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5', > + 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4', > + 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c', > + 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b', > + 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27', > + 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277', > + 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa', > + 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e', > + 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e', > + 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f', > + 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2', > + 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc', > + 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167', > + 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64', > + 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d', > + 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20', > + 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab', > + 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53', > + 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2', > + 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e', > + 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372', > +} > + > +import sys, os > + > +def _validate_md5(egg_name, data): > + if egg_name in md5_data: > + from md5 import md5 > + digest = md5(data).hexdigest() > + if digest != md5_data[egg_name]: > + print>>sys.stderr, ( > + "md5 validation of %s failed! (Possible download problem?)" > + % egg_name > + ) > + sys.exit(2) > + return data > + > + > +def use_setuptools( > + version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, > + download_delay=15 > +): > + """Automatically find/download setuptools and make it available on sys.path > + > + `version` should be a valid setuptools version number that is available > + as an egg for download under the `download_base` URL (which should end with > + a '/'). `to_dir` is the directory where setuptools will be downloaded, if > + it is not already available. If `download_delay` is specified, it should > + be the number of seconds that will be paused before initiating a download, > + should one be required. If an older version of setuptools is installed, > + this routine will print a message to ``sys.stderr`` and raise SystemExit in > + an attempt to abort the calling script. > + """ > + try: > + import setuptools > + if setuptools.__version__ == '0.0.1': > + print>>sys.stderr, ( > + "You have an obsolete version of setuptools installed. Please\n" > + "remove it from your system entirely before rerunning this script." > + ) > + sys.exit(2) > + except ImportError: > + egg = download_setuptools(version, download_base, to_dir, download_delay) > + sys.path.insert(0, egg) > + import setuptools; setuptools.bootstrap_install_from = egg > + > + import pkg_resources > + try: > + pkg_resources.require("setuptools>="+version) > + > + except pkg_resources.VersionConflict, e: > + # XXX could we install in a subprocess here? > + print>>sys.stderr, ( > + "The required version of setuptools (>=%s) is not available, and\n" > + "can't be installed while this script is running. Please install\n" > + " a more recent version first.\n\n(Currently using %r)" > + ) % (version, e.args[0]) > + sys.exit(2) > + > +def download_setuptools( > + version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, > + delay = 15 > +): > + """Download setuptools from a specified location and return its filename > + > + `version` should be a valid setuptools version number that is available > + as an egg for download under the `download_base` URL (which should end > + with a '/'). `to_dir` is the directory where the egg will be downloaded. > + `delay` is the number of seconds to pause before an actual download attempt. > + """ > + import urllib2, shutil > + egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3]) > + url = download_base + egg_name > + saveto = os.path.join(to_dir, egg_name) > + src = dst = None > + if not os.path.exists(saveto): # Avoid repeated downloads > + try: > + from distutils import log > + if delay: > + log.warn(""" > +--------------------------------------------------------------------------- > +This script requires setuptools version %s to run (even to display > +help). I will attempt to download it for you (from > +%s), but > +you may need to enable firewall access for this script first. > +I will start the download in %d seconds. > + > +(Note: if this machine does not have network access, please obtain the file > + > + %s > + > +and place it in this directory before rerunning this script.) > +---------------------------------------------------------------------------""", > + version, download_base, delay, url > + ); from time import sleep; sleep(delay) > + log.warn("Downloading %s", url) > + src = urllib2.urlopen(url) > + # Read/write all in one block, so we don't create a corrupt file > + # if the download is interrupted. > + data = _validate_md5(egg_name, src.read()) > + dst = open(saveto,"wb"); dst.write(data) > + finally: > + if src: src.close() > + if dst: dst.close() > + return os.path.realpath(saveto) > + > +def main(argv, version=DEFAULT_VERSION): > + """Install or upgrade setuptools and EasyInstall""" > + > + try: > + import setuptools > + except ImportError: > + egg = None > + try: > + egg = download_setuptools(version, delay=0) > + sys.path.insert(0,egg) > + from setuptools.command.easy_install import main > + return main(list(argv)+[egg]) # we're done here > + finally: > + if egg and os.path.exists(egg): > + os.unlink(egg) > + else: > + if setuptools.__version__ == '0.0.1': > + # tell the user to uninstall obsolete version > + use_setuptools(version) > + > + req = "setuptools>="+version > + import pkg_resources > + try: > + pkg_resources.require(req) > + except pkg_resources.VersionConflict: > + try: > + from setuptools.command.easy_install import main > + except ImportError: > + from easy_install import main > + main(list(argv)+[download_setuptools(delay=0)]) > + sys.exit(0) # try to force an exit > + else: > + if argv: > + from setuptools.command.easy_install import main > + main(argv) > + else: > + print "Setuptools version",version,"or greater has been installed." > + print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)' > + > + > + > +def update_md5(filenames): > + """Update our built-in md5 registry""" > + > + import re > + from md5 import md5 > + > + for name in filenames: > + base = os.path.basename(name) > + f = open(name,'rb') > + md5_data[base] = md5(f.read()).hexdigest() > + f.close() > + > + data = [" %r: %r,\n" % it for it in md5_data.items()] > + data.sort() > + repl = "".join(data) > + > + import inspect > + srcfile = inspect.getsourcefile(sys.modules[__name__]) > + f = open(srcfile, 'rb'); src = f.read(); f.close() > + > + match = re.search("\nmd5_data = {\n([^}]+)}", src) > + if not match: > + print>>sys.stderr, "Internal error!" > + sys.exit(2) > + > + src = src[:match.start(1)] + repl + src[match.end(1):] > + f = open(srcfile,'w') > + f.write(src) > + f.close() > + > + > +if __name__=='__main__': > + if len(sys.argv)>2 and sys.argv[1]=='--md5update': > + update_md5(sys.argv[2:]) > + else: > + main(sys.argv[1:]) > diff --git a/server/ovirtserver/__init__.py b/server/ovirtserver/__init__.py > new file mode 100644 > index 0000000..1d14a09 > --- /dev/null > +++ b/server/ovirtserver/__init__.py > @@ -0,0 +1,18 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""The server package""" > diff --git a/server/ovirtserver/config/__init__.py b/server/ovirtserver/config/__init__.py > new file mode 100644 > index 0000000..90ca87c > --- /dev/null > +++ b/server/ovirtserver/config/__init__.py > @@ -0,0 +1,16 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > diff --git a/server/ovirtserver/config/app_cfg.py b/server/ovirtserver/config/app_cfg.py > new file mode 100644 > index 0000000..8882a6b > --- /dev/null > +++ b/server/ovirtserver/config/app_cfg.py > @@ -0,0 +1,54 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +""" > +Global configuration file for TG2-specific settings in server. > + > +This file complements development/deployment.ini. > + > +Please note that **all the argument values are strings**. If you want to > +convert them into boolean, for example, you should use the > +:func:`paste.deploy.converters.asbool` function, as in:: > + > + from paste.deploy.converters import asbool > + setting = asbool(global_conf.get('the_setting')) > + > +""" > + > +from tg.configuration import AppConfig > + > +import ovirtserver > +from ovirtserver import model > +from ovirtserver.lib import app_globals, helpers > + > +base_config = AppConfig() > +base_config.renderers = [] > + > +base_config.package = ovirtserver > + > +#Set the default renderer > +base_config.default_renderer = 'genshi' > +base_config.renderers.append('genshi') > +# if you want raw speed and have installed chameleon.genshi > +# you should try to use this renderer instead. > +# warning: for the moment chameleon does not handle i18n translations > +#base_config.renderers.append('chameleon_genshi') > + > +#Configure the base SQLALchemy Setup > +base_config.use_sqlalchemy = True > +base_config.model = ovirtserver.model > +base_config.DBSession = ovirtserver.model.DBSession > diff --git a/server/ovirtserver/config/deployment.ini_tmpl b/server/ovirtserver/config/deployment.ini_tmpl > new file mode 100644 > index 0000000..7b1403c > --- /dev/null > +++ b/server/ovirtserver/config/deployment.ini_tmpl > @@ -0,0 +1,104 @@ > +# Copyright (C) yyyy, your name. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +# > +# server - TurboGears configuration > +# > +# The %(here)s variable will be replaced with the parent directory of this file > +# > +[DEFAULT] > +# WARGING == If debug is not set to false, you'll get the interactive > +# debugger on production, which is a huge security hole. > + > +debug = false > +email_to = you at yourdomain.com > +smtp_server = localhost > +error_email_from = paste at localhost > + > +[server:main] > +use = egg:Paste#http > +host = 0.0.0.0 > +port = 8080 > + > +[app:main] > +use = egg:server > +full_stack = true > +cache_dir = %(here)s/data > +beaker.session.key = ovirtserver > +beaker.session.secret = ${app_instance_secret} > +app_instance_uuid = ${app_instance_uuid} > + > +# If you'd like to fine-tune the individual locations of the cache data dirs > +# for the Cache data, or the Session saves, un-comment the desired settings > +# here: > +#beaker.cache.data_dir = %(here)s/data/cache > +#beaker.session.data_dir = %(here)s/data/sessions > +# Specify the database for SQLAlchemy to use via > +# turbogears.database > +# %(here) may include a ':' character on Windows environments; this can > +# invalidate the URI when specifying a SQLite db via path name > +sqlalchemy.url = sqlite:///%(here)s/somedb.db > +sqlalchemy.echo = False > + > +# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT* > +# Debug mode will enable the interactive debugging tool, allowing ANYONE to > +# execute malicious code after an exception is raised. > +#set debug = false > + > +# Logging configuration > +# Add additional loggers, handlers, formatters here > +# Uses python's logging config file format > +# http://docs.python.org/lib/logging-config-fileformat.html > + > +[loggers] > +keys = root, ovirtserver, sqlalchemy > + > +[handlers] > +keys = console > + > +[formatters] > +keys = generic > + > +# If you create additional loggers, add them as a key to [loggers] > +[logger_root] > +level = INFO > +handlers = console > + > +[logger_ovirtserver] > +level = INFO > +handlers > +qualname = ovirtserver > + > +[logger_sqlalchemy] > +level = WARN > +handlers > +qualname = sqlalchemy.engine > +# "level = INFO" logs SQL queries. > +# "level = DEBUG" logs SQL queries and results. > +# "level = WARN" logs neither. (Recommended for production systems.) > + > + > +# If you create additional handlers, add them as a key to [handlers] > +[handler_console] > +class = StreamHandler > +args = (sys.stderr,) > +level = NOTSET > +formatter = generic > + > +# If you create additional formatters, add them as a key to [formatters] > +[formatter_generic] > +format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s > +datefmt = %H:%M:%S > diff --git a/server/ovirtserver/config/environment.py b/server/ovirtserver/config/environment.py > new file mode 100644 > index 0000000..01b0275 > --- /dev/null > +++ b/server/ovirtserver/config/environment.py > @@ -0,0 +1,25 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""WSGI environment setup for server.""" > + > +from ovirtserver.config.app_cfg import base_config > + > +__all__ = ['load_environment'] > + > +#Use base_config to setup the environment loader function > +load_environment = base_config.make_load_environment() > diff --git a/server/ovirtserver/config/middleware.py b/server/ovirtserver/config/middleware.py > new file mode 100644 > index 0000000..b5f47da > --- /dev/null > +++ b/server/ovirtserver/config/middleware.py > @@ -0,0 +1,55 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""WSGI middleware initialization for the server application.""" > + > +from ovirtserver.config.app_cfg import base_config > +from ovirtserver.config.environment import load_environment > + > + > +__all__ = ['make_app'] > + > +# Use base_config to setup the necessary PasteDeploy application factory. > +# make_base_app will wrap the TG2 app with all the middleware it needs. > +make_base_app = base_config.setup_tg_wsgi_app(load_environment) > + > + > +def make_app(global_conf, full_stack=True, **app_conf): > + """ > + Set server up with the settings found in the PasteDeploy configuration > + file used. > + > + :param global_conf: The global settings for server (those > + defined under the ``[DEFAULT]`` section). > + :type global_conf: dict > + :param full_stack: Should the whole TG2 stack be set up? > + :type full_stack: str or bool > + :return: The server application with all the relevant middleware > + loaded. > + > + This is the PasteDeploy factory for the server application. > + > + ``app_conf`` contains all the application-specific settings (those defined > + under ``[app:main]``. > + > + > + """ > + app = make_base_app(global_conf, full_stack=True, **app_conf) > + > + # Wrap your base TurboGears 2 application with custom middleware here > + > + return app > diff --git a/server/ovirtserver/controllers/__init__.py b/server/ovirtserver/controllers/__init__.py > new file mode 100644 > index 0000000..417d5ed > --- /dev/null > +++ b/server/ovirtserver/controllers/__init__.py > @@ -0,0 +1,18 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""Controllers for the server application.""" > diff --git a/server/ovirtserver/controllers/controller.template b/server/ovirtserver/controllers/controller.template > new file mode 100644 > index 0000000..2de6832 > --- /dev/null > +++ b/server/ovirtserver/controllers/controller.template > @@ -0,0 +1,36 @@ > +# Copyright (C) yyyy, your name > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""Sample controller module""" > + > +# turbogears imports > +from tg import expose > +#from tg import redirect, validate, flash > + > +# third party imports > +#from pylons.i18n import ugettext as _ > +#from repoze.what import predicates > + > +# project specific imports > +from ovirtserver.lib.base import BaseController > +#from ovirtserver.model import DBSession, metadata > + > + > +class SampleController(BaseController): > + > + @expose('ovirtserver.templates.index') > + def index(self): > + return dict(page='index') > diff --git a/server/ovirtserver/controllers/error.py b/server/ovirtserver/controllers/error.py > new file mode 100644 > index 0000000..6a14218 > --- /dev/null > +++ b/server/ovirtserver/controllers/error.py > @@ -0,0 +1,46 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""Error controller""" > + > +from tg import request, expose > + > +__all__ = ['ErrorController'] > + > + > +class ErrorController(object): > + """ > + Generates error documents as and when they are required. > + > + The ErrorDocuments middleware forwards to ErrorController when error > + related status codes are returned from the application. > + > + This behaviour can be altered by changing the parameters to the > + ErrorDocuments middleware in your config/middleware.py file. > + > + """ > + > + @expose('ovirtserver.templates.error') > + def document(self, *args, **kwargs): > + """Render the error document""" > + resp = request.environ.get('pylons.original_response') > + default_message = ("<p>We're sorry but we weren't able to process " > + " this request.</p>") > + values = dict(prefix=request.environ.get('SCRIPT_NAME', ''), > + code=request.params.get('code', resp.status_int), > + message=request.params.get('message', default_message)) > + return values > diff --git a/server/ovirtserver/controllers/root.py b/server/ovirtserver/controllers/root.py > new file mode 100644 > index 0000000..cfd682b > --- /dev/null > +++ b/server/ovirtserver/controllers/root.py > @@ -0,0 +1,55 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""Main Controller""" > + > +from tg import expose, flash, require, url, request, redirect > +from pylons.i18n import ugettext as _, lazy_ugettext as l_ > + > +from ovirtserver.lib.base import BaseController > +from ovirtserver.model import DBSession, metadata > +from ovirtserver.controllers.error import ErrorController > + > +__all__ = ['RootController'] > + > + > +class RootController(BaseController): > + """ > + The root controller for the server application. > + > + All the other controllers and WSGI applications should be mounted on this > + controller. For example:: > + > + panel = ControlPanelController() > + another_app = AnotherWSGIApplication() > + > + Keep in mind that WSGI applications shouldn't be mounted directly: They > + must be wrapped around with :class:`tg.controllers.WSGIAppController`. > + > + """ > + > + error = ErrorController() > + > + @expose('ovirtserver.templates.index') > + def index(self): > + """Handle the front-page.""" > + return dict(page='index') > + > + @expose('ovirtserver.templates.about') > + def about(self): > + """Handle the 'about' page.""" > + return dict(page='about') > diff --git a/server/ovirtserver/controllers/secure.py b/server/ovirtserver/controllers/secure.py > new file mode 100644 > index 0000000..adb98f7 > --- /dev/null > +++ b/server/ovirtserver/controllers/secure.py > @@ -0,0 +1,21 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""Sample controller with all its actions protected.""" > + > +# This controller is only used when you activate auth. You can safely remove > +# this file from your project. > diff --git a/server/ovirtserver/controllers/template.py b/server/ovirtserver/controllers/template.py > new file mode 100644 > index 0000000..77a1fcb > --- /dev/null > +++ b/server/ovirtserver/controllers/template.py > @@ -0,0 +1,51 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""Fallback controller.""" > + > +from ovirtserver.lib.base import BaseController > + > +__all__ = ['TemplateController'] > + > + > +class TemplateController(BaseController): > + """ > + The fallback controller for server. > + > + By default, the final controller tried to fulfill the request > + when no other routes match. It may be used to display a template > + when all else fails, e.g.:: > + > + def view(self, url): > + return render('/%s' % url) > + > + Or if you're using Mako and want to explicitly send a 404 (Not > + Found) response code when the requested template doesn't exist:: > + > + import mako.exceptions > + > + def view(self, url): > + try: > + return render('/%s' % url) > + except mako.exceptions.TopLevelLookupException: > + abort(404) > + > + """ > + > + def view(self, url): > + """Abort the request with a 404 HTTP status code.""" > + abort(404) > diff --git a/server/ovirtserver/i18n/ru/LC_MESSAGES/ovirtserver.po b/server/ovirtserver/i18n/ru/LC_MESSAGES/ovirtserver.po > new file mode 100644 > index 0000000..36532d4 > --- /dev/null > +++ b/server/ovirtserver/i18n/ru/LC_MESSAGES/ovirtserver.po > @@ -0,0 +1,24 @@ > +# Russian translations for ${package}. > +# Copyright (C) 2008 ORGANIZATION > +# This file is distributed under the same license as the ${package} project. > +# FIRST AUTHOR<EMAIL at ADDRESS>, 2008. > +# > +msgid "" > +msgstr "" > +"Project-Id-Version: ${package} 0.0.0\n" > +"Report-Msgid-Bugs-To: EMAIL at ADDRESS\n" > +"POT-Creation-Date: 2008-01-13 14:00+0200\n" > +"PO-Revision-Date: 2008-01-13 14:00+0200\n" > +"Last-Translator: FULL NAME<EMAIL at ADDRESS>\n" > +"Language-Team: ru<LL at li.org>\n" > +"Plural-Forms: nplurals=3; plural=(n%10==1&& n%100!=11 ? 0 : n%10>=2&& " > +"n%10<=4&& (n%100<10 || n%100>=20) ? 1 : 2)\n" > +"MIME-Version: 1.0\n" > +"Content-Type: text/plain; charset=utf-8\n" > +"Content-Transfer-Encoding: 8bit\n" > +"Generated-By: Babel 0.9.1\n" > + > +#: ${package}/controllers/root.py:13 > +msgid "Your application is now running" > +msgstr "???????? ???????????????????? ?????????????? ????????????????" > + > diff --git a/server/ovirtserver/lib/__init__.py b/server/ovirtserver/lib/__init__.py > new file mode 100644 > index 0000000..90ca87c > --- /dev/null > +++ b/server/ovirtserver/lib/__init__.py > @@ -0,0 +1,16 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > diff --git a/server/ovirtserver/lib/app_globals.py b/server/ovirtserver/lib/app_globals.py > new file mode 100644 > index 0000000..d5d2abe > --- /dev/null > +++ b/server/ovirtserver/lib/app_globals.py > @@ -0,0 +1,33 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""The application's Globals object""" > + > +__all__ = ['Globals'] > + > + > +class Globals(object): > + """Container for objects available throughout the life of the application. > + > + One instance of Globals is created during application initialization and > + is available during requests via the 'app_globals' variable. > + > + """ > + > + def __init__(self): > + """Do nothing, by default.""" > + pass > diff --git a/server/ovirtserver/lib/base.py b/server/ovirtserver/lib/base.py > new file mode 100644 > index 0000000..90772cc > --- /dev/null > +++ b/server/ovirtserver/lib/base.py > @@ -0,0 +1,44 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""The base Controller API.""" > + > +from tg import TGController, tmpl_context > +from tg.render import render > +from pylons.i18n import _, ungettext, N_ > +from tw.api import WidgetBunch > +import ovirtserver.model as model > + > +__all__ = ['Controller', 'BaseController'] > + > + > +class BaseController(TGController): > + """ > + Base class for the controllers in the application. > + > + Your web application should have one of these. The root of > + your application is used to compute URLs used by your app. > + > + """ > + > + def __call__(self, environ, start_response): > + """Invoke the Controller""" > + # TGController.__call__ dispatches to the Controller method > + # the request is routed to. This routing information is > + # available in environ['pylons.routes_dict'] > + > + return TGController.__call__(self, environ, start_response) > diff --git a/server/ovirtserver/lib/helpers.py b/server/ovirtserver/lib/helpers.py > new file mode 100644 > index 0000000..88cdc0f > --- /dev/null > +++ b/server/ovirtserver/lib/helpers.py > @@ -0,0 +1,20 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""WebHelpers used in server.""" > + > +from webhelpers import date, feedgenerator, html, number, misc, text > diff --git a/server/ovirtserver/model/__init__.py b/server/ovirtserver/model/__init__.py > new file mode 100644 > index 0000000..1b37524 > --- /dev/null > +++ b/server/ovirtserver/model/__init__.py > @@ -0,0 +1,77 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""The application's model objects""" > + > +from zope.sqlalchemy import ZopeTransactionExtension > +from sqlalchemy.orm import scoped_session, sessionmaker > +#from sqlalchemy import MetaData > +from sqlalchemy.ext.declarative import declarative_base > + > +# Global session manager: DBSession() returns the Thread-local > +# session object appropriate for the current web request. > +maker = sessionmaker(autoflush=True, autocommit=False, > + extension=ZopeTransactionExtension()) > +DBSession = scoped_session(maker) > + > +# Base class for all of our model classes: By default, the data model is > +# defined with SQLAlchemy's declarative extension, but if you need more > +# control, you can switch to the traditional method. > +DeclarativeBase = declarative_base() > + > +# There are two convenient ways for you to spare some typing. > +# You can have a query property on all your model classes by doing this: > +# DeclarativeBase.query = DBSession.query_property() > +# Or you can use a session-aware mapper as it was used in TurboGears 1: > +# DeclarativeBase = declarative_base(mapper=DBSession.mapper) > + > +# Global metadata. > +# The default metadata is the one from the declarative base. > +metadata = DeclarativeBase.metadata > + > +# If you have multiple databases with overlapping table names, you'll need a > +# metadata for each database. Feel free to rename 'metadata2'. > +#metadata2 = MetaData() > + > +##### > +# Generally you will not want to define your table's mappers, and data objects > +# here in __init__ but will want to create modules them in the model directory > +# and import them at the bottom of this file. > +# > +###### > + > +def init_model(engine): > + """Call me before using any of the tables or classes in the model.""" > + > + DBSession.configure(bind=engine) > + # If you are using reflection to introspect your database and create > + # table objects for you, your tables must be defined and mapped inside > + # the init_model function, so that the engine is available if you > + # use the model outside tg2, you need to make sure this is called before > + # you use the model. > + > + # > + # See the following example: > + > + #global t_reflected > + > + #t_reflected = Table("Reflected", metadata, > + # autoload=True, autoload_with=engine) > + > + #mapper(Reflected, t_reflected) > + > +# Import your model modules here. > diff --git a/server/ovirtserver/model/auth.py b/server/ovirtserver/model/auth.py > new file mode 100644 > index 0000000..d7ea74b > --- /dev/null > +++ b/server/ovirtserver/model/auth.py > @@ -0,0 +1,27 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +""" > +Auth* related model. > + > +This is where the models used by :mod:`repoze.who` and :mod:`repoze.what` are > +defined. > + > +It's perfectly fine to re-use this definition in the server application, > +though. > + > +""" > diff --git a/server/ovirtserver/model/model.template b/server/ovirtserver/model/model.template > new file mode 100644 > index 0000000..716807e > --- /dev/null > +++ b/server/ovirtserver/model/model.template > @@ -0,0 +1,37 @@ > +# Copyright (C) yyyy, your name. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""Sample model module.""" > + > +from sqlalchemy import * > +from sqlalchemy.orm import mapper, relation > +from sqlalchemy import Table, ForeignKey, Column > +from sqlalchemy.types import Integer, Unicode > +#from sqlalchemy.orm import relation, backref > + > +from ovirtserver.model import DeclarativeBase, metadata, DBSession > + > + > +class SampleModel(DeclarativeBase): > + __tablename__ = 'sample_model' > + > + #{ Columns > + > + id = Column(Integer, primary_key=True) > + > + data = Column(Unicode(255), nullable=False) > + > + #} > diff --git a/server/ovirtserver/public/favicon.ico b/server/ovirtserver/public/favicon.ico > new file mode 100644 > index 0000000000000000000000000000000000000000..840986e4705befe9beb4275e2807fd358a362497 > GIT binary patch > literal 1104 > zcmV-W1h4xaiwFP!000000|7Y%#`{M}MmRZP5C9MW=S=`zU0s?(6{e=9adB~piHWPL > ztMKsf<mBXhe0;dLxYLng)6>)U_xHB8w!DmPpP!#EEiT>N-OZzotgNilw50s}{OQ-t > z^78VNlas>2!U6&U#KgqR%*?*NzOJsW&d$!SbyBdfu%Muz$;rva#>TX?w3(Ti+uPgs > z&04auvZ$!2y1Kf(y}gex2j}PK(9qCSktL<vVARyqhlhvUZDREF^lmT{>!dMnZf at o5 > z^=WBo?eqTG!L-)a*6Ql&*x1;RX;!tCefaqJQBhIy=HN$1M}|Wt-{0TEn}yfO!GVE+ > zq*N-`-RJ-R|LpASW at ct!U|@4WF3Wo@$oPbyO(IuUSF(ar`tX0OW<jP}GRDi*+u-Zs > z>F<|!XSIN1g<D9uzQ^z4+w=PUzN3)M(%kl<k=f77aIGXhY%!Q at I`xi%a8OC)&A_Ir > zviJS}+||(e^zxp*oN8=wl81+Zu}tCS?f9;wnx3WY at bUQZ?!Lp!o}#J1u%hAQ=CZcG > z>F at gA;^d5tjqK&(Vr6Ob_W0=R?)?A%)7RUD!9CjD-;a-v=<Do_kc4h=c6WM!`}g(E > z#J<3<Nd5cz at bvbpueWt|cA=%Mj**z|_4(Y`)q;hK`1}3l-`vvJ;!I6VQ&m~EsiWE3 > z-FkyVq=s}IHWu^q^ITtJ{rvj-`uXtl_TAs$6B878czF8w_~-BQg^7>j<Kyx1@$K#H > zPEb=_U}Up0E^mi!IyyR%mYwzO>A}IlqoboyQ&+&&w#&=Qrjm-vP)P6Z at 9ysI`}_OK > z%F4jN!2bUJ`uh6f;^M)^&t_<C{{R2~{{HLn{6RuO{{H{@`T70*{rda+_VxAq{r>Rs > z^3l at O)Y8(|)Y8MYtj4>w=-kzvNgU77)ZyXb;o{@<_4W4l_V at Pn&CShIQ&aBl?dj?1 > z>+9>x$HQV{Wy{OVfpc@~>*{A`XINNRT3TDkzqtPX{d|9grlg}C92_JgBg at duy1Tij > zr=`o!%<J#*;^XA%>gmD1y~4r3mYSg<{uM)VWnpw>WFU8GbZ8({Xk{QrNlj1yEC2ui > z01yBW000R70Gl*n*5r*DAr*v}c{5O;!(~W<1i at wwn?xk>911*^&58pDNEBGHl1-Y! > zV+_iHa4-fQI!I$2baBGqn6V%Zf~2u`ViBH2C-SAi8N`^CG-*<Jd$FXc8E at IrSdl`l > z&{0)KTF_7<rNt3dQe6oF*X0W!bS<PP=nARNmo7D;QH!#s4>}uEuuy4%&c&K2(ToAH > z@#V*fF*a<p7;_ at R7aKsD7>N?4%eiatvSoO&s7n+hMhu}Fm8LSRK7Cxk>S9DHBxp6v > z^#Ky)%NHQGqX60GqJ}YJ6~YCHVxu;3Bfr8`Fy^oVBqLu=oJjP=2&4)cn?$>?=$ot> > WvS0=+x)9A_Kma>NIMN(B1ONa82$stL > > literal 0 > HcmV?d00001 > > diff --git a/server/ovirtserver/templates/__init__.py b/server/ovirtserver/templates/__init__.py > new file mode 100644 > index 0000000..14d408b > --- /dev/null > +++ b/server/ovirtserver/templates/__init__.py > @@ -0,0 +1,18 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""Templates package for the application.""" > diff --git a/server/ovirtserver/templates/error.html b/server/ovirtserver/templates/error.html > new file mode 100644 > index 0000000..001f8f4 > --- /dev/null > +++ b/server/ovirtserver/templates/error.html > @@ -0,0 +1,19 @@ > +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" > + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> > +<html xmlns="http://www.w3.org/1999/xhtml" > + xmlns:py="http://genshi.edgewall.org/" > + xmlns:xi="http://www.w3.org/2001/XInclude"> > + > +<xi:include href="master.html" /> > + > +<head> > +<meta content="text/html; charset=UTF-8" http-equiv="content-type" py:replace="''"/> > +<title>A ${code} Error has Occurred</title> > +</head> > + > +<body> > +<h1>Error ${code}</h1> > + > +<div>${XML(message)}</div> > +</body> > +</html> > diff --git a/server/ovirtserver/templates/index.html b/server/ovirtserver/templates/index.html > new file mode 100644 > index 0000000..1c2496b > --- /dev/null > +++ b/server/ovirtserver/templates/index.html > @@ -0,0 +1,20 @@ > +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" > + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> > +<html xmlns="http://www.w3.org/1999/xhtml" > + xmlns:py="http://genshi.edgewall.org/" > + xmlns:xi="http://www.w3.org/2001/XInclude"> > + > +<head> > +<meta content="text/html; charset=UTF-8" http-equiv="content-type" py:replace="''"/> > +<title>Welcome to the oVirt management server</title> > +</head> > + > +<body> > +<h1>Welcome To The oVirt Server Reference Implementation</h1> > + > +<p> > + This server provides a reference implementation for how a management server should interact > + with the oVirt managed node. > +</p> > +</body> > +</html> > diff --git a/server/ovirtserver/tests/__init__.py b/server/ovirtserver/tests/__init__.py > new file mode 100644 > index 0000000..7c1a4a9 > --- /dev/null > +++ b/server/ovirtserver/tests/__init__.py > @@ -0,0 +1,80 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""Unit and functional test suite for server.""" > + > +from os import path > +import sys > + > +from tg import config > +from paste.deploy import loadapp > +from paste.script.appinstall import SetupCommand > +from routes import url_for > +from webtest import TestApp > +from nose.tools import eq_ > + > +from ovirtserver import model > + > +__all__ = ['setup_db', 'teardown_db', 'TestController', 'url_for'] > + > +def setup_db(): > + """Method used to build a database""" > + engine = config['pylons.app_globals'].sa_engine > + model.init_model(engine) > + model.metadata.create_all(engine) > + > +def teardown_db(): > + """Method used to destroy a database""" > + engine = config['pylons.app_globals'].sa_engine > + model.metadata.drop_all(engine) > + > + > +class TestController(object): > + """ > + Base functional test case for the controllers. > + > + The server application instance (``self.app``) set up in this test > + case (and descendants) has authentication disabled, so that developers can > + test the protected areas independently of the :mod:`repoze.who` plugins > + used initially. This way, authentication can be tested once and separately. > + > + Check ovirtserver.tests.functional.test_authentication for the repoze.who > + integration tests. > + > + This is the officially supported way to test protected areas with > + repoze.who-testutil (http://code.gustavonarea.net/repoze.who-testutil/). > + > + """ > + > + application_under_test = 'main_without_authn' > + > + def setUp(self): > + """Method called by nose before running each test""" > + # Loading the application: > + conf_dir = config.here > + wsgiapp = loadapp('config:test.ini#%s' % self.application_under_test, > + relative_to=conf_dir) > + self.app = TestApp(wsgiapp) > + # Setting it up: > + test_file = path.join(conf_dir, 'test.ini') > + cmd = SetupCommand('setup-app') > + cmd.run([test_file]) > + > + def tearDown(self): > + """Method called by nose after running each test""" > + # Cleaning up the database: > + teardown_db() > diff --git a/server/ovirtserver/tests/functional/__init__.py b/server/ovirtserver/tests/functional/__init__.py > new file mode 100644 > index 0000000..be0e5fb > --- /dev/null > +++ b/server/ovirtserver/tests/functional/__init__.py > @@ -0,0 +1,18 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""Functional test suite for the controllers of the application.""" > diff --git a/server/ovirtserver/tests/functional/test_authentication.py b/server/ovirtserver/tests/functional/test_authentication.py > new file mode 100644 > index 0000000..90ca87c > --- /dev/null > +++ b/server/ovirtserver/tests/functional/test_authentication.py > @@ -0,0 +1,16 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > diff --git a/server/ovirtserver/tests/functional/test_root.py b/server/ovirtserver/tests/functional/test_root.py > new file mode 100644 > index 0000000..5a7a55e > --- /dev/null > +++ b/server/ovirtserver/tests/functional/test_root.py > @@ -0,0 +1,48 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +""" > +Functional test suite for the root controller. > + > +This is an example of how functional tests can be written for controllers. > + > +As opposed to a unit-test, which test a small unit of functionality, > +functional tests exercise the whole application and its WSGI stack. > + > +Please read http://pythonpaste.org/webtest/ for more information. > + > +""" > +from nose.tools import assert_true > + > +from ovirtserver.tests import TestController > + > + > +class TestRootController(TestController): > + def test_index(self): > + response = self.app.get('/') > + msg = 'TurboGears 2 is rapid web application development toolkit '\ > + 'designed to make your life easier.' > + # You can look for specific strings: > + assert_true(msg in response) > + > + # You can also access a BeautifulSoup'ed response in your tests > + # (First run $ easy_install BeautifulSoup > + # and then uncomment the next two lines) > + > + #links = response.html.findAll('a') > + #print links > + #assert_true(links, "Mummy, there are no links here!") > diff --git a/server/ovirtserver/tests/models/__init__.py b/server/ovirtserver/tests/models/__init__.py > new file mode 100644 > index 0000000..354b222 > --- /dev/null > +++ b/server/ovirtserver/tests/models/__init__.py > @@ -0,0 +1,68 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""Unit test suite for the models of the application.""" > +from nose.tools import assert_equals > + > +from ovirtserver.model import DBSession > +from ovirtserver.tests import setup_db, teardown_db > + > +__all__ = ['ModelTest'] > + > +#Create an empty database before we start our tests for this module > +def setup(): > + """Function called by nose on module load""" > + setup_db() > + > +#Teardown that database > +def teardown(): > + """Function called by nose after all tests in this module ran""" > + teardown_db() > + > +class ModelTest(object): > + """Base unit test case for the models.""" > + > + klass = None > + attrs = {} > + > + def setup(self): > + try: > + new_attrs = {} > + new_attrs.update(self.attrs) > + new_attrs.update(self.do_get_dependencies()) > + self.obj = self.klass(**new_attrs) > + DBSession.add(self.obj) > + DBSession.flush() > + return self.obj > + except: > + DBSession.rollback() > + raise > + > + def tearDown(self): > + DBSession.rollback() > + > + def do_get_dependencies(self): > + """Use this method to pull in other objects that need to be created for this object to be build properly""" > + return {} > + > + def test_create_obj(self): > + pass > + > + def test_query_obj(self): > + obj = DBSession.query(self.klass).one() > + for key, value in self.attrs.iteritems(): > + assert_equals(getattr(obj, key), value) > diff --git a/server/ovirtserver/tests/models/test_auth.py b/server/ovirtserver/tests/models/test_auth.py > new file mode 100644 > index 0000000..eb0fce0 > --- /dev/null > +++ b/server/ovirtserver/tests/models/test_auth.py > @@ -0,0 +1,22 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""Test suite for the TG app's models""" > +from nose.tools import eq_ > + > +from ovirtserver import model > +from ovirtserver.tests.models import ModelTest > diff --git a/server/ovirtserver/websetup.py b/server/ovirtserver/websetup.py > new file mode 100644 > index 0000000..36e3d8c > --- /dev/null > +++ b/server/ovirtserver/websetup.py > @@ -0,0 +1,42 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +"""Setup the server application""" > + > +import logging > + > +import transaction > +from tg import config > + > +from ovirtserver.config.environment import load_environment > + > +__all__ = ['setup_app'] > + > +log = logging.getLogger(__name__) > + > + > +def setup_app(command, conf, vars): > + """Place any commands to setup ovirtserver here""" > + load_environment(conf.global_conf, conf.local_conf) > + # Load the models > + from ovirtserver import model > + print "Creating tables" > + model.metadata.create_all(bind=config['pylons.app_globals'].sa_engine) > + > + > + transaction.commit() > + print "Successfully setup" > diff --git a/server/server.egg-info/PKG-INFO b/server/server.egg-info/PKG-INFO > new file mode 100644 > index 0000000..2ad8b9b > --- /dev/null > +++ b/server/server.egg-info/PKG-INFO > @@ -0,0 +1,10 @@ > +Metadata-Version: 1.0 > +Name: server > +Version: 0.1dev > +Summary: UNKNOWN > +Home-page: UNKNOWN > +Author: UNKNOWN > +Author-email: UNKNOWN > +License: UNKNOWN > +Description: UNKNOWN > +Platform: UNKNOWN > diff --git a/server/server.egg-info/SOURCES.txt b/server/server.egg-info/SOURCES.txt > new file mode 100644 > index 0000000..4632e06 > --- /dev/null > +++ b/server/server.egg-info/SOURCES.txt > @@ -0,0 +1,68 @@ > +MANIFEST.in > +README.txt > +setup.cfg > +setup.py > +ovirtserver/__init__.py > +ovirtserver/websetup.py > +ovirtserver/config/__init__.py > +ovirtserver/config/app_cfg.py > +ovirtserver/config/environment.py > +ovirtserver/config/middleware.py > +ovirtserver/controllers/__init__.py > +ovirtserver/controllers/error.py > +ovirtserver/controllers/root.py > +ovirtserver/controllers/secure.py > +ovirtserver/controllers/template.py > +ovirtserver/i18n/ru/LC_MESSAGES/ovirtserver.po > +ovirtserver/lib/__init__.py > +ovirtserver/lib/app_globals.py > +ovirtserver/lib/base.py > +ovirtserver/lib/helpers.py > +ovirtserver/model/__init__.py > +ovirtserver/model/auth.py > +ovirtserver/public/favicon.ico > +ovirtserver/public/css/style.css > +ovirtserver/public/images/contentbg.png > +ovirtserver/public/images/error.png > +ovirtserver/public/images/header_inner2.png > +ovirtserver/public/images/headerbg.png > +ovirtserver/public/images/info.png > +ovirtserver/public/images/inputbg.png > +ovirtserver/public/images/loginbg.png > +ovirtserver/public/images/loginbottombg.png > +ovirtserver/public/images/loginheader-left.png > +ovirtserver/public/images/loginheader-right.png > +ovirtserver/public/images/menu-item-actibg-first.png > +ovirtserver/public/images/menu-item-actibg.png > +ovirtserver/public/images/menu-item-border.png > +ovirtserver/public/images/menubg.png > +ovirtserver/public/images/ok.png > +ovirtserver/public/images/pagebg.png > +ovirtserver/public/images/star.png > +ovirtserver/public/images/strype2.png > +ovirtserver/public/images/under_the_hood_blue.png > +ovirtserver/public/images/warning.png > +ovirtserver/templates/__init__.py > +ovirtserver/templates/about.html > +ovirtserver/templates/authentication.html > +ovirtserver/templates/debug.html > +ovirtserver/templates/error.html > +ovirtserver/templates/footer.html > +ovirtserver/templates/header.html > +ovirtserver/templates/index.html > +ovirtserver/templates/login.html > +ovirtserver/templates/master.html > +ovirtserver/templates/sidebars.html > +ovirtserver/tests/__init__.py > +ovirtserver/tests/functional/__init__.py > +ovirtserver/tests/functional/test_authentication.py > +ovirtserver/tests/functional/test_root.py > +ovirtserver/tests/models/__init__.py > +ovirtserver/tests/models/test_auth.py > +server.egg-info/PKG-INFO > +server.egg-info/SOURCES.txt > +server.egg-info/dependency_links.txt > +server.egg-info/entry_points.txt > +server.egg-info/paster_plugins.txt > +server.egg-info/requires.txt > +server.egg-info/top_level.txt > \ No newline at end of file > diff --git a/server/server.egg-info/dependency_links.txt b/server/server.egg-info/dependency_links.txt > new file mode 100644 > index 0000000..8b13789 > --- /dev/null > +++ b/server/server.egg-info/dependency_links.txt > @@ -0,0 +1 @@ > + > diff --git a/server/server.egg-info/entry_points.txt b/server/server.egg-info/entry_points.txt > new file mode 100644 > index 0000000..da62946 > --- /dev/null > +++ b/server/server.egg-info/entry_points.txt > @@ -0,0 +1,7 @@ > + > + [paste.app_factory] > + main = ovirtserver.config.middleware:make_app > + > + [paste.app_install] > + main = pylons.util:PylonsInstaller > + > \ No newline at end of file > diff --git a/server/server.egg-info/paster_plugins.txt b/server/server.egg-info/paster_plugins.txt > new file mode 100644 > index 0000000..ab508e5 > --- /dev/null > +++ b/server/server.egg-info/paster_plugins.txt > @@ -0,0 +1,4 @@ > +PasteScript > +Pylons > +TurboGears2 > +tg.devtools > diff --git a/server/server.egg-info/requires.txt b/server/server.egg-info/requires.txt > new file mode 100644 > index 0000000..661a57b > --- /dev/null > +++ b/server/server.egg-info/requires.txt > @@ -0,0 +1,6 @@ > +TurboGears2>= 2.0b7 > +Catwalk>= 2.0.2 > +Babel>=0.9.4 > +toscawidgets>= 0.9.7.1 > +zope.sqlalchemy>= 0.4 > +repoze.tm2>= 1.0a4 > \ No newline at end of file > diff --git a/server/server.egg-info/top_level.txt b/server/server.egg-info/top_level.txt > new file mode 100644 > index 0000000..4e4dbeb > --- /dev/null > +++ b/server/server.egg-info/top_level.txt > @@ -0,0 +1 @@ > +ovirtserver > diff --git a/server/setup.cfg b/server/setup.cfg > new file mode 100644 > index 0000000..cb01cf9 > --- /dev/null > +++ b/server/setup.cfg > @@ -0,0 +1,32 @@ > +[egg_info] > +tag_build = dev > +tag_svn_revision = true > + > +[easy_install] > +find_links = http://www.pylonshq.com/download/ > + > +[nosetests] > +with-pylons=test.ini > + > +# Babel configuration > +[compile_catalog] > +domain = ovirtserver > +directory = ovirtserver/i18n > +statistics = true > + > +[extract_messages] > +add_comments = TRANSLATORS: > +output_file = ovirtserver/i18n/ovirtserver.pot > +width = 80 > +keywords = l_ > + > +[init_catalog] > +domain = ovirtserver > +input_file = ovirtserver/i18n/ovirtserver.pot > +output_dir = ovirtserver/i18n > + > +[update_catalog] > +domain = ovirtserver > +input_file = ovirtserver/i18n/ovirtserver.pot > +output_dir = ovirtserver/i18n > +previous = true > diff --git a/server/setup.py b/server/setup.py > new file mode 100644 > index 0000000..bf646ad > --- /dev/null > +++ b/server/setup.py > @@ -0,0 +1,63 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +try: > + from setuptools import setup, find_packages > +except ImportError: > + from ez_setup import use_setuptools > + use_setuptools() > + from setuptools import setup, find_packages > + > +setup( > + name='server', > + version='0.1', > + description='', > + author='', > + author_email='', > + #url='', > + install_requires=[ > + "TurboGears2>= 2.0b7", > + "Catwalk>= 2.0.2", > + "Babel>=0.9.4", > + #can be removed iif use_toscawidgets = False > + "toscawidgets>= 0.9.7.1", > + "zope.sqlalchemy>= 0.4 ", > + "repoze.tm2>= 1.0a4", > + ], > + setup_requires=["PasteScript>= 1.7"], > + paster_plugins=['PasteScript', 'Pylons', 'TurboGears2', 'tg.devtools'], > + packages=find_packages(exclude=['ez_setup']), > + include_package_data=True, > + test_suite='nose.collector', > + tests_require=['WebTest', 'BeautifulSoup'], > + package_data={'ovirtserver': ['i18n/*/LC_MESSAGES/*.mo', > + 'templates/*/*', > + 'public/*/*']}, > + message_extractors={'ovirtserver': [ > + ('**.py', 'python', None), > + ('templates/**.mako', 'mako', None), > + ('templates/**.html', 'genshi', None), > + ('public/**', 'ignore', None)]}, > + > + entry_points=""" > + [paste.app_factory] > + main = ovirtserver.config.middleware:make_app > + > + [paste.app_install] > + main = pylons.util:PylonsInstaller > + """, > +) > diff --git a/server/test.ini b/server/test.ini > new file mode 100644 > index 0000000..415fcb0 > --- /dev/null > +++ b/server/test.ini > @@ -0,0 +1,42 @@ > +# Copyright (C) 2010, Red Hat, Inc. > +# Written by Darryl L. Pierce > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License > +# as published by the Free Software Foundation; either version 2 > +# of the License, or (at your option) any later version. > +# > +# This program is distributed in the hope that it will be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. > + > +# > +# server - TurboGears 2 testing environment configuration > +# > +# The %(here)s variable will be replaced with the parent directory of this file > +# > +[DEFAULT] > +debug = true > +# Uncomment and replace with the address which should receive any error reports > +# email_to = you at yourdomain.com > +smtp_server = localhost > +error_email_from = paste at localhost > + > +[server:main] > +use = egg:Paste#http > +host = 0.0.0.0 > +port = 5000 > + > +[app:main] > +use = config:development.ini > + > +[app:main_without_authn] > +use = main > +skip_authentication = True > + > +# Add additional test specific configuration options as necessary. > > > > _______________________________________________ > Ovirt-devel mailing list > Ovirt-devel at redhat.com > https://www.redhat.com/mailman/listinfo/ovirt-devel