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

Aline Manera alinefm at linux.vnet.ibm.com
Wed Jun 8 18:56:40 UTC 2016



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.

>   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.

>                                                        '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'.




More information about the Kimchi-devel mailing list