OpenStack Cinder源码分析之五

感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!
如果转载,请保留作者信息。
博客地址:http://blog.csdn.net/gaoxingnengjisuan
邮箱地址:dong.liu@siat.ac.cn


我们继续来整理代码,继续来看cinder中volume部分的代码。

/cinder/volume/qos_specs.py:QoS功能的实现;QoS(Quality of Service)服务质量,是网络的一种安全机制;是用来解决网络延迟和阻塞等问题的一种技术;在正常情况下,如果网络只用于特定的无时间限制的应用系统,并不需要QoS比如Web应用,或E-mail设置等;但是对关键应用和多媒体应用就十分必要;当网络过载或拥塞时,QoS能确保重要业务量不受延迟或丢弃,同时保证网络的高效运行;

    def create(context, name,specs=None):在数据库中建立一个qos_specs

    def update(context, qos_specs_id,specs):更新数据库中QOS功能的数据信息;

    def delete(context, qos_specs_id,force=False):标志QOS功能为删除标识;

    def delete_keys(context,qos_specs_id, keys):设置指定的目标QOS功能的标识为delete标识;

    def get_associations(context,specs_id):根据给定的qos_specs的id值获取所有相关的卷的类型信息;

    def associate_qos_with_type(context, specs_id, type_id):根据给定的卷的类型解除相关的qos_specs

    def disassociate_qos_specs(context,specs_id, type_id):解除卷类型从指定的qos_specs

    def disassociate_all(context,specs_id):从所有的实体中消除与specs_id相关联的qos_specs;

    def get_all_specs(context,inactive=False, search_opts={}):获取所有符合条件的qos_specs

    def get_qos_specs(ctxt, id):根据给定的id值获取单个的QOS功能;

    def get_qos_specs_by_name(context,name):根据给定的名称获取单个QOS功能的相关信息;


/cinder/volume/rpcapi.py:volume RPC API客户端;

    class VolumeAPI(cinder.openstack.common.rpc.proxy.RpcProxy):volume RPC API客户端;

        def create_volume(self, ctxt, volume, host, request_spec,filter_properties, allow_reschedule=True, snapshot_id=None, image_id=None,source_volid=None):远程调用实现建立并导出卷;

        def delete_volume(self, ctxt, volume):远程调用实现卷的删除;

        def create_snapshot(self, ctxt, volume, snapshot):调用存储后端的create_snapshot方法,实现远程调用实现建立并导出快照;

        def delete_snapshot(self, ctxt, snapshot, host):调用存储后端的delete_snapshot方法,实现远程调用实现删除快照;

        def attach_volume(self, ctxt, volume, instance_uuid, host_name,mountpoint, mode):远程调用实现卷的附加操作;调用具体存储后端的attach_volume方法,实现卷的附加操作,并更新数据库表明卷已经附加;

        def detach_volume(self, ctxt, volume):远程调用实现卷的卸载操作;

        def copy_volume_to_image(self, ctxt, volume, image_meta):远程调用实现上传指定的卷到Glance

        def initialize_connection(self, ctxt, volume, connector):远程调用实现初始化卷的连接操作;调用存储后端的initialize_connection方法,实现初始化卷的连接操作;

        def terminate_connection(self, ctxt, volume, connector, force=False):远程调用实现通过连接器从主机清理连接;调用存储后端的terminate_connection方法,实现通过连接器从主机清理连接;

        def publish_service_capabilities(self, ctxt):远程调用实现收集驱动的状态和capabilities信息,并进行信息的发布;

        def accept_transfer(self, ctxt, volume, new_user, new_project):调用存储后端的accept_transfer方法,实现存储器上卷的所有权的转换;指定了要转换所有权的卷volume、新的用户new_user和新的对象new_project;

        def extend_volume(self, ctxt, volume, new_size):远程调用实现卷大小的扩展操作;

        def migrate_volume(self, ctxt, volume, dest_host, force_host_copy):远程调用实现迁移卷到指定的主机;

        def migrate_volume_completion(self, ctxt, volume, new_volume, error):远程调用实现卷的迁移结束之后的操作;


/cinder/volume/utils.py:卷相关的实用工具和方法;


