def stabilize(self): # Wait for udev to create the devices for the just added disks # It is possible when we get here the events for the new devices # are not send yet, so sleep to make sure the events are fired time.sleep(2) udev_settle()
def offlineSCSIDevice(self): f = open("/proc/scsi/scsi", "r") lines = f.readlines() f.close() # alternatively iterate over /sys/bus/scsi/devices/*:0:*:*/ for line in lines: if not line.startswith("Host"): continue scsihost = string.split(line) host = scsihost[1] channel = "0" id = scsihost[5] lun = scsihost[7] scsidev = "%s:%s:%s:%s" % (host[4:], channel, id, lun) fcpsysfs = "%s/%s" % (scsidevsysfs, scsidev) scsidel = "%s/%s/delete" % (scsidevsysfs, scsidev) f = open("%s/hba_id" % (fcpsysfs), "r") fcphbasysfs = f.readline().strip() f.close() f = open("%s/wwpn" % (fcpsysfs), "r") fcpwwpnsysfs = f.readline().strip() f.close() f = open("%s/fcp_lun" % (fcpsysfs), "r") fcplunsysfs = f.readline().strip() f.close() if fcphbasysfs == self.devnum and fcpwwpnsysfs == self.wwpn and fcplunsysfs == self.fcplun: loggedWriteLineToFile(scsidel, "1") udev_settle() return log.warn("no scsi device found to delete for zfcp %s %s %s" % (self.devnum, self.wwpn, self.fcplun))
def offlineSCSIDevice(self): f = open("/proc/scsi/scsi", "r") lines = f.readlines() f.close() # alternatively iterate over /sys/bus/scsi/devices/*:0:*:*/ for line in lines: if not line.startswith("Host"): continue scsihost = string.split(line) host = scsihost[1] channel = "0" id = scsihost[5] lun = scsihost[7] scsidev = "%s:%s:%s:%s" % (host[4:], channel, id, lun) fcpsysfs = "%s/%s" % (scsidevsysfs, scsidev) scsidel = "%s/%s/delete" % (scsidevsysfs, scsidev) f = open("%s/hba_id" % (fcpsysfs), "r") fcphbasysfs = f.readline().strip() f.close() f = open("%s/wwpn" % (fcpsysfs), "r") fcpwwpnsysfs = f.readline().strip() f.close() f = open("%s/fcp_lun" % (fcpsysfs), "r") fcplunsysfs = f.readline().strip() f.close() if fcphbasysfs == self.devnum \ and fcpwwpnsysfs == self.wwpn \ and fcplunsysfs == self.fcplun: loggedWriteLineToFile(scsidel, "1") udev_settle() return log.warn("no scsi device found to delete for zfcp %s %s %s" % (self.devnum, self.wwpn, self.fcplun))
def onlineDevice(self): online = "%s/%s/online" % (zfcpsysfs, self.devnum) portadd = "%s/%s/port_add" % (zfcpsysfs, self.devnum) portdir = "%s/%s/%s" % (zfcpsysfs, self.devnum, self.wwpn) unitadd = "%s/unit_add" % (portdir) unitdir = "%s/%s" % (portdir, self.fcplun) failed = "%s/failed" % (unitdir) if not os.path.exists(online): log.info("Freeing zFCP device %s" % (self.devnum, )) iutil.execWithRedirect("zfcp_cio_free", ["-d", self.devnum], stdout="/dev/tty5", stderr="/dev/tty5") if not os.path.exists(online): raise ValueError, _( "zFCP device %s not found, not even in device ignore list." % (self.devnum, )) try: f = open(online, "r") devonline = f.readline().strip() f.close() if devonline != "1": loggedWriteLineToFile(online, "1") except IOError as e: raise ValueError, _("Could not set zFCP device %(devnum)s " "online (%(e)s).") \ % {'devnum': self.devnum, 'e': e} if not os.path.exists(portdir): if os.path.exists(portadd): # older zfcp sysfs interface try: loggedWriteLineToFile(portadd, self.wwpn) udev_settle() except IOError as e: raise ValueError, _("Could not add WWPN %(wwpn)s to zFCP " "device %(devnum)s (%(e)s).") \ % {'wwpn': self.wwpn, 'devnum': self.devnum, 'e': e} else: # newer zfcp sysfs interface with auto port scan raise ValueError, _("WWPN %(wwpn)s not found at zFCP device " "%(devnum)s.") % { 'wwpn': self.wwpn, 'devnum': self.devnum } else: if os.path.exists(portadd): # older zfcp sysfs interface log.info("WWPN %(wwpn)s at zFCP device %(devnum)s already " "there.") % { 'wwpn': self.wwpn, 'devnum': self.devnum } if not os.path.exists(unitdir): try: loggedWriteLineToFile(unitadd, self.fcplun) udev_settle() except IOError as e: raise ValueError, _("Could not add LUN %(fcplun)s to WWPN " "%(wwpn)s on zFCP device %(devnum)s " "(%(e)s).") \ % {'fcplun': self.fcplun, 'wwpn': self.wwpn, 'devnum': self.devnum, 'e': e} else: raise ValueError, _("LUN %(fcplun)s at WWPN %(wwpn)s on zFCP " "device %(devnum)s already configured.") \ % {'fcplun': self.fcplun, 'wwpn': self.wwpn, 'devnum': self.devnum} fail = "0" try: f = open(failed, "r") fail = f.readline().strip() f.close() except IOError as e: raise ValueError, _("Could not read failed attribute of LUN " "%(fcplun)s at WWPN %(wwpn)s on zFCP device " "%(devnum)s (%(e)s).") \ % {'fcplun': self.fcplun, 'wwpn': self.wwpn, 'devnum': self.devnum, 'e': e} if fail != "0": self.offlineDevice() raise ValueError, _("Failed LUN %(fcplun)s at WWPN %(wwpn)s on " "zFCP device %(devnum)s removed again.") \ % {'fcplun': self.fcplun, 'wwpn': self.wwpn, 'devnum': self.devnum} return True
def onlineDevice(self): online = "%s/%s/online" %(zfcpsysfs, self.devnum) portadd = "%s/%s/port_add" %(zfcpsysfs, self.devnum) portdir = "%s/%s/%s" %(zfcpsysfs, self.devnum, self.wwpn) unitadd = "%s/unit_add" %(portdir) unitdir = "%s/%s" %(portdir, self.fcplun) failed = "%s/failed" %(unitdir) if not os.path.exists(online): log.info("Freeing zFCP device %s" % (self.devnum,)) iutil.execWithRedirect("zfcp_cio_free", ["-d", self.devnum], stdout="/dev/tty5", stderr="/dev/tty5") if not os.path.exists(online): raise ValueError, _( "zFCP device %s not found, not even in device ignore list." %(self.devnum,)) try: f = open(online, "r") devonline = f.readline().strip() f.close() if devonline != "1": loggedWriteLineToFile(online, "1") except IOError as e: raise ValueError, _("Could not set zFCP device %(devnum)s " "online (%(e)s).") \ % {'devnum': self.devnum, 'e': e} if not os.path.exists(portdir): if os.path.exists(portadd): # older zfcp sysfs interface try: loggedWriteLineToFile(portadd, self.wwpn) udev_settle() except IOError as e: raise ValueError, _("Could not add WWPN %(wwpn)s to zFCP " "device %(devnum)s (%(e)s).") \ % {'wwpn': self.wwpn, 'devnum': self.devnum, 'e': e} else: # newer zfcp sysfs interface with auto port scan raise ValueError, _("WWPN %(wwpn)s not found at zFCP device " "%(devnum)s.") % {'wwpn': self.wwpn, 'devnum': self.devnum} else: if os.path.exists(portadd): # older zfcp sysfs interface log.info("WWPN %(wwpn)s at zFCP device %(devnum)s already " "there." % {'wwpn': self.wwpn, 'devnum': self.devnum}) if not os.path.exists(unitdir): try: loggedWriteLineToFile(unitadd, self.fcplun) udev_settle() except IOError as e: raise ValueError, _("Could not add LUN %(fcplun)s to WWPN " "%(wwpn)s on zFCP device %(devnum)s " "(%(e)s).") \ % {'fcplun': self.fcplun, 'wwpn': self.wwpn, 'devnum': self.devnum, 'e': e} else: raise ValueError, _("LUN %(fcplun)s at WWPN %(wwpn)s on zFCP " "device %(devnum)s already configured.") \ % {'fcplun': self.fcplun, 'wwpn': self.wwpn, 'devnum': self.devnum} fail = "0" try: f = open(failed, "r") fail = f.readline().strip() f.close() except IOError as e: raise ValueError, _("Could not read failed attribute of LUN " "%(fcplun)s at WWPN %(wwpn)s on zFCP device " "%(devnum)s (%(e)s).") \ % {'fcplun': self.fcplun, 'wwpn': self.wwpn, 'devnum': self.devnum, 'e': e} if fail != "0": self.offlineDevice() raise ValueError, _("Failed LUN %(fcplun)s at WWPN %(wwpn)s on " "zFCP device %(devnum)s removed again.") \ % {'fcplun': self.fcplun, 'wwpn': self.wwpn, 'devnum': self.devnum} return True
def onlineDevice(self): online = "%s/%s/online" % (zfcpsysfs, self.devnum) portadd = "%s/%s/port_add" % (zfcpsysfs, self.devnum) portdir = "%s/%s/%s" % (zfcpsysfs, self.devnum, self.wwpn) unitadd = "%s/unit_add" % (portdir) unitdir = "%s/%s" % (portdir, self.fcplun) failed = "%s/failed" % (unitdir) try: if not os.path.exists(online): loggedWriteLineToFile("/proc/cio_ignore", "free %s" % (self.devnum,)) udev_settle() except IOError as e: raise ValueError, _("Could not free zFCP device %(devnum)s from " "device ignore list (%(e)s).") % { "devnum": self.devnum, "e": e, } if not os.path.exists(online): raise ValueError, _("zFCP device %s not found, not even in device ignore list." % (self.devnum,)) try: f = open(online, "r") devonline = f.readline().strip() f.close() if devonline != "1": loggedWriteLineToFile(online, "1") else: log.info("zFCP device %s already online." % (self.devnum,)) except IOError as e: raise ValueError, _("Could not set zFCP device %(devnum)s " "online (%(e)s).") % { "devnum": self.devnum, "e": e, } if not os.path.exists(portdir): if os.path.exists(portadd): # older zfcp sysfs interface try: loggedWriteLineToFile(portadd, self.wwpn) udev_settle() except IOError as e: raise ValueError, _("Could not add WWPN %(wwpn)s to zFCP " "device %(devnum)s (%(e)s).") % { "wwpn": self.wwpn, "devnum": self.devnum, "e": e, } else: # newer zfcp sysfs interface with auto port scan raise ValueError, _("WWPN %(wwpn)s not found at zFCP device " "%(devnum)s.") % { "wwpn": self.wwpn, "devnum": self.devnum, } else: if os.path.exists(portadd): # older zfcp sysfs interface log.info("WWPN %(wwpn)s at zFCP device %(devnum)s already " "there.") % { "wwpn": self.wwpn, "devnum": self.devnum, } if not os.path.exists(unitdir): try: loggedWriteLineToFile(unitadd, self.fcplun) udev_settle() except IOError as e: raise ValueError, _( "Could not add LUN %(fcplun)s to WWPN " "%(wwpn)s on zFCP device %(devnum)s " "(%(e)s)." ) % {"fcplun": self.fcplun, "wwpn": self.wwpn, "devnum": self.devnum, "e": e} else: raise ValueError, _("LUN %(fcplun)s at WWPN %(wwpn)s on zFCP " "device %(devnum)s already configured.") % { "fcplun": self.fcplun, "wwpn": self.wwpn, "devnum": self.devnum, } fail = "0" try: f = open(failed, "r") fail = f.readline().strip() f.close() except IOError as e: raise ValueError, _( "Could not read failed attribute of LUN " "%(fcplun)s at WWPN %(wwpn)s on zFCP device " "%(devnum)s (%(e)s)." ) % {"fcplun": self.fcplun, "wwpn": self.wwpn, "devnum": self.devnum, "e": e} if fail != "0": self.offlineDevice() raise ValueError, _( "Failed LUN %(fcplun)s at WWPN %(wwpn)s on " "zFCP device %(devnum)s removed again." ) % {"fcplun": self.fcplun, "wwpn": self.wwpn, "devnum": self.devnum} return True