Пример #1
0
    def __init__(self):
        self.config = CONF
        self.installed_modules = {}
        self.hooks = APIHooks()

        # default internal hooks
        self.before_hooks = self.hooks.required_request_hooks()
        self.after_hooks = self.hooks.required_response_hooks()

        self.default_route = None

        self._dispatchers = {}
        self._error_handlers = []
Пример #2
0
class Jumpgate(object):

    def __init__(self):
        self.config = CONF
        self.installed_modules = {}
        self.hooks = APIHooks()

        # default internal hooks
        self.before_hooks = self.hooks.required_request_hooks()
        self.after_hooks = self.hooks.required_response_hooks()

        self.default_route = None

        self._dispatchers = {}
        self._error_handlers = []

    def add_error_handler(self, ex, handler):
        if (ex, handler) not in self._error_handlers:
            self._error_handlers.insert(0, (ex, handler))

    def make_api(self):
        self.before_hooks.extend(self.hooks.optional_request_hooks())
        self.after_hooks.extend(self.hooks.optional_response_hooks())

        api = API(before=self.before_hooks, after=self.after_hooks)

        # Set the default route to the NYI object
        api.add_sink(self.default_route or NYI(before=self.before_hooks,
                                               after=self.after_hooks))

        # Add Error Handlers - ordered generic to more specific
        built_in_handlers = [(Exception, handle_unexpected_errors),
                             (ResponseException, ResponseException.handle),
                             (InvalidTokenError, InvalidTokenError.handle)]

        for ex, handler in built_in_handlers + self._error_handlers:
            api.add_error_handler(ex,
                                  wrap_handler_with_hooks(handler,
                                                          self.after_hooks))

        # Add all the routes collected thus far
        for _, disp in self._dispatchers.items():
            for endpoint, handler in disp.get_routes():
                LOG.debug("Loading endpoint %s", endpoint)
                api.add_route(endpoint, handler)
                api.add_route('%s.json' % endpoint, handler)

        return api

    def add_dispatcher(self, service, dispatcher):
        self._dispatchers[service] = dispatcher

    def get_dispatcher(self, service):
        return self._dispatchers[service]

    def get_endpoint_url(self, service, *args, **kwargs):
        dispatcher = self._dispatchers.get(service)
        return dispatcher.get_endpoint_url(*args, **kwargs)

    def load_endpoints(self):
        for service in SUPPORTED_SERVICES:
            enabled_services = self.config['enabled_services']
            if service in enabled_services:
                service_module = importlib.import_module('jumpgate.' + service)

                # Import the dispatcher for the service
                disp = Dispatcher(mount=self.config[service]['mount'])
                service_module.add_endpoints(disp)
                self.add_dispatcher(service, disp)
                self.installed_modules[service] = True
            else:
                self.installed_modules[service] = False

    def load_drivers(self):
        for service, disp in self._dispatchers.items():
            module = importlib.import_module(self.config[service]['driver'])

            if hasattr(module, 'setup_routes'):
                module.setup_routes(self, disp)