Пример #1
0
def _get_single_tpg(iqn):
    """
    Returns TPG object for given iqn, assuming that each target has a single TPG.
    """
    tpg = rtslib.TPG(rtslib.Target(rtslib.FabricModule('iscsi'), iqn), 1)

    return tpg
Пример #2
0
def create(backing_device,
           name,
           userid,
           password,
           iser_enabled,
           initiator_iqns=None):
    try:
        rtsroot = rtslib.root.RTSRoot()
    except rtslib.utils.RTSLibError:
        print(_('Ensure that configfs is mounted at /sys/kernel/config.'))
        raise

    # Look to see if BlockStorageObject already exists
    for x in rtsroot.storage_objects:
        if x.name == name:
            # Already exists, use this one
            return

    so_new = rtslib.BlockStorageObject(name=name, dev=backing_device)

    target_new = rtslib.Target(rtslib.FabricModule('iscsi'), name, 'create')

    tpg_new = rtslib.TPG(target_new, mode='create')
    tpg_new.set_attribute('authentication', '1')

    lun_new = rtslib.LUN(tpg_new, storage_object=so_new)

    if initiator_iqns:
        initiator_iqns = initiator_iqns.strip(' ')
        for i in initiator_iqns.split(','):
            acl_new = rtslib.NodeACL(tpg_new, i, mode='create')
            acl_new.chap_userid = userid
            acl_new.chap_password = password

            rtslib.MappedLUN(acl_new, lun_new.lun, lun_new.lun)

    tpg_new.enable = 1

    try:
        portal = rtslib.NetworkPortal(tpg_new, '0.0.0.0', 3260, mode='any')
    except rtslib.utils.RTSLibError:
        print(
            _('Error creating NetworkPortal: ensure port 3260 '
              'is not in use by another service.'))
        raise

    try:
        if iser_enabled == 'True':
            portal._set_iser(1)
    except rtslib.utils.RTSLibError:
        print(
            _('Error enabling iSER for NetworkPortal: please ensure that '
              'RDMA is supported on your iSCSI port.'))
        raise

    try:
        rtslib.NetworkPortal(tpg_new, '::0', 3260, mode='any')
    except rtslib.utils.RTSLibError:
        # TODO(emh): Binding to IPv6 fails sometimes -- let pass for now.
        pass
Пример #3
0
def delete_all_targets():
    """
    Recursively deletes all iscsi Target objects.
    """
    for iqn in current_targets():
        rtslib.Target(rtslib.FabricModule('iscsi'), wwn=iqn).delete()

    return None
Пример #4
0
def create_tpg(iqn):
    """
    Creates new TPG on iscsi target with given iqn.
    """
    logger.info("trying to create new tpg for %s" % iqn)
    try:
        rtslib.TPG(rtslib.Target(rtslib.FabricModule('iscsi'), iqn),
                   _next_free_tpg_index(iqn))
    except:
        raise

    return None
Пример #5
0
def current_tpgs(iqn):
    """
    Returns list of currently defined TPGs on iscsi target with given iqn,
    each being represented as {'iqn': '<str>', 'tag': '<int>'}
    """
    existings_tpgs = []
    for tpg in rtslib.Target(rtslib.FabricModule('iscsi'), iqn).tpgs:
        existings_tpgs.append({
            'iqn': iqn,
            'tag': tpg.tag,
        })

    return existings_tpgs
Пример #6
0
def create_target(iqn):
    """
    Creates new iscsi target with given iqn, unless it already exists.
    """
    logger.info("trying to create target %s" % iqn)
    if iqn in current_targets():
        logger.debug('iscsi-target "%s" already exists' % iqn)
    else:
        try:
            rtslib.Target(rtslib.FabricModule('iscsi'), wwn=iqn)
            logger.debug('Creating iscsi-target %s' % iqn)
        except:
            raise

    return None
