[PATCH rhel7-branch] (v2) Catch race of network device state vs reading its config properties (#919478, #1005681)
Radek Vykydal
rvykydal at redhat.com
Tue Sep 10 12:57:12 UTC 2013
Fedora bz: #980576
Catch the infamous
DBusException: org.freedesktop.DBus.Error.UnknownMethod:
Method "Get" with signature "ss" on interface "org.freedesktop.DBus.Properties"
doesn't exist
exception.
Object with path from devices's IPXConfig property is valid only if
its device is in ACTIVATED state.
---
pyanaconda/nm.py | 29 +++++++++++++++++++++++++----
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/pyanaconda/nm.py b/pyanaconda/nm.py
index dd0df99..0c88800 100644
--- a/pyanaconda/nm.py
+++ b/pyanaconda/nm.py
@@ -53,7 +53,12 @@ class SettingNotFoundError(ValueError):
return self.__repr__()
class DeviceSettingsNotFoundError(ValueError):
- """Settings (NMRemoteConnection object was not found"""
+ """Settings NMRemoteConnection object was not found"""
+ def __str__(self):
+ return self.__repr__()
+
+class UnknownMethodGetError(Exception):
+ """Object does not have Get, most probably being invalid"""
def __str__(self):
return self.__repr__()
@@ -86,6 +91,8 @@ def _get_property(object_path, prop, interface_name_suffix=""):
except GLib.GError as e:
if "org.freedesktop.DBus.Error.AccessDenied" in e.message:
return None
+ elif "org.freedesktop.DBus.Error.UnknownMethod" in e.message:
+ raise UnknownMethodGetError
else:
raise
@@ -305,7 +312,12 @@ def nm_device_ip_config(name, version=4):
if config == "/":
return []
- addresses = _get_property(config, "Addresses", dbus_iface)
+ try:
+ addresses = _get_property(config, "Addresses", dbus_iface)
+ # object is valid only if device is in ACTIVATED state (racy)
+ except UnknownMethodGetError:
+ return []
+
addr_list = []
for addr, prefix, gateway in addresses:
# TODO - look for a library function (could have used IPy but byte order!)
@@ -317,7 +329,12 @@ def nm_device_ip_config(name, version=4):
gateway_str = nm_dbus_ay_to_ipv6(gateway)
addr_list.append([addr_str, prefix, gateway_str])
- nameservers = _get_property(config, "Nameservers", dbus_iface)
+ try:
+ nameservers = _get_property(config, "Nameservers", dbus_iface)
+ # object is valid only if device is in ACTIVATED state (racy)
+ except UnknownMethodGetError:
+ return []
+
ns_list = []
for ns in nameservers:
# TODO - look for a library function
@@ -341,7 +358,11 @@ def nm_ntp_servers_from_dhcp():
for device in active_devices:
# harvest NTP server addresses from DHCPv4
dhcp4_path = nm_device_property(device, "Dhcp4Config")
- options = _get_property(dhcp4_path, "Options", ".DHCP4Config")
+ try:
+ options = _get_property(dhcp4_path, "Options", ".DHCP4Config")
+ # object is valid only if device is in ACTIVATED state (racy)
+ except UnknownMethodGetError:
+ options = None
if options and 'ntp_servers' in options:
# NTP server addresses returned by DHCP are whitespace delimited
ntp_servers_string = options["ntp_servers"]
--
1.7.11.7
More information about the anaconda-patches
mailing list