Beispiel #1
0
    def _arcconf_ld_to_lsm_vol(arcconf_ld, array_num, sys_id, ctrl_num):
        ld_id = arcconf_ld['logicalDriveID']
        raid_level = arcconf_ld['raidLevel']
        vpd83 = str(arcconf_ld['volumeUniqueID']).lower()
        pool_id = "%s:%s" % (sys_id, array_num)

        block_size = arcconf_ld['BlockSize']
        num_of_blocks = int(arcconf_ld['dataSpace'])
        vol_name = arcconf_ld['name']

        if vpd83:
            blk_paths = LocalDisk.vpd83_search(vpd83)
            if blk_paths:
                vol_name += ": %s" % " ".join(blk_paths)

        if int(arcconf_ld['state']) != LOGICAL_DEVICE_OK:
            admin_status = Volume.ADMIN_STATE_DISABLED
        else:
            admin_status = Volume.ADMIN_STATE_ENABLED

        stripe_size = arcconf_ld['StripeSize']
        full_stripe_size = arcconf_ld['fullStripeSize']
        ld_state = arcconf_ld['state']
        plugin_data = "%s:%s:%s:%s:%s:%s:%s" % (ld_state, raid_level,
                                                stripe_size, full_stripe_size,
                                                ld_id, array_num, ctrl_num)
        volume_id = "%s:%s" % (sys_id, ld_id)
        return Volume(volume_id, vol_name, vpd83, block_size, num_of_blocks,
                      admin_status, sys_id, pool_id, plugin_data)
Beispiel #2
0
    def _arcconf_ld_to_lsm_vol(arcconf_ld,
                               pool_id,
                               sys_id,
                               ctrl_num,
                               array_num,
                               arcconf_ld_name):
        ld_num = arcconf_ld['logicalDriveID']
        vpd83 = str(arcconf_ld['volumeUniqueID']).lower()

        block_size = arcconf_ld['BlockSize']
        num_of_blocks = int(arcconf_ld['dataSpace']) * 1024 / int(block_size)
        vol_name = arcconf_ld_name

        if vpd83:
            blk_paths = LocalDisk.vpd83_search(vpd83)
            if blk_paths:
                vol_name += ": %s" % " ".join(blk_paths)

        if int(arcconf_ld['state']) != LOGICAL_DEVICE_OK:
            admin_status = Volume.ADMIN_STATE_DISABLED
        else:
            admin_status = Volume.ADMIN_STATE_ENABLED
        plugin_data = "%s:%s:%s" % (ctrl_num, array_num, ld_num)

        volume_id = array_num
        return Volume(
            volume_id, vol_name, vpd83, block_size, num_of_blocks,
            admin_status, sys_id, pool_id, plugin_data)
