openstack nova和neutron之间的event通信机制

1 前言在看openstack中的nova代码的时候,创建虚拟机和热迁移的时候,nova侧会创建event时间机制,然后会wait阻塞,直至neutron发送相应的通知消息。代码如下: def _create_guest_with_network(self, context, xml, instance, network_info, block_device_info, power_on=True,
摘要由CSDN通过智能技术生成

1 前言

在看openstack中的nova代码的时候,创建虚拟机和热迁移的时候,nova侧会创建event时间机制,然后会wait阻塞,直至neutron发送相应的通知消息。代码如下:

    def _create_guest_with_network(self, context, xml, instance, network_info,
                                   block_device_info, power_on=True,
                                   vifs_already_plugged=False,
                                   post_xml_callback=None,
                                   external_events=None,
                                   cleanup_instance_dir=False,
                                   cleanup_instance_disks=False):

        timeout = CONF.vif_plugging_timeout
        if (
            CONF.libvirt.virt_type in ('kvm', 'qemu') and
            not vifs_already_plugged and power_on and timeout
        ):
            events = (external_events if external_events
                      else self._get_neutron_events(network_info))
        else:
            events = []

        pause = bool(events)
        guest: libvirt_guest.Guest = None
        try:
            with self.virtapi.wait_for_instance_event(
                    instance, events, deadline=timeout,
                    error_callback=self._neutron_failed_callback):
                self.plug_vifs(instance, network_info)
                with self._lxc_disk_handler(context, instance,
                                            instance.image_meta,
                                            block_device_info):
                    guest = self._create_guest(
                        context, xml, instance,
                        pause=pause, power_on=power_on,
                        post_xml_callback=post_xml_callback)
        .......

上述代码中的virtapi.wait_for_instance_event函数调用的是nova.nova.compute.manager.ComputeVirtAPI.wait_for_instance_event中的函数,该函数的作用是创建相应的事件。

并且将创建的事件用如下形式保存在nova.nova.compute.manager.InstanceEvents对象中

{
    "instance_uuid":{
        ("network-vif-plugged", "vif_uuid1", object:event1)
        ("network-vif-plugged", "vif_uuid2", object:event2)
    }
}

后面neutron组件再通过调用novaclinet接口:nova.nova.api.openstack.compute.server_external_events.ServerExternalEventsController.create,通过instance_uuid,选择某个instance中的event,再根据传入的name和tag,决定调用哪个event进行send。

因为上面用到了with、yield和event等关键字,下面将对这些用法进行分析

2 python中yield的作用

首先应该明白一些基本概念

1. 什么是迭代器,什么是生成器,迭代器和生成器之间有什么区别

迭代器:迭代只是访问集合元素的一种方式,迭代器有两个基本方法:iter()和next()。简单来说,字符串、元组和列表都是迭代器。只不过这些变量(迭代对象)在遍历的时候自动调用next()方法。

生成器:在python中,只要使用了yield的函数,被称为生成器(generator)。和普通函数不同的是,生成

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值