scripts/slurm_gcp_plugins/__init__.py (102 lines of code) (raw):

import importlib import pkgutil import logging import inspect # Only perform discovery at init discovered_plugins = { name.lstrip("."): importlib.import_module(name=name, package="slurm_gcp_plugins") for finder, name, ispkg in pkgutil.iter_modules(path=__path__, prefix=".") if name.lstrip(".") != "utils" } logging.info( ( "slurm_gcp_plugins found:" + ", ".join( [ "slurm_gcp_plugins" + plugin for plugin in sorted(discovered_plugins.keys()) ] ) ) ) def get_plugins(): return discovered_plugins def get_plugins_function(function_name): plugins = get_plugins() return { plugin: function for plugin in sorted(plugins.keys()) for name, function in inspect.getmembers(plugins[plugin], inspect.isfunction) if name == function_name } def run_plugins_for_function(plugin_function_name, pos_args, keyword_args): if "lkp" not in keyword_args: logging.error( ( f"Plugin callback {plugin_function_name} called" + 'without a "lkp" argument need to get obtain deployment' + "information" ) ) return if not keyword_args["lkp"].cfg: logging.error( ( f"Plugin callback {plugin_function_name} called" + 'with "lkp.cfg" unpopulated. lkp.cfg is needed' + "to argument need to get obtain deployment" + "information" ) ) return cfg = keyword_args["lkp"].cfg if cfg.enable_slurm_gcp_plugins: for plugin, function in get_plugins_function(plugin_function_name).items(): if plugin in cfg.enable_slurm_gcp_plugins: logging.debug(f"Running {function} from plugin {plugin}") try: function(*pos_args, **keyword_args) except BaseException as e: logging.error( f"Plugin callback {plugin}:{function} caused an exception: {e}" ) else: logging.debug( f"Not running {function} from non-enabled plugin {plugin}" ) # Implement this function to add fields to the cached VM instance lookup def register_instance_information_fields(*pos_args, **keyword_args): run_plugins_for_function( plugin_function_name="register_instance_information_fields", pos_args=pos_args, keyword_args=keyword_args, ) # Called just after VM instances have been created and are up def post_main_resume_nodes(*pos_args, **keyword_args): run_plugins_for_function( plugin_function_name="post_main_resume_nodes", pos_args=pos_args, keyword_args=keyword_args, ) # Called just before VM instances are deleted should be still up # (NOTE: if a node has failed it might not be up or unresponsive) def pre_main_suspend_nodes(*pos_args, **keyword_args): run_plugins_for_function( plugin_function_name="pre_main_suspend_nodes", pos_args=pos_args, keyword_args=keyword_args, ) # Called just before VM instances are created are created with # bulkInsert- this function can be implemented to inspect and/or # modify the insertion request. def pre_instance_bulk_insert(*pos_args, **keyword_args): run_plugins_for_function( plugin_function_name="pre_instance_bulk_insert", pos_args=pos_args, keyword_args=keyword_args, ) # Called just before placement groups are created - this function can # be implemented to inspect and/or modify the insertion request. def pre_placement_group_insert(*pos_args, **keyword_args): run_plugins_for_function( plugin_function_name="pre_placement_group_insert", pos_args=pos_args, keyword_args=keyword_args, ) __all__ = [ "post_main_resume_nodes", "pre_main_suspend_nodes", "register_instance_information_fields", "pre_instance_bulk_insert", "pre_placement_group_insert", ]