124 lines
3.4 KiB
Python
124 lines
3.4 KiB
Python
# 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
|
|
|
|
|
|
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
|
|
|
|
|
|
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
|
|
|
|
|
|
@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
|
|
|
|
|
|
@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
|
|
|
|
|
|
@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
|