def _load_plugins(self, on_module_begin=None, on_module_end=None, on_modules_loaded=None): from middlewared.service import Service, CompoundService, CRUDService, ConfigService, SystemServiceService services = [] main_plugins_dir = os.path.realpath( os.path.join( os.path.dirname(os.path.realpath(__file__)), '..', 'plugins', )) plugins_dirs = [ os.path.join(overlay_dir, 'plugins') for overlay_dir in self.overlay_dirs ] plugins_dirs.insert(0, main_plugins_dir) for plugins_dir in plugins_dirs: if not os.path.exists(plugins_dir): raise ValueError(f'plugins dir not found: {plugins_dir}') for mod in load_modules(plugins_dir, depth=1): if on_module_begin: on_module_begin(mod) services.extend( load_classes( mod, Service, (ConfigService, CRUDService, SystemServiceService))) if on_module_end: on_module_end(mod) key = lambda service: service._config.namespace for name, parts in itertools.groupby(sorted(set(services), key=key), key=key): parts = list(parts) if len(parts) == 1: service = parts[0](self) else: service = CompoundService(self, [part(self) for part in parts]) self.add_service(service) if on_modules_loaded: on_modules_loaded() # Now that all plugins have been loaded we can resolve all method params # to make sure every schema is patched and references match from middlewared.schema import resolve_methods # Lazy import so namespace match to_resolve = [] for service in list(self._services.values()): for attr in dir(service): to_resolve.append(getattr(service, attr)) resolve_methods(self._schemas, to_resolve)
def _load_plugins(self, on_module_begin=None, on_module_end=None, on_modules_loaded=None): from middlewared.service import Service, CompoundService, ABSTRACT_SERVICES services = [] main_plugins_dir = os.path.realpath( os.path.join( os.path.dirname(os.path.realpath(__file__)), '..', 'plugins', )) plugins_dirs = [ os.path.join(overlay_dir, 'plugins') for overlay_dir in self.overlay_dirs ] plugins_dirs.insert(0, main_plugins_dir) for plugins_dir in plugins_dirs: if not os.path.exists(plugins_dir): raise ValueError(f'plugins dir not found: {plugins_dir}') for mod in load_modules(plugins_dir, depth=1): if on_module_begin: on_module_begin(mod) services.extend(load_classes(mod, Service, ABSTRACT_SERVICES)) if on_module_end: on_module_end(mod) def key(service): return service._config.namespace for name, parts in itertools.groupby(sorted(set(services), key=key), key=key): parts = list(parts) if len(parts) == 1: service = parts[0](self) else: service = CompoundService(self, [part(self) for part in parts]) if not service._config.private and not service._config.cli_private and not service._config.cli_namespace: raise RuntimeError( f'Service {service!r} does not have CLI namespace set') self.add_service(service) if on_modules_loaded: on_modules_loaded() # Now that all plugins have been loaded we can resolve all method params # to make sure every schema is patched and references match self._resolve_methods()