Merge "Read datapath_type from VIF object"
This commit is contained in:
commit
6097e397fb
@ -171,20 +171,32 @@ class VIFPortProfileBase(osv_base.VersionedObject,
|
||||
@base.VersionedObjectRegistry.register
|
||||
class VIFPortProfileOpenVSwitch(VIFPortProfileBase):
|
||||
# Port profile info for OpenVSwitch networks
|
||||
|
||||
VERSION = '1.0'
|
||||
# Version 1.0: Initial release
|
||||
# Version 1.1: Added 'datapath_type'
|
||||
VERSION = '1.1'
|
||||
|
||||
fields = {
|
||||
'interface_id': fields.UUIDField(),
|
||||
'profile_id': fields.StringField(),
|
||||
|
||||
# Datapath type of the bridge
|
||||
'datapath_type': fields.StringField(nullable=True),
|
||||
}
|
||||
|
||||
def obj_make_compatible(self, primitive, target_version):
|
||||
super(VIFPortProfileOpenVSwitch, self).obj_make_compatible(
|
||||
primitive, target_version)
|
||||
target_version = versionutils.convert_version_to_tuple(target_version)
|
||||
if target_version < (1, 1) and 'datapath_type' in primitive:
|
||||
del primitive['datapath_type']
|
||||
|
||||
|
||||
@base.VersionedObjectRegistry.register
|
||||
class VIFPortProfileFPOpenVSwitch(VIFPortProfileOpenVSwitch):
|
||||
# Port profile info for OpenVSwitch networks using fastpath
|
||||
|
||||
VERSION = '1.0'
|
||||
# Version 1.0: Initial release
|
||||
# Version 1.1: VIFPortProfileOpenVSwitch updated to 1.1
|
||||
VERSION = '1.1'
|
||||
|
||||
fields = {
|
||||
# Name of the bridge (managed by fast path) to connect to
|
||||
@ -194,12 +206,19 @@ class VIFPortProfileFPOpenVSwitch(VIFPortProfileOpenVSwitch):
|
||||
'hybrid_plug': fields.BooleanField(default=False),
|
||||
}
|
||||
|
||||
def obj_make_compatible(self, primitive, target_version):
|
||||
target_version = versionutils.convert_version_to_tuple(target_version)
|
||||
if target_version < (1, 1):
|
||||
super(VIFPortProfileFPOpenVSwitch, self).obj_make_compatible(
|
||||
primitive, "1.0")
|
||||
|
||||
|
||||
@base.VersionedObjectRegistry.register
|
||||
class VIFPortProfileOVSRepresentor(VIFPortProfileOpenVSwitch):
|
||||
# Port profile info for OpenVSwitch networks using a representor
|
||||
|
||||
VERSION = '1.0'
|
||||
# Version 1.0: Initial release
|
||||
# Version 1.1: VIFPortProfileOpenVSwitch updated to 1.1
|
||||
VERSION = '1.1'
|
||||
|
||||
fields = {
|
||||
# Name to set on the representor (if set)
|
||||
@ -209,6 +228,12 @@ class VIFPortProfileOVSRepresentor(VIFPortProfileOpenVSwitch):
|
||||
'representor_address': fields.PCIAddressField(nullable=True),
|
||||
}
|
||||
|
||||
def obj_make_compatible(self, primitive, target_version):
|
||||
target_version = versionutils.convert_version_to_tuple(target_version)
|
||||
if target_version < (1, 1):
|
||||
super(VIFPortProfileOVSRepresentor, self).obj_make_compatible(
|
||||
primitive, "1.0")
|
||||
|
||||
|
||||
@base.VersionedObjectRegistry.register
|
||||
class VIFPortProfileFPBridge(VIFPortProfileBase):
|
||||
|
@ -58,12 +58,26 @@ class TestVIFS(base.TestCase):
|
||||
def test_vif_bridge_ovs(self):
|
||||
prof = objects.vif.VIFPortProfileOpenVSwitch(
|
||||
interface_id="07bd6cea-fb37-4594-b769-90fc51854ee9",
|
||||
profile_id="fishfood")
|
||||
profile_id="fishfood",
|
||||
datapath_type='netdev')
|
||||
self._test_vif(objects.vif.VIFOpenVSwitch,
|
||||
vif_name="vif123",
|
||||
bridge_name="br0",
|
||||
port_profile=prof)
|
||||
|
||||
def test_vif_bridge_ovs_backport_1_0(self):
|
||||
obj = objects.vif.VIFPortProfileOpenVSwitch(
|
||||
interface_id="07bd6cea-fb37-4594-b769-90fc51854ee9",
|
||||
profile_id="fishfood",
|
||||
datapath_type='netdev')
|
||||
primitive = obj.obj_to_primitive(target_version='1.0')
|
||||
self.assertEqual('1.0', primitive['versioned_object.version'])
|
||||
data = primitive['versioned_object.data']
|
||||
self.assertEqual('07bd6cea-fb37-4594-b769-90fc51854ee9',
|
||||
data['interface_id'])
|
||||
self.assertEqual('fishfood', data['profile_id'])
|
||||
self.assertNotIn('datapath_type', data)
|
||||
|
||||
def test_vif_direct_plain(self):
|
||||
self._test_vif(objects.vif.VIFDirect,
|
||||
vif_name="vif123",
|
||||
@ -98,6 +112,7 @@ class TestVIFS(base.TestCase):
|
||||
prof = objects.vif.VIFPortProfileFPOpenVSwitch(
|
||||
interface_id="07bd6cea-fb37-4594-b769-90fc51854ee8",
|
||||
profile_id="fishfood",
|
||||
datapath_type='netdev',
|
||||
bridge_name="br-int",
|
||||
hybrid_plug=False)
|
||||
self._test_vif(objects.vif.VIFVHostUser,
|
||||
@ -106,10 +121,28 @@ class TestVIFS(base.TestCase):
|
||||
vif_name="tap123",
|
||||
port_profile=prof)
|
||||
|
||||
def test_vif_vhost_user_fp_ovs_backport_1_0(self):
|
||||
obj = objects.vif.VIFPortProfileFPOpenVSwitch(
|
||||
interface_id="07bd6cea-fb37-4594-b769-90fc51854ee9",
|
||||
profile_id="fishfood",
|
||||
datapath_type='netdev',
|
||||
bridge_name="br-int",
|
||||
hybrid_plug=False)
|
||||
primitive = obj.obj_to_primitive(target_version='1.0')
|
||||
self.assertEqual('1.0', primitive['versioned_object.version'])
|
||||
data = primitive['versioned_object.data']
|
||||
self.assertEqual('07bd6cea-fb37-4594-b769-90fc51854ee9',
|
||||
data['interface_id'])
|
||||
self.assertEqual('fishfood', data['profile_id'])
|
||||
self.assertEqual('br-int', data['bridge_name'])
|
||||
self.assertEqual(False, data['hybrid_plug'])
|
||||
self.assertNotIn('datapath_type', data)
|
||||
|
||||
def test_vif_vhost_user_ovs_representor(self):
|
||||
prof = objects.vif.VIFPortProfileOVSRepresentor(
|
||||
interface_id="07bd6cea-fb37-4594-b769-90fc51854ee8",
|
||||
profile_id="fishfood",
|
||||
datapath_type='netdev',
|
||||
representor_name="tap123",
|
||||
representor_address="0002:24:12.3")
|
||||
self._test_vif(objects.vif.VIFVHostUser,
|
||||
@ -118,6 +151,23 @@ class TestVIFS(base.TestCase):
|
||||
vif_name="tap123",
|
||||
port_profile=prof)
|
||||
|
||||
def test_vif_vhost_user_ovs_representor_backport_1_0(self):
|
||||
obj = objects.vif.VIFPortProfileOVSRepresentor(
|
||||
interface_id="07bd6cea-fb37-4594-b769-90fc51854ee9",
|
||||
profile_id="fishfood",
|
||||
datapath_type='netdev',
|
||||
representor_name="tap123",
|
||||
representor_address="0002:24:12.3")
|
||||
primitive = obj.obj_to_primitive(target_version='1.0')
|
||||
self.assertEqual('1.0', primitive['versioned_object.version'])
|
||||
data = primitive['versioned_object.data']
|
||||
self.assertEqual('07bd6cea-fb37-4594-b769-90fc51854ee9',
|
||||
data['interface_id'])
|
||||
self.assertEqual('fishfood', data['profile_id'])
|
||||
self.assertEqual('tap123', data['representor_name'])
|
||||
self.assertEqual("0002:24:12.3", data['representor_address'])
|
||||
self.assertNotIn('datapath_type', data)
|
||||
|
||||
def test_vif_vhost_user_fp_lb(self):
|
||||
prof = objects.vif.VIFPortProfileFPBridge(bridge_name="brq456")
|
||||
self._test_vif(objects.vif.VIFVHostUser,
|
||||
@ -168,12 +218,12 @@ object_data = {
|
||||
'VIFPortProfile8021Qbg': '1.0-167f305f6e982b9368cc38763815d429',
|
||||
'VIFPortProfile8021Qbh': '1.0-4b945f07d2666ab00a48d1dc225669b1',
|
||||
'VIFPortProfileBase': '1.0-77509ea1ea0dd750d5864b9bd87d3f9d',
|
||||
'VIFPortProfileOpenVSwitch': '1.0-533126c2a16b1a40ddf38c33e7b1f1c5',
|
||||
'VIFPortProfileFPOpenVSwitch': '1.0-9fc1799cb0adcd469481653b0420dc5e',
|
||||
'VIFPortProfileOpenVSwitch': '1.1-70d36e09c8d800345ce71177265212df',
|
||||
'VIFPortProfileFPOpenVSwitch': '1.1-74e77f46aa5806930df6f37a0b76ff8b',
|
||||
'VIFPortProfileFPBridge': '1.0-d50872b3cddd245ffebef6053dfbe27a',
|
||||
'VIFPortProfileFPTap': '1.0-11670d8dbabd772ff0da26961adadc5a',
|
||||
'VIFVHostUser': '1.1-1f95b43be1f884f090ca1f4d79adfd35',
|
||||
'VIFPortProfileOVSRepresentor': '1.0-d1b67d954bcab8378c8064771d62ecd5',
|
||||
'VIFPortProfileOVSRepresentor': '1.1-30e555981003a109b133da5b43ded5df',
|
||||
}
|
||||
|
||||
|
||||
|
@ -106,9 +106,17 @@ class OvsPlugin(plugin.PluginBase):
|
||||
mtu = self._get_mtu(vif)
|
||||
linux_net.update_ovs_vif_port(vif_name, mtu)
|
||||
|
||||
@staticmethod
|
||||
def _get_vif_datapath_type(vif, datapath=constants.OVS_DATAPATH_SYSTEM):
|
||||
profile = vif.port_profile
|
||||
if 'datapath_type' not in profile or not profile.datapath_type:
|
||||
return datapath
|
||||
return profile.datapath_type
|
||||
|
||||
def _plug_vhostuser(self, vif, instance_info):
|
||||
linux_net.ensure_ovs_bridge(vif.network.bridge,
|
||||
constants.OVS_DATAPATH_NETDEV)
|
||||
linux_net.ensure_ovs_bridge(
|
||||
vif.network.bridge, self._get_vif_datapath_type(
|
||||
vif, datapath=constants.OVS_DATAPATH_NETDEV))
|
||||
vif_name = OvsPlugin.gen_port_name(
|
||||
constants.OVS_VHOSTUSER_PREFIX, vif.id)
|
||||
args = {}
|
||||
@ -141,7 +149,7 @@ class OvsPlugin(plugin.PluginBase):
|
||||
linux_net.create_veth_pair(v1_name, v2_name, mtu)
|
||||
linux_net.add_bridge_port(vif.bridge_name, v1_name)
|
||||
linux_net.ensure_ovs_bridge(vif.network.bridge,
|
||||
constants.OVS_DATAPATH_SYSTEM)
|
||||
self._get_vif_datapath_type(vif))
|
||||
self._create_vif_port(vif, v2_name, instance_info)
|
||||
else:
|
||||
linux_net.update_veth_pair(v1_name, v2_name, mtu)
|
||||
@ -152,7 +160,7 @@ class OvsPlugin(plugin.PluginBase):
|
||||
|
||||
if not linux_net.device_exists(vif.id):
|
||||
linux_net.ensure_ovs_bridge(vif.network.bridge,
|
||||
constants.OVS_DATAPATH_SYSTEM)
|
||||
self._get_vif_datapath_type(vif))
|
||||
self._create_vif_port(vif, vif.id, instance_info)
|
||||
|
||||
def _plug_vf_passthrough(self, vif, instance_info):
|
||||
@ -177,7 +185,7 @@ class OvsPlugin(plugin.PluginBase):
|
||||
if isinstance(vif, objects.vif.VIFOpenVSwitch):
|
||||
if sys.platform != constants.PLATFORM_WIN32:
|
||||
linux_net.ensure_ovs_bridge(vif.network.bridge,
|
||||
constants.OVS_DATAPATH_SYSTEM)
|
||||
self._get_vif_datapath_type(vif))
|
||||
else:
|
||||
self._plug_vif_windows(vif, instance_info)
|
||||
elif isinstance(vif, objects.vif.VIFBridge):
|
||||
|
@ -56,7 +56,12 @@ class PluginTest(testtools.TestCase):
|
||||
mtu=1234)
|
||||
|
||||
self.profile_ovs = objects.vif.VIFPortProfileOpenVSwitch(
|
||||
interface_id='e65867e0-9340-4a7f-a256-09af6eb7a3aa')
|
||||
interface_id='e65867e0-9340-4a7f-a256-09af6eb7a3aa',
|
||||
datapath_type='netdev')
|
||||
|
||||
self.profile_ovs_no_datatype = objects.vif.VIFPortProfileOpenVSwitch(
|
||||
interface_id='e65867e0-9340-4a7f-a256-09af6eb7a3aa',
|
||||
datapath_type='')
|
||||
|
||||
self.vif_ovs_hybrid = objects.vif.VIFBridge(
|
||||
id='b679325f-ca89-4ee0-a8be-6db1409b69ea',
|
||||
@ -64,7 +69,7 @@ class PluginTest(testtools.TestCase):
|
||||
network=self.network_ovs,
|
||||
dev_name='tap-xxx-yyy-zzz',
|
||||
bridge_name="qbrvif-xxx-yyy",
|
||||
port_profile=self.profile_ovs)
|
||||
port_profile=self.profile_ovs_no_datatype)
|
||||
|
||||
self.vif_ovs = objects.vif.VIFOpenVSwitch(
|
||||
id='b679325f-ca89-4ee0-a8be-6db1409b69ea',
|
||||
@ -102,6 +107,16 @@ class PluginTest(testtools.TestCase):
|
||||
name='demo',
|
||||
uuid='f0000000-0000-0000-0000-000000000001')
|
||||
|
||||
def test__get_vif_datapath_type(self):
|
||||
plugin = ovs.OvsPlugin.load('ovs')
|
||||
dp_type = plugin._get_vif_datapath_type(
|
||||
self.vif_ovs, datapath=constants.OVS_DATAPATH_SYSTEM)
|
||||
self.assertEqual(self.profile_ovs.datapath_type, dp_type)
|
||||
|
||||
dp_type = plugin._get_vif_datapath_type(
|
||||
self.vif_ovs_hybrid, datapath=constants.OVS_DATAPATH_SYSTEM)
|
||||
self.assertEqual(constants.OVS_DATAPATH_SYSTEM, dp_type)
|
||||
|
||||
@mock.patch.object(linux_net, 'create_ovs_vif_port')
|
||||
def test_create_vif_port(self, mock_create_ovs_vif_port):
|
||||
plugin = ovs.OvsPlugin.load('ovs')
|
||||
@ -139,9 +154,9 @@ class PluginTest(testtools.TestCase):
|
||||
plugin = ovs.OvsPlugin.load("ovs")
|
||||
plugin._plug_bridge = plug_bridge_mock
|
||||
plugin.plug(self.vif_ovs, self.instance)
|
||||
plug_bridge_mock.assert_not_called()
|
||||
ensure_ovs_bridge.assert_called_once_with(
|
||||
self.vif_ovs.network.bridge, constants.OVS_DATAPATH_SYSTEM)
|
||||
dp_type = ovs.OvsPlugin._get_vif_datapath_type(self.vif_ovs)
|
||||
ensure_ovs_bridge.assert_called_once_with(self.vif_ovs.network.bridge,
|
||||
dp_type)
|
||||
|
||||
@mock.patch.object(linux_net, 'set_interface_state')
|
||||
@mock.patch.object(linux_net, 'ensure_ovs_bridge')
|
||||
@ -158,6 +173,7 @@ class PluginTest(testtools.TestCase):
|
||||
add_bridge_port, _create_vif_port,
|
||||
_update_vif_port, ensure_ovs_bridge,
|
||||
set_interface_state):
|
||||
dp_type = ovs.OvsPlugin._get_vif_datapath_type(self.vif_ovs_hybrid)
|
||||
calls = {
|
||||
'device_exists': [mock.call('qvob679325f-ca')],
|
||||
'create_veth_pair': [mock.call('qvbb679325f-ca',
|
||||
@ -176,8 +192,7 @@ class PluginTest(testtools.TestCase):
|
||||
'_create_vif_port': [mock.call(self.vif_ovs_hybrid,
|
||||
'qvob679325f-ca',
|
||||
self.instance)],
|
||||
'ensure_ovs_bridge': [mock.call('br0',
|
||||
constants.OVS_DATAPATH_SYSTEM)]
|
||||
'ensure_ovs_bridge': [mock.call('br0', dp_type)]
|
||||
}
|
||||
|
||||
# plugging new devices should result in devices being created
|
||||
@ -216,11 +231,11 @@ class PluginTest(testtools.TestCase):
|
||||
@mock.patch.object(ovs, 'sys')
|
||||
def _check_plug_ovs_windows(self, vif, mock_sys, device_exists,
|
||||
_create_vif_port, ensure_ovs_bridge):
|
||||
dp_type = ovs.OvsPlugin._get_vif_datapath_type(vif)
|
||||
calls = {
|
||||
'device_exists': [mock.call(vif.id)],
|
||||
'_create_vif_port': [mock.call(vif, vif.id, self.instance)],
|
||||
'ensure_ovs_bridge': [mock.call('br0',
|
||||
constants.OVS_DATAPATH_SYSTEM)]
|
||||
'ensure_ovs_bridge': [mock.call('br0', dp_type)]
|
||||
}
|
||||
|
||||
mock_sys.platform = constants.PLATFORM_WIN32
|
||||
@ -276,14 +291,14 @@ class PluginTest(testtools.TestCase):
|
||||
@mock.patch.object(linux_net, 'ensure_ovs_bridge')
|
||||
@mock.patch.object(ovs.OvsPlugin, '_create_vif_port')
|
||||
def test_plug_ovs_vhostuser(self, _create_vif_port, ensure_ovs_bridge):
|
||||
dp_type = ovs.OvsPlugin._get_vif_datapath_type(self.vif_vhostuser)
|
||||
calls = {
|
||||
|
||||
'_create_vif_port': [mock.call(
|
||||
self.vif_vhostuser, 'vhub679325f-ca',
|
||||
self.instance,
|
||||
interface_type='dpdkvhostuser')],
|
||||
'ensure_ovs_bridge': [mock.call('br0',
|
||||
constants.OVS_DATAPATH_NETDEV)]
|
||||
'ensure_ovs_bridge': [mock.call('br0', dp_type)]
|
||||
}
|
||||
|
||||
plugin = ovs.OvsPlugin.load("ovs")
|
||||
@ -295,6 +310,8 @@ class PluginTest(testtools.TestCase):
|
||||
@mock.patch.object(linux_net, 'create_ovs_vif_port')
|
||||
def test_plug_ovs_vhostuser_client(self, create_ovs_vif_port,
|
||||
ensure_ovs_bridge):
|
||||
dp_type = ovs.OvsPlugin._get_vif_datapath_type(
|
||||
self.vif_vhostuser_client)
|
||||
calls = {
|
||||
'create_ovs_vif_port': [
|
||||
mock.call(
|
||||
@ -305,8 +322,7 @@ class PluginTest(testtools.TestCase):
|
||||
1500, interface_type='dpdkvhostuserclient',
|
||||
vhost_server_path='/var/run/openvswitch/vhub679325f-ca',
|
||||
timeout=120)],
|
||||
'ensure_ovs_bridge': [mock.call('br0',
|
||||
constants.OVS_DATAPATH_NETDEV)]
|
||||
'ensure_ovs_bridge': [mock.call('br0', dp_type)]
|
||||
}
|
||||
|
||||
plugin = ovs.OvsPlugin.load("ovs")
|
||||
|
Loading…
Reference in New Issue
Block a user