Nova attach volume的流程分析

这篇个人学习笔记详细介绍了OpenStack Nova中volume挂载的流程,包括发送挂载命令的API接口和RPCcast异步请求,以及挂载命令在nova-compute服务中的接收处理,涉及LibvirtDriver的挂载和target发现操作。
摘要由CSDN通过智能技术生成

作为个人学习笔记分享,有任何问题欢迎交流!

(2013.7.5更新)

Nova中volume挂载流程分为两部分:挂载命令的发送和接收处理

1 挂载命令的发送

1.1提供API接口

代码来源:nova/api/openstack/contrib/volumes.py:VolumeAttachmentController.create():

@wsgi.serializers(xml=VolumeAttachmentTemplate)
    def create(self, req, server_id, body):
        """Attach a volume to an instance."""
        context = req.environ['nova.context']
        authorize(context)
        authorize_attach(context, action='create')

        if not self.is_valid_body(body, 'volumeAttachment'):
            raise exc.HTTPUnprocessableEntity()
#从请求中获取卷ID和设备名称
        volume_id = body['volumeAttachment']['volumeId'] 
        device = body['volumeAttachment'].get('device')

        self._validate_volume_id(volume_id)

        msg = _("Attach volume %(volume_id)s to instance %(server_id)s"
                " at %(device)s") % locals()
        LOG.audit(msg, context=context)
		
        try:
            instance = self.compute_api.get(context, server_id)#compute_api=compute.API(),compute.API()即为/nova/compute/__init__.py:API(*args,**kwargs),该函数导入了一个类,被导入的类是由_compute_opts中compute_api_class决定的,compute_api_class的默认值为:nova.compute.api.API,所以get()既是nova/compute/api.py:API.get(),根据实例ID获取一个实例。
            device = self.compute_api.attach_volume(context, instance,
                                                    volume_id, device)#挂载一个存在的卷到一个存在的实例
        except exception.NotFound:
            raise exc.HTTPNotFound()
        except exception.InstanceInvalidState as state_error:
            common.raise_http_conflict_for_instance_invalid_state(state_error,
                    'attach_volume')

1.2发送RPCcast异步请求,给instance挂载上volume_id,挂载点在device.

代码来源:nova/compute/api.py:API.attach_volume(context, instance, volume_id,device)

#volume_api=nova/volume/cinder/api.py:API
  try:
            volume = self.volume_api.get(context, volume_id)通过cinderclient从cinder获取volume.
            self.volume_api.check_attach(context, volume, instance=instance)#检查volume是否可用
            self.volume_api.reserve_volume(context, volume)
            self.compute_rpcapi.attach_volume(context, instance=instance,
                    volume_id=volume_id, mountpoint=device)#compute_rpcapi=nova/compute/rpcapi.py:ComputeAPI
        except Exception:
            with excutils.save_and_reraise_exception():
                self.db.block_device_mapping_destroy_by_instance_and_device(
                        context, instance['uuid'], device)

#nova/compute/rpcapi.py:ComputeAPI.attach_volume():
def attach_volume(self, ctxt, instance, volume_id, mountpoint):
        instance_p = jsonutils.to_primitive(instance)
        self.cast(ctxt, self.make_msg('attach_volume',#cast调用
                instance=instance_p, volume_id=volume_id,
                mountpoint
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值