LOG.exception(_("Unable to retrieve OVS kernel module version."))
+def get_installed_kernel_version():
+ args = ["uname", "-r"]
+ try:
+ cmd = utils.execute(args)
+ for line in cmd.split('\n'):
+ return str(re.findall("\d+\.\d+\.\d+", line))
+ except Exception:
+ LOG.exception(_("Unable to retrieve installed Linux kernel version."))
+
+
def get_bridge_external_bridge_id(root_helper, bridge):
args = ["ovs-vsctl", "--timeout=2", "br-get-external-id",
bridge, "bridge-id"]
def _compare_installed_and_required_version(
- installed_version, required_version, check_type, version_type):
+ installed_kernel_version, installed_version, required_version,
+ check_type, version_type):
+ if installed_kernel_version:
+ if dist_version.StrictVersion(
+ installed_kernel_version) >= dist_version.StrictVersion(
+ constants.MINIMUM_LINUX_KERNEL_OVS_VXLAN):
+ return
if installed_version:
if dist_version.StrictVersion(
installed_version) < dist_version.StrictVersion(
def check_ovs_vxlan_version(root_helper):
min_required_version = constants.MINIMUM_OVS_VXLAN_VERSION
installed_klm_version = get_installed_ovs_klm_version()
+ installed_kernel_version = get_installed_kernel_version()
installed_usr_version = get_installed_ovs_usr_version(root_helper)
LOG.debug(_("Checking OVS version for VXLAN support "
- "installed klm version is %s "), installed_klm_version)
- LOG.debug(_("Checking OVS version for VXLAN support "
- "installed usr version is %s"), installed_usr_version)
+ "installed klm version is %(klm)s, installed Linux version is "
+ "%(kernel)s, installed user version is %(usr)s ") %
+ {'klm': installed_klm_version,
+ 'kernel': installed_kernel_version,
+ 'usr': installed_usr_version})
# First check the userspace version
- _compare_installed_and_required_version(installed_usr_version,
+ _compare_installed_and_required_version(None, installed_usr_version,
min_required_version,
'userspace', 'VXLAN')
# Now check the kernel version
- _compare_installed_and_required_version(installed_klm_version,
+ _compare_installed_and_required_version(installed_kernel_version,
+ installed_klm_version,
min_required_version,
'kernel', 'VXLAN')
# The minimum version of OVS which supports VXLAN tunneling
MINIMUM_OVS_VXLAN_VERSION = "1.10"
+# The first version of the Linux kernel with converged VXLAN code for OVS
+MINIMUM_LINUX_KERNEL_OVS_VXLAN = "3.13.0"
+
# The different types of tunnels
TUNNEL_NETWORK_TYPES = [p_const.TYPE_GRE, p_const.TYPE_VXLAN]
NOTIFIER = ('neutron.plugins.ml2.rpc.AgentNotifierApi')
+OVS_LINUX_KERN_VERS_WITHOUT_VXLAN = "3.12.0"
class OFAAgentTestCase(base.BaseTestCase):
def _check_ovs_vxlan_version(self, installed_usr_version,
installed_klm_version,
+ installed_kernel_version,
expecting_ok):
with mock.patch(
'neutron.agent.linux.ovs_lib.get_installed_ovs_klm_version'
with mock.patch(
'neutron.agent.linux.ovs_lib.get_installed_ovs_usr_version'
) as usr_cmd:
- try:
- klm_cmd.return_value = installed_klm_version
- usr_cmd.return_value = installed_usr_version
- self.agent.tunnel_types = 'vxlan'
- self.agent._check_ovs_version()
- version_ok = True
- except SystemExit as e:
- self.assertEqual(e.code, 1)
- version_ok = False
- self.assertEqual(version_ok, expecting_ok)
+ with mock.patch(
+ 'neutron.agent.linux.ovs_lib.get_installed_kernel_version'
+ ) as krn_cmd:
+ try:
+ klm_cmd.return_value = installed_klm_version
+ usr_cmd.return_value = installed_usr_version
+ krn_cmd.return_value = installed_kernel_version
+ self.agent.tunnel_types = 'vxlan'
+ self.agent._check_ovs_version()
+ version_ok = True
+ except SystemExit as e:
+ self.assertEqual(e.code, 1)
+ version_ok = False
+ self.assertEqual(version_ok, expecting_ok)
def test_check_minimum_version(self):
min_vxlan_ver = constants.MINIMUM_OVS_VXLAN_VERSION
+ min_kernel_ver = constants.MINIMUM_LINUX_KERNEL_OVS_VXLAN
self._check_ovs_vxlan_version(min_vxlan_ver, min_vxlan_ver,
- expecting_ok=True)
+ min_kernel_ver, expecting_ok=True)
def test_check_future_version(self):
install_ver = str(float(constants.MINIMUM_OVS_VXLAN_VERSION) + 0.01)
+ min_kernel_ver = constants.MINIMUM_LINUX_KERNEL_OVS_VXLAN
self._check_ovs_vxlan_version(install_ver, install_ver,
- expecting_ok=True)
+ min_kernel_ver, expecting_ok=True)
def test_check_fail_version(self):
install_ver = str(float(constants.MINIMUM_OVS_VXLAN_VERSION) - 0.01)
+ min_kernel_ver = constants.MINIMUM_LINUX_KERNEL_OVS_VXLAN
self._check_ovs_vxlan_version(install_ver, install_ver,
- expecting_ok=False)
+ min_kernel_ver, expecting_ok=False)
def test_check_fail_no_version(self):
+ min_kernel_ver = constants.MINIMUM_LINUX_KERNEL_OVS_VXLAN
self._check_ovs_vxlan_version(None, None,
- expecting_ok=False)
+ min_kernel_ver, expecting_ok=False)
def test_check_fail_klm_version(self):
min_vxlan_ver = constants.MINIMUM_OVS_VXLAN_VERSION
+ min_kernel_ver = OVS_LINUX_KERN_VERS_WITHOUT_VXLAN
install_ver = str(float(min_vxlan_ver) - 0.01)
self._check_ovs_vxlan_version(min_vxlan_ver, install_ver,
- expecting_ok=False)
+ min_kernel_ver, expecting_ok=False)
def test_daemon_loop_uses_polling_manager(self):
with mock.patch(
from neutron.tests import base
from neutron.tests import tools
+OVS_LINUX_KERN_VERS_WITHOUT_VXLAN = "3.12.0"
+
class TestBaseOVS(base.BaseTestCase):
def _check_ovs_vxlan_version(self, installed_usr_version,
installed_klm_version,
+ installed_kernel_version,
expecting_ok):
with mock.patch(
'neutron.agent.linux.ovs_lib.get_installed_ovs_klm_version'
with mock.patch(
'neutron.agent.linux.ovs_lib.get_installed_ovs_usr_version'
) as usr_cmd:
- try:
- klm_cmd.return_value = installed_klm_version
- usr_cmd.return_value = installed_usr_version
- ovs_lib.check_ovs_vxlan_version(root_helper='sudo')
- version_ok = True
- except SystemError:
- version_ok = False
- self.assertEqual(version_ok, expecting_ok)
+ with mock.patch(
+ 'neutron.agent.linux.ovs_lib.get_installed_kernel_version'
+ ) as kernel_cmd:
+ try:
+ klm_cmd.return_value = installed_klm_version
+ usr_cmd.return_value = installed_usr_version
+ kernel_cmd.return_value = installed_kernel_version
+ ovs_lib.check_ovs_vxlan_version(root_helper='sudo')
+ version_ok = True
+ except SystemError:
+ version_ok = False
+ self.assertEqual(version_ok, expecting_ok)
def test_check_minimum_version(self):
min_vxlan_ver = constants.MINIMUM_OVS_VXLAN_VERSION
+ min_kernel_ver = constants.MINIMUM_LINUX_KERNEL_OVS_VXLAN
self._check_ovs_vxlan_version(min_vxlan_ver, min_vxlan_ver,
- expecting_ok=True)
+ min_kernel_ver, expecting_ok=True)
def test_check_future_version(self):
install_ver = str(float(constants.MINIMUM_OVS_VXLAN_VERSION) + 0.01)
+ min_kernel_ver = constants.MINIMUM_LINUX_KERNEL_OVS_VXLAN
self._check_ovs_vxlan_version(install_ver, install_ver,
- expecting_ok=True)
+ min_kernel_ver, expecting_ok=True)
def test_check_fail_version(self):
install_ver = str(float(constants.MINIMUM_OVS_VXLAN_VERSION) - 0.01)
+ min_kernel_ver = constants.MINIMUM_LINUX_KERNEL_OVS_VXLAN
self._check_ovs_vxlan_version(install_ver, install_ver,
- expecting_ok=False)
+ min_kernel_ver, expecting_ok=False)
def test_check_fail_no_version(self):
+ min_kernel_ver = constants.MINIMUM_LINUX_KERNEL_OVS_VXLAN
self._check_ovs_vxlan_version(None, None,
+ min_kernel_ver,
expecting_ok=False)
def test_check_fail_klm_version(self):
min_vxlan_ver = constants.MINIMUM_OVS_VXLAN_VERSION
+ min_kernel_ver = OVS_LINUX_KERN_VERS_WITHOUT_VXLAN
install_ver = str(float(min_vxlan_ver) - 0.01)
self._check_ovs_vxlan_version(min_vxlan_ver,
install_ver,
+ min_kernel_ver,
expecting_ok=False)
+
+ def test_check_pass_kernel_version(self):
+ min_vxlan_ver = constants.MINIMUM_OVS_VXLAN_VERSION
+ min_kernel_ver = constants.MINIMUM_LINUX_KERNEL_OVS_VXLAN
+ self._check_ovs_vxlan_version(min_vxlan_ver, min_vxlan_ver,
+ min_kernel_ver, expecting_ok=True)
NOTIFIER = ('neutron.plugins.openvswitch.'
'ovs_neutron_plugin.AgentNotifierApi')
+OVS_LINUX_KERN_VERS_WITHOUT_VXLAN = "3.12.0"
class CreateAgentConfigMap(base.BaseTestCase):
def _check_ovs_vxlan_version(self, installed_usr_version,
installed_klm_version,
+ installed_kernel_version,
expecting_ok):
with mock.patch(
'neutron.agent.linux.ovs_lib.get_installed_ovs_klm_version'
with mock.patch(
'neutron.agent.linux.ovs_lib.get_installed_ovs_usr_version'
) as usr_cmd:
- try:
- klm_cmd.return_value = installed_klm_version
- usr_cmd.return_value = installed_usr_version
- self.agent.tunnel_types = 'vxlan'
- self.agent._check_ovs_version()
- version_ok = True
- except SystemExit as e:
- self.assertEqual(e.code, 1)
- version_ok = False
- self.assertEqual(version_ok, expecting_ok)
+ with mock.patch(
+ 'neutron.agent.linux.ovs_lib.get_installed_kernel_version'
+ ) as kernel_cmd:
+ try:
+ klm_cmd.return_value = installed_klm_version
+ usr_cmd.return_value = installed_usr_version
+ kernel_cmd.return_value = installed_kernel_version
+ self.agent.tunnel_types = 'vxlan'
+ self.agent._check_ovs_version()
+ version_ok = True
+ except SystemExit as e:
+ self.assertEqual(e.code, 1)
+ version_ok = False
+ self.assertEqual(version_ok, expecting_ok)
def test_check_minimum_version(self):
min_vxlan_ver = constants.MINIMUM_OVS_VXLAN_VERSION
+ min_kernel_ver = constants.MINIMUM_LINUX_KERNEL_OVS_VXLAN
self._check_ovs_vxlan_version(min_vxlan_ver, min_vxlan_ver,
- expecting_ok=True)
+ min_kernel_ver, expecting_ok=True)
def test_check_future_version(self):
install_ver = str(float(constants.MINIMUM_OVS_VXLAN_VERSION) + 0.01)
+ min_kernel_ver = constants.MINIMUM_LINUX_KERNEL_OVS_VXLAN
self._check_ovs_vxlan_version(install_ver, install_ver,
- expecting_ok=True)
+ min_kernel_ver, expecting_ok=True)
def test_check_fail_version(self):
install_ver = str(float(constants.MINIMUM_OVS_VXLAN_VERSION) - 0.01)
+ min_kernel_ver = constants.MINIMUM_LINUX_KERNEL_OVS_VXLAN
self._check_ovs_vxlan_version(install_ver, install_ver,
- expecting_ok=False)
+ min_kernel_ver, expecting_ok=False)
def test_check_fail_no_version(self):
+ min_kernel_ver = constants.MINIMUM_LINUX_KERNEL_OVS_VXLAN
self._check_ovs_vxlan_version(None, None,
- expecting_ok=False)
+ min_kernel_ver, expecting_ok=False)
def test_check_fail_klm_version(self):
min_vxlan_ver = constants.MINIMUM_OVS_VXLAN_VERSION
+ min_kernel_ver = OVS_LINUX_KERN_VERS_WITHOUT_VXLAN
install_ver = str(float(min_vxlan_ver) - 0.01)
self._check_ovs_vxlan_version(min_vxlan_ver, install_ver,
- expecting_ok=False)
+ min_kernel_ver, expecting_ok=False)
def _prepare_l2_pop_ofports(self):
lvm1 = mock.Mock()
return_value="1.10") as klm_ver:
with mock.patch.object(ovs_lib, 'get_installed_ovs_usr_version',
return_value="1.10") as usr_ver:
- ovs_neutron_agent.OVSNeutronAgent(self.INT_BRIDGE,
- self.TUN_BRIDGE,
- '10.0.0.1', self.NET_MAPPING,
- 'sudo', 2, ['vxlan'],
- self.VETH_MTU)
+ with mock.patch.object(ovs_lib, 'get_installed_kernel_version',
+ return_value=(
+ constants.
+ MINIMUM_LINUX_KERNEL_OVS_VXLAN
+ )) as kernel_ver:
+ ovs_neutron_agent.OVSNeutronAgent(self.INT_BRIDGE,
+ self.TUN_BRIDGE,
+ '10.0.0.1',
+ self.NET_MAPPING,
+ 'sudo', 2, ['vxlan'],
+ self.VETH_MTU)
klm_ver.assert_called_once_with()
+ kernel_ver.assert_called_once_with()
usr_ver.assert_called_once_with('sudo')
self._verify_mock_calls()