Example #1
0
    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)
Example #2
0
    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()