Ejemplo n.º 1
0
    def initialize_connection(self, volume, connector):
        volume_iqn = volume['provider_location'].split(' ')[1]

        (auth_method, auth_user, auth_pass) = \
            volume['provider_auth'].split(' ', 3)

        # Add initiator iqns to target ACL
        try:
            self._execute('cinder-rtstool',
                          'add-initiator',
                          volume_iqn,
                          auth_user,
                          auth_pass,
                          connector['initiator'],
                          run_as_root=True)
        except putils.ProcessExecutionError:
            LOG.error(
                _("Failed to add initiator iqn %s to target") %
                connector['initiator'])
            raise exception.ISCSITargetAttachFailed(volume_id=volume['id'])

        iscsi_properties = self._get_iscsi_properties(volume)

        # FIXME(jdg): For LIO the target_lun is 0, other than that all data
        # is the same as it is for tgtadm, just modify it here
        iscsi_properties['target_lun'] = 0

        return {'driver_volume_type': 'iscsi', 'data': iscsi_properties}
Ejemplo n.º 2
0
    def initialize_connection(self, volume, connector):
        volume_iqn = volume['provider_location'].split(' ')[1]

        (auth_method, auth_user, auth_pass) = \
            volume['provider_auth'].split(' ', 3)

        # Add initiator iqns to target ACL
        try:
            utils.execute('cinder-rtstool', 'add-initiator',
                          volume_iqn,
                          auth_user,
                          auth_pass,
                          connector['initiator'],
                          run_as_root=True)
        except putils.ProcessExecutionError:
            LOG.error(_LE("Failed to add initiator iqn %s to target") %
                      connector['initiator'])
            raise exception.ISCSITargetAttachFailed(
                volume_id=volume['id'])

        iscsi_properties = self._get_iscsi_properties(volume,
                                                      connector.get(
                                                          'multipath'))

        return {
            'driver_volume_type': self.iscsi_protocol,
            'data': iscsi_properties
        }
Ejemplo n.º 3
0
    def initialize_connection(self, volume, connector):
        volume_iqn = volume['provider_location'].split(' ')[1]

        (auth_method, auth_user, auth_pass) = \
            volume['provider_auth'].split(' ', 3)

        # Add initiator iqns to target ACL
        LOG.info(('Exporting iscsi initiator: %(initiator)s '
                  'for volume: %(id)s'),
                 {"initiator": connector['initiator'], "id": volume["id"]})
        try:
            self._execute('cinder-rtstool', 'add-initiator',
                          volume_iqn,
                          auth_user,
                          auth_pass,
                          connector['initiator'],
                          run_as_root=True)
        except putils.ProcessExecutionError:
            LOG.exception("Failed to add initiator iqn %s to target",
                          connector['initiator'])
            raise exception.ISCSITargetAttachFailed(
                volume_id=volume['id'])

        # We make changes persistent
        self._persist_configuration(volume['id'])

        ret = super(LioAdm, self).initialize_connection(volume, connector)
        LOG.info(('Exported iscsi initiator for'
                  ' volume: %s'), volume["id"])
        return ret