Beispiel #3
0
    def volumes(self, search_key=None, search_value=None, flags=0):
        """
        Returns an array of volume objects

        """
        vol_list = []
        lu_list = self._request("get_names", "zvol", [""])

        #        lu_list = self._ns_request('rest/nms',
        #            {"method": "get_lu_list",
        #             "object": "scsidisk",
        #             "params": ['']})
        for lu in lu_list:
            try:
                lu_props = self._request("get_lu_props", "scsidisk", [lu])
            except:
                lu_props = {'guid': '', 'state': 'N/A'}

            zvol_props = self._request("get_child_props", "zvol", [lu, ""])

            block_size = NexentaStor._to_bytes(zvol_props['volblocksize'])
            size_bytes = int(zvol_props['size_bytes'])
            num_of_blocks = size_bytes / block_size
            admin_state = Volume.ADMIN_STATE_ENABLED

            vol_list.append(
                Volume(lu, lu, lu_props['guid'].lower(),
                       block_size, num_of_blocks,
                       admin_state, self.system.id,
                       NexentaStor._get_pool_id(lu)))

        return search_property(vol_list, search_key, search_value)
    def _vd_to_lsm_vol(vd_id, dg_id, sys_id, vd_basic_info, vd_pd_info_list,
                       vd_prop_info, vd_path):

        vol_id = f"{sys_id}:VD{vd_id:d}"
        name = f"VD {vd_id:d}"
        if "Name" in list(vd_basic_info.keys()) and vd_basic_info["Name"]:
            name += ": {}".format(vd_basic_info["Name"])

        vpd83 = vd_prop_info.get("SCSI NAA Id", "")
        if len(vpd83) != 0:
            vol_id = vpd83
        block_size = size_human_2_size_bytes(vd_pd_info_list[0]["SeSz"])
        num_of_blocks = vd_prop_info["Number of Blocks"]
        admin_state = Volume.ADMIN_STATE_ENABLED
        if vd_prop_info["Exposed to OS"] != "Yes" or \
           vd_basic_info["Access"] != "RW":
            admin_state = Volume.ADMIN_STATE_DISABLED
        pool_id = _pool_id_of(dg_id, sys_id)
        plugin_data = vd_path
        return Volume(
            vol_id,
            name,
            vpd83,
            block_size,
            num_of_blocks,
            admin_state,
            sys_id,
            pool_id,
            plugin_data,
        )
Beispiel #5
0
    def _arcconf_ld_to_lsm_vol(arcconf_ld, pool_id, sys_id, ctrl_num,
                               array_num, arcconf_ld_name):
        """
        raises DeviceNotFoundError
        """
        ld_num = arcconf_ld['logicalDriveID']
        vpd83 = str(arcconf_ld['volumeUniqueID']).lower()

        block_size = arcconf_ld['BlockSize']
        num_of_blocks = int(arcconf_ld['dataSpace']) / int(block_size)
        vol_name = arcconf_ld_name

        if len(vpd83) > 0:
            blk_paths = LocalDisk.vpd83_search(vpd83)
            if len(blk_paths) > 0:
                blk_path = blk_paths[0]
                vol_name += ": %s" % " ".join(blk_paths)
                device = Device.from_device_file(_CONTEXT, blk_path)
                attributes = device.attributes
                try:
                    block_size = attributes.asint("BlockSize")
                    num_of_blocks = attributes.asint("dataSpace")
                except (KeyError, UnicodeDecodeError, ValueError):
                    pass

        if int(arcconf_ld['state']) > 2:
            admin_status = Volume.ADMIN_STATE_DISABLED
        else:
            admin_status = Volume.ADMIN_STATE_ENABLED
        plugin_data = "%s:%s:%s" % (ctrl_num, array_num, ld_num)

        volume_id = array_num
        return Volume(volume_id, vol_name, vpd83, block_size, num_of_blocks,
                      admin_status, sys_id, pool_id, plugin_data)
Beispiel #6
0
    def _get_volume(self, pool_id, volume_name):
        vol = [
            v for v in self._jsonrequest("vol_list", dict(pool=pool_id))
            if v['name'] == volume_name
        ][0]

        vpd83 = TargetdStorage._uuid_to_vpd83(vol['uuid'])
        return Volume(vol['uuid'], vol['name'], vpd83, 512, vol['size'] / 512,
                      Volume.ADMIN_STATE_ENABLED, self.system.id, pool_id)
Beispiel #7
0
 def volumes(self, search_key=None, search_value=None, flags=0):
     volumes = []
     for p_name in (p['name'] for p in self._jsonrequest("pool_list")
                    if p['type'] == 'block'):
         for vol in self._jsonrequest("vol_list", dict(pool=p_name)):
             vpd83 = TargetdStorage._uuid_to_vpd83(vol['uuid'])
             volumes.append(
                 Volume(vol['uuid'], vol['name'], vpd83, 512,
                        long(vol['size'] / 512), Volume.ADMIN_STATE_ENABLED,
                        self.system.id, p_name))
     return search_property(volumes, search_key, search_value)
