Merge "Add new VIF type VIF_TYPE_TAP"

This commit is contained in:
Jenkins 2015-07-02 18:25:21 +00:00 committed by Gerrit Code Review
commit 6b4146e944
4 changed files with 60 additions and 0 deletions

View File

@ -42,6 +42,7 @@ VIF_TYPE_MIDONET = 'midonet'
VIF_TYPE_VHOSTUSER = 'vhostuser' VIF_TYPE_VHOSTUSER = 'vhostuser'
VIF_TYPE_VROUTER = 'vrouter' VIF_TYPE_VROUTER = 'vrouter'
VIF_TYPE_OTHER = 'other' VIF_TYPE_OTHER = 'other'
VIF_TYPE_TAP = 'tap'
# Constants for dictionary keys in the 'vif_details' field in the VIF # Constants for dictionary keys in the 'vif_details' field in the VIF
# class # class
@ -65,6 +66,10 @@ VIF_DETAILS_VHOSTUSER_SOCKET = 'vhostuser_socket'
# into ovs bridge. Valid values are True and False # into ovs bridge. Valid values are True and False
VIF_DETAILS_VHOSTUSER_OVS_PLUG = 'vhostuser_ovs_plug' VIF_DETAILS_VHOSTUSER_OVS_PLUG = 'vhostuser_ovs_plug'
# Constants for dictionary keys in the 'vif_details' field that are
# valid for VIF_TYPE_TAP.
VIF_DETAILS_TAP_MAC_ADDRESS = 'mac_address'
# Define supported virtual NIC types. VNIC_TYPE_DIRECT and VNIC_TYPE_MACVTAP # Define supported virtual NIC types. VNIC_TYPE_DIRECT and VNIC_TYPE_MACVTAP
# are used for SR-IOV ports # are used for SR-IOV ports
VNIC_TYPE_NORMAL = 'normal' VNIC_TYPE_NORMAL = 'normal'

View File

@ -2394,6 +2394,12 @@ class TestNeutronv2(TestNeutronv2Base):
self.assertTrue(net['should_create_bridge']) self.assertTrue(net['should_create_bridge'])
self.assertIsNone(iid) self.assertIsNone(iid)
def test_nw_info_build_network_tap(self):
net, iid = self._test_nw_info_build_network(model.VIF_TYPE_TAP)
self.assertIsNone(net['bridge'])
self.assertNotIn('should_create_bridge', net)
self.assertIsNone(iid)
def test_nw_info_build_network_other(self): def test_nw_info_build_network_other(self):
net, iid = self._test_nw_info_build_network(None) net, iid = self._test_nw_info_build_network(None)
self.assertIsNone(net['bridge']) self.assertIsNone(net['bridge'])

View File

@ -268,6 +268,11 @@ class LibvirtVifTestCase(test.NoDBTestCase):
type=network_model.VIF_TYPE_MIDONET, type=network_model.VIF_TYPE_MIDONET,
devname='tap-xxx-yyy-zzz') devname='tap-xxx-yyy-zzz')
vif_tap = network_model.VIF(id='vif-xxx-yyy-zzz',
address='ca:fe:de:ad:be:ef',
type=network_model.VIF_TYPE_TAP,
devname='tap-xxx-yyy-zzz')
vif_iovisor = network_model.VIF(id='vif-xxx-yyy-zzz', vif_iovisor = network_model.VIF(id='vif-xxx-yyy-zzz',
address='ca:fe:de:ad:be:ef', address='ca:fe:de:ad:be:ef',
network=network_bridge, network=network_bridge,
@ -1000,6 +1005,24 @@ class LibvirtVifTestCase(test.NoDBTestCase):
self._assertTypeAndMacEquals(node, "ethernet", "target", "dev", self._assertTypeAndMacEquals(node, "ethernet", "target", "dev",
self.vif_midonet, br_want) self.vif_midonet, br_want)
def test_tap_ethernet_vif_driver(self):
d = vif.LibvirtGenericVIFDriver()
br_want = self.vif_tap['devname']
xml = self._get_instance_xml(d, self.vif_tap)
node = self._get_node(xml)
self._assertTypeAndMacEquals(node, "ethernet", "target", "dev",
self.vif_tap, br_want)
@mock.patch('nova.network.linux_net.device_exists')
def test_plug_tap(self, device_exists):
device_exists.return_value = True
d = vif.LibvirtGenericVIFDriver()
d.plug_tap(None, self.vif_tap)
def test_unplug_tap(self):
d = vif.LibvirtGenericVIFDriver()
d.unplug_tap(None, self.vif_tap)
def test_generic_8021qbh_driver(self): def test_generic_8021qbh_driver(self):
d = vif.LibvirtGenericVIFDriver() d = vif.LibvirtGenericVIFDriver()
xml = self._get_instance_xml(d, self.vif_8021qbh) xml = self._get_instance_xml(d, self.vif_8021qbh)

View File

@ -318,6 +318,16 @@ class LibvirtGenericVIFDriver(object):
return conf return conf
def get_config_tap(self, instance, vif, image_meta,
inst_type, virt_type):
conf = self.get_base_config(instance, vif, image_meta,
inst_type, virt_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, def get_config_mlnx_direct(self, instance, vif, image_meta,
inst_type, virt_type): inst_type, virt_type):
conf = self.get_base_config(instance, vif, image_meta, conf = self.get_base_config(instance, vif, image_meta,
@ -535,6 +545,13 @@ class LibvirtGenericVIFDriver(object):
except processutils.ProcessExecutionError: except processutils.ProcessExecutionError:
LOG.exception(_LE("Failed while plugging vif"), instance=instance) LOG.exception(_LE("Failed while plugging vif"), instance=instance)
def plug_tap(self, instance, vif):
"""Plug a VIF_TYPE_TAP virtual interface."""
dev = self.get_vif_devname(vif)
mac = vif['details'].get(network_model.VIF_DETAILS_TAP_MAC_ADDRESS)
linux_net.create_tap_dev(dev, mac)
linux_net._set_device_mtu(dev)
def plug_vhostuser(self, instance, vif): def plug_vhostuser(self, instance, vif):
ovs_plug = vif['details'].get( ovs_plug = vif['details'].get(
network_model.VIF_DETAILS_VHOSTUSER_OVS_PLUG, network_model.VIF_DETAILS_VHOSTUSER_OVS_PLUG,
@ -721,6 +738,15 @@ class LibvirtGenericVIFDriver(object):
LOG.exception(_LE("Failed while unplugging vif"), LOG.exception(_LE("Failed while unplugging vif"),
instance=instance) instance=instance)
def unplug_tap(self, instance, vif):
"""Unplug a VIF_TYPE_TAP virtual interface."""
dev = self.get_vif_devname(vif)
try:
linux_net.delete_net_dev(dev)
except processutils.ProcessExecutionError:
LOG.exception(_LE("Failed while unplugging vif"),
instance=instance)
def unplug_iovisor(self, instance, vif): def unplug_iovisor(self, instance, vif):
"""Unplug using PLUMgrid IO Visor Driver """Unplug using PLUMgrid IO Visor Driver