学习 OpenStack (3):基于 Pecan 开发 OpenStack 组件(Demo) _____1


前言

内容主要用作个人学习总结,如有描述错误,欢迎指明

其实框架入门这种事情,最好是去看框架的官方文档;除非你的学习时间真的很少,需要急速上手

这篇随笔,更多是为组件开发做铺垫




服务入口

接触过 OpenStack 的人都知道它有很多组件以及很多版本(这里以 cloudkitty-rocky 版为主),在看组件的源码时,通常会以项目的 setup.cfg 文件入手

如下所示:


PS:如果看不懂,请查看 ,链接的文章会大致讲解 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" ,都是在

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//.conf 配置日志路径(一般是 /var/log/)
3. import oslo_messaging            # 消息模块,所有和消息中间件打交道的方法,都会在这个模块中体现
4. from oslo_policy import policy   # 与 keystone 配套使用的权限模块,可以细化接口的权限控制
5. import oslo_utils

# 其他组件依赖
1. from keystonemiddleware import auth_token

剩下的,拆分到下一篇算了