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)
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)
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, )
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)
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)
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)
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)
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 ''
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)
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)
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)
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)
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)