分享

Glance 源码分析(1) – 框架

xioaxu790 发表于 2014-12-22 19:55:56 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 2 22332
问题导读

1、 V1 和 V2的最大区别是什么?
2、apiv2app的流程是怎样的?
3、如何理解glance的API 框架?





以下主要分析 V2 版本的代码, V1 和 V2的最大区别就是:
  • V1: 包含两个服务 glance-api 和 glance-registry. glance-api 接受客户端的 所有命令, 分发并响应, 涉及到数据库的操作由内部转发到 glance-registry 完成
  • V2 简化了流程, 所有的处理都在内部实现, 不需要额外的服务. 因此只需要 glance-api 一个服务


Table of Contents
  • 启动流程
  • API 框架
  • 处理流程


启动流程
1.png

  1. # glance/cmd/api.py
  2. def main():
  3.     # 载入配置, 下面的函数在 glance/common/config.py 中定义, 调用此函数会初始化
  4.     # oslo 模块中的模块变量 CONF, 把 glance-api.conf 中的值设置在 CONF 的属性中,
  5.     # 使用的时候按照 "CONF.enable_v1_api" 此方式调用, 具体的细节不多讲
  6.     config.parse_args()
  7.     # 初始化后端存储,
  8.     # 1. 将所有后端存储的类名注册到 glance/store/__init__.py:REGISTERED_STORES
  9.     # 2. 将所有后端存储的名字和实例注册到 glance/store/location.py:SCHEME_TO_CLS_MAP
  10.     #    以后 glance-api 可以根据用户的请求和配置文件找到具体的后端存储的实例, 调用相应的
  11.     #    实例的函数(add/delete)来操作
  12.     glance.store.create_stores()
  13.     # 启动 WSGI 程序
  14.     # load_paste_app 会在默认位置(/etc/glance/)找到 glance-api-paste.ini,
  15.     # 然后根据用户的配置(是否启用 keystone等)调用 paste.loadapp 载入相应的 app,
  16.     # 最后传递给 server.start 启动 WSGI 应用, 具体的细节之后的系列会讲到
  17.     server = wsgi.Server()
  18.     server.start(config.load_paste_app('glance-api'), default_port=9292)
  19.     server.wait()
复制代码



API 框架
1.png
  1. # file: /etc/glance/glance-api-paste.ini
  2. [pipeline:glance-api-keystone]
  3. pipeline = versionnegotiation authtoken context rootapp
  4. [filter:versionnegotiation]
  5. paste.filter_factory = glance.api.middleware.version_negotiation:VersionNegotiationFilter.factory
  6. [filter:authtoken]
  7. paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory
  8. delay_auth_decision = true
  9. [filter:context]
  10. paste.filter_factory = glance.api.middleware.context:ContextMiddleware.factory
  11. [composite:rootapp]
  12. paste.composite_factory = glance.api:root_app_factory
  13. /: apiversions
  14. /v1: apiv1app
  15. /v2: apiv2app
复制代码

关于 paste 模块的使用说明, 请参考 python paste.deploy 探索

流程如下:
  • 首先 WSGI 接收到用户请求, 将用户的请求信息交给 paste 模块处理
  • paste 模块根据配置文件的规则依次经过 versionnegotiation authtoken context 这几个过滤器
  • 最后交由 rootapp, 这是个类型为 app 的处理, rootapp 内部再根据用户提供的版本 信息(v1/v2) 交由 apiv1app 或者 apiv2app 处理, 最后把返回 HTTP Response
  • 真正的业务逻辑在 apiv1app/apiv2app 内部实现, 见下面的处理流程



处理流程
apiv2app 定义的工厂方法在 glance/api/v2/router:API.factory 中, API 类继承自 wsgi.Router, Router 类利用了 python-route 模块做 url 的选择处理, 具体的流程 见下(详细的分析请参考后面的系列):
1.png




已有(2)人评论

跳转到指定楼层
355815741 发表于 2014-12-23 09:02:15
好东西,学习学习,谢谢分享~
回复

使用道具 举报

eason 发表于 2015-7-9 21:12:32
楼主,对于以下python api调用glance的程序,具体流程是怎样的
from glanceclient import Client

glance = Client('1', endpoint='http://192.168.239.136:9292', token='275a0e95160e4b90a551e78c3c243e25')
ima=glance.images.get('0fb18337-dcf0-46ab-bfe0-fdada303ef33')
print ima.name


就是说,glance.images调用get方法如何找到/glance/api/v1中代码执行并返回结果
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条