[Kimchi-devel] [PATCH v2][Wok 2/8] Changes server behavior to use pluginsmanager

Rodrigo Trujillo rodrigo.trujillo at linux.vnet.ibm.com
Wed Jun 8 21:06:43 UTC 2016



On 06/08/2016 03:56 PM, Aline Manera wrote:
>
>
> On 06/06/2016 04:13 PM, Rodrigo Trujillo wrote:
>> Signed-off-by: Rodrigo Trujillo <rodrigo.trujillo at linux.vnet.ibm.com>
>> ---
>>   src/wok/auth.py   | 15 ++++++++-------
>>   src/wok/root.py   |  8 ++++----
>>   src/wok/server.py | 57 
>> ++++++-------------------------------------------------
>>   src/wok/utils.py  | 52 
>> --------------------------------------------------
>>   4 files changed, 18 insertions(+), 114 deletions(-)
>>
>> diff --git a/src/wok/auth.py b/src/wok/auth.py
>> index 0355e86..f8be4b5 100644
>> --- a/src/wok/auth.py
>> +++ b/src/wok/auth.py
>> @@ -35,15 +35,15 @@ import urllib2
>>   from wok import template
>>   from wok.config import config
>>   from wok.exception import InvalidOperation, OperationFailed
>> -from wok.utils import get_all_tabs, run_command
>> +from wok.pluginsmanager import get_all_tabs
>> +from wok.utils import run_command
>> +
>>
>>   USER_NAME = 'username'
>>   USER_GROUPS = 'groups'
>>   USER_ROLES = 'roles'
>>   REFRESH = 'robot-refresh'
>
>
>> -tabs = get_all_tabs()
>> -
>
> Keep it there and update to point to the new function to avoid 
> multiple file processing for each server request.

This change was necessary because of cyclic imports in the code.
Backing to previous implementation will require to change other Wok 
classes initialization.