Ejemplo n.º 4
0
    def initialize_connection(self, volume, connector):
        """Map the created volume to connector['initiator'].

           :param volume: dictionary volume reference
           :param connector: dictionary connector reference
        """

        LOG.info(_LI("initialize volume %(vol)s connector %(conn)s"),
                 {'vol': volume, 'conn': connector})

        # connector[ip, host, wwnns, unititator, wwp/

        service_info = self._get_service_target(volume)
        (ip, ipp, ctl, port, _hdp, tgtalias, secret) = service_info
        info = _loc_info(volume['provider_location'])

        if 'tgt' in info.keys():  # spurious repeat connection
            # print info.keys()
            LOG.debug("initiate_conn: tgt already set %s", info['tgt'])
        (arid, lun_name) = info['id_lu']
        loc = arid + '.' + lun_name
        # sps, use target if provided
        try:
            out = self.bend.add_iscsi_conn(self.config['hnas_cmd'],
                                           self.config['mgmt_ip0'],
                                           self.config['username'],
                                           self.config['password'],
                                           lun_name, _hdp, port, tgtalias,
                                           connector['initiator'])
        except processutils.ProcessExecutionError:
            msg = _("Error attaching volume %s. "
                    "Target limit might be reached!") % volume['id']
            raise exception.ISCSITargetAttachFailed(message=msg)

        hnas_portal = ip + ':' + ipp
        # sps need hlun, fulliqn
        hlun = out.split()[1]
        fulliqn = out.split()[13]
        tgt = hnas_portal + ',' + tgtalias + ',' + loc + ',' + ctl + ','
        tgt += port + ',' + hlun

        LOG.info(_LI("initiate: connection %s"), tgt)

        properties = {}
        properties['provider_location'] = tgt
        self._update_vol_location(volume['id'], tgt)
        properties['target_discovered'] = False
        properties['target_portal'] = hnas_portal
        properties['target_iqn'] = fulliqn
        properties['target_lun'] = int(hlun)
        properties['volume_id'] = volume['id']
        properties['auth_username'] = connector['initiator']

        if self.config['chap_enabled'] == 'True':
            properties['auth_method'] = 'CHAP'
            properties['auth_password'] = secret

        conn_info = {'driver_volume_type': 'iscsi', 'data': properties}
        LOG.debug("initialize_connection: conn_info: %s.", conn_info)
        return conn_info
Ejemplo n.º 5
0
 def initialize_connection(self, volume, connector):
     LOG.debug('initialize_connection: volume %(vol)s with connector '
               '%(conn)s', {'vol': volume['id'], 'conn': connector})
     volume_name = acs5000_common.VOLUME_PREFIX + volume['name'][-12:]
     ret = self._cmd.create_lun_map(volume_name,
                                    'WITH_ISCSI',
                                    connector['initiator'])
     if ret['key'] == 303:
         raise exception.VolumeNotFound(volume_id=volume_name)
     elif ret['key'] == 402:
         raise exception.ISCSITargetAttachFailed(volume_id=volume_name)
     else:
         lun_info = ret['arr']
         properties = {}
         properties['target_discovered'] = False
         properties['target_iqns'] = lun_info['iscsi_name']
         properties['target_portals'] = lun_info['portal']
         properties['target_luns'] = lun_info['lun']
         properties['volume_id'] = volume['id']
         properties['auth_method'] = ''
         properties['auth_username'] = ''
         properties['auth_password'] = ''
         properties['discovery_auth_method'] = ''
         properties['discovery_auth_username'] = ''
         properties['discovery_auth_password'] = ''
         return {'driver_volume_type': 'iscsi', 'data': properties}
Ejemplo n.º 6
0
    def terminate_connection(self, volume, connector):
        volume_iqn = volume['provider_location'].split(' ')[1]

        # Delete initiator iqns from target ACL
        try:
            self._execute('cinder-rtstool', 'delete-initiator',
                          volume_iqn,
                          connector['initiator'],
                          run_as_root=True)
        except putils.ProcessExecutionError:
            LOG.error(_LE("Failed to delete initiator iqn %s to target.") %
                      connector['initiator'])
            raise exception.ISCSITargetAttachFailed(volume_id=volume['id'])
Ejemplo n.º 7
0
    def initialize_connection(self, volume, connector):
        """Maps the created volume to connector['initiator'].

        :param volume: dictionary volume reference
        :param connector: dictionary connector reference
        :returns: The connection information
        :raises: ISCSITargetAttachFailed
        """
        service_info = self._get_service_target(volume)
        (ip, ipp, evs, port, _fs, tgtalias, secret) = service_info

        try:
            conn = self.backend.add_iscsi_conn(volume.name, _fs, port,
                                               tgtalias,
                                               connector['initiator'])

        except processutils.ProcessExecutionError:
            msg = (_("Error attaching volume %(vol)s. "
                     "Target limit might be reached!") % {
                         'vol': volume.id
                     })
            LOG.error(msg)
            raise exception.ISCSITargetAttachFailed(volume_id=volume.id)

        hnas_portal = ip + ':' + ipp
        lu_id = six.text_type(conn['lu_id'])
        fulliqn = conn['iqn']
        tgt = (hnas_portal + ',' + tgtalias + ',' + volume.provider_location +
               ',' + evs + ',' + port + ',' + lu_id)

        LOG.info(_LI("initiate: connection %(tgt)s"), {'tgt': tgt})

        properties = {}
        properties['provider_location'] = tgt
        properties['target_discovered'] = False
        properties['target_portal'] = hnas_portal
        properties['target_iqn'] = fulliqn
        properties['target_lu'] = int(lu_id)
        properties['volume_id'] = volume.id
        properties['auth_username'] = connector['initiator']

        if self.config['chap_enabled']:
            properties['auth_method'] = 'CHAP'
            properties['auth_password'] = secret

        conn_info = {'driver_volume_type': 'iscsi', 'data': properties}

        return conn_info
