summaryrefslogtreecommitdiffstats
path: root/func
diff options
context:
space:
mode:
authorKrzysztof A. Adamski <krzysztofa@gmail.com>2008-08-02 19:41:40 -0400
committerKrzysztof A. Adamski <krzysztofa@gmail.com>2008-08-07 18:29:22 -0400
commitb2ea14876b07a9a2a64adbb0ddd824e15c674ffe (patch)
tree479d2ed287b92440d478c1e78abba377cf59a25c /func
parent4a17d134e0f5a3880a4ba0d930e2d37485c8b1a2 (diff)
downloadfunc-b2ea14876b07a9a2a64adbb0ddd824e15c674ffe.tar.gz
func-b2ea14876b07a9a2a64adbb0ddd824e15c674ffe.tar.xz
func-b2ea14876b07a9a2a64adbb0ddd824e15c674ffe.zip
Adding overlord modules support.
Diffstat (limited to 'func')
-rw-r--r--func/minion/modules/func_module.py6
-rwxr-xr-xfunc/module_loader.py19
-rwxr-xr-xfunc/overlord/client.py12
-rw-r--r--func/overlord/modules/__init__.py0
-rw-r--r--func/overlord/modules/test.py5
-rw-r--r--func/overlord/overlord_module.py2
6 files changed, 38 insertions, 6 deletions
diff --git a/func/minion/modules/func_module.py b/func/minion/modules/func_module.py
index 56f21f9..6586d40 100644
--- a/func/minion/modules/func_module.py
+++ b/func/minion/modules/func_module.py
@@ -15,6 +15,7 @@ import inspect
from func import logger
from certmaster.config import read_config, BaseConfig
from func.commonconfig import FuncdConfig
+import func.module_loader
from func.minion.func_arg import * #the arg getter stuff
class FuncModule(object):
@@ -85,10 +86,7 @@ class FuncModule(object):
return self.description
def __is_public_valid_method(self,attr):
- if inspect.ismethod(getattr(self, attr)) and attr[0] != '_' and\
- attr != 'register_rpc' and attr!='register_method_args':
- return True
- return False
+ return func.module_loader.is_public_valid_method(self, attr, blacklist=['register_rpc', 'register_method_args'])
def __get_method_args(self):
"""
diff --git a/func/module_loader.py b/func/module_loader.py
index f418f80..a999de7 100755
--- a/func/module_loader.py
+++ b/func/module_loader.py
@@ -16,6 +16,7 @@
import distutils.sysconfig
import os
import sys
+import inspect
from gettext import gettext
_ = gettext
@@ -36,9 +37,17 @@ def module_walker(topdir):
# in the module name, and foo..bar doesnt work -akl
module_files.append(os.path.normpath("%s/%s" % (root, filename)))
-
return module_files
+def load_methods(path, main_class):
+ methods = {}
+ modules = load_modules(path, main_class)
+ for x in modules.keys():
+ for method in dir(modules[x]):
+ if is_public_valid_method(modules[x], method):
+ methods["%s.%s" % (x,method)]=getattr(modules[x], method)
+ return methods
+
def load_modules(path='func/minion/modules/', main_class=func_module.FuncModule, blacklist=None):
python_path = distutils.sysconfig.get_python_lib()
@@ -103,6 +112,14 @@ def load_modules(path='func/minion/modules/', main_class=func_module.FuncModule,
return mods
+def is_public_valid_method(obj, attr, blacklist=[]):
+ if inspect.ismethod(getattr(obj, attr)) and attr[0] != '_':
+ for b in blacklist:
+ if attr==b:
+ return False
+ return True
+ return False
+
if __name__ == "__main__":
diff --git a/func/overlord/client.py b/func/overlord/client.py
index b02438d..e68fdcc 100755
--- a/func/overlord/client.py
+++ b/func/overlord/client.py
@@ -31,6 +31,8 @@ import delegation_tools as dtools
import func.forkbomb as forkbomb
import func.jobthing as jobthing
from func.CommonErrors import *
+import func.module_loader as module_loader
+from func.overlord import overlord_module
# ===================================
# defaults
@@ -192,6 +194,8 @@ class Overlord(object):
if init_ssl:
self.setup_ssl()
+
+ self.methods = module_loader.load_methods('func/overlord/modules/', overlord_module.BaseModule)
def setup_ssl(self, client_key=None, client_cert=None, ca=None):
# defaults go:
@@ -285,7 +289,13 @@ class Overlord(object):
If Overlord() was constructed with noglobs=True, the return is instead
just a single value, not a hash.
"""
-
+
+ if module == "local":
+ if method in self.methods.keys():
+ return self.methods[method]()
+ else:
+ raise AttributeError("no such method")
+
if not self.delegate: #delegation is turned off, so run normally
return self.run_direct(module, method, args, nforks)
diff --git a/func/overlord/modules/__init__.py b/func/overlord/modules/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/func/overlord/modules/__init__.py
diff --git a/func/overlord/modules/test.py b/func/overlord/modules/test.py
new file mode 100644
index 0000000..09f7a33
--- /dev/null
+++ b/func/overlord/modules/test.py
@@ -0,0 +1,5 @@
+from func.overlord import overlord_module
+
+class test(overlord_module.BaseModule):
+ def return1(self):
+ return 1
diff --git a/func/overlord/overlord_module.py b/func/overlord/overlord_module.py
new file mode 100644
index 0000000..17a335d
--- /dev/null
+++ b/func/overlord/overlord_module.py
@@ -0,0 +1,2 @@
+class BaseModule:
+ pass