>
>>   def redirect_login():
>>       url = "/login.html"
>> @@ -85,7 +85,7 @@ class PAMUser(User):
>>           # after adding support to change user roles that info 
>> should be read
>>           # from a specific objstore and fallback to default only if 
>> any entry is
>>           # found
>
>> -        self.user[USER_ROLES] = dict.fromkeys(tabs, 'user')
>> +        self.user[USER_ROLES] = dict.fromkeys(get_all_tabs(), 'user')
>>
>>       def get_groups(self):
>>           out, err, rc = run_command(['id', '-Gn', 
>> self.user[USER_NAME]])
>> @@ -99,7 +99,7 @@ class PAMUser(User):
>>               # after adding support to change user roles that info 
>> should be
>>               # read from a specific objstore and fallback to default 
>> only if
>>               # any entry is found
>> -            self.user[USER_ROLES] = dict.fromkeys(tabs, 'admin')
>> +            self.user[USER_ROLES] = dict.fromkeys(get_all_tabs(), 
>> 'admin')
>>
>>           return self.user[USER_ROLES]
>>
>> @@ -195,7 +195,7 @@ class LDAPUser(User):
>>           self.user[USER_GROUPS] = list()
>>           # FIXME: user roles will be changed according roles 
>> assignment after
>>           # objstore is integrated
>> -        self.user[USER_ROLES] = dict.fromkeys(tabs, 'user')
>> +        self.user[USER_ROLES] = dict.fromkeys(get_all_tabs(), 'user')
>>
>>       @staticmethod
>>       def authenticate(username, password):
>> @@ -236,7 +236,8 @@ class LDAPUser(User):
>>               "authentication", "ldap_admin_id").strip('"').split(',')
>>           for admin_id in admin_ids:
>>               if self.user[USER_NAME] == admin_id.strip():
>> -                self.user[USER_ROLES] = dict.fromkeys(tabs, 'admin')
>> +                self.user[USER_ROLES] = dict.fromkeys(get_all_tabs(),
>> +
>
> That way, on each server request the tab file will be parsed. Move it 
> a global variable as it was before.

Just made a test adding a print in the function and I do not see 
multiples requests to it. I only see during logging to application.


>
>> 'admin')
>>           return self.user[USER_ROLES]
>>
>>       def get_user(self):
>> diff --git a/src/wok/root.py b/src/wok/root.py
>> index 29ea657..cb8b376 100644
>> --- a/src/wok/root.py
>> +++ b/src/wok/root.py
>> @@ -123,10 +123,10 @@ class Root(Resource):
>>
>>           data['scripts'] = []
>>           for plugin, app in cherrypy.tree.apps.iteritems():
>> -                if app.root.extends is not None:
>> -                    scripts = app.root.extends.get(script_name, {})
>> -                    if page in scripts.keys():
>> -                        data['scripts'].append(scripts[page])
>> +            if app.root.extends is not None:
>> +                scripts = app.root.extends.get(script_name, {})
>> +                if page in scripts.keys():
>> +                    data['scripts'].append(scripts[page])
>>
>>           if page.endswith('.html'):
>>               context = template.render('/tabs/' + page, data)
>> diff --git a/src/wok/server.py b/src/wok/server.py
>> index 902d4bf..3cb257f 100644
>> --- a/src/wok/server.py
>> +++ b/src/wok/server.py
>> @@ -30,14 +30,14 @@ from string import Template
>>   from wok import auth
>>   from wok import config
>>   from wok.config import config as configParser
>> -from wok.config import paths, PluginConfig, WokConfig
>> +from wok.config import paths, WokConfig
>>   from wok.control import sub_nodes
>>   from wok.model import model
>> +from wok.pluginsmanager import Plugins
>>   from wok.proxy import start_proxy, terminate_proxy
>>   from wok.reqlogger import RequestLogger
>>   from wok.root import WokRoot
>>   from wok.safewatchedfilehandler import SafeWatchedFileHandler
>> -from wok.utils import get_enabled_plugins, import_class
>>
>>
>>   LOGGING_LEVEL = {"debug": logging.DEBUG,
>> @@ -171,61 +171,16 @@ class Server(object):
>>
>>           self.app = cherrypy.tree.mount(WokRoot(model_instance, 
>> dev_env),
>>                                          config=self.configObj)
>> -        self._load_plugins(options)
>> +
>> +        # Initiate and handles plugins
>> +        plugins = Plugins(options)
>> +        plugins.load_plugins()
>>
>>           # Terminate proxy when cherrypy server is terminated
>>           cherrypy.engine.subscribe('exit', terminate_proxy)
>>
>>           cherrypy.lib.sessions.init()
>>
>> -    def _load_plugins(self, options):
>> -        for plugin_name, plugin_config in get_enabled_plugins():
>> -            try:
>> -                plugin_class = ('plugins.%s.%s' %
>> -                                (plugin_name,
>> -                                 plugin_name[0].upper() + 
>> plugin_name[1:]))
>> -                script_name = plugin_config['wok']['uri']
>> -                del plugin_config['wok']
>> -
>> -                plugin_config.update(PluginConfig(plugin_name))
>> -            except KeyError:
>> -                continue
>> -
>> -            try:
>> -                plugin_app = import_class(plugin_class)(options)
>> -            except ImportError, e:
>> -                cherrypy.log.error_log.error(
>> -                    "Failed to import plugin %s, "
>> -                    "error: %s" % (plugin_class, e.message)
>> -                )
>> -                continue
>> -
>> -            # dynamically extend plugin config with custom data, if 
>> provided
>> -            get_custom_conf = getattr(plugin_app, "get_custom_conf", 
>> None)
>> -            if get_custom_conf is not None:
>> -                plugin_config.update(get_custom_conf())
>> -
>> -            # dynamically add tools.wokauth.on = True to extra 
>> plugin APIs
>> -            try:
>> -                sub_nodes = 
>> import_class('plugins.%s.control.sub_nodes' %
>> -                                         plugin_name)
>> -
>> -                urlSubNodes = {}
>> -                for ident, node in sub_nodes.items():
>> -                    if node.url_auth:
>> -                        ident = "/%s" % ident
>> -                        urlSubNodes[ident] = {'tools.wokauth.on': True}
>> -
>> -                    plugin_config.update(urlSubNodes)
>> -
>> -            except ImportError, e:
>> -                cherrypy.log.error_log.error(
>> -                    "Failed to import subnodes for plugin %s, "
>> -                    "error: %s" % (plugin_class, e.message)
>> -                )
>> -
>> -            cherrypy.tree.mount(plugin_app, script_name, plugin_config)
>> -
>>       def start(self):
>>           # Subscribe to SignalHandler plugin
>>           if hasattr(cherrypy.engine, 'signal_handler'):
>> diff --git a/src/wok/utils.py b/src/wok/utils.py
>> index 4b3b0ac..10f2850 100644
>> --- a/src/wok/utils.py
>> +++ b/src/wok/utils.py
>> @@ -32,16 +32,13 @@ import sqlite3
>>   import subprocess
>>   import sys
>>   import traceback
>> -import xml.etree.ElementTree as ET
>>   import locale
>>
>> -from cherrypy.lib.reprconf import Parser
>>   from datetime import datetime, timedelta
>>   from multiprocessing import Process, Queue
>>   from threading import Timer
>>
>>   from wok.asynctask import AsyncTask
>> -from wok.config import paths, PluginPaths
>>   from wok.exception import InvalidParameter, TimeoutExpired
>>
>>
>> @@ -76,55 +73,6 @@ def is_digit(value):
>>           return False
>>
>>
>> -def _load_plugin_conf(name):
>> -    plugin_conf = PluginPaths(name).conf_file
>> -    if not os.path.exists(plugin_conf):
>> -        cherrypy.log.error_log.error("Plugin configuration file %s"
>> -                                     " doesn't exist." % plugin_conf)
>> -        return
>> -    try:
>> -        return Parser().dict_from_file(plugin_conf)
>> -    except ValueError as e:
>> -        cherrypy.log.error_log.error("Failed to load plugin "
>> -                                     "conf from %s: %s" %
>> -                                     (plugin_conf, e.message))
>> -
>> -
>> -def get_enabled_plugins():
>> -    plugin_dir = paths.plugins_dir
>> -    try:
>> -        dir_contents = os.listdir(plugin_dir)
>> -    except OSError:
>> -        return
>> -    for name in dir_contents:
>> -        if os.path.isdir(os.path.join(plugin_dir, name)):
>> -            plugin_config = _load_plugin_conf(name)
>> -            try:
>> -                if plugin_config['wok']['enable']:
>> -                    yield (name, plugin_config)
>> -            except (TypeError, KeyError):
>> -                continue
>> -
>> -
>> -def get_all_tabs():
>> -    files = []
>> -
>> -    for plugin, _ in get_enabled_plugins():
>> -        files.append(os.path.join(PluginPaths(plugin).ui_dir,
>> -                     'config/tab-ext.xml'))
>> -
>> -    tabs = []
>> -    for f in files:
>> -        try:
>> -            root = ET.parse(f)
>> -        except (IOError):
>> -            wok_log.debug("Unable to load %s", f)
>> -            continue
>> -        tabs.extend([t.text.lower() for t in 
>> root.getiterator('title')])
>> -
>> -    return tabs
>> -
>> -
>>   def get_plugin_from_request():
>>       """
>>       Returns name of plugin being requested. If no plugin, returns 
>> 'wok'.
>
> _______________________________________________
> Kimchi-devel mailing list
> Kimchi-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/kimchi-devel
>




More information about the Kimchi-devel mailing list