Beispiel #8
0
    def volume_resize(self, volume, new_size_bytes, flags=0):
        """
        Re-sizes a volume.

        Returns a tuple (job_id, re-sized_volume)
        Note: Tuple return values are mutually exclusive, when one
        is None the other must be valid.
        """
        self._request("set_child_prop", "zvol",
                      [volume.name, 'volsize', str(new_size_bytes)])
        self._request("realign_size", "scsidisk", [volume.name])
        new_num_of_blocks = new_size_bytes / volume.block_size
        return None, Volume(volume.id, volume.name, volume.vpd83,
                            volume.block_size, new_num_of_blocks,
                            volume.admin_state, volume.system_id,
                            volume.pool_id)
Beispiel #9
0
def _vpd83_of_cim_vol(cim_vol):
    """
    Extract VPD83 NAA string from CIMInstanceName and convert to LSM format.
    """
    vpd_83 = _vpd83_in_cim_vol_name(cim_vol)
    if vpd_83 is None:
        vpd_83 = _vpd83_in_cim_vol_otherinfo(cim_vol)
    if vpd_83 is None:
        vpd_83 = _vpd83_netapp(cim_vol)

    if vpd_83:
        vpd_83 = vpd_83.lower()

    if vpd_83 and Volume.vpd83_verify(vpd_83):
        return vpd_83
    else:
        return ''
Beispiel #10
0
def _vpd83_of_cim_vol(cim_vol):
    """
    Extract VPD83 NAA string from CIMInstanceName and convert to LSM format.
    """
    vpd_83 = _vpd83_in_cim_vol_name(cim_vol)
    if vpd_83 is None:
        vpd_83 = _vpd83_in_cim_vol_otherinfo(cim_vol)
    if vpd_83 is None:
        vpd_83 = _vpd83_netapp(cim_vol)

    if vpd_83:
        vpd_83 = vpd_83.lower()

    if vpd_83 and Volume.vpd83_verify(vpd_83):
        return vpd_83
    else:
        return ''
Beispiel #11
0
    def _vd_to_lsm_vol(vd_id, dg_id, sys_id, vd_basic_info, vd_pd_info_list,
                       vd_prop_info, vd_path):

        vol_id = "%s:VD%d" % (sys_id, vd_id)
        name = "VD %d" % vd_id
        if 'Name' in vd_basic_info.keys() and vd_basic_info['Name']:
            name += ": %s" % vd_basic_info['Name']

        vpd83 = ''  # TODO(Gris Ge): Beg LSI to provide this information.
        block_size = size_human_2_size_bytes(vd_pd_info_list[0]['SeSz'])
        num_of_blocks = vd_prop_info['Number of Blocks']
        admin_state = Volume.ADMIN_STATE_ENABLED
        if vd_prop_info['Exposed to OS'] != 'Yes' or \
           vd_basic_info['Access'] != 'RW':
            admin_state = Volume.ADMIN_STATE_DISABLED
        pool_id = _pool_id_of(dg_id, sys_id)
        plugin_data = vd_path
        return Volume(
            vol_id, name, vpd83, block_size, num_of_blocks, admin_state,
            sys_id, pool_id, plugin_data)
Beispiel #12
0
    def _vd_to_lsm_vol(vd_id, dg_id, sys_id, vd_basic_info, vd_pd_info_list,
                       vd_prop_info, vd_path):

        vol_id = "%s:VD%d" % (sys_id, vd_id)
        name = "VD %d" % vd_id
        if 'Name' in list(vd_basic_info.keys()) and vd_basic_info['Name']:
            name += ": %s" % vd_basic_info['Name']

        vpd83 = vd_prop_info.get('SCSI NAA Id', '')
        if (len(vpd83) != 0):
            vol_id = vpd83
        block_size = size_human_2_size_bytes(vd_pd_info_list[0]['SeSz'])
        num_of_blocks = vd_prop_info['Number of Blocks']
        admin_state = Volume.ADMIN_STATE_ENABLED
        if vd_prop_info['Exposed to OS'] != 'Yes' or \
           vd_basic_info['Access'] != 'RW':
            admin_state = Volume.ADMIN_STATE_DISABLED
        pool_id = _pool_id_of(dg_id, sys_id)
        plugin_data = vd_path
        return Volume(vol_id, name, vpd83, block_size, num_of_blocks,
                      admin_state, sys_id, pool_id, plugin_data)
