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

[PATCH rhel6-branch 2/7] iscsi: add iface binding support to iscsi device class (nic) (#500273)



Resolves: rhbz#500273

Also write out proper dracut options:

netroot=iscsi:[<servername>]:[<protocol>]:[<port>]:
[<iscsi_iface_name>]:[<netdev_name>]:[<LUN>]:<targetname>
---
 network.py            |   22 ++++++++--------------
 storage/devices.py    |   16 +++++++++++++---
 storage/devicetree.py |    9 ++++++---
 storage/iscsi.py      |    4 ++--
 storage/udev.py       |    6 ++++++
 5 files changed, 35 insertions(+), 22 deletions(-)

diff --git a/network.py b/network.py
index 98dd4af..ec35068 100644
--- a/network.py
+++ b/network.py
@@ -279,7 +279,7 @@ class NetworkDevice(IfcfgFile):
     def usedByFCoE(self, anaconda):
         import storage
         for d in anaconda.id.storage.devices:
-            if (isinstance(d, storage.devices.NetworkStorageDevice) and
+            if (isinstance(d, storage.devices.FcoeDiskDevice) and
                 d.nic == self.iface):
                 return True
         return False
@@ -288,20 +288,14 @@ class NetworkDevice(IfcfgFile):
         import storage
         rootdev = anaconda.id.storage.rootDevice
         for d in anaconda.id.storage.devices:
-            if (isinstance(d, storage.devices.NetworkStorageDevice) and
-                d.host_address and
+            if (isinstance(d, storage.devices.iScsiDiskDevice) and
                 rootdev.dependsOn(d)):
-                if self.iface == ifaceForHostIP(d.host_address):
-                    return True
-        return False
-
-    def usedByISCSI(self, anaconda):
-        import storage
-        for d in anaconda.id.storage.devices:
-            if (isinstance(d, storage.devices.NetworkStorageDevice) and
-                d.host_address):
-                if self.iface == ifaceForHostIP(d.host_address):
-                    return True
+                if d.nic:
+                    if self.iface == d.nic:
+                        return True
+                else:
+                    if self.iface == ifaceForHostIP(d.host_address):
+                        return True
         return False
 
 class Network:
diff --git a/storage/devices.py b/storage/devices.py
index 3810b24..d847cb9 100644
--- a/storage/devices.py
+++ b/storage/devices.py
@@ -3609,10 +3609,16 @@ class iScsiDiskDevice(DiskDevice, NetworkStorageDevice):
     def __init__(self, device, **kwargs):
         self.node = kwargs.pop("node")
         self.ibft = kwargs.pop("ibft")
+        self.nic = kwargs.pop("nic")
         self.initiator = kwargs.pop("initiator")
         DiskDevice.__init__(self, device, **kwargs)
-        NetworkStorageDevice.__init__(self, host_address=self.node.address)
-        log.debug("created new iscsi disk %s %s:%d" % (self.node.name, self.node.address, self.node.port))
+        NetworkStorageDevice.__init__(self, host_address=self.node.address,
+                                      nic=self.nic)
+        log.debug("created new iscsi disk %s %s:%d via %s:%s" % (self.node.name,
+                                                              self.node.address,
+                                                              self.node.port,
+                                                              self.node.iface,
+                                                              self.nic))
 
     def dracutSetupArgs(self):
         if self.ibft:
@@ -3631,7 +3637,11 @@ class iScsiDiskDevice(DiskDevice, NetworkStorageDevice):
                 netroot += ":%s:%s" % (auth.reverse_username,
                                        auth.reverse_password)
 
-        netroot += "@%s::%d::%s" % (address, self.node.port, self.node.name)
+        netroot += "@%s::%d:%s:%s::%s" % (address,
+                                          self.node.port,
+                                          self.node.iface,
+                                          self.nic,
+                                          self.node.name)
 
         initiator = "iscsi_initiator=%s" % self.initiator
 
diff --git a/storage/devicetree.py b/storage/devicetree.py
index ffd6732..e6ae639 100644
--- a/storage/devicetree.py
+++ b/storage/devicetree.py
@@ -1180,11 +1180,14 @@ class DeviceTree(object):
         kwargs = { "serial": serial, "vendor": vendor, "bus": bus }
         if udev_device_is_iscsi(info):
             diskType = iScsiDiskDevice
-            kwargs["node"] = self.iscsi.getNode(
+            node = self.iscsi.getNode(
                                    udev_device_get_iscsi_name(info),
                                    udev_device_get_iscsi_address(info),
-                                   udev_device_get_iscsi_port(info))
-            kwargs["ibft"] = kwargs["node"] in self.iscsi.ibftNodes
+                                   udev_device_get_iscsi_port(info),
+                                   udev_device_get_iscsi_nic(info))
+            kwargs["node"] = node
+            kwargs["nic"] = self.iscsi.ifaces.get(node.iface, node.iface)
+            kwargs["ibft"] = node in self.iscsi.ibftNodes
             kwargs["initiator"] = self.iscsi.initiator
             log.debug("%s is an iscsi disk" % name)
         elif udev_device_is_fcoe(info):
diff --git a/storage/iscsi.py b/storage/iscsi.py
index f4dfee4..34c4ad0 100644
--- a/storage/iscsi.py
+++ b/storage/iscsi.py
@@ -446,10 +446,10 @@ class iscsi(object):
             shutil.copytree("/var/lib/iscsi", instPath + "/var/lib/iscsi",
                             symlinks=True)
 
-    def getNode(self, name, address, port):
+    def getNode(self, name, address, port, iface):
         for node in self.active_nodes():
             if node.name == name and node.address == address and \
-               node.port == int(port):
+               node.port == int(port) and node.iface == iface:
                 return node
 
         return None
diff --git a/storage/udev.py b/storage/udev.py
index d9a5d13..7890c17 100644
--- a/storage/udev.py
+++ b/storage/udev.py
@@ -553,6 +553,12 @@ def udev_device_get_iscsi_port(info):
     # IPV6 contains : within the address, the part after the last : is the port
     return path_components[address_field].split(":")[-1]
 
+def udev_device_get_iscsi_nic(info):
+    session = info["sysfs_path"].split("/")[4]
+    iface = open("/sys/class/iscsi_session/%s/ifacename" %
+                 session).read().strip()
+    return iface
+
 # fcoe disks have ID_PATH in the form of:
 # For FCoE directly over the NIC (so no VLAN and thus no DCB):
 # pci-eth#-fc-${id}
-- 
1.7.4


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