diff options
Diffstat (limited to 'utils/dispatcher/func.py')
-rw-r--r-- | utils/dispatcher/func.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/utils/dispatcher/func.py b/utils/dispatcher/func.py new file mode 100644 index 00000000..71830bf2 --- /dev/null +++ b/utils/dispatcher/func.py @@ -0,0 +1,70 @@ +#Copyright 2013: Mirantis Inc. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +# bottlenecks comment: this is a modified copy of rally/rally/common/utils.py + +import os +import sys +from oslo_utils import importutils + +import utils + + +# Decorator for cli-args +def cliargs(*args, **kwargs): + def _decorator(func): + func.__dict__.setdefault('arguments', []).insert(0, (args, kwargs)) + return func + return _decorator + + +def itersubclasses(cls, _seen=None): + """Generator over all subclasses of a given class in depth first order.""" + + if not isinstance(cls, type): + raise TypeError("itersubclasses must be called with " + "new-style classes, not %.100r" % cls) + _seen = _seen or set() + try: + subs = cls.__subclasses__() + except TypeError: # fails only when cls is type + subs = cls.__subclasses__(cls) + for sub in subs: + if sub not in _seen: + _seen.add(sub) + yield sub + for sub in itersubclasses(sub, _seen): + yield sub + + +def try_append_module(name, modules): + if name not in modules: + modules[name] = importutils.import_module(name) + + +def import_modules_from_package(package): + """Import modules from package and append into sys.modules + + :param: package - Full package name. For example: rally.deploy.engines + """ + path = [os.path.dirname(utils.__file__), ".."] + package.split(".") + path = os.path.join(*path) + for root, dirs, files in os.walk(path): + for filename in files: + if filename.startswith("__") or not filename.endswith(".py"): + continue + new_package = ".".join(root.split(os.sep)).split("....")[1] + module_name = "%s.%s" % (new_package, filename[:-3]) + try_append_module(module_name, sys.modules) |