Exemple #1
0
 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
Exemple #4
0
    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))
Exemple #5
0
    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")
Exemple #6
0
                # 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':
Exemple #7
0
        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':