Source code for monasca_events_api.app.api

# Copyright 2017 FUJITSU LIMITED
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

"""
Module contains factories to initializes various applications
of monasca-events-api.
"""

import falcon
from oslo_log import log
import six

from monasca_events_api.app.controller import healthchecks
from monasca_events_api.app.controller.v1 import events as v1_events
from monasca_events_api.app.controller import versions
from monasca_events_api.app.core import error_handlers
from monasca_events_api.app.core import request
from monasca_events_api import config


[docs]def error_trap(app_name): """Decorator trapping any error during application boot time. :param app_name: Application name :type app_name: str :return: _wrapper function """ @six.wraps(error_trap) def _wrapper(func): @six.wraps(_wrapper) def _inner_wrapper(*args, **kwargs): try: return func(*args, **kwargs) except Exception: logger = log.getLogger(__name__) logger.exception( 'Failed to load application: \'{}\''.format(app_name)) raise return _inner_wrapper return _wrapper
[docs]def singleton_config(func): """Decorator ensuring that configuration is loaded only once. :param func: Function to execute :return: _wrapper """ @six.wraps(singleton_config) def _wrapper(global_conf, **local_conf): config.parse_args() return func(global_conf, **local_conf) return _wrapper
[docs]@error_trap('version') def create_version_app(global_conf, **local_conf): """Creates Version application""" ctrl = versions.Versions() controllers = { '/': ctrl, # redirect http://host:port/ down to Version app # avoid conflicts with actual pipelines and 404 error '/version': ctrl, # list all the versions '/version/{version_id}': ctrl # display details of the version } wsgi_app = falcon.API() for route, ctrl in controllers.items(): wsgi_app.add_route(route, ctrl) return wsgi_app
[docs]@error_trap('healthcheck') def create_healthcheck_app(global_conf, **local_conf): """Create Healthcheck application""" controllers = { '/': healthchecks.HealthChecks(), } wsgi_app = falcon.API() for route, ctrl in controllers.items(): wsgi_app.add_route(route, ctrl) return wsgi_app
[docs]@error_trap('api') @singleton_config def create_api_app(global_conf, **local_conf): """Create Main Events Api application. :param global_conf: Global config :param local_conf: Local config :return: falcon.API """ controllers = {} controllers.update({ '/events': v1_events.Events() }) wsgi_app = falcon.API( request_type=request.Request ) for route, ctrl in controllers.items(): wsgi_app.add_route(route, ctrl) error_handlers.register_error_handler(wsgi_app) return wsgi_app