openstack cinder volume创建流程以及源码分析(三)

本文基于openstack Stein 版本

上文中,volume创建经scheduler 已经rpc cast 传给了 volume.

(1) cinder\volume\manager.py
VolumeManager.create_volume 函数对创建请求进行响应,并调用cinder.volume.flows.api.get_flow来创建。。

OnFailureReschedulerTask 当scheduer失败时重试,ExtractVolumeSpecTask 获取volume创建spec内容,NotifyVolumeActionTask 通知volume 创建动作,最终开始干活 CreateVolumeFromSpecTask 创建volume,以及 CreateVolumeOnFinishTask 通知volume创建完成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cinder.volume.manager.VolumeManager.create_volume
try:
# NOTE(flaper87): Driver initialization is
# verified by the task itself.
flow_engine = create_volume.get_flow(
context_elevated,
self,
self.db,
self.driver,
self.scheduler_rpcapi,
self.host,
volume,
allow_reschedule,
context,
request_spec,
filter_properties,
image_volume_cache=self.image_volume_cache,
)
except Exception:
msg = _("Create manager volume flow failed.")
LOG.exception(msg, resource={'type': 'volume', 'id': volume.id})
raise exception.CinderException(msg)

CreateVolumeFromSpecTask 中又根据创建类型,是普通volume,还是image,还是备份还是快照等动作会有区别,这里已使用ceph的image创建为例,最终调用rbd的 _clone 函数clone 出一个块设备,最终resize 一下大小,同时更新根据image 元数据更新volume相关信息,最终更新volume 数据库相关信息。

CreateVolumeOnFinishTask 当volume创建完之后,更新volume 数据库状态信息。

支持volume 已经创建完成!