Change provider plugins registration and enablement
authorSimo Sorce <simo@redhat.com>
Mon, 7 Apr 2014 20:49:06 +0000 (16:49 -0400)
committerSimo Sorce <simo@redhat.com>
Fri, 11 Apr 2014 21:25:54 +0000 (17:25 -0400)
When plugins are not enabled at startup the admin page is not available
as it is created only on enablement.

Split enablement and registration, so plugins can be registered even
when actually disabled.

Also rework the way enablement is tracked and make sure enablement status
is saved back to the database when it changes so it is kept on restarts.

Signed-off-by: Simo Sorce <simo@redhat.com>
ipsilon/admin/providers.py
ipsilon/providers/common.py
templates/admin/providers.html

index 1a2df7c..ba5e1e7 100755 (executable)
@@ -43,12 +43,17 @@ class ProviderPlugins(Page):
 
     def root_with_msg(self, message=None, message_type=None):
         plugins = self._site[FACILITY]
 
     def root_with_msg(self, message=None, message_type=None):
         plugins = self._site[FACILITY]
+        enabled_plugins = []
+        for item in plugins['available']:
+            plugin = plugins['available'][item]
+            if plugin.is_enabled:
+                enabled_plugins.append(item)
         return self._template('admin/providers.html', title=self.title,
                               baseurl=self.url,
                               message=message,
                               message_type=message_type,
                               available=plugins['available'],
         return self._template('admin/providers.html', title=self.title,
                               baseurl=self.url,
                               message=message,
                               message_type=message_type,
                               available=plugins['available'],
-                              enabled=plugins['enabled'],
+                              enabled=enabled_plugins,
                               menu=self._master.menu)
 
     def root(self, *args, **kwargs):
                               menu=self._master.menu)
 
     def root(self, *args, **kwargs):
@@ -61,7 +66,7 @@ class ProviderPlugins(Page):
             msg = "Unknown plugin %s" % plugin
             return self.root_with_msg(msg, "error")
         obj = plugins['available'][plugin]
             msg = "Unknown plugin %s" % plugin
             return self.root_with_msg(msg, "error")
         obj = plugins['available'][plugin]
-        if obj not in plugins['enabled']:
+        if not obj.is_enabled:
             obj.enable(self._site)
             msg = "Plugin %s enabled" % obj.name
         return self.root_with_msg(msg, "success")
             obj.enable(self._site)
             msg = "Plugin %s enabled" % obj.name
         return self.root_with_msg(msg, "success")
@@ -74,7 +79,7 @@ class ProviderPlugins(Page):
             msg = "Unknown plugin %s" % plugin
             return self.root_with_msg(msg, "error")
         obj = plugins['available'][plugin]
             msg = "Unknown plugin %s" % plugin
             return self.root_with_msg(msg, "error")
         obj = plugins['available'][plugin]
-        if obj in plugins['enabled']:
+        if obj.is_enabled:
             obj.disable(self._site)
             msg = "Plugin %s disabled" % obj.name
         return self.root_with_msg(msg, "success")
             obj.disable(self._site)
             msg = "Plugin %s disabled" % obj.name
         return self.root_with_msg(msg, "success")
index f9c1311..b1eab1a 100755 (executable)
@@ -43,6 +43,7 @@ class ProviderBase(PluginObject):
         super(ProviderBase, self).__init__()
         self.name = name
         self.path = path
         super(ProviderBase, self).__init__()
         self.name = name
         self.path = path
+        self.tree = None
         self.admin = None
 
     def _debug(self, fact):
         self.admin = None
 
     def _debug(self, fact):
@@ -52,32 +53,55 @@ class ProviderBase(PluginObject):
     def get_tree(self, site):
         raise NotImplementedError
 
     def get_tree(self, site):
         raise NotImplementedError
 
-    def enable(self, site):
-        plugins = site[FACILITY]
-        if self in plugins['enabled']:
+    def register(self, site):
+        if self.tree:
+            # already registered
             return
 
         # configure self
             return
 
         # configure self
+        plugins = site[FACILITY]
         if self.name in plugins['config']:
             self.set_config(plugins['config'][self.name])
 
         if self.name in plugins['config']:
             self.set_config(plugins['config'][self.name])
 
+        # init pages and admin interfaces
+        self.tree = self.get_tree(site)
+
+        self._debug('IdP Provider registered: %s' % self.name)
+
+        if self.get_config_value('enabled') == '1':
+            # and add self to the root
+            root = site[FACILITY]['root']
+            root.add_subtree(self.name, self.tree)
+            self._debug('IdP Provider enabled: %s' % self.name)
+
+    @property
+    def is_enabled(self):
+        if self.get_config_value('enabled') == '1':
+            return True
+        return False
+
+    def enable(self, site):
+        if self.is_enabled:
+            return
+
         # and add self to the root
         # and add self to the root
-        root = plugins['root']
-        root.add_subtree(self.name, self.get_tree(site))
+        root = site[FACILITY]['root']
+        root.add_subtree(self.name, self.tree)
 
 
-        plugins['enabled'].append(self)
+        self.set_config_value('enabled', '1')
+        self.save_plugin_config(FACILITY)
         self._debug('IdP Provider enabled: %s' % self.name)
 
     def disable(self, site):
         self._debug('IdP Provider enabled: %s' % self.name)
 
     def disable(self, site):
-        plugins = site[FACILITY]
-        if self not in plugins['enabled']:
+        if not self.is_enabled:
             return
 
         # remove self to the root
             return
 
         # remove self to the root
-        root = plugins['root']
+        root = site[FACILITY]['root']
         root.del_subtree(self.name)
 
         root.del_subtree(self.name)
 
-        plugins['enabled'].remove(self)
+        self.set_config_value('enabled', '0')
+        self.save_plugin_config(FACILITY)
         self._debug('IdP Provider disabled: %s' % self.name)
 
 
         self._debug('IdP Provider disabled: %s' % self.name)
 
 
@@ -123,11 +147,9 @@ class LoadProviders(object):
         self._debug('Available providers: %s' % str(available))
 
         providers['root'] = root
         self._debug('Available providers: %s' % str(available))
 
         providers['root'] = root
-        for item in providers['whitelist']:
-            self._debug('IdP Provider in whitelist: %s' % item)
-            if item not in providers['available']:
-                continue
-            providers['available'][item].enable(site)
+        for item in providers['available']:
+            plugin = providers['available'][item]
+            plugin.register(site)
 
     def _debug(self, fact):
         if cherrypy.config.get('debug', False):
 
     def _debug(self, fact):
         if cherrypy.config.get('debug', False):
index fbeb54d..66230d7 100644 (file)
@@ -7,7 +7,7 @@
         <div class="row">
         <div class="col-md-3 col-sm-3 col-xs-6">{{ p }}</div>
         <div class="col-md-3 col-sm-3 col-xs-6">
         <div class="row">
         <div class="col-md-3 col-sm-3 col-xs-6">{{ p }}</div>
         <div class="col-md-3 col-sm-3 col-xs-6">
-        {% if available[p] in enabled %}
+        {% if p in enabled %}
             <a class="btn btn-default" href="{{ baseurl }}/disable/{{ p }}">Disable</a>
             <a class="btn btn-default" href="{{ baseurl }}/{{ p }}">Configure</a>
             {% if available[p].admin %}
             <a class="btn btn-default" href="{{ baseurl }}/disable/{{ p }}">Disable</a>
             <a class="btn btn-default" href="{{ baseurl }}/{{ p }}">Configure</a>
             {% if available[p].admin %}