/cinder/volume/volume_types.py:内置卷的类型属性相关方法;

    def create(context, name,extra_specs={}):在数据库中建立一个新的卷的类型;

    def destroy(context, id):在数据库中删除卷的类型信息;

    def get_all_types(context,inactive=0, search_opts={}):获取所有数据库中没有删除的卷的类型;

    def get_volume_type(ctxt, id):根据给定id来检索获取单个的卷的类型;

    def get_volume_type_by_name(context, name):根据名称获取单个卷的类型;

    def get_default_volume_type():获取默认的卷的类型;

    def is_encrypted(context,volume_type_id):验证卷的类型是否是加密的;

    def get_volume_type_qos_specs(volume_type_id):根据给定的卷类型获取所有QOS功能相关的信息;


/cinder/volume/flows/base.py:flow的基类实现;

   def _make_task_name(cls,addons=None):获取任务类的名称;

    class CinderTask(task.Task):所有cinder任务的基类;

    class InjectTask(CinderTask):这个类实现了注入字典信息到flow中;


/cinder/volume/flows/utils.py:flow相关的一些实用工具;


/cinder/volume/flows/creat_volume/__init__.py:基于flow task管理方式的卷的建立的实现;

    class ExtractVolumeRequestTask(base.CinderTask):实现提取并验证处理卷的请求信息任务类;这个task的主要任务是提取和验证输入的值,这些输入的值将形成一个潜在的卷的请求信息;并且实现根据一组条件对这些输入值进行验证,并将这些输入值转换成有效的集合;并返回这些经过验证和转换的输入值,这些输入值将会应用于其他task中;

        def _extract_snapshot(snapshot):从给定的快照中提取快照的id信息;

        def _extract_source_volume(source_volume):从给定的卷中提取卷的id信息;

        def _extract_size(size, source_volume, snapshot):提取并验证卷的大小;

        def _check_image_metadata(self, context, image_id, size):检测镜像的存在性,并验证镜像的元数据中镜像大小的属性信息;

        def _check_metadata_properties(metadata=None):检测卷的元数据属性是有效的;

        def _extract_availability_zone(self, availability_zone, snapshot,source_volume):提取并返回一个经过验证的可用的zone

        def _get_encryption_key_id(self, key_manager, context, volume_type_id,snapshot, source_volume, backup_source_volume):获取加密密钥信息的id值;

        def _get_volume_type_id(self, volume_type, source_volume, snapshot,backup_source_volume):获取卷类型信息的id值;

        def __call__(self, context, size, snapshot, image_id, source_volume,availability_zone, volume_type, metadata, key_manager, backup_source_volume):这个task的主要任务是提取和验证输入的值,这些输入的值将形成一个潜在的卷的请求信息;并且实现根据一组条件对这些输入值进行验证,并将这些输入值转换成有效的集合;并返回这些经过验证和转换的输入值,这些输入值将会应用于其他task中。

    class EntryCreateTask(base.CinderTask):在数据库中为给定的卷建立条目;逆转操作:从数据库中删除volume_id建立的条目;

        def __call__(self, context, **kwargs):为给定的输入在数据库中建立数据条目,并返回详细信息;从kwargs中获取卷的相关属性值,并根据卷的相关属性值在数据库中实现新卷的建立;

        def revert(self, context, result, cause):删除指定的卷在数据库中的数据条目信息,实现逆转回滚操作;

    class QuotaReserveTask(base.CinderTask):根据给定的大小值和给定的卷类型信息实现保存单一的卷;

        def __call__(self, context, size, volume_type_id):根据给定的大小值和给定的卷类型信息实现保存单一的卷;

        def revert(self, context, result, cause):回调配额预留资源;

    class QuotaCommitTask(base.CinderTask):提交资源配额的预留信息到数据库中;

        def __call__(self, context, reservations, volume_properties):提交资源配额的预留信息到数据库中;

        def revert(self, context, result, cause):实现逆转回滚操作;

    class VolumeCastTask(base.CinderTask):远程调用实现卷的建立操作;

        def _cast_create_volume(self, context, request_spec, filter_properties):远程调用建立卷的方法,实现卷的建立操作;

        def __call__(self, context, **kwargs):远程调用实现卷的建立操作;

    class OnFailureChangeStatusTask(base.CinderTask):这个task实现了当出现错误时,设置指定id的卷的状态为ERROR;

    class OnFailureRescheduleTask(base.CinderTask):触发一个发送进行重新调度的请求,当进行task恢复回滚操作的时候;

        def __call__(self, context, *args, **kwargs):触发一个发送进行重新调度的请求,当进行task恢复回滚操作的时候;

        def _reschedule(self, context, cause, request_spec, filter_properties,snapshot_id, image_id, volume_id, **kwargs):实现重新调度的操作,并实现重新卷的建立操作;

        def _pre_reschedule(self, context, volume_id):实现重新调度操作前进行的一些操作;

        def revert(self, context, result, cause):实现任务task的回滚操作;

    class NotifySchedulerFailureTask(base.CinderTask):当任务出现错误后用于通知任务错误的task

    class ExtractSchedulerSpecTask(base.CinderTask):实现了从输入的参数中提取对象的规范信息的操作;

    class ExtractVolumeSpecTask(base.CinderTask):提取一个用于建立卷的通用结构规范;

        def __call__(self, context, volume_id, **kwargs):提取一个用于建立卷的通用结构规范;即获取specs和volume_ref的数据信息;

    class NotifyVolumeActionTask(base.CinderTask):执行关于给定卷的相关通知操作;获取指定卷的使用率信息,并进行通知操作;

    class CreateVolumeFromSpecTask(base.CinderTask):根据所提供的规范要求实现卷的建立操作;

        def _handle_bootable_volume_glance_meta(self, context, volume_id,**kwargs):根据具体情况实现对指定卷的glance元数据进行更新操作;调用者应该提供snapshot_id、source_volid和image_id三个参数之一,如果提供的是image_id,则还应该提供image_meta,否则则被视为空的字典;

        def _create_from_snapshot(self, context, volume_ref, snapshot_id,**kwargs):实现从快照建立卷的操作,并根据具体情况实现对指定卷的glance元数据进行更新操作;

        def _enable_bootable_flag(self, context, volume_id):确认bootable标志的值;

        def _create_from_source_volume(self, context, volume_ref, source_volid,**kwargs):实现从源卷建立(实际上就是直接拷贝)卷的操作;

        def _copy_image_to_volume(self, context, volume_ref, image_id,image_location, image_service):下载glance镜像数据到指定的卷;

        def _capture_volume_image_metadata(self, context, volume_id, image_id,image_meta):根据给定的image_meta为指定的卷更新Glance元数据;

        def _create_from_image(self, context, volume_ref, image_location,image_id, image_meta, image_service, **kwargs):从镜像实现卷的建立;

        def _create_raw_volume(self, context, volume_ref, **kwargs):实现raw格式卷的建立;

        def __call__(self, context, volume_ref, volume_spec):根据所提供的规范要求实现卷的建立操作;

    class CreateVolumeOnFinishTask(NotifyVolumeActionTask):当成功的建立卷之后,完成卷建立之后的通知操作;


    def get_api_flow(scheduler_rpcapi,volume_rpcapi, db, image_service, az_check_functor, create_what):构建并返回用于建立卷的flow;flow将会做如下的事情:1. 为相关的task注入keys和values;2. 提取并验证输入的keys和values;3. 保留配额数据(如果有错误,则恢复配额数据);4. 在数据库中建立条目;5. 提交资源配额的预留信息到数据库中;6. 远程调用实现卷的建立操作;

    def get_scheduler_flow(db, driver,request_spec=None, filter_properties=None, volume_id=None, snapshot_id=None,image_id=None):构建并返回用于通过远程调度建立卷的flow;flow将会做以下的事情:1. 为相关的task注入keys和values;2. 实现了从输入的参数中提取调度器的规范信息的操作;3. 对于出错的task进行处理,发送错误通知,记录错误信息等;4. 远程调用实现在主机上建立卷;

    def get_manager_flow(db, driver,scheduler_rpcapi, host, volume_id, request_spec=None, filter_properties=None,allow_reschedule=True, snapshot_id=None, image_id=None, source_volid=None,reschedule_context=None):构建并返回用于通过管理器建立卷的flow;flow将会做以下的事情:1. 首先要确定我们是否允许进行重新调度,因为这影响了我们如何对出现错误的情况进行处理;2.为相关的task注入keys和values;3. 对于出错的task进行处理,发送错误通知,记录错误信息等;4. 实现了从输入的参数中提取建立卷的规范信息的操作;5. 通知已经开始进行卷的建立操作;6. 根据所获取的建立卷的规范信息实现卷的建立操作;7. 当成功的建立卷之后,完成卷建立之后的通知操作;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值