Adding basic flask framework
Pending addition of Flask-OsloLog and Flask-KeystoneAuth Change-Id: I734bcd4390d1eeadd61c64516ac6b0adf02d09e9
This commit is contained in:
parent
054413a055
commit
18632f314d
|
@ -0,0 +1,16 @@
|
||||||
|
[DEFAULT]
|
||||||
|
|
||||||
|
[keystone_authtoken]
|
||||||
|
identity_uri =
|
||||||
|
auth_uri =
|
||||||
|
admin_tenant_name =
|
||||||
|
admin_user =
|
||||||
|
admin_password =
|
||||||
|
auth_version =
|
||||||
|
auth_protocol =
|
||||||
|
delay_auth_decision = True
|
||||||
|
|
||||||
|
[sqlalchemy]
|
||||||
|
database_uri = sqlite:////tmp/nemesis.db
|
||||||
|
echo = true
|
||||||
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
from flask import Flask
|
||||||
|
import os
|
||||||
|
from oslo_config import cfg
|
||||||
|
from python_nemesis.config import collect_sqlalchemy_opts
|
||||||
|
from python_nemesis.config import register_opts
|
||||||
|
from python_nemesis.extensions import db
|
||||||
|
# from python_nemesis.extensions import log
|
||||||
|
|
||||||
|
|
||||||
|
def configure_blueprints(app, blueprints):
|
||||||
|
"""Register configured blueprints into app object.
|
||||||
|
|
||||||
|
:param app: The application object to which configuration should
|
||||||
|
be applied.
|
||||||
|
:type app: :py:class:`flask.Flask`
|
||||||
|
:param blueprints: list of blueprints to be registered.
|
||||||
|
:type blueprints: list(:py:class:`flask.Blueprint`)
|
||||||
|
"""
|
||||||
|
for blueprint in blueprints:
|
||||||
|
app.register_blueprint(blueprint)
|
||||||
|
|
||||||
|
|
||||||
|
def configure_app(app):
|
||||||
|
"""Retrieve App Configuration.
|
||||||
|
|
||||||
|
configure_app first loads default configuration and then attempts
|
||||||
|
to override defaults using a file specified in env:NEMESIS_CONFIG.
|
||||||
|
|
||||||
|
:param app: The application object to which configuration should
|
||||||
|
be applied.
|
||||||
|
:type app: :py:class:`flask.Flask`
|
||||||
|
"""
|
||||||
|
app.config.from_object('python_nemesis.default_config')
|
||||||
|
app.config["cfg"] = cfg.CONF
|
||||||
|
config_file = os.environ.get(
|
||||||
|
"NEMESIS_CONFIG",
|
||||||
|
"/etc/nemesis/nemesis.conf")
|
||||||
|
|
||||||
|
register_opts(app.config["cfg"], config_file)
|
||||||
|
collect_sqlalchemy_opts(app, app.config["cfg"])
|
||||||
|
|
||||||
|
|
||||||
|
def configure_extensions(app):
|
||||||
|
"""Initialize extensions for Flask.
|
||||||
|
|
||||||
|
This function is intended for use with the app factory style
|
||||||
|
of Flask deployment.
|
||||||
|
|
||||||
|
:param app: The application object to which configuration should
|
||||||
|
be applied.
|
||||||
|
:type app: :py:class:`flask.Flask`
|
||||||
|
"""
|
||||||
|
db.init_app(app)
|
||||||
|
# log.init_app(app)
|
||||||
|
|
||||||
|
|
||||||
|
def create_app(app_name=None, blueprints=None):
|
||||||
|
"""Create the flask app.
|
||||||
|
|
||||||
|
This function is intended to be used with the app factory
|
||||||
|
style of Flask deployment.
|
||||||
|
|
||||||
|
:param str app_name: Name to be used internally within flask.
|
||||||
|
:param blueprints: Blueprints to be registered.
|
||||||
|
:type blueprints: list(:py:class:`flask.Blueprint`)
|
||||||
|
:returns: The created app.
|
||||||
|
:rtype: :py:class:`flask.Flask`
|
||||||
|
"""
|
||||||
|
app = Flask(app_name)
|
||||||
|
|
||||||
|
configure_app(app)
|
||||||
|
configure_extensions(app)
|
||||||
|
|
||||||
|
return app
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__": # pragma: no cover
|
||||||
|
app = create_app('nemesis-api')
|
||||||
|
app.run(threaded=True)
|
|
@ -0,0 +1,80 @@
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
from oslo_config import cfg
|
||||||
|
|
||||||
|
|
||||||
|
DEFAULT_OPT_GRP = cfg.OptGroup(name='DEFAULT')
|
||||||
|
DEFAULT_OPTS = [
|
||||||
|
cfg.StrOpt('test_value', default="this is a value")
|
||||||
|
]
|
||||||
|
|
||||||
|
SQLALCHEMY_OPT_GRP = cfg.OptGroup(name='sqlalchemy')
|
||||||
|
SQLALCHEMY_OPTS = [
|
||||||
|
cfg.StrOpt('database_uri'),
|
||||||
|
cfg.BoolOpt('echo'),
|
||||||
|
cfg.IntOpt('pool_size'),
|
||||||
|
cfg.IntOpt('pool_timeout'),
|
||||||
|
cfg.IntOpt('pool_recycle'),
|
||||||
|
cfg.IntOpt('max_overflow'),
|
||||||
|
cfg.BoolOpt('track_modifications'),
|
||||||
|
]
|
||||||
|
|
||||||
|
IDENTITY_OPT_GRP = cfg.OptGroup(name='identity')
|
||||||
|
IDENTITY_OPTS = [
|
||||||
|
cfg.StrOpt('username'),
|
||||||
|
cfg.StrOpt('password')
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def register_opts(conf, config_file):
|
||||||
|
'''Register Oslo Configuration Options from a provided config file.
|
||||||
|
|
||||||
|
:param conf: oslo config to be populated.
|
||||||
|
:type conf: :py:obj:`cfg.CONF`
|
||||||
|
:param str config_file: Location of the config file to be used.
|
||||||
|
'''
|
||||||
|
conf(default_config_files=[config_file])
|
||||||
|
conf.register_opts(DEFAULT_OPTS)
|
||||||
|
conf.register_group(SQLALCHEMY_OPT_GRP)
|
||||||
|
conf.register_opts(SQLALCHEMY_OPTS, SQLALCHEMY_OPT_GRP)
|
||||||
|
conf.register_group(IDENTITY_OPT_GRP)
|
||||||
|
conf.register_opts(IDENTITY_OPTS, IDENTITY_OPT_GRP)
|
||||||
|
|
||||||
|
|
||||||
|
def collect_sqlalchemy_opts(app, conf):
|
||||||
|
"""Collect sqlalchemy options from `oslo.config` and apply them.
|
||||||
|
|
||||||
|
This function copies the configuration entries for sqlalchemy
|
||||||
|
directly into the :py:class:`flask.Flask` object where the
|
||||||
|
upstream Flask-SqlAlchemy extension expects to find them.
|
||||||
|
|
||||||
|
:param app: The application object to which configuration should
|
||||||
|
be applied.
|
||||||
|
:type app: :py:class:`flask.Flask`
|
||||||
|
:param conf: oslo config to be populated.
|
||||||
|
:type conf: :py:obj:`cfg.CONF`
|
||||||
|
"""
|
||||||
|
def _import_opt_from_oslo(flask_opt, oslo_opt):
|
||||||
|
if conf.sqlalchemy[oslo_opt] is not None:
|
||||||
|
app.config[flask_opt] = conf.sqlalchemy[oslo_opt]
|
||||||
|
|
||||||
|
_import_opt_from_oslo('SQLALCHEMY_DATABASE_URI', 'database_uri')
|
||||||
|
_import_opt_from_oslo('SQLALCHEMY_ECHO', 'echo')
|
||||||
|
_import_opt_from_oslo('SQLALCHEMY_POOL_SIZE', 'pool_size')
|
||||||
|
_import_opt_from_oslo('SQLALCHEMY_POOL_TIMEOUT', 'pool_timeout')
|
||||||
|
_import_opt_from_oslo('SQLALCHEMY_POOL_RECYCLE', 'pool_recycle')
|
||||||
|
_import_opt_from_oslo('SQLALCHEMY_MAX_OVERFLOW', 'max_overflow')
|
||||||
|
_import_opt_from_oslo(
|
||||||
|
'SQLALCHEMY_TRACK_MODIFICATIONS',
|
||||||
|
'track_modifications'
|
||||||
|
)
|
|
@ -0,0 +1,4 @@
|
||||||
|
DEBUG = True
|
||||||
|
TESTING = False
|
||||||
|
JSONIFY_PRETTYPRINT_REGULAR = True
|
||||||
|
JSON_SORT_KEYS = True
|
|
@ -0,0 +1,6 @@
|
||||||
|
# from flask_oslolog import OsloLog
|
||||||
|
from flask_sqlalchemy import SQLAlchemy
|
||||||
|
|
||||||
|
|
||||||
|
db = SQLAlchemy()
|
||||||
|
# log = OsloLog()
|
|
@ -3,3 +3,10 @@
|
||||||
# process, which may cause wedges in the gate later.
|
# process, which may cause wedges in the gate later.
|
||||||
|
|
||||||
pbr>=2.0.0 # Apache-2.0
|
pbr>=2.0.0 # Apache-2.0
|
||||||
|
alembic>=0.8.10 # MIT
|
||||||
|
Flask!=0.11,<1.0,>=0.10 # BSD
|
||||||
|
Flask-SQLAlchemy>=2.0 # BSD
|
||||||
|
oslo.config>=3.22.0 # Apache-2.0
|
||||||
|
oslo.messaging>=5.19.0 # Apache-2.0
|
||||||
|
oslo.log>=3.11.0 # Apache-2.0
|
||||||
|
keystonemiddleware>=4.12.0 # Apache-2.0
|
||||||
|
|
Loading…
Reference in New Issue