[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[PATCH rhel6-branch 1/7] iscsi: add iface binding support to discovery and setup GUI (#500273)



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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]