def attach(self, sr_uuid, vdi_uuid): self.sr._loadvdis() if vdi_uuid not in self.sr.vdis: raise xs_errors.XenError('VDIUnavailable') if not util.pathexists(self.path): self.sr.refresh() if 'SCSIid' in self.sm_config: if self.sr.mpath == 'true': self.sr.mpathmodule.refresh(self.sm_config['SCSIid'], 0) devs = os.listdir("/dev/disk/by-scsid/%s" % self.sm_config['SCSIid']) for dev in devs: realdev = os.path.realpath("/dev/disk/by-scsid/%s/%s" % (self.sm_config['SCSIid'], dev)) util.set_scheduler(realdev.split("/")[-1], "noop") if not util.wait_for_path(self.path, MAX_TIMEOUT): util.SMlog("Unable to detect LUN attached to host [%s]" % self.sr.path) raise xs_errors.XenError('VDIUnavailable') return super(RAWVDI, self).attach(sr_uuid, vdi_uuid)
def block_setscheduler(self, dev): try: realdev = os.path.realpath(dev) disk = util.diskFromPartition(realdev) # the normal case: the sr default scheduler (typically noop), # potentially overridden by SR.other_config:scheduler other_config = self.session.xenapi.SR.get_other_config(self.sr_ref) sched = other_config.get('scheduler') if not sched: sched = self.sched # special case: CFQ if the underlying disk holds dom0's file systems. if disk in util.dom0_disks(): sched = 'cfq' util.SMlog("Block scheduler: %s (%s) wants %s" % (dev, disk, sched)) util.set_scheduler(realdev[5:], sched) except Exception, e: util.SMlog("Failed to set block scheduler on %s: %s" % (dev, e))
def attach(self, sr_uuid): if not util.match_uuid(sr_uuid) or not lvutil._checkVG(self.vgname): raise xs_errors.XenError('SRUnavailable', \ opterr='no such volume group: %s' % self.vgname) if self.isMaster: #Update SCSIid string util.SMlog("Calling devlist_to_serial") scsiutil.add_serial_record(self.session, self.sr_ref, \ scsiutil.devlist_to_serialstring(self.root.split(','))) # Set the block scheduler try: self.other_config = self.session.xenapi.SR.get_other_config(self.sr_ref) if self.other_config.has_key('scheduler') and self.other_config['scheduler'] != self.sched: self.sched = self.other_config['scheduler'] for dev in self.root.split(','): realdev = os.path.realpath(dev)[5:] util.set_scheduler(realdev, self.sched) except: pass
def attach(self, sr_uuid): self._mpathHandle() multiTargets = False npaths = 0 try: pbdref = util.find_my_pbd(self.session, self.host_ref, self.sr_ref) if pbdref: other_config = self.session.xenapi.PBD.get_other_config(pbdref) multiTargets = util.sessions_less_than_targets( other_config, self.dconf) except: pass if not self.attached or multiTargets: # Verify iSCSI target and port if 'multihomelist' in self.dconf and 'multiSession' not in self.dconf: targetlist = self.dconf['multihomelist'].split(',') else: targetlist = ['%s:%d' % (self.target, self.port)] conn = False for val in targetlist: (target, port) = iscsilib.parse_IP_port(val) try: util._testHost(target, long(port), 'ISCSITarget') self.target = target self.port = long(port) conn = True break except: pass if not conn: raise xs_errors.XenError('ISCSITarget') # Test and set the initiatorname file iscsilib.ensure_daemon_running_ok(self.localIQN) # Check to see if auto attach was set if not iscsilib._checkTGT(self.targetIQN) or multiTargets: try: map = [] if 'any' != self.targetIQN: try: map = iscsilib.get_node_records(self.targetIQN) except: # Pass the exception that is thrown, when there # are no nodes pass if len(map) == 0: map = iscsilib.discovery( self.target, self.port, self.chapuser, self.chappassword, self.targetIQN, iscsilib.get_iscsi_interfaces()) if len(map) == 0: self._scan_IQNs() raise xs_errors.XenError( 'ISCSIDiscovery', opterr='check target settings') for i in range(0, len(map)): (portal, tpgt, iqn) = map[i] try: (ipaddr, port) = iscsilib.parse_IP_port(portal) if not self.multihomed and ipaddr != self.target: continue util._testHost(ipaddr, long(port), 'ISCSITarget') util.SMlog("Logging in to [%s:%s]" % (ipaddr, port)) iscsilib.login(portal, iqn, self.chapuser, self.chappassword, self.incoming_chapuser, self.incoming_chappassword, self.mpath == "true") npaths = npaths + 1 except Exception as e: # Exceptions thrown in login are acknowledged, # the rest of exceptions are ignored since some of the # paths in multipath may not be reachable if str(e).startswith('ISCSI login'): raise else: pass if not iscsilib._checkTGT(self.targetIQN): raise xs_errors.XenError('ISCSIDevice', \ opterr='during login') # Allow the devices to settle time.sleep(5) except util.CommandException as inst: raise xs_errors.XenError('ISCSILogin', \ opterr='code is %d' % inst.code) self.attached = True self._initPaths() util._incr_iscsiSR_refcount(self.targetIQN, sr_uuid) IQNs = [] if "multiSession" in self.dconf: IQNs = "" for iqn in self.dconf['multiSession'].split("|"): if len(iqn): IQNs += iqn.split(',')[2] else: IQNs.append(self.targetIQN) sessions = 0 paths = iscsilib.get_IQN_paths() for path in paths: try: if util.get_single_entry(os.path.join(path, 'targetname')) in IQNs: sessions += 1 util.SMlog("IQN match. Incrementing sessions to %d" % sessions) except: util.SMlog("Failed to read targetname path," \ + "iscsi_sessions value may be incorrect") if pbdref: # Just to be safe in case of garbage left during crashes # we remove the key and add it self.session.xenapi.PBD.remove_from_other_config( pbdref, "iscsi_sessions") self.session.xenapi.PBD.add_to_other_config( pbdref, "iscsi_sessions", str(sessions)) if 'SCSIid' in self.dconf: if self.mpath == 'true': self.mpathmodule.refresh(self.dconf['SCSIid'], 0) devs = os.listdir("/dev/disk/by-scsid/%s" % self.dconf['SCSIid']) for dev in devs: realdev = os.path.realpath("/dev/disk/by-scsid/%s/%s" % (self.dconf['SCSIid'], dev)) util.set_scheduler(realdev.split("/")[-1], "noop")
# Just to be safe in case of garbage left during crashes # we remove the key and add it self.session.xenapi.PBD.remove_from_other_config( pbdref, "iscsi_sessions") self.session.xenapi.PBD.add_to_other_config( pbdref, "iscsi_sessions", str(sessions)) except: pass if self.dconf.has_key('SCSIid'): if self.mpath == 'true': self.mpathmodule.refresh(self.dconf['SCSIid'], 0) devs = os.listdir("/dev/disk/by-scsid/%s" % self.dconf['SCSIid']) for dev in devs: realdev = os.path.realpath("/dev/disk/by-scsid/%s/%s" % (self.dconf['SCSIid'], dev)) util.set_scheduler(realdev.split("/")[-1], "noop") def detach(self, sr_uuid): keys = [] pbdref = None try: pbdref = util.find_my_pbd(self.session, self.host_ref, self.sr_ref) except: pass if self.dconf.has_key('SCSIid'): self.mpathmodule.reset(self.dconf['SCSIid'], True) # explicitly unmap keys.append("mpath-" + self.dconf['SCSIid']) # Remove iscsi_sessions and multipathed keys if pbdref <> None: if self.cmd == 'sr_detach':
if pbdref: # Just to be safe in case of garbage left during crashes # we remove the key and add it self.session.xenapi.PBD.remove_from_other_config( pbdref, "iscsi_sessions") self.session.xenapi.PBD.add_to_other_config( pbdref, "iscsi_sessions", str(sessions)) if self.dconf.has_key('SCSIid'): if self.mpath == 'true': self.mpathmodule.refresh(self.dconf['SCSIid'], 0) devs = os.listdir("/dev/disk/by-scsid/%s" % self.dconf['SCSIid']) for dev in devs: realdev = os.path.realpath("/dev/disk/by-scsid/%s/%s" % (self.dconf['SCSIid'], dev)) util.set_scheduler(realdev.split("/")[-1], "noop") def detach(self, sr_uuid, delete=False): keys = [] pbdref = None try: pbdref = util.find_my_pbd(self.session, self.host_ref, self.sr_ref) except: pass if self.dconf.has_key('SCSIid'): self.mpathmodule.reset(self.dconf['SCSIid'], explicit_unmap=True) keys.append("mpath-" + self.dconf['SCSIid']) # Remove iscsi_sessions and multipathed keys if pbdref <> None: if self.cmd == 'sr_detach':