简述
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