Resolves: rhbz#500273 In this initial support all used nodes will be either iface bound using default iface. --- iw/advanced_storage.py | 18 ++++++++++++++++-- storage/iscsi.py | 43 +++++++++++++++++++++++++++++++++++++++++++ ui/adddrive.glade | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 2 deletions(-) diff --git a/iw/advanced_storage.py b/iw/advanced_storage.py index 6384d5f..a21a8e7 100644 --- a/iw/advanced_storage.py +++ b/iw/advanced_storage.py @@ -394,7 +394,7 @@ def addFcoeDrive(anaconda): dialog.destroy() return rc -def addIscsiDrive(anaconda): +def addIscsiDrive(anaconda, bind=False): """ Displays a series of dialogs that walk the user through discovering and logging into iscsi nodes. @@ -409,6 +409,15 @@ def addIscsiDrive(anaconda): return gtk.RESPONSE_CANCEL urlgrabber.grabber.reset_curl_obj() + # This will modify behaviour of iscsi.discovery() function + if storage.iscsi.iscsi().mode == "none" and not bind: + storage.iscsi.iscsi().delete_interfaces() + elif (storage.iscsi.iscsi().mode == "none" and bind + or storage.iscsi.iscsi().mode == "bind"): + active = set(network.getActiveNetDevs()) + created = set(storage.iscsi.iscsi().ifaces.values()) + storage.iscsi.iscsi().create_interfaces(active - created) + wizard = iSCSIGuiWizard() login_ok_nodes = pih.drive_iscsi_addition(anaconda, wizard) if len(login_ok_nodes): @@ -456,6 +465,10 @@ def addDrive(anaconda): if not storage.iscsi.has_iscsi(): dxml.get_widget("iscsiRadio").set_sensitive(False) dxml.get_widget("iscsiRadio").set_active(False) + dxml.get_widget("iscsiBindCheck").set_sensitive(False) + else: + dxml.get_widget("iscsiBindCheck").set_active(bool(storage.iscsi.iscsi().ifaces)) + dxml.get_widget("iscsiBindCheck").set_sensitive(storage.iscsi.iscsi().mode == "none") if not storage.fcoe.has_fcoe(): dxml.get_widget("fcoeRadio").set_sensitive(False) @@ -476,7 +489,8 @@ def addDrive(anaconda): return False if dxml.get_widget("iscsiRadio").get_active() and storage.iscsi.has_iscsi(): - rc = addIscsiDrive(anaconda) + bind = dxml.get_widget("iscsiBindCheck").get_active() + rc = addIscsiDrive(anaconda, bind) elif dxml.get_widget("fcoeRadio").get_active() and storage.fcoe.has_fcoe(): rc = addFcoeDrive(anaconda) elif dxml.get_widget("zfcpRadio") is not None and dxml.get_widget("zfcpRadio").get_active(): diff --git a/storage/iscsi.py b/storage/iscsi.py index d44b822..f4dfee4 100644 --- a/storage/iscsi.py +++ b/storage/iscsi.py @@ -103,6 +103,7 @@ class iscsi(object): self._initiator = "" self.initiatorSet = False self.started = False + self.ifaces = {} if flags.ibft: try: @@ -142,6 +143,17 @@ class iscsi(object): itertools.chain(*self.discovered_targets.values()) if logged_in] + self.ibftNodes + def _getMode(self): + if not self.active_nodes(): + return "none" + else: + if self.ifaces: + return "bind" + else: + return "default" + + mode = property(_getMode) + def _mark_node_active(self, node, active=True): """Mark node as one logged in to @@ -189,6 +201,37 @@ class iscsi(object): if intf: w.pop() + def create_interfaces(self, ifaces): + for iface in ifaces: + iscsi_iface_name = "iface%d" % len(self.ifaces) + #iscsiadm -m iface -I iface0 --op=new + iutil.execWithRedirect("iscsiadm", + ["-m", "iface", "-I", iscsi_iface_name, "--op=new"], + stdout="/dev/tty5", + stderr="/dev/tty5") + #iscsiadm -m iface -I iface0 --op=update -n iface.net_ifacename -v eth0 + iutil.execWithRedirect("iscsiadm", + ["-m", "iface", "-I", iscsi_iface_name, + "--op=update", "-n", + "iface.net_ifacename", "-v", iface], + stdout="/dev/tty5", + stderr="/dev/tty5") + + self.ifaces[iscsi_iface_name] = iface + log.debug("created_interface %s:%s" % (iscsi_iface_name, iface)) + + def delete_interfaces(self): + if not self.ifaces: + return None + for iscsi_iface_name in self.ifaces: + #iscsiadm -m iface -I iface0 --op=delete + iutil.execWithRedirect("iscsiadm", + ["-m", "iface", "-I", iscsi_iface_name, + "--op=delete"], + stdout="/dev/tty5", + stderr="/dev/tty5") + self.ifaces = {} + def startup(self, intf = None): if self.started: return diff --git a/ui/adddrive.glade b/ui/adddrive.glade index a085176..5440966 100644 --- a/ui/adddrive.glade +++ b/ui/adddrive.glade @@ -184,6 +184,39 @@ </child> <child> + <widget class="GtkAlignment" id="alignment2"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">1</property> + <property name="yscale">1</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">18</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkCheckButton" id="iscsiBindCheck"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Bind targets to network interfaces</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> <widget class="GtkRadioButton" id="zfcpRadio"> <property name="visible">True</property> <property name="label" translatable="yes">Add _ZFCP LUN</property> -- 1.7.4 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list