感谢朋友支持本博客,欢迎共同探讨交流,由于能力和时间有限,错误之处在所难免,欢迎指正!
如果转载,请保留作者信息。
博客地址: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. 当成功的建立卷之后,完成卷建立之后的通知操作;