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

本文基于openstack Stein 版本

1. cinder 创建整体流程

openstack cinder volume创建流程以及源码分析(一)_第1张图片

如整体架构图所示,创建卷涉及的答题步骤主要有以下几步: a. Client发送请求,通过RESTFUL接口访问cinder-api。 b. Api解析响应请求,api解析由Client发送来的请求,并通过rpc进一步调用cinder-scheduler。 c. Scheduler对资源进行调度,scheduler选择合适的节点进行。 d. Volume调用Driver创建卷,volume通过指定Driver进行卷的创建。

2. 源码详解

(1) cinder\api\v3\volumes.py VolumeController. create函数对创建请求进行响应,首先函数对name, size,volume_type、metadata、snapshot等信息进行获取,然后调用Volume API的create进行创建。

cinder.api.v3.volumes.VolumeController.create:
    # 对name,size,volume_type、metadata、snapshot等信息进行获取
    new_volume = self.volume_api.create(context,
                                            size,
                                            volume.get('display_name'),
                                            volume.get('display_description'),
                                            **kwargs)

(2) cinder\volume\api.py API.create函数对source_volume、volume_type等参数进行进一步检查,确保无误,并调用cinder.volume.flows.api.get_flow来创建。

cinder.volume.api.API.create:
     try:
            sched_rpcapi = (self.scheduler_rpcapi if (
                            not cgsnapshot and not source_cg and
                            not group_snapshot and not source_group)
                            else None)
            volume_rpcapi = (self.volume_rpcapi if (
                             not cgsnapshot and not source_cg and
                             not group_snapshot and not source_group)
                             else None)
            flow_engine = create_volume.get_flow(self.db,
                                                 self.image_service,
                                                 availability_zones,
                                                 create_what,
                                                 sched_rpcapi,
                                                 volume_rpcapi)
        except Exception:
            msg = _('Failed to create api volume flow.')
            LOG.exception(msg)
            raise exception.CinderException(msg)

(3) cinder\volume\flows\api\create_volume.py get_flow函数检查Quata配额,最后创建EntryCreateTask及VolumeCastTask等任务, 其中EntryCreateTask会将卷的创建过程写入数据库,此时卷的状态为”creating”。 VolumeCastTask.excute函数会调用VoumeCastTask.cast_create_volume VolumeCastTask.cast_create_volume函数,如果未传入host,则会经过调度进行创建卷,通过scheduler_rpcapi.create_volume创建卷;如果未传入host则直接交由Volume Manager去创建卷。

cinder.volume.flows.api.create_volume.VolumeCastTask._cast_create_volume:
  self.scheduler_rpcapi.create_volume(
            context,
            volume,
            snapshot_id=snapshot_id,
            image_id=image_id,
            request_spec=request_spec,
            filter_properties=filter_properties,
            backup_id=backup_id)

至此为止,Cinder API部分完成了自己的工作。

你可能感兴趣的:(openstack,云计算)