OpenStack-Cinder创卷代码走读(Grizzly)END

来源:互联网 发布:门户网站访问效率优化 编辑:程序博客网 时间:2024/06/10 19:46

25.volume_rpcapi.create_volume是调用manager.py中的create_volume方法,   该方法先从数据库中取出volume的信息,然后调用  volume_utils.notify_about_volume_usage方法(是不是通知RabbitMQ?)。然后继续从volume信息中取vol_name,vol_size,并且如果入参中有snapshot_id,说明从快照创建卷,则从DB中取该snapshot的信息,如果入参中有source_volID,说明是从已有卷创建卷,则从DB中取该源卷信息,如果入参中有image_id,说明是从镜像创建卷,则从glance中获取镜像服务器信息,镜像ID,镜像位置,镜像的metadata.然后调用该类的私有方法_create_volume,该方法首先判断如果snapshot_ref,imag_id,srcvol_ref都是空,则说明是创建一个空卷,就调用driver.create_volume去创卷,如果有snapshot_ref参数,则调用driver.create_volume_from_snapshot方法去创卷,如果请求中有源卷的参数,则调用driver.create_cloned_volume去创卷(实际上就是克隆一个卷)。如果请求中有镜像参数,则调用driver.clone_image方法去创卷,如果clone_image失败,则调用普通创卷方法先创建个空卷,然后将卷状态置为downloading,然后调用_copy_image_to_volume方法把镜像内容拷贝入卷中。

26._create_volume方法会有两个返回值,model_update和cloned.如果有创卷中有异常,会判断如果是根据源卷创建的话,则回滚源卷的状态。同时从新进行调度。

27.如果返回值model_update为true,会在数据库中更新创建好的卷,同时如果是从卷创建卷的方式时,还有把源卷的Glance metadata拷贝一份给新的卷,也就是说新卷将保留源卷的metadata.

28.然后会调用driver.create_export方法,这个方式似乎是根据不同的存储返回卷的位置,例如huawei iscsi driver中返回的是lun_id.

29.流程继续,会根据请求如果有snapshot_id,也会拷贝Glance metadata(应该是这个快照对应的卷的metadata)给新卷。如果是从image创建卷的方式,如果image有metadata,也会拷贝镜像的属性到volume_glance_metadata表中。会写入这个卷对应镜像的ID,名称及其他属性。

30.最后更新数据库中的卷状态和创建时间,并调用_notify_about_volume_usage方法通知“create.end”,并返回卷ID。

原创粉丝点击