def apply_python_control(level: str, control: Control, experiment: Experiment, context: Union[Activity, Experiment], state: Union[Journal, Run, List[Run]] = None, configuration: Configuration = None, secrets: Secrets = None): """ Apply a control by calling a function matching the given level. """ provider = control["provider"] func_name = _level_mapping.get(level) func = load_func(control, func_name) if not func: return arguments = deepcopy(provider.get("arguments", {})) if configuration or secrets: arguments = substitute(arguments, configuration, secrets) sig = inspect.signature(func) if "secrets" in provider and "secrets" in sig.parameters: arguments["secrets"] = {} for s in provider["secrets"]: arguments["secrets"].update(secrets.get(s, {}).copy()) if "configuration" in sig.parameters: arguments["configuration"] = configuration.copy() if "state" in sig.parameters: arguments["state"] = state if "experiment" in sig.parameters: arguments["experiment"] = experiment func(context=context, **arguments)
def run_python_activity(activity: Activity, configuration: Configuration, secrets: Secrets) -> Any: """ Run a Python activity. A python activity is a function from any importable module. The result of that function is returned as the activity's output. This should be considered as a private function. """ provider = activity["provider"] mod_path = provider["module"] func_name = provider["func"] mod = importlib.import_module(mod_path) func = getattr(mod, func_name) arguments = provider.get("arguments", {}).copy() if configuration or secrets: arguments = substitute(arguments, configuration, secrets) sig = inspect.signature(func) if "secrets" in provider and "secrets" in sig.parameters: arguments["secrets"] = {} for s in provider["secrets"]: arguments["secrets"].update(secrets.get(s, {}).copy()) if "configuration" in sig.parameters: arguments["configuration"] = configuration.copy() try: return func(**arguments) except Exception as x: raise FailedActivity( traceback.format_exception_only( type(x), x)[0].strip()).with_traceback(sys.exc_info()[2])