学习 OpenStack (3):基于 Pecan 开发 OpenStack 组件(Demo) _____1
前言
内容主要用作个人学习总结,如有描述错误,欢迎指明
其实框架入门这种事情,最好是去看框架的官方文档;除非你的学习时间真的很少,需要急速上手。
这篇随笔,更多是为组件开发做铺垫
服务入口
接触过 OpenStack 的人都知道它有很多组件以及很多版本(这里以 cloudkitty-rocky 版为主),在看组件的源码时,通常会以项目的 setup.cfg 文件入手
如下所示:
PS:如果看不懂,请查看 pbr 打包简介,链接的文章会大致讲解 setup.cfg 文件的构成以及相关 关键字的含义
先看 "etc/nova/api-paste.ini" 这一行,之前随笔有提到过,OpenStack-API 的整体结构有一个变化很大的地方
1.Paste + PasteDeploy + Routes + WebOb
2.Pecan (+Paste)
对比核心组件(nova) 和 新增组件(cloudkitty)的源码能发现, 路由映射相关的旧代码,在新版本里几乎找不到
Paste Deployment 用于发现&配置 WSGI Application 和 Server,它的主要体现就是 api-paste.ini 这个配置文件。通过它,我们可以找到服务的入口,如下所示
服务加载
读过 setup.cfg 和 api_paste.ini ,可以发现启动服务有多种切入方式
方式1:定义 setup.cfg
setup.cfg
[entry_points]
...
wsgi_scripts =
cloudkitty-api = cloudkitty.api.app:build_wsgi_app
# "wsgi_scripts" 代表这是一个 wsgi 的可执行脚本;以上述代码为例子,在 Linux 环境安装时,会在 /usr/bin 下生成一个名为 "cloudkitty-api" 的可执行文件;具体效果,大家可以在部署 OpenStack 环境时验证与查看
cloudkitty/api/app.py
def build_wsgi_app(argv=None):
service.prepare_service()
return load_app()
def load_app():
cfg_file = cfg.CONF.api_paste_config
...
appname = "cloudkitty+{}".format(cfg.CONF.auth_strategy)
return deploy.loadapp("config:" + cfg_file, name=appname)
方式2:定义 api_paste.ini
api_paste.ini
[app:ck_api_v1]
paste.app_factory = cloudkitty.api.app:app_factory
cloudkitty/api/app.py
def app_factory(global_config, **local_conf):
return setup_app()
def setup_app(pecan_config=None, extra_hooks=None):
app_conf = get_pecan_config()
storage_backend = storage.get_storage()
app_hooks = [
hooks.RPCHook(),
hooks.StorageHook(storage_backend),
hooks.ContextHook(),
]
app = pecan.make_app(
app_conf.app.root,
static_root=app_conf.app.static_root,
template_path=app_conf.app.template_path,
debug=CONF.api.pecan_debug,
force_canonical=getattr(app_conf.app, 'force_canonical', True),
hooks=app_hooks,
guess_content_type_from_ext=False
)
return app
你跟随 "app" 的实例化过程去看,就会发现上述2种方式都指向了 "app_factory" ,都是在构建 wsgi-application
def setip_app():
return pecan.make_app()
->
# Instantiate the WSGI app by passing **kw onward
app = Pecan(root, **kw)
->
PecanBase.__call__()
...
return state.response(environ, start_response)
构建组件 demo
OpenStack 相关的第三方包,一般会涉及到以下部分
# 通用模块
1. from oslo_config import cfg # 在 /etc/nova/nova.conf 里的配置项,都会加载到 cfg 中
2. from oslo_log import log # web 项目都会有日志模块,openstack 造好的轮子,不用白不用,在 /etc/<name>/<name>.conf 配置日志路径(一般是 /var/log/<name>)
3. import oslo_messaging # 消息模块,所有和消息中间件打交道的方法,都会在这个模块中体现
4. from oslo_policy import policy # 与 keystone 配套使用的权限模块,可以细化接口的权限控制
5. import oslo_utils
# 其他组件依赖
1. from keystonemiddleware import auth_token
剩下的,拆分到下一篇算了
(☞゚ヮ゚)☞ ☜(゚ヮ゚☜))