nova event事件源码分析

简述

openstack项目中nova负责启动用户虚拟机,并将虚拟机的vif plug到对应的虚拟网络(ovs),neutron负责虚拟网络资源和连通性管理。二者之间需要交互,包括port的创建,网络信息缓存一致性以及port和物理主机的对应关系等。另外从云主机的使用角度来讲,当底层网络虚拟化不ok之前,用户的虚拟机是不应该active,否则会存在用户虚机启动但是底层网络异常的体验。因此nova设计了event事件机制,将vif plug到虚拟网络之后会发生等待;而neutron扫描到虚拟网络(ovs)上有新的端口时会上报up及相应处理,处理完毕调用nova事件机制对外提供的api发送相应的事件,nova收到正确的网络事件之后接触等待,完成虚拟机启动。

nova启动虚拟机的事件等待

在/nova/virt/libvirt/driver.py中 有如下代码:

    def _create_domain_and_network(self, context, xml, instance, network_info,
                                   disk_info, block_device_info=None,
                                   power_on=True, reboot=False,
                                   vifs_already_plugged=False):

        """Do required network setup and create domain."""
        ....#省略一些代码
        #此处运用contextlib with实现事件等待,具体参看博文http://blog.csdn.net/u013553406/article/details/51648681
        try:
            with self.virtapi.wait_for_instance_event(
                    instance, events, deadline=timeout,
                    error_callback=self._neutron_failed_callback):
                self.plug_vifs(instance, network_info)
                self.firewall_driver.setup_basic_filtering(instance,
                                                           network_info)
                self.firewall_driver.prepare_instance_filter(instance,
                                                             network_info)
                with self._lxc_disk_handler(instance, image_meta,
                                            block_device_info, disk_info):
                    guest = self._create_domain(
                        xml, pause=pause, power_on=power_on)

                self.firewall_driver.apply_instance_filter(instance,
                                                           network_info)
        except exception.VirtualInterfaceCreateException:
            # Neutron reported failure and we didn't swallow it, so
            # bail here
            with excutils.save_and_reraise_exception():
                if guest:
                    guest.poweroff()
                self.cleanup(context, instance, network_info=network_info,
                             block_device_info=block_device_info)
        except eventlet.timeout.Timeout:#event的timeout处理
            # We never heard from Neutron
            LOG.warn(_LW('Timeout waiting for vif 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值