[master 12/20] libnm in spoke: share nm client in standalone and normal spoke

rvykydal installerbot-noreply at redhat.com
Mon Aug 31 14:55:55 UTC 2015


From: Radek Vykydal <rvykydal at redhat.com>

Having one client in standalone and another in normal spoke leads to
losing status updates of objects in the latter (eg client.get_connections()).

Also connect the signals in initialize and disconnect them on leaving
standalone spoke.
---
 pyanaconda/ui/gui/spokes/network.py | 45 +++++++++++++++++++++++--------------
 1 file changed, 28 insertions(+), 17 deletions(-)

diff --git a/pyanaconda/ui/gui/spokes/network.py b/pyanaconda/ui/gui/spokes/network.py
index 2b84e60..c328b53 100644
--- a/pyanaconda/ui/gui/spokes/network.py
+++ b/pyanaconda/ui/gui/spokes/network.py
@@ -306,13 +306,14 @@ class NetworkControlBox(GObject.GObject):
         NM.DeviceType.BRIDGE: N_("Bridge"),
     }
 
-    def __init__(self, builder, spoke=None):
+    def __init__(self, builder, client, spoke=None):
 
         GObject.GObject.__init__(self)
 
         self.builder = builder
         self._running_nmce = None
         self.spoke = spoke
+        self.client = client
 
         # button for creating of virtual bond and vlan devices
         self.builder.get_object("add_toolbutton").set_sensitive(True)
@@ -350,8 +351,6 @@ def __init__(self, builder, spoke=None):
         # to prevent UI update signals races
         self._updating_device = False
 
-        self.client = NM.Client.new()
-
         # devices list
         # limited to wired and wireless
         treeview = self.builder.get_object("treeview_devices")
@@ -370,27 +369,16 @@ def __init__(self, builder, spoke=None):
         combobox.connect("changed", self.on_wireless_ap_changed_cb)
         self.selected_ap = None
 
-        # NM Client
-        self.client.connect("device-added", self.on_device_added)
-        self.client.connect("device-removed", self.on_device_removed)
-        self.client.connect("connection-added", self.on_connection_added)
-
         self.builder.get_object("device_wired_off_switch").connect("notify::active",
                                                              self.on_device_off_toggled)
         self.builder.get_object("device_wireless_off_switch").connect("notify::active",
                                                              self.on_device_off_toggled)
-        self.client.connect("notify::%s" % NM.CLIENT_WIRELESS_ENABLED,
-                            self.on_wireless_enabled)
-
         self.builder.get_object("button_wired_options").connect("clicked",
                                                            self.on_edit_connection)
         self.builder.get_object("button_wireless_options").connect("clicked",
                                                               self.on_edit_connection)
         self.entry_hostname = self.builder.get_object("entry_hostname")
 
-        self.client.connect("notify::%s" % NM.CLIENT_STATE,
-                            self.on_nm_state_changed)
-
     @property
     def vbox(self):
         return self.builder.get_object("networkControlBox_vbox")
@@ -447,6 +435,14 @@ def add_connection_to_list(self, uuid):
         return True
 
     def initialize(self):
+        self.client.connect("device-added", self.on_device_added)
+        self.client.connect("device-removed", self.on_device_removed)
+        self.client.connect("connection-added", self.on_connection_added)
+        self.client.connect("notify::%s" % NM.CLIENT_WIRELESS_ENABLED,
+                            self.on_wireless_enabled)
+        self.client.connect("notify::%s" % NM.CLIENT_STATE,
+                            self.on_nm_state_changed)
+
         for device in self.client.get_devices():
             self.add_device_to_list(device)
 
@@ -1136,6 +1132,19 @@ def hostname(self, value):
             return
         self.entry_hostname.set_text(value)
 
+    def disconnect_client_callbacks(self):
+        self.client.disconnect_by_func(self.on_device_added)
+        self.client.disconnect_by_func(self.on_device_removed)
+        self.client.disconnect_by_func(self.on_connection_added)
+        self.client.disconnect_by_func(self.on_wireless_enabled)
+        self.client.disconnect_by_func(self.on_nm_state_changed)
+        try:
+            for device in self.client.get_devices():
+                device.disconnect_by_func(self.on_device_config_changed)
+                device.disconnect_by_func(self.on_device_state_changed)
+        except TypeError as e:
+            if not "nothing connected" in str(e):
+                log.debug("network: %s", e)
 
 class SecretAgentDialog(GUIObject):
     builderObjects = ["secret_agent_dialog"]
@@ -1365,7 +1374,7 @@ class NetworkSpoke(FirstbootSpokeMixIn, NormalSpoke):
 
     def __init__(self, *args, **kwargs):
         NormalSpoke.__init__(self, *args, **kwargs)
-        self.network_control_box = NetworkControlBox(self.builder, spoke=self)
+        self.network_control_box = NetworkControlBox(self.builder, nmclient, spoke=self)
         self.network_control_box.hostname = self.data.network.hostname
         self.network_control_box.connect("nm-state-changed",
                                          self.on_nm_state_changed)
@@ -1470,7 +1479,7 @@ class NetworkStandaloneSpoke(StandaloneSpoke):
 
     def __init__(self, *args, **kwargs):
         StandaloneSpoke.__init__(self, *args, **kwargs)
-        self.network_control_box = NetworkControlBox(self.builder, spoke=self)
+        self.network_control_box = NetworkControlBox(self.builder, nmclient, spoke=self)
         self.network_control_box.hostname = self.data.network.hostname
         parent = self.builder.get_object("AnacondaStandaloneWindow-action_area5")
         parent.add(self.network_control_box.vbox)
@@ -1496,6 +1505,7 @@ def apply(self):
                     fallback=not anaconda_flags.automatedInstall)
 
         self.network_control_box.kill_nmce(msg="leaving standalone network spoke")
+        self.network_control_box.disconnect_client_callbacks()
 
     def execute(self):
         # update system's hostname
@@ -1551,6 +1561,7 @@ def _update_network_data(data, ncb):
     hostname = ncb.hostname
     network.update_hostname_data(data, hostname)
 
+nmclient = NM.Client.new()
 
 def test():
     win = Gtk.Window()
@@ -1561,7 +1572,7 @@ def test():
     ui_file_path = os.environ.get('UIPATH')+'spokes/network.glade'
     builder.add_from_file(ui_file_path)
 
-    n = NetworkControlBox(builder)
+    n = NetworkControlBox(builder, nmclient)
     n.initialize()
     n.refresh()
 


-- 
To view this commit on github, visit https://github.com/rhinstaller/anaconda/commit/cce3bcf0a8bcdb75b63a2e4ec52c5d815a85d026


More information about the anaconda-patches mailing list