Beispiel #13
0
def cim_vol_to_lsm_vol(cim_vol, pool_id, sys_id):
    """
    Takes a CIMInstance that represents a volume and returns a lsm Volume
    """

    # This is optional (User friendly name)
    if 'ElementName' in cim_vol:
        user_name = cim_vol["ElementName"]
    else:
        # Better fallback value?
        user_name = cim_vol['DeviceID']

    vpd_83 = _vpd83_of_cim_vol(cim_vol)

    admin_state = Volume.ADMIN_STATE_ENABLED

    plugin_data = cim_path_to_path_str(cim_vol.path)

    return Volume(vol_id_of_cim_vol(cim_vol), user_name, vpd_83,
                  cim_vol["BlockSize"], cim_vol["NumberOfBlocks"], admin_state,
                  sys_id, pool_id, plugin_data)
Beispiel #14
0
    def volumes(self, search_key=None, search_value=None, flags=0):
        """
        Returns an array of volume objects

        """
        vol_list = []
        lu_list = self._request("get_names", "zvol", [""])

        #        lu_list = self._ns_request('rest/nms',
        #            {"method": "get_lu_list",
        #             "object": "scsidisk",
        #             "params": ['']})
        for lu in lu_list:
            try:
                try:
                    lu_props = self._request("get_lu_props", "scsidisk", [lu])
                except:
                    lu_props = {'guid': '', 'state': 'N/A'}

                zvol_props = self._request("get_child_props", "zvol", [lu, ""])

                block_size = NexentaStor._to_bytes(zvol_props['volblocksize'])
                size_bytes = int(zvol_props['size_bytes'])
                num_of_blocks = int_div(size_bytes, block_size)
                admin_state = Volume.ADMIN_STATE_ENABLED

                vol_list.append(
                    Volume(lu, lu, lu_props['guid'].lower(), block_size,
                           num_of_blocks, admin_state, self.system.id,
                           NexentaStor._get_pool_id(lu)))
            except LsmError as e:
                # The available volumes could have changed while we were trying
                # to retrieve information about each one of them.
                error('nstor:volumes: %s' % str(e))
                pass

        return search_property(vol_list, search_key, search_value)
Beispiel #15
0
    def _hp_ld_to_lsm_vol(hp_ld, pool_id, sys_id, ctrl_num, array_num,
                          hp_ld_name):
        ld_num = hp_ld_name[len("Logical Drive: "):]
        vpd83 = hp_ld['Unique Identifier'].lower()
        # No document or command output indicate block size
        # of volume. So we try to read from linux kernel, if failed
        # try 512 and roughly calculate the sector count.
        regex_match = re.compile("/dev/(sd[a-z]+)").search(hp_ld['Disk Name'])
        vol_name = hp_ld_name
        if regex_match:
            sd_name = regex_match.group(1)
            block_size = int(
                file_read("/sys/block/%s/queue/logical_block_size" % sd_name))
            num_of_blocks = int(file_read("/sys/block/%s/size" % sd_name))
            vol_name += ": /dev/%s" % sd_name
        else:
            block_size = 512
            num_of_blocks = int(_hp_size_to_lsm(hp_ld['Size']) / block_size)

        plugin_data = "%s:%s:%s" % (ctrl_num, array_num, ld_num)

        # HP SmartArray does not allow disabling volume.
        return Volume(vpd83, vol_name, vpd83, block_size, num_of_blocks,
                      Volume.ADMIN_STATE_ENABLED, sys_id, pool_id, plugin_data)