cinder创建卷源码分析

Posted syw-home

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cinder创建卷源码分析相关的知识,希望对你有一定的参考价值。

创建卷

卷创建流程图

技术图片

 

 

 

 

卷创建时序图

技术图片

 

 

各模块的理解

cinder api

  1. cinder/cinder/inspur/api/v3/inspur_volumes.py
    1. VolumeInspurController.create方法对创建进行响应,首先对project_id, user_id, volume_type, snapshot, metadata等信息进行检查
    2. 然后调用volume_api的create的方法进行创建。【 volume_api指向inspur_api】
    3. inspur_api调用openstack原生的api进行create。【 Inspur_API继承了原生的API,复用了create方法】
  2. cinder/cinder/volume/api.py
    1. API.create方法对source_volume, volume_type, snapshot等信息再进行检查,调用create_volume.get_flow方法进行创建
  3. cinder/cinder/volume/flows/api/create_volume.py
    1. get_flow方法内包含有5个类
      1. ExtractVolumeRequestTask: 抽取请求的信息,并将字段转换成其他任务可用的格式
      2. QuotaReserveTask: 配额检查及占用,与mysql数据库有交互,检查配额使用情况,占用的时候,将请求的额度写入到mysql中的quota_usages表中的reserved字段;【cinder quota-usage admin # 展示admin项目下配额使用情况】
      3. EntryCreateTask: 调用cinder.objects.volume.Volume.create()方法在database中创建记录,此时卷的状态为creating
      4. QuotaCommitTask: 在数据库中进行配额的确认
      5. VolumeCastTask: 向scheduler_rpcapi投递create_volume创建卷的信息,涉及如下函数
        1. execute函数
        2. cast_create_volume函数
  4. cinder api完成了自己的工作

cinder scheduler

  1. cinder/cinder/scheduler/rpcapi.py (此步还属于cinder api层)
    1. SchedulerAPI.create_volume函数会通过消息队列异步调用SchedulerManager.create_volume函数。
  2. cinder/cinder/scheduler/manager.py
    1. SchedulerManager.create_volume函数,使用自己的flow来创建volume,其中还传入了driver, 该driver可理解为scheduler自己的过滤规则。
  3.  cinder/scheduler/flows/create_volume.py
    1.  get_flow函数,包含两个类
      1. ExtractSchedulerSpecTask: 对request_spec的信息进行补充
      2. ScheduleCreateVolumeTask, 其方法execute,会调用driver_api.schedule_create_volume
  4. cinder/cinder/scheduler/filter_scheduler.py
    1. 更新数据库, 主要对卷添加选择出来的存储后端信息
    2. 通过消息队列调用volume_rpcapi.create_volume

cinder volume

  1. cinder/cinder/volume/rpcapi.py
    1. VolumeAPI.create_volume会通过消息队列异步调用VolumeManager.create_volume
  2. cinder/cinder/volume/manager.py
    1. VolumeManager.create_volume方法中使用create_volume.get_flow()方法定义flow_engine任务流,并run之。【create_volume.get_flow(),来源cinder/cinder/volume/flows/manager/create_volume.py】
  3. cinder/cinder/volume/flows/manager/create_volume.py
    1. get_flow方法包含5个类,对应5个任务,如下
      1. ExtractVolumeRefTask: 参考volume_id获取整个volume信息
      2. OnFailureRescheduleTask: 当恢复回滚的时候,触发一个重新调度的请求
      3. ExtractVolumeSpecTask: 提取volume spec的信息
      4. NotifyVolumeActionTask: 创建消息通知
      5. CreateVolumeFromSpecTask: 调用driver创建volume
      6. CreateVolumeOnFinishTask: 创建成功的消息通知,并更新mysql数据库

以上是关于cinder创建卷源码分析的主要内容,如果未能解决你的问题,请参考以下文章

[源码分析]Kubernests-csi与Openstack-Cinder使用Ceph-rbd创建快照过程对比及源码分析

[源码分析]Kubernests-csi与Openstack-Cinder使用Ceph-rbd创建快照过程对比及源码分析

[源码分析]Kubernests-csi与Openstack-Cinder使用Ceph-rbd创建快照过程对比及源码分析

[源码分析]Kubernests-csi与Openstack-Cinder使用Ceph-rbd创建快照过程对比及源码分析

cinder api启动过程源码分析

kube-controller-manager源码分析-AD controller分析