diff --git a/nova/tests/unit/virt/libvirt/test_vif.py b/nova/tests/unit/virt/libvirt/test_vif.py index 260148188ce3..46c9f65b6d65 100644 --- a/nova/tests/unit/virt/libvirt/test_vif.py +++ b/nova/tests/unit/virt/libvirt/test_vif.py @@ -576,6 +576,8 @@ class LibvirtVifTestCase(test.NoDBTestCase): self.assertEqual(pci_slot, pci_slot_want) def _assertXmlEqual(self, expectedXmlstr, actualXmlstr): + if not isinstance(actualXmlstr, six.string_types): + actualXmlstr = etree.tostring(actualXmlstr, pretty_print=True) self.assertThat(actualXmlstr, matchers.XMLMatches(expectedXmlstr)) def _get_conf(self): @@ -610,6 +612,8 @@ class LibvirtVifTestCase(test.NoDBTestCase): nic = driver.get_config(self.instance, vif, image_meta, flavor, CONF.libvirt.virt_type, hostimpl) + # TODO(stephenfin): There doesn't appear to be any reason we should do + # this: just return 'nic.to_xml()' and remove '_get_node' conf.add_device(nic) return conf.to_xml() @@ -1630,6 +1634,25 @@ class LibvirtVifTestCase(test.NoDBTestCase): """, cfg.to_xml()) + @mock.patch("nova.network.os_vif_util.nova_to_osvif_instance") + @mock.patch("nova.network.os_vif_util.nova_to_osvif_vif") + def test_config_os_vif_vhostuser(self, mock_convert_vif, + mock_convert_inst): + mock_convert_vif.return_value = self.os_vif_vhostuser + mock_convert_inst.return_value = self.os_vif_inst_info + + d = vif.LibvirtGenericVIFDriver() + xml = self._get_instance_xml(d, self.vif_vhostuser) + node = self._get_node(xml) + + self._assertXmlEqual(""" + + + + + """, node) + @mock.patch("nova.network.os_vif_util.nova_to_osvif_instance") @mock.patch("nova.network.os_vif_util.nova_to_osvif_vif") def test_config_os_vif_agilio_ovs_fallthrough(self, mock_convert_vif, diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py index 4b846b6c2bb9..c5b5a308e1b4 100644 --- a/nova/virt/libvirt/vif.py +++ b/nova/virt/libvirt/vif.py @@ -573,7 +573,11 @@ class LibvirtGenericVIFDriver(object): {'obj': vif.obj_name(), 'func': viffunc}) func(instance, vif, conf, host) - designer.set_vif_bandwidth_config(conf, inst_type) + # not all VIF types support bandwidth configuration + # https://github.com/libvirt/libvirt/blob/568a41722/src/conf/netdev_bandwidth_conf.h#L38 + if vif.obj_name() not in ('VIFVHostUser', 'VIFHostDevice'): + designer.set_vif_bandwidth_config(conf, inst_type) + if ('network' in vif and 'mtu' in vif.network and self._has_min_version_for_mtu(host)): designer.set_vif_mtu_config(conf, vif.network.mtu)