[Kimchi-devel] [PATCH 1/3] Reorganize the kimchi's paths gereneration code

Mark Wu wudxw at linux.vnet.ibm.com
Fri Jan 24 06:35:31 UTC 2014


On 01/24/2014 09:37 AM, Aline Manera wrote:
> On 01/22/2014 03:48 AM, Mark Wu wrote:
>> This patch reorganizes kimchi's paths generation code to make the user
>> of path vars can work with both kimchi root app and plugin app.
>>
>> Signed-off-by: Mark Wu <wudxw at linux.vnet.ibm.com>
>> ---
>>   src/kimchi/cachebust.py |   4 +-
>>   src/kimchi/config.py.in | 164 
>> ++++++++++++++++++++----------------------------
>>   src/kimchi/root.py      |   6 +-
>>   src/kimchi/server.py    |  10 +--
>>   src/kimchi/template.py  |  14 +++--
>>   src/kimchi/utils.py     |   6 +-
>>   src/kimchid.in          |   7 ++-
>>   tests/test_plugin.py    |   4 +-
>>   8 files changed, 100 insertions(+), 115 deletions(-)
>>
>> diff --git a/src/kimchi/cachebust.py b/src/kimchi/cachebust.py
>> index 9a71f4f..7844695 100644
>> --- a/src/kimchi/cachebust.py
>> +++ b/src/kimchi/cachebust.py
>> @@ -23,11 +23,11 @@
>>   import os
>>
>>
>> -from kimchi.config import get_prefix
>> +from kimchi.config import paths
>>
>>
>>   def href(url):
>>       # for error.html, url is absolute path
>> -    f = os.path.join(get_prefix(), 'ui', url.lstrip("/"))
>> +    f = os.path.join(paths.ui_dir, url.lstrip("/"))
>>       mtime = os.path.getmtime(f)
>>       return "%s?cacheBust=%s" % (url, mtime)
>> diff --git a/src/kimchi/config.py.in b/src/kimchi/config.py.in
>> index 22fe614..53c8e42 100644
>> --- a/src/kimchi/config.py.in
>> +++ b/src/kimchi/config.py.in
>> @@ -28,7 +28,6 @@ import platform
>>
>>
>>   from ConfigParser import SafeConfigParser
>> -from glob import iglob
>>
>>
>>   from kimchi.xmlutils import xpath_get_text
>> @@ -37,86 +36,24 @@ from kimchi.xmlutils import xpath_get_text
>>   DEFAULT_LOG_LEVEL = "debug"
>>
>>
>> -def get_prefix():
>> -    if __file__[0] == '/':
>> -        base = os.path.dirname(__file__)
>> -    else:
>> -        base = os.path.dirname('./%s' % __file__)
>> -
>> -    if os.access('%s/../../src/kimchi/config.py' % base, os.F_OK):
>> -        return '%s/../..' % base
>> -    else:
>> -        return '@pkgdatadir@'
>> -
>> -
>> -def without_installation():
>> -    return get_prefix() != '@pkgdatadir@'
>> -
>> -
>> -def get_config_dir():
>> -    prefix = get_prefix()
>> -
>> -    if prefix == '@pkgdatadir@':
>> -        return '@sysconfdir@/kimchi'
>> -    else:
>> -        return os.path.join(prefix, 'src')
>> -
>> -
>> -def _get_kimchi_src_dir():
>> -    prefix = get_prefix()
>> -    return ('@kimchidir@' if prefix == '@pkgdatadir@'
>> -            else os.path.join(prefix, 'src/kimchi'))
>> -
>> -
>> -def get_api_schema_file():
>> -    return os.path.join(_get_kimchi_src_dir(), 'API.json')
>> -
>> -
>> -def get_default_log_dir():
>> -    prefix = get_prefix()
>> -
>> -    if prefix == '@pkgdatadir@':
>> -        return "@localstatedir@/log/kimchi"
>> -
>> -    return os.path.join(prefix, 'log')
>> -
>> -
>> -def get_state_path():
>> -    prefix = get_prefix()
>> -
>> -    if prefix == '@pkgdatadir@':
>> -        return "@localstatedir@/lib/kimchi"
>> -
>> -    return os.path.join(prefix, 'data')
>> -
>> -
>>   def get_session_path():
>> -    return os.path.join(get_state_path(), 'sessions')
>> +    return os.path.join(paths.state_dir, 'sessions')
>>
>>
>>   def get_object_store():
>> -    return os.path.join(get_prefix(), 'data', 'objectstore')
>> +    return os.path.join(paths.state_dir, 'objectstore')
>>
>>
>>   def get_distros_store():
>> -    return os.path.join(get_config_dir(), 'distros.d')
>> -
>> -
>> -def get_template_path(resource):
>> -    return '%s/ui/pages/%s.tmpl' % (get_prefix(), resource)
>> +    return os.path.join(paths.conf_dir, 'distros.d')
>>
>>
>>   def get_screenshot_path():
>> -    return "%s/data/screenshots" % get_prefix()
>> -
>> +    return os.path.join(paths.state_dir, 'screenshots')
>>
>> -def get_mo_path():
>> -    return '%s/mo' % get_prefix()
>>
>> -
>> -def get_support_language():
>> -    mopath = "%s/*" % get_mo_path()
>> -    return [path.rsplit('/', 1)[1] for path in iglob(mopath)]
>> +def get_debugreports_path():
>> +    return os.path.join(paths.state_dir, 'debugreports')
>>
>>
>>   def find_qemu_binary():
>> @@ -137,37 +74,74 @@ def find_qemu_binary():
>>       return location
>>
>>
>> -def get_debugreports_path():
>> -    return os.path.join(get_prefix(), 'data', 'debugreports')
>> +class Paths(object):
>> +
>> +    def __init__(self):
>> +        self.prefix = self.get_prefix()
>> +        self.installed = (self.prefix == '@pkgdatadir@')
>> +
>> +        if self.installed:
>> +            self.state_dir = '@localstatedir@/lib/kimchi'
>> +            self.log_dir = '@localstatedir@/log/kimchi'
>> +            self.conf_dir = '@sysconfdir@/kimchi'
>> +            self.src_dir = '@kimchidir@'
>> +            self.plugins_dir = '@kimchidir@'
>> +        else:
>> +            self.state_dir = self.add_prefix('data')
>> +            self.log_dir = self.add_prefix('log')
>> +            self.conf_dir = self.add_prefix('src')
>> +            self.src_dir = self.add_prefix('src/kimchi')
>> +            self.plugins_dir = self.add_prefix('plugins')
>> +
>> +        self.ui_dir = self.add_prefix('ui')
>> +        self.mo_dir = self.add_prefix('mo')
>> +
>> +    def get_prefix(self):
>> +        if __file__[0] == '/':
>> +            base = os.path.dirname(__file__)
>> +        else:
>> +            base = os.path.dirname('./%s' % __file__)
>> +
>> +        if os.access('%s/../../src/kimchi/config.py' % base, os.F_OK):
>> +            return os.path.abspath('%s/../..' % base)
>> +        else:
>> +            return '@pkgdatadir@'
>> +
>> +    def add_prefix(self, subdir):
>> +        return os.path.join(self.prefix, subdir)
>> +
>> +    def get_template_path(self, resource):
>> +        return os.path.join(self.ui_dir, 'pages/%s.tmpl' % resource)
>> +
>> +
>
>> +paths = Paths()
>> +
>
> Move it to the constants section
We have to put it after the definition of class Paths.  If you insist on 
it,  we will have to move the class Path to a new module. But it's still 
not clean to have paths related definition in two files.
>
>>
>> +class PluginPaths(Paths):
>>
>> -def get_plugins_dir():
>> -    prefix = get_prefix()
>> -    if prefix == '@pkgdatadir@':
>> -        prefix = '@kimchidir@'
>> -    return os.path.join(prefix, 'plugins')
>> +    def __init__(self, name):
>> +        super(PluginPaths, self).__init__()
>> +        self.plugin_dir = os.path.join('plugins', name)
>>
>> +        if self.installed:
>> +            self.conf_dir = '@sysconfdir@/kimchi/plugins.d'
>> +            self.src_dir = os.path.join('@kimchidir@', self.plugin_dir)
>> +        else:
>> +            self.conf_dir = self.add_prefix(self.plugin_dir)
>> +            self.src_dir = self.add_prefix(self.plugin_dir)
>>
>> -def get_plugin_config(name):
>> -    prefix = get_prefix()
>> -    if prefix == '@pkgdatadir@':
>> -        base_dir = '@sysconfdir@/kimchi/plugins.d/'
>> -    else:
>> -        base_dir = os.path.join(prefix, 'plugins')
>> -    return os.path.join(base_dir, '%s/%s.conf' % (name, name))
>> +        self.ui_dir = self.add_prefix(os.path.join(self.plugin_dir, 
>> 'ui'))
>> +        self.mo_dir = self.add_prefix(os.path.join(self.plugin_dir, 
>> 'mo'))
>> +        self.conf_file = os.path.join(self.conf_dir, '%s.conf' % name)
>>
>>
>> -def _get_plugin_ui_dir(name):
>> -    prefix = get_prefix()
>> -    if prefix == '@pkgdatadir@':
>> -        base_dir = '@pkgdatadir@/plugins/'
>> -    else:
>> -        base_dir = os.path.join(prefix, 'plugins')
>> -    return os.path.join(base_dir, '%s/ui' % name)
>
>> +_plugin_paths = {}
>
> Why is it needed?
It was kind of cache to avoid



