Openstack liberty Glance上传镜像源码分析

本文由Ceph中国社区-Thomas独家投稿《Openstack liberty Glance上传镜像源码分析》

在Openstack中创建云主机,首先得有镜像,而Glance模块提供镜像服务功能,包括:镜像的发现、检索及存储等,主要包括:glance-api和glance-registery两个服务,分别负责镜像的存储和元数据管理。下面基于源码,分析下镜像的上传过程。

##上传镜像 先通过glance CLI上传镜像,来直观的了解下镜像上传的过程:

通过在命令行中开启–debug,我们可以发现,上传镜像过程中glance CLI会发送如下三个不同的请求:

这里写图片描述

这里写图片描述

这里写图片描述

那这三个请求分别干了什么事呢? 下面我们来一一分解。

##获取镜像属性定义 通过glance/api/v2/router.py.API中定义的路由映射,我们知道上述的第一个请求由glance/api/v2/schemas.py.Controller.image方法处理,如下:

self.image_schema在glance/api/v2/schemas.py.Controller.__init__方法中初始化:

它进一步调用glance/api/v2/images.py.ImagesController.get_schema方法:

最后来看看raw方法,实现很简单:调用父类的Schema返回镜像属性字典,同时更新additionalProperties属性,然后将属性字典返回给调用者

小结:第一个请求获取了镜像所支持的属性字典定义,下面就该根据这些信息来验证用户输入参数了。

##更新数据库 下面来分析第二个请求的处理过程,根据上述的–debug日志和路由映射,我们知道该请求由glance/api/v2/images.py.ImagesController.create方法处理:

接着来看看get_image_factory方法:

根据上面的分析,我画了下面的类图: 1

2

可以看到*ImageFactoryProxy类都继承自glance/domain/proxy.py.ImageFactory,通过类名也可以猜出它的功能:镜像工厂,那就是用来创建封装镜像对象的;各个子类也分别实现:权限检查、消息通知、策略检查、配额检查等。

另外各个*ImageFactoryProxy类都依赖于*ImageProxy类。而各*ImageProxy类都继承自glance/domain/proxy.py.Image,该类描述的是镜像的属性信息,包括:name,image_id, status等。各*ImageProxy类是对Image的扩展。

各个类的关系搞清楚下了,下面来看看new_image的实现:

为更直观的展现new_image的调用链,请看下面的序列图:

3

序列图中省略了各个ImageFactoryProxy.new_image方法中的其他处理过程。

可以看到new_image调用从最左边的 glance/api/authorization.py/ImageFactoryProxy一直到最深处(右数第三)的glance/domain/__init__.py/ImageFactory,它返回一个domain/__init__.py.Image对象,然后开始逐层往回 (location.py/ImageFactoryProxy到authorization.py/ImageFactoryProxy)调用glance/domain/proxy.py/Helper.proxy方法,最后的结果是:返回一个经过各个*ImageProxy层层封装的Image对象,如所示(从里到外):

看到上面Image的封装过程,有没有觉得很像TCP/IP协议栈的封包过程呢!有封包,就一定会有解包,下面一起来看看:

看图说话(类图见上面的图2):

4

咋一看,该序列图和上面的很像吧!这就对了。可以看到add调用从最左边的glance/api/authorization.py/ImageRepoProxy一直到最深处(右数二)的glance/db/__init__.py/ImageRepo,首先调用unproxy完成解包,然后记录数据库条目(这个时候可以在Dashboard上看到状态为’已排队’),接着开始逐层往回(location.py/ImageRepoProxy到authorization.py/ImageRepoProxy)调用glance/domain/proxy.py/Helper.proxy方法,和前述ImageFactoryProxy类一样,各ImageRepoProxy类也依次完成 :权限检查、属性配额检查、策略检查以及信息通知等,最后也是返回一个经过各个*ImageProxy层层封装的Image对象,以供后续使用。

小结:经过上面的分析,我们知道上传镜像过程中的第二个请求,主要完成权限检查,配额检查,策略检查,发布通知以及记录数据库等操作。下面来看看镜像文件的上传过程。

##上传镜像文件

根据前述glance CLI的debug日志及路由映射,我们可以很容易找到上传镜像文件的入口:

函数说明请查阅上面的注解,save方法与add方法的处理过程很类似,读者可以根据前面add的序列图做进一步分析;下面只给出set_data的序列图:

5

至此,上传镜像的过程就分析完了。希望对大家有用。今天是六一,在这里祝大家节日快乐!

Leave a Comment

电子邮件地址不会被公开。