Merge "Adding python package requirement for VNF testing."
[yardstick.git] / api / server.py
1 ##############################################################################
2 # Copyright (c) 2016 Huawei Technologies Co.,Ltd and others.
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9 from __future__ import absolute_import
10
11 import inspect
12 import logging
13 from functools import reduce
14 from six.moves import filter
15
16 from flasgger import Swagger
17 from flask import Flask
18 from flask_restful import Api
19
20 from api.database import Base
21 from api.database import db_session
22 from api.database import engine
23 from api.database import models
24 from api.urls import urlpatterns
25 from yardstick import _init_logging
26
27 logger = logging.getLogger(__name__)
28
29 app = Flask(__name__)
30
31 Swagger(app)
32
33 api = Api(app)
34
35
36 @app.teardown_request
37 def shutdown_session(exception=None):
38     db_session.remove()
39
40
41 def init_db():
42     def func(a):
43         try:
44             if issubclass(a[1], Base):
45                 return True
46         except TypeError:
47             pass
48         return False
49
50     subclses = filter(func, inspect.getmembers(models, inspect.isclass))
51     logger.debug('Import models: %s', [a[1] for a in subclses])
52     Base.metadata.create_all(bind=engine)
53
54
55 init_db()
56 reduce(lambda a, b: a.add_resource(b.resource, b.url,
57                                    endpoint=b.endpoint) or a, urlpatterns, api)
58
59 if __name__ == '__main__':
60     _init_logging()
61     logger.setLevel(logging.DEBUG)
62     logger.info('Starting server')
63     app.run(host='0.0.0.0')