From 6334eb32df01326b85ca6cd589a5ea91117189e6 Mon Sep 17 00:00:00 2001 From: Gris Ge Date: Fri, 9 Aug 2019 13:26:02 +0800 Subject: [PATCH] nm: Ignore not active failure when deactivate Ignore the failure: Connection deactivation failed on nm2: error=nm-manager-error-quark: The connection was not active. Even we check activate connection status before deactivating, there is still a small chance that NM deactivated the connection after we checked. This patch also fix the random failure of `test_add_bond_with_slaves_and_ipv4` test when tear down: * The tear down will delete bond99 and eth1/eth2. * After bond99 got deleted, the connections of eth1/eth2 will be brought down automatically by NM. * There is a small chance(about 1 out of 10) to trigger the problem of deactivating a non-active connection. Signed-off-by: Gris Ge --- libnmstate/nm/active_connection.py | 27 +++++++++++++++++++----- tests/lib/nm/active_connection_test.py | 29 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 tests/lib/nm/active_connection_test.py diff --git a/libnmstate/nm/active_connection.py b/libnmstate/nm/active_connection.py index 81ec9b5..28a89d5 100644 --- a/libnmstate/nm/active_connection.py +++ b/libnmstate/nm/active_connection.py @@ -20,6 +20,11 @@ import logging from . import nmclient +from .nmclient import GLib +from .nmclient import NM + + +NM_MANAGER_ERROR_DOMAIN = 'nm-manager-error-quark' class AlternativeACState(object): @@ -96,12 +101,24 @@ class ActiveConnection(object): e, ) else: - self._mainloop.quit( - 'Connection deactivation failed on {}: error={}'.format( - self._nmdev.get_iface(), e + if ( + isinstance(e, GLib.GError) + # pylint: disable=no-member + and e.domain == NM_MANAGER_ERROR_DOMAIN + and e.code == NM.ManagerError.CONNECTIONNOTACTIVE + # pylint: enable=no-member + ): + success = True + logging.debug( + 'Connection is not active on {}, no need to ' + 'deactivate'.format(self.devname) ) - ) - return + else: + self._mainloop.quit( + 'Connection deactivation failed on {}: ' + 'error={}'.format(self._nmdev.get_iface(), e) + ) + return if success: logging.debug( diff --git a/tests/lib/nm/active_connection_test.py b/tests/lib/nm/active_connection_test.py new file mode 100644 index 0000000..5bd6d66 --- /dev/null +++ b/tests/lib/nm/active_connection_test.py @@ -0,0 +1,29 @@ +# +# Copyright (c) 2019 Red Hat, Inc. +# +# This file is part of nmstate +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 2.1 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with this program. If not, see . +# + +from libnmstate.nm.nmclient import NM +from libnmstate.nm.nmclient import GLib + +from libnmstate.nm.active_connection import NM_MANAGER_ERROR_DOMAIN + + +def test_nm_manager_error_domain_str(): + assert NM_MANAGER_ERROR_DOMAIN == GLib.quark_to_string( + NM.ManagerError.quark() + ) -- 2.22.0