diff --git a/nova/tests/fake_network.py b/nova/tests/fake_network.py index 42ce71dedb0..15343adda91 100644 --- a/nova/tests/fake_network.py +++ b/nova/tests/fake_network.py @@ -54,7 +54,7 @@ def __init__(self, *args, **kwargs): def setattr(self, key, val): self.__setattr__(key, val) - def get_config(self, instance, network, mapping, image_meta): + def get_config(self, instance, network, mapping, image_meta, inst_type): conf = libvirt_config.LibvirtConfigGuestInterface() for attr, val in conf.__dict__.iteritems(): diff --git a/nova/tests/test_libvirt_vif.py b/nova/tests/test_libvirt_vif.py index 6160105ce0b..20b56f88ea0 100644 --- a/nova/tests/test_libvirt_vif.py +++ b/nova/tests/test_libvirt_vif.py @@ -17,6 +17,7 @@ from lxml import etree from oslo.config import cfg +from nova.compute import instance_types from nova import exception from nova.network import model as network_model from nova import test @@ -160,6 +161,15 @@ class LibvirtVifTestCase(test.TestCase): 'uuid': 'instance-uuid' } + bandwidth = { + 'quota:vif_inbound_peak': '102400', + 'quota:vif_outbound_peak': '102400', + 'quota:vif_inbound_average': '102400', + 'quota:vif_outbound_average': '102400', + 'quota:vif_inbound_burst': '102400', + 'quota:vif_inbound_burst': '102400' + } + def setUp(self): super(LibvirtVifTestCase, self).setUp() self.flags(allow_same_net_traffic=True) @@ -179,7 +189,13 @@ def _get_instance_xml(self, driver, net, mapping, image_meta=None): conf.memory = 100 * 1024 conf.vcpus = 4 - nic = driver.get_config(self.instance, net, mapping, image_meta) + default_inst_type = instance_types.get_default_instance_type() + extra_specs = default_inst_type['extra_specs'].items() + quota_bandwith = self.bandwidth.items() + default_inst_type['extra_specs'] = dict(extra_specs + quota_bandwith) + + nic = driver.get_config(self.instance, net, mapping, image_meta, + default_inst_type) conf.add_device(nic) return conf.to_xml() @@ -322,6 +338,10 @@ def get_connection(): self.mapping_bridge) doc = etree.fromstring(xml) + + ret = doc.findall('./devices/interface/bandwidth') + self.assertEqual(len(ret), 1) + ret = doc.findall('./devices/interface') self.assertEqual(len(ret), 1) node = ret[0] diff --git a/nova/virt/libvirt/designer.py b/nova/virt/libvirt/designer.py index 8dc579300b8..85641fa31fb 100644 --- a/nova/virt/libvirt/designer.py +++ b/nova/virt/libvirt/designer.py @@ -100,7 +100,7 @@ def set_vif_host_backend_802qbh_config(conf, devname, profileid, conf.target_dev = tapname -def set_vif_bandwidth_config(conf, extra_specs): +def set_vif_bandwidth_config(conf, inst_type): """Config vif inbound/outbound bandwidth limit. parameters are set in instance_type_extra_specs table, key is in the format quota:vif_inbound_average. @@ -109,7 +109,7 @@ def set_vif_bandwidth_config(conf, extra_specs): bandwidth_items = ['vif_inbound_average', 'vif_inbound_peak', 'vif_inbound_burst', 'vif_outbound_average', 'vif_outbound_peak', 'vif_outbound_burst'] - for key, value in extra_specs.iteritems(): + for key, value in inst_type['extra_specs'].iteritems(): scope = key.split(':') if len(scope) > 1 and scope[0] == 'quota': if scope[1] in bandwidth_items: diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index ed8e7a1dbc8..fd4f5c4dbc7 100755 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -2256,7 +2256,8 @@ def get_guest_config(self, instance, network_info, image_meta, for (network, mapping) in network_info: cfg = self.vif_driver.get_config(instance, network, mapping, - image_meta) + image_meta, + inst_type) guest.add_device(cfg) if CONF.libvirt_type == "qemu" or CONF.libvirt_type == "kvm": diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py index c8a87bd3c88..f18021ef491 100644 --- a/nova/virt/libvirt/vif.py +++ b/nova/virt/libvirt/vif.py @@ -92,7 +92,7 @@ def get_vif_devname(self, mapping): return mapping['vif_devname'] return ("nic" + mapping['vif_uuid'])[:network_model.NIC_NAME_LEN] - def get_config(self, instance, network, mapping, image_meta): + def get_config(self, instance, network, mapping, image_meta, inst_type): conf = vconfig.LibvirtConfigGuestInterface() # Default to letting libvirt / the hypervisor choose the model model = None @@ -159,13 +159,14 @@ def get_firewall_required(self): return True return False - def get_config_bridge(self, instance, network, mapping, image_meta): + def get_config_bridge(self, instance, network, mapping, image_meta, + inst_type): """Get VIF configurations for bridge type.""" conf = super(LibvirtGenericVIFDriver, self).get_config(instance, network, mapping, - image_meta) + image_meta, inst_type) designer.set_vif_host_backend_bridge_config( conf, self.get_bridge_name(network), @@ -175,28 +176,30 @@ def get_config_bridge(self, instance, network, mapping, image_meta): name = "nova-instance-" + instance['name'] + "-" + mac_id if self.get_firewall_required(): conf.filtername = name - designer.set_vif_bandwidth_config(conf, instance) + designer.set_vif_bandwidth_config(conf, inst_type) return conf - def get_config_ovs_ethernet(self, instance, network, mapping, image_meta): + def get_config_ovs_ethernet(self, instance, network, mapping, + image_meta, inst_type): conf = super(LibvirtGenericVIFDriver, self).get_config(instance, network, mapping, - image_meta) + image_meta, inst_type) dev = self.get_vif_devname(mapping) designer.set_vif_host_backend_ethernet_config(conf, dev) return conf - def get_config_ovs_bridge(self, instance, network, mapping, image_meta): + def get_config_ovs_bridge(self, instance, network, mapping, image_meta, + inst_type): conf = super(LibvirtGenericVIFDriver, self).get_config(instance, network, mapping, - image_meta) + image_meta, inst_type) designer.set_vif_host_backend_ovs_config( conf, self.get_bridge_name(network), @@ -205,34 +208,40 @@ def get_config_ovs_bridge(self, instance, network, mapping, image_meta): return conf - def get_config_ovs_hybrid(self, instance, network, mapping, image_meta): + def get_config_ovs_hybrid(self, instance, network, mapping, image_meta, + inst_type): newnet = copy.deepcopy(network) newnet['bridge'] = self.get_br_name(mapping['vif_uuid']) return self.get_config_bridge(instance, newnet, mapping, - image_meta) + image_meta, inst_type) - def get_config_ovs(self, instance, network, mapping, image_meta): + def get_config_ovs(self, instance, network, mapping, image_meta, + inst_type): if self.get_firewall_required(): return self.get_config_ovs_hybrid(instance, network, mapping, - image_meta) + image_meta, + inst_type) elif self.has_libvirt_version(LIBVIRT_OVS_VPORT_VERSION): return self.get_config_ovs_bridge(instance, network, mapping, - image_meta) + image_meta, + inst_type) else: return self.get_config_ovs_ethernet(instance, network, mapping, - image_meta) + image_meta, + inst_type) - def get_config_802qbg(self, instance, network, mapping, image_meta): + def get_config_802qbg(self, instance, network, mapping, image_meta, + inst_type): conf = super(LibvirtGenericVIFDriver, self).get_config(instance, network, mapping, - image_meta) + image_meta, inst_type) params = mapping["qbg_params"] designer.set_vif_host_backend_802qbg_config( @@ -244,12 +253,13 @@ def get_config_802qbg(self, instance, network, mapping, image_meta): return conf - def get_config_802qbh(self, instance, network, mapping, image_meta): + def get_config_802qbh(self, instance, network, mapping, image_meta, + inst_type): conf = super(LibvirtGenericVIFDriver, self).get_config(instance, network, mapping, - image_meta) + image_meta, inst_type) params = mapping["qbh_params"] designer.set_vif_host_backend_802qbh_config( @@ -258,7 +268,7 @@ def get_config_802qbh(self, instance, network, mapping, image_meta): return conf - def get_config(self, instance, network, mapping, image_meta): + def get_config(self, instance, network, mapping, image_meta, inst_type): vif_type = mapping.get('vif_type') LOG.debug(_("vif_type=%(vif_type)s instance=%(instance)s " @@ -273,19 +283,23 @@ def get_config(self, instance, network, mapping, image_meta): if vif_type == network_model.VIF_TYPE_BRIDGE: return self.get_config_bridge(instance, network, mapping, - image_meta) + image_meta, + inst_type) elif vif_type == network_model.VIF_TYPE_OVS: return self.get_config_ovs(instance, network, mapping, - image_meta) + image_meta, + inst_type) elif vif_type == network_model.VIF_TYPE_802_QBG: return self.get_config_802qbg(instance, network, mapping, - image_meta) + image_meta, + inst_type) elif vif_type == network_model.VIF_TYPE_802_QBH: return self.get_config_802qbh(instance, network, mapping, - image_meta) + image_meta, + inst_type) else: raise exception.NovaException( _("Unexpected vif_type=%s") % vif_type) @@ -496,8 +510,9 @@ class LibvirtBridgeDriver(LibvirtGenericVIFDriver): drivers which do not yet report 'vif_type' port binding. Will be deprecated in Havana, and removed in Ixxxx.""" - def get_config(self, instance, network, mapping, image_meta): - return self.get_config_bridge(instance, network, mapping, image_meta) + def get_config(self, instance, network, mapping, image_meta, inst_type): + return self.get_config_bridge(instance, network, mapping, image_meta, + inst_type) def plug(self, instance, vif): self.plug_bridge(instance, vif) @@ -517,10 +532,10 @@ def get_bridge_name(self, network): def get_ovs_interfaceid(self, mapping): return mapping.get('ovs_interfaceid') or mapping['vif_uuid'] - def get_config(self, instance, network, mapping, image_meta): + def get_config(self, instance, network, mapping, image_meta, inst_type): return self.get_config_ovs_ethernet(instance, network, mapping, - image_meta) + image_meta, inst_type) def plug(self, instance, vif): self.plug_ovs_ethernet(instance, vif) @@ -540,10 +555,11 @@ def get_bridge_name(self, network): def get_ovs_interfaceid(self, mapping): return mapping.get('ovs_interfaceid') or mapping['vif_uuid'] - def get_config(self, instance, network, mapping, image_meta): + def get_config(self, instance, network, mapping, image_meta, inst_type): return self.get_config_ovs_hybrid(instance, network, mapping, - image_meta) + image_meta, + inst_type) def plug(self, instance, vif): return self.plug_ovs_hybrid(instance, vif) @@ -563,10 +579,11 @@ def get_bridge_name(self, network): def get_ovs_interfaceid(self, mapping): return mapping.get('ovs_interfaceid') or mapping['vif_uuid'] - def get_config(self, instance, network, mapping, image_meta): + def get_config(self, instance, network, mapping, image_meta, inst_type): return self.get_config_ovs_bridge(instance, network, mapping, - image_meta) + image_meta, + inst_type) def plug(self, instance, vif): return self.plug_ovs_bridge(instance, vif) @@ -584,12 +601,13 @@ def get_bridge_name(self, network): def_bridge = ("brq" + network['id'])[:network_model.NIC_NAME_LEN] return network.get('bridge') or def_bridge - def get_config(self, instance, network, mapping, image_meta): + def get_config(self, instance, network, mapping, image_meta, inst_type): # In order for libvirt to make use of the bridge name then it has # to ensure that the bridge exists if 'should_create_bridge' not in mapping: mapping['should_create_bridge'] = True - return self.get_config_bridge(instance, network, mapping, image_meta) + return self.get_config_bridge(instance, network, mapping, image_meta, + inst_type) def plug(self, instance, vif): self.plug_bridge(instance, vif)