3 # Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
11 Used to launch Functest RestApi
18 from urlparse import urljoin
21 from flask import Flask
22 from flask_restful import Api
23 from flasgger import Swagger
25 from functest.api.base import ApiResource
26 from functest.api.common import api_utils
27 from functest.api.database.db import BASE
28 from functest.api.database.db import DB_SESSION
29 from functest.api.database.db import ENGINE
30 from functest.api.database.v1 import models
31 from functest.api.urls import URLPATTERNS
34 LOGGER = logging.getLogger(__name__)
42 def shutdown_session(exception=None): # pylint: disable=unused-argument
44 To be called at the end of each request whether it is successful
45 or an exception is raised
50 def get_resource(resource_name):
51 """ Obtain the required resource according to resource name """
52 name = ''.join(resource_name.split('_'))
53 return next((r for r in api_utils.itersubclasses(ApiResource)
54 if r.__name__.lower() == name))
57 def get_endpoint(url):
58 """ Obtain the endpoint of url """
59 address = socket.gethostbyname(socket.gethostname())
60 return urljoin('http://{}:5000'.format(address), url)
63 def api_add_resource():
65 The resource has multiple URLs and you can pass multiple URLs to the
66 add_resource() method on the Api object. Each one will be routed to
69 for url_pattern in URLPATTERNS:
72 get_resource(url_pattern.target), url_pattern.url,
73 endpoint=get_endpoint(url_pattern.url))
75 LOGGER.error('url resource not found: %s', url_pattern.url)
80 Import all modules here that might define models so that
81 they will be registered properly on the metadata, and then
85 """ To check the subclasses of BASE"""
87 if issubclass(subcls[1], BASE):
92 # pylint: disable=bad-builtin
93 subclses = filter(func, inspect.getmembers(models, inspect.isclass))
94 LOGGER.debug('Import models: %s', [subcls[1] for subcls in subclses])
95 BASE.metadata.create_all(bind=ENGINE)
100 logging.config.fileConfig(pkg_resources.resource_filename(
101 'functest', 'ci/logging.ini'))
102 logging.captureWarnings(True)
103 LOGGER.info('Starting Functest server')
106 APP.run(host='0.0.0.0')