Пример #7
0
    def _createTarget(self, iqn, imgPath, rollback):
        '''Using LIO Python binding to configure iSCSI target.

        LIO can export various types of backend storage object as LUN, and
        support many fabric modules like iSCSI, FCoE.

        The backstores/fileio/image hierachy and iscsi/target/tpg/lun
        hierarchy are managed separately. Their lifecycles are independent.
        Create the backstore hierachy and the iSCSI hierachy, then attach the
        image file to the lun.

        For more infomation, see http://www.linux-iscsi.org/wiki/ISCSI .
        '''
        fio = rtslib.FileIOStorageObject(os.path.basename(imgPath), imgPath,
                                         os.path.getsize(imgPath))
        rollback.prependDefer(fio.delete)

        iscsiMod = rtslib.FabricModule('iscsi')
        tgt = rtslib.Target(iscsiMod, iqn, mode='create')
        # Target.delete() will delete all
        # TPGs, ACLs, LUNs, Portals recursively
        rollback.prependDefer(tgt.delete)
        # TPG is a group of network portals
        tpg = rtslib.TPG(tgt, None, mode='create')
        rtslib.LUN(tpg, None, fio)
        # Enable demo mode, grant all initiators to access all LUNs in the TPG
        tpg.set_attribute('generate_node_acls', '1')
        tpg.set_attribute('cache_dynamic_acls', '1')
        # Do not use any authentication methods
        tpg.set_attribute('authentication', '0')
        # Allow writing to LUNs in demo mode
        tpg.set_attribute('demo_mode_write_protect', '0')
        # Activate the TPG otherwise it is not able to access the LUNs in it
        tpg.enable = True
        # Bind to '127.0.0.1' so it's OK to use demo mode just for testing
        rtslib.NetworkPortal(tpg, self.address, 3260, mode='create')
Пример #8
0
def create(backing_device,
           name,
           userid,
           password,
           iser_enabled,
           initiator_iqns=None,
           portals_ips=None,
           portals_port=3260):
    # List of IPS that will not raise an error when they fail binding.
    # Originally we will fail on all binding errors.
    ips_allow_fail = ()

    try:
        rtsroot = rtslib.root.RTSRoot()
    except rtslib.utils.RTSLibError:
        print(_('Ensure that configfs is mounted at /sys/kernel/config.'))
        raise

    # Look to see if BlockStorageObject already exists
    for x in rtsroot.storage_objects:
        if x.name == name:
            # Already exists, use this one
            return

    so_new = rtslib.BlockStorageObject(name=name, dev=backing_device)

    target_new = rtslib.Target(rtslib.FabricModule('iscsi'), name, 'create')

    tpg_new = rtslib.TPG(target_new, mode='create')
    tpg_new.set_attribute('authentication', '1')

    lun_new = rtslib.LUN(tpg_new, storage_object=so_new)

    if initiator_iqns:
        initiator_iqns = initiator_iqns.strip(' ')
        for i in initiator_iqns.split(','):
            acl_new = rtslib.NodeACL(tpg_new, i, mode='create')
            acl_new.chap_userid = userid
            acl_new.chap_password = password

            rtslib.MappedLUN(acl_new, lun_new.lun, lun_new.lun)

    tpg_new.enable = 1

    # If no ips are given we'll bind to all IPv4 and v6
    if not portals_ips:
        portals_ips = ('0.0.0.0', '::0')
        # TODO(emh): Binding to IPv6 fails sometimes -- let pass for now.
        ips_allow_fail = ('::0', )

    for ip in portals_ips:
        try:
            portal = rtslib.NetworkPortal(tpg_new,
                                          ip,
                                          portals_port,
                                          mode='any')
        except rtslib.utils.RTSLibError:
            raise_exc = ip not in ips_allow_fail
            msg_type = 'Error' if raise_exc else 'Warning'
            print(
                _('%(msg_type)s: creating NetworkPortal: ensure port '
                  '%(port)d on ip %(ip)s is not in use by another service.') %
                {
                    'msg_type': msg_type,
                    'port': portals_port,
                    'ip': ip
                })
            if raise_exc:
                raise
        else:
            try:
                if iser_enabled == 'True':
                    portal.iser = True
            except rtslib.utils.RTSLibError:
                print(
                    _('Error enabling iSER for NetworkPortal: please ensure '
                      'that RDMA is supported on your iSCSI port %(port)d '
                      'on ip %(ip)s.') % {
                          'port': portals_port,
                          'ip': ip
                      })
                raise
Пример #9
0
#!/usr/bin/env python

import rtslib

iscsi = rtslib.FabricModule("iscsi")
f = rtslib.FileIOStorageObject("test1", "/tmp/test.img", 20000000000)
f2 = rtslib.FileIOStorageObject("test2", "/tmp/test2.img", 20000000000)
target = rtslib.Target(iscsi)
tpg = rtslib.TPG(target, 1)
tpg.enable = True
tpg.set_attribute("authentication", False)
tpg.set_attribute("demo_mode_write_protect", False)
portal = rtslib.NetworkPortal(tpg, "0.0.0.0", 3260)
lun = rtslib.LUN(tpg, 0, f)
lun2 = rtslib.LUN(tpg, 1, f2)
tpg.set_attribute("cache_dynamic_acls", True)
tpg.set_attribute("generate_node_acls", True)
print target.wwn