instantiation many times. but it just have a few, so remove it in v2.

>
>>
>>
>> -def get_plugin_tab_xml(name):
>> -    return os.path.join(_get_plugin_ui_dir(name), 'config/tab-ext.xml')
>> +def plugin_paths(plugin_name):
>> +    if plugin_name not in _plugin_paths:
>> +        _plugin_paths[plugin_name] = PluginPaths(plugin_name)
>> +    return _plugin_paths[plugin_name]
>>
>>
>>   def _get_config():
>> @@ -180,12 +154,12 @@ def _get_config():
>>       config.set("server", "ssl_key", "")
>>       config.set("server", "environment", "development")
>>       config.add_section("logging")
>> -    config.set("logging", "log_dir", get_default_log_dir())
>> +    config.set("logging", "log_dir", paths.log_dir)
>>       config.set("logging", "log_level", DEFAULT_LOG_LEVEL)
>>       config.add_section("display")
>>       config.set("display", "display_proxy_port", "64667")
>>
>> -    config_file = os.path.join(get_config_dir(), 'kimchi.conf')
>> +    config_file = os.path.join(paths.conf_dir, 'kimchi.conf')
>>       if os.path.exists(config_file):
>>           config.read(config_file)
>>       return config
>> @@ -195,4 +169,4 @@ config = _get_config()
>>
>>
>>   if __name__ == '__main__':
>> -    print get_prefix()
>> +    print paths.prefix
>> diff --git a/src/kimchi/root.py b/src/kimchi/root.py
>> index 3cc6321..ae9fd0e 100644
>> --- a/src/kimchi/root.py
>> +++ b/src/kimchi/root.py
>> @@ -23,11 +23,12 @@
>>
>>   import cherrypy
>>   import json
>> +import os
>>
>>
>>   from kimchi import auth
>>   from kimchi import template
>> -from kimchi.config import get_api_schema_file
>> +from kimchi.config import paths
>>   from kimchi.control.base import Resource
>>   from kimchi.control.config import Config
>>   from kimchi.control.debugreports import DebugReports
>> @@ -67,7 +68,8 @@ class Root(Resource):
>>           self.host = Host(model)
>>           self.debugreports = DebugReports(model)
>>           self.plugins = Plugins(model)
>> -        self.api_schema = json.load(open(get_api_schema_file()))
>> +        self.api_schema = json.load(open(os.path.join(paths.src_dir,
>> + 'API.json')))
>>
>>       def error_production_handler(self, status, message, traceback, 
>> version):
>>           data = {'code': status, 'reason': message}
>> diff --git a/src/kimchi/server.py b/src/kimchi/server.py
>> index b820263..58b082b 100644
>> --- a/src/kimchi/server.py
>> +++ b/src/kimchi/server.py
>> @@ -33,6 +33,7 @@ from kimchi import config
>>   from kimchi import model
>>   from kimchi import mockmodel
>>   from kimchi import vnc
>> +from kimchi.config import paths, plugin_paths
>>   from kimchi.root import Root
>>   from kimchi.utils import get_enabled_plugins, import_class
>>
>> @@ -63,8 +64,8 @@ class Server(object):
>>       CACHEEXPIRES = 31536000
>>       configObj = {
>>           '/': {'tools.trailing_slash.on': False,
>> -              'tools.staticdir.root': config.get_prefix(),
>> -              'tools.staticfile.root': config.get_prefix(),
>> +              'tools.staticdir.root': paths.prefix,
>> +              'tools.staticfile.root': paths.prefix,
>>                 'request.methods_with_bodies': ('POST', 'PUT'),
>>                 'tools.nocache.on': True,
>>                 'tools.sessions.on': True,
>> @@ -211,7 +212,8 @@ class Server(object):
>>                   plugin_config['/ui/config/tab-ext.xml'] = {
>>                       'tools.staticfile.on': True,
>>                       'tools.staticfile.filename':
>> -                    config.get_plugin_tab_xml(plugin_name),
>> + os.path.join(plugin_paths(plugin_name).ui_dir,
>> +                                 'config/tab-ext.xml'),
>>                       'tools.nocache.on': True}
>>               except KeyError:
>>                   continue
>> @@ -233,7 +235,7 @@ class Server(object):
>>           cert = options.ssl_cert
>>           key = options.ssl_key
>>           if not cert or not key:
>> -            config_dir = config.get_config_dir()
>> +            config_dir = paths.conf_dir
>>               cert = '%s/kimchi-cert.pem' % config_dir
>>               key = '%s/kimchi-key.pem' % config_dir
>>
>> diff --git a/src/kimchi/template.py b/src/kimchi/template.py
>> index 1f19c4a..1740997 100644
>> --- a/src/kimchi/template.py
>> +++ b/src/kimchi/template.py
>> @@ -28,9 +28,10 @@ import os
>>
>>
>>   from Cheetah.Template import Template
>> +from glob import iglob
>>
>>
>> -from kimchi import config
>> +from kimchi.config import paths
>>
>>
>>   def get_lang():
>> @@ -54,8 +55,13 @@ def get_lang():
>>       return langs
>>
>>
>> +def get_support_languages():
>> +    mopath = "%s/*" % paths.mo_dir
>> +    return [path.rsplit('/', 1)[1] for path in iglob(mopath)]
>> +
>> +
>>   def validate_language(langs):
>> -    supportLangs = config.get_support_language()
>> +    supportLangs = get_support_languages()
>>       for lang in langs:
>>           if lang in supportLangs:
>>               return lang
>> @@ -88,12 +94,12 @@ def render(resource, data):
>>                             separators=(',', ':'),
>>                             encoding='iso-8859-1')
>>       elif can_accept_html():
>> -        filename = config.get_template_path(resource)
>> +        filename = paths.get_template_path(resource)
>>           try:
>>               params = {'data': data}
>>               lang = validate_language(get_lang())
>>               gettext_conf = {'domain': 'kimchi',
>> -                            'localedir': config.get_mo_path(),
>> +                            'localedir': paths.mo_dir,
>>                               'lang': [lang]}
>>               params['lang'] = gettext_conf
>>               return Template(file=filename, 
>> searchList=params).respond()
>> diff --git a/src/kimchi/utils.py b/src/kimchi/utils.py
>> index 5d6e8ea..7077b3b 100644
>> --- a/src/kimchi/utils.py
>> +++ b/src/kimchi/utils.py
>> @@ -28,10 +28,10 @@ import urllib2
>>
>>
>>   from cherrypy.lib.reprconf import Parser
>> +from kimchi.config import paths, plugin_paths
>>   from kimchi.exception import TimeoutExpired
>>
>>
>> -from kimchi import config
>>   from threading import Timer
>>
>>
>> @@ -48,7 +48,7 @@ def is_digit(value):
>>
>>
>>   def _load_plugin_conf(name):
>> -    plugin_conf = config.get_plugin_config(name)
>> +    plugin_conf = plugin_paths(name).conf_file
>>       if not os.path.exists(plugin_conf):
>>           cherrypy.log.error_log.error("Plugin configuration file %s"
>>                                        " doesn't exist." % plugin_conf)
>> @@ -62,7 +62,7 @@ def _load_plugin_conf(name):
>>
>>
>>   def get_enabled_plugins():
>> -    plugin_dir = config.get_plugins_dir()
>> +    plugin_dir = paths.plugins_dir
>>       try:
>>           dir_contents = os.listdir(plugin_dir)
>>       except OSError:
>> diff --git a/src/kimchid.in b/src/kimchid.in
>> index 548fa52..eebc017 100644
>> --- a/src/kimchid.in
>> +++ b/src/kimchid.in
>> @@ -30,12 +30,13 @@ sys.path.insert(1, '@pythondir@')
>>
>>   import kimchi.server
>>   import kimchi.config
>> -if kimchi.config.without_installation():
>> -    sys.path.append(kimchi.config.get_prefix())
>>
>> -from kimchi.config import config
>> +from kimchi.config import config, paths
>>   from optparse import OptionParser
>>
>> +if not paths.installed:
>> +    sys.path.append(paths.prefix)
>> +
>>   ACCESS_LOG = "kimchi-access.log"
>>   ERROR_LOG = "kimchi-error.log"
>>
>> diff --git a/tests/test_plugin.py b/tests/test_plugin.py
>> index 42c87a9..e5c9053 100644
>> --- a/tests/test_plugin.py
>> +++ b/tests/test_plugin.py
>> @@ -32,7 +32,7 @@ from functools import partial
>>   import kimchi.mockmodel
>>   import kimchi.server
>>   import utils
>> -from kimchi import config
>> +from kimchi.config import paths
>>
>>
>>   test_server = None
>> @@ -48,7 +48,7 @@ def setUpModule():
>>       host = '127.0.0.1'
>>       port = utils.get_free_port('http')
>>       ssl_port = None
>> -    sys.path.append(config.get_prefix())
>> +    sys.path.append(paths.prefix)
>>       test_server = utils.run_server(host, port, ssl_port, 
>> test_mode=True,
>>                                      model=model)
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ovirt.org/pipermail/kimchi-devel/attachments/20140124/de6414a0/attachment.html>


More information about the Kimchi-devel mailing list