diff options
author | Jenkins <jenkins@review.openstack.org> | 2013-10-22 11:20:14 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2013-10-22 11:20:14 +0000 |
commit | c29d4509031d5d5d5421a92d075afc2620da5244 (patch) | |
tree | 44b87b7f1cbaa4af87098225774167b1aa30bab5 /nova | |
parent | 9acef6431d436d0fc1dea770b60d46804508db1f (diff) | |
parent | 3fb9c58138e3f8f927163455749aad1673dcf4d2 (diff) | |
download | nova-c29d4509031d5d5d5421a92d075afc2620da5244.tar.gz |
Merge "Plug Vif into Midonet using Neutron port binding"
Diffstat (limited to 'nova')
-rw-r--r-- | nova/network/model.py | 1 | ||||
-rw-r--r-- | nova/tests/virt/libvirt/test_libvirt_vif.py | 21 | ||||
-rw-r--r-- | nova/virt/libvirt/vif.py | 52 |
3 files changed, 74 insertions, 0 deletions
diff --git a/nova/network/model.py b/nova/network/model.py index b8905a59ec..e11bfeb7ac 100644 --- a/nova/network/model.py +++ b/nova/network/model.py @@ -37,6 +37,7 @@ VIF_TYPE_BRIDGE = 'bridge' VIF_TYPE_802_QBG = '802.1qbg' VIF_TYPE_802_QBH = '802.1qbh' VIF_TYPE_MLNX_DIRECT = 'mlnx_direct' +VIF_TYPE_MIDONET = 'midonet' VIF_TYPE_OTHER = 'other' # Constant for max length of network interface names diff --git a/nova/tests/virt/libvirt/test_libvirt_vif.py b/nova/tests/virt/libvirt/test_libvirt_vif.py index a43e4a89ec..dd9040d3cf 100644 --- a/nova/tests/virt/libvirt/test_libvirt_vif.py +++ b/nova/tests/virt/libvirt/test_libvirt_vif.py @@ -164,12 +164,24 @@ class LibvirtVifTestCase(test.TestCase): subnet_bridge_6], interface='eth0') + network_midonet = network_model.Network(id='network-id-xxx-yyy-zzz', + label=None, + bridge=None, + subnets=[subnet_bridge_4], + interface='eth0') + vif_mlnx = network_model.VIF(id='vif-xxx-yyy-zzz', address='ca:fe:de:ad:be:ef', network=network_mlnx, type=network_model.VIF_TYPE_MLNX_DIRECT, devname='tap-xxx-yyy-zzz') + vif_midonet = network_model.VIF(id='vif-xxx-yyy-zzz', + address='ca:fe:de:ad:be:ef', + network=network_midonet, + type=network_model.VIF_TYPE_MIDONET, + devname='tap-xxx-yyy-zzz') + instance = { 'name': 'instance-name', 'uuid': 'instance-uuid' @@ -514,6 +526,15 @@ class LibvirtVifTestCase(test.TestCase): self._assertMacEquals(node, self.vif_mlnx) self._assertModel(xml, "virtio") + def test_midonet_ethernet_vif_driver(self): + d = vif.LibvirtGenericVIFDriver(self._get_conn()) + self.flags(firewall_driver="nova.virt.firewall.NoopFirewallDriver") + br_want = self.vif_midonet['devname'] + xml = self._get_instance_xml(d, self.vif_midonet) + node = self._get_node(xml) + self._assertTypeAndMacEquals(node, "ethernet", "target", "dev", + self.vif_midonet, br_want) + def test_generic_8021qbh_driver(self): d = vif.LibvirtGenericVIFDriver(self._get_conn()) xml = self._get_instance_xml(d, self.vif_8021qbh) diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py index 1bb8f62ce9..a77df372f3 100644 --- a/nova/virt/libvirt/vif.py +++ b/nova/virt/libvirt/vif.py @@ -301,6 +301,17 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): return conf + def get_config_midonet(self, instance, vif, image_meta, + inst_type): + conf = super(LibvirtGenericVIFDriver, + self).get_config(instance, vif, + image_meta, inst_type) + + dev = self.get_vif_devname(vif) + designer.set_vif_host_backend_ethernet_config(conf, dev) + + return conf + def get_config_mlnx_direct(self, instance, vif, image_meta, inst_type): conf = super(LibvirtGenericVIFDriver, @@ -359,6 +370,11 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): vif, image_meta, inst_type) + elif vif_type == network_model.VIF_TYPE_MIDONET: + return self.get_config_midonet(instance, + vif, + image_meta, + inst_type) else: raise exception.NovaException( _("Unexpected vif_type=%s") % vif_type) @@ -511,6 +527,22 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): super(LibvirtGenericVIFDriver, self).plug(instance, vif) + def plug_midonet(self, instance, vif): + """Plug into MidoNet's network port + + Bind the vif to a MidoNet virtual port. + """ + super(LibvirtGenericVIFDriver, + self).plug(instance, vif) + dev = self.get_vif_devname(vif) + port_id = vif['id'] + try: + linux_net.create_tap_dev(dev) + utils.execute('mm-ctl', '--bind-port', port_id, dev, + run_as_root=True) + except processutils.ProcessExecutionError: + LOG.exception(_("Failed while plugging vif"), instance=instance) + def plug_iovisor(self, instance, vif): """Plug using PLUMgrid IO Visor Driver @@ -561,6 +593,8 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): self.plug_iovisor(instance, vif) elif vif_type == network_model.VIF_TYPE_MLNX_DIRECT: self.plug_mlnx_direct(instance, vif) + elif vif_type == network_model.VIF_TYPE_MIDONET: + self.plug_midonet(instance, vif) else: raise exception.NovaException( _("Unexpected vif_type=%s") % vif_type) @@ -675,6 +709,22 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): super(LibvirtGenericVIFDriver, self).unplug(instance, vif) + def unplug_midonet(self, instance, vif): + """Unplug from MidoNet network port + + Unbind the vif from a MidoNet virtual port. + """ + super(LibvirtGenericVIFDriver, + self).unplug(instance, vif) + dev = self.get_vif_devname(vif) + port_id = vif['id'] + try: + utils.execute('mm-ctl', '--unbind-port', port_id, + run_as_root=True) + linux_net.delete_net_dev(dev) + except processutils.ProcessExecutionError: + LOG.exception(_("Failed while unplugging vif"), instance=instance) + def unplug_iovisor(self, instance, vif): """Unplug using PLUMgrid IO Visor Driver @@ -722,6 +772,8 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): self.unplug_iovisor(instance, vif) elif vif_type == network_model.VIF_TYPE_MLNX_DIRECT: self.unplug_mlnx_direct(instance, vif) + elif vif_type == network_model.VIF_TYPE_MIDONET: + self.unplug_midonet(instance, vif) else: raise exception.NovaException( _("Unexpected vif_type=%s") % vif_type) |