Ejemplo n.º 8
0
 def initialize_connection(self, volume, connector):
     LOG.debug(
         'enter: initialize_connection: volume '
         '%(vol)s with connector %(conn)s', {
             'vol': volume.id,
             'conn': connector
         })
     volume_name = self._convert_name(volume.name)
     ret = self._cmd.create_lun_map(volume_name, self.protocol,
                                    connector['initiator'])
     if ret['key'] == 0:
         lun_required = ['iscsi_name', 'portal', 'lun']
         lun_info = ret['arr']
         for param in lun_required:
             if param not in lun_info:
                 msg = (_('initialize_connection: Param %(param)s '
                          'was not returned correctly when volume '
                          '%(vol)s mapping.') % {
                              'param': param,
                              'vol': volume.id
                          })
                 raise exception.VolumeBackendAPIException(data=msg)
         data = {
             'target_discovered': False,
             'target_iqns': lun_info['iscsi_name'],
             'target_portals': lun_info['portal'],
             'target_luns': lun_info['lun'],
             'volume_id': volume.id
         }
         LOG.debug(
             'leave: initialize_connection: volume '
             '%(vol)s with connector %(conn)s', {
                 'vol': volume.id,
                 'conn': connector
             })
         return {'driver_volume_type': 'iscsi', 'data': data}
     if ret['key'] == 303:
         raise exception.VolumeNotFound(volume_id=volume_name)
     elif ret['key'] == 402:
         raise exception.ISCSITargetAttachFailed(volume_id=volume_name)
     else:
         msg = (_('failed to map the volume %(vol)s to '
                  'connector %(conn)s.') % {
                      'vol': volume['id'],
                      'conn': connector
                  })
         raise exception.VolumeBackendAPIException(data=msg)
Ejemplo n.º 9
0
    def initialize_connection(self, volume, connector):
        volume_iqn = volume['provider_location'].split(' ')[1]

        (auth_method, auth_user, auth_pass) = \
            volume['provider_auth'].split(' ', 3)

        # Add initiator iqns to target ACL
        try:
            self._execute('rtstool',
                          'add-initiator',
                          volume_iqn,
                          auth_user,
                          auth_pass,
                          connector['initiator'],
                          run_as_root=True)
        except exception.ProcessExecutionError as e:
            LOG.error(
                _("Failed to add initiator iqn %s to target") %
                connector['initiator'])
            raise exception.ISCSITargetAttachFailed(volume_id=volume['id'])
Ejemplo n.º 10
0
    def initialize_connection(self, volume, connector):
        volume_iqn = volume['provider_location'].split(' ')[1]

        (auth_method, auth_user, auth_pass) = \
            volume['provider_auth'].split(' ', 3)

        # Add initiator iqns to target ACL
        try:
            self._execute('cinder-rtstool', 'add-initiator',
                          volume_iqn,
                          auth_user,
                          auth_pass,
                          connector['initiator'],
                          run_as_root=True)
        except putils.ProcessExecutionError:
            LOG.exception(_LE("Failed to add initiator iqn %s to target"),
                          connector['initiator'])
            raise exception.ISCSITargetAttachFailed(
                volume_id=volume['id'])

        # We make changes persistent
        self._persist_configuration(volume['id'])

        return super(LioAdm, self).initialize_connection(volume, connector)