Best Python code snippet using avocado_python
pci.py
Source:pci.py  
...130    Gets network interface(nic) in a PCI address.131    :param pci_address: Any segment of a PCI address (1f, 0000:00:1f, ...)132    :return: list of network interfaces in a PCI address.133    """134    return get_interfaces_in_pci_address(pci_address, "net")135def get_interfaces_in_pci_address(pci_address, pci_class):136    """137    Gets interface in a PCI address.138    e.g: host = pci.get_interfaces_in_pci_address("0001:01:00.0", "net")139         ['enP1p1s0f0']140         host = pci.get_interfaces_in_pci_address("0004:01:00.0", "scsi_host")141         ['host6']142    :param pci_address: Any segment of a PCI address (1f, 0000:00:1f, ...)143    :param class: Adapter class (FC(fc_host), FCoE(net), NIC(net), SCSI(scsi)..)144    :return: list of generic interfaces in a PCI address.145    """146    pci_class_path = "/sys/class/%s/" % pci_class147    if not pci_class or not os.path.isdir(pci_class_path):148        return ""149    return [interface for interface in os.listdir(pci_class_path)150            if pci_address in os.readlink(os.path.join(pci_class_path,151                                                       interface))]152def get_pci_class_name(pci_address):153    """154    Gets PCI class name for given PCI bus address155    e.g: >>> pci.get_pci_class_name("0000:01:00.0")156             'scsi_host'157    :param pci_address: Any segment of a PCI address(1f, 0000:00:if, ...)158    :return: class name for corresponding PCI bus address159    """160    pci_class_dic = {'0104': 'scsi_host', '0c04': 'scsi_host', '0280': 'net',161                     '0c03': 'scsi_host', '0200': 'net', '0108': 'nvme',162                     '0106': 'ata_port', '0207': 'net'}163    pci_class_id = get_pci_prop(pci_address, "Class")164    if pci_class_id not in pci_class_dic:165        return ""166    return pci_class_dic.get(pci_class_id)167def get_pci_type(pci_address):168    """169    Gets PCI type for given PCI bus address170    e.g: >>> pci.get_pci_class_name("0000:01:00.0")171             'fc'172    :param pci_address: Any segment of a PCI address(1f, 0000:00:if, ...)173    :return: type for corresponding PCI bus address174    """175    pci_class_dic = {'0104': 'raid', '0c04': 'fc', '0280': 'infiniband',176                     '0c03': 'usb', '0200': 'network', '0108': 'nvme',177                     '0207': 'infiniband'}178    pci_class_id = get_pci_prop(pci_address, "Class")179    if pci_class_id not in pci_class_dic:180        return ""181    return pci_class_dic.get(pci_class_id)182def get_firmware(pci_address):183    """184    Gets firmware of a pci_address185    :param pci_address: PCI address(0000:00:if.0, ...)186    :return: firmware for its interface187    """188    class_name = get_pci_class_name(pci_address)189    interface = get_interfaces_in_pci_address(pci_address, class_name)190    firmware = ''191    if not interface:192        return firmware193    interface = interface[0]194    if class_name == 'net':195        for line in runcmd('ethtool -i %s' % interface)[1].splitlines():196            if 'firmware-version' in line:197                firmware = line.split()[1]198                break199    else:200        for name in ['firmware_rev', 'fwrev', 'fw_version']:201            filename = "/sys/class/%s/%s/%s" % (class_name, interface, name)202            if os.path.isfile(filename):203                with open(filename, 'r') as fw_file:204                    firmware = fw_file.read().strip('\t\r\n\0').split()[0]205                    firmware = firmware.strip(',')206    return firmware207def get_pci_fun_list(pci_address):208    """209    Gets list of functions in the given PCI address.210    Example: in address 0000:03:00, functions are 0000:03:00.0 and 0000:03:00.1211    :param pci_address: Any segment of a PCI address (1f, 0000:00:1f, ...)212    :return: list of functions in a PCI address.213    """214    return list(dev for dev in get_pci_addresses() if pci_address in dev)215def get_slot_from_sysfs(full_pci_address):216    """217    Gets the PCI slot of given address.218    :note: Specific for ppc64 processor.219    :param full_pci_address: Full PCI address including domain (0000:03:00.0)220    :return: Removed port related details using re, only returns till221             physical slot of the adapter.222    """223    if 'ppc64' not in platform.processor():224        return ""225    if not os.path.isfile('/sys/bus/pci/devices/%s/devspec' % full_pci_address):226        return227    filename = "/sys/bus/pci/devices/%s/devspec" % full_pci_address228    with open(filename, 'r') as file_obj:229        devspec = file_obj.read()230    if not os.path.isfile("/proc/device-tree/%s/ibm,loc-code" % devspec):231        return232    filename = "/proc/device-tree/%s/ibm,loc-code" % devspec233    with open(filename, 'r') as file_obj:234        slot = file_obj.read()235    slot_ibm = re.match(r'((\w+)[.])+(\w+)-[P(\d+)-]*C(\d+)', slot)236    if slot_ibm:237        return slot_ibm.group()238    slot_openpower = re.match(r'(\w+)[\s]*(\w+)(\d*)', slot)239    if slot_openpower:240        return slot_openpower.group()241    return ""242def get_slot_list():243    """244    Gets list of PCI slots in the system.245    :note: Specific for ppc64 processor.246    :return: list of slots in the system.247    """248    return list(set(get_slot_from_sysfs(dev) for dev in get_pci_addresses()))249def get_pci_id_from_sysfs(full_pci_address):250    """251    Gets the PCI ID from sysfs of given PCI address.252    :param full_pci_address: Full PCI address including domain (0000:03:00.0)253    :return: PCI ID of a PCI address from sysfs.254    """255    path = "/sys/bus/pci/devices/%s" % full_pci_address256    if os.path.isdir(path):257        path = "%s/%%s" % path258        return ":".join(["%04x" % int(open(path % param).read(), 16)259                         for param in ['vendor', 'device', 'subsystem_vendor',260                                       'subsystem_device']])261    return ""262def get_pci_prop(pci_address, prop):263    """264    Gets specific PCI ID of given PCI address. (first match only)265    :param pci_address: Any segment of a PCI address (1f, 0000:00:1f, ...)266    :param part: prop of PCI ID.267    :return: specific PCI ID of a PCI address.268    """269    output = runcmd("lspci -Dnvmm -s %s" % pci_address)[1]270    if output:271        for line in output.splitlines():272            if prop == line.split(':')[0]:273                return line.split()[-1]274    return ""275def get_pci_id(pci_address):276    """277    Gets PCI id of given address. (first match only)278    :param pci_address: Any segment of a PCI address (1f, 0000:00:1f, ...)279    :return: PCI ID of a PCI address.280    """281    pci_id = []282    for params in ['Vendor', 'Device', 'SVendor', 'SDevice']:283        output = get_pci_prop(pci_address, params)284        if not output:285            return ""286        pci_id.append(output)287    if pci_id:288        return ":".join(pci_id)289def get_pci_prop_name(pci_address, prop):290    """291    Gets specific PCI ID of given PCI address. (first match only)292    :param pci_address: Any segment of a PCI address (1f, 0000:00:1f, ...)293    :param prop: prop of PCI ID.294    :return: specific PCI ID of a PCI address.295    """296    output = runcmd("lspci -Dvmm -s %s" % pci_address)[1]297    if output:298        for line in output.splitlines():299            if prop == line.split(':')[0]:300                return " ".join(line.split()[1:])301    return ""302def get_pci_name(pci_address):303    """304    Gets PCI id of given address. (first match only)305    :param pci_address: Any segment of a PCI address (1f, 0000:00:1f, ...)306    :return: PCI ID of a PCI address.307    """308    pci_name = []309    for params in ['Vendor', 'Device']:310        output = get_pci_prop_name(pci_address, params)311        if not output:312            return313        pci_name.append(output)314    if pci_name:315        return " ".join(pci_name)316    return ""317def get_driver(pci_address):318    """319    Gets the kernel driver in use of given PCI address. (first match only)320    :param pci_address: Any segment of a PCI address (1f, 0000:00:1f, ...)321    :return: driver of a PCI address.322    """323    output = runcmd("lspci -ks %s" % pci_address)[1]324    if output:325        for line in output.splitlines():326            if 'Kernel driver in use:' in line:327                return line.rsplit(None, 1)[-1]328    return ""329def ioa_details():330    """331    Gets the IPR IOA details and returns332    return: list of dics, with keys ioa, serial, remote serial, pci, status333    """334    show_ioas = runcmd("iprconfig -c show-ioas")[1]335    ioas = []336    if show_ioas:337        for line in show_ioas.splitlines():338            if 'Operational' in line:339                ioa = line.split()[0]340                serial = r_serial = pci = status = ''341                ioa_details = runcmd('iprconfig -c show-details %s' % ioa)[1]342                for line in ioa_details.splitlines():343                    if line.startswith('PCI Address'):344                        pci = line.split()[-1]345                    if line.startswith('Serial Number'):346                        serial = line.split()[-1]347                    if line.startswith('Remote Adapter Serial Number'):348                        r_serial = line.split()[-1]349                    if line.startswith('Current Dual Adapter State'):350                        status = line.split()[-1]351                ioas.append({'ioa': ioa, 'pci': pci, 'serial': serial, 'r_serial': r_serial, 'status': status})352    return ioas353def get_primary_ioa(pci_address):354    """355    Gets the Primary IPR IOA in the given PCI address356    :param pci_address: PCI Address (0000:00:1f, 0000:00:1f.1, ...)357    :return: primary IOA358    """359    for ioa_detail in ioa_details():360        if pci_address in ioa_detail['pci'] and 'Primary' in ioa_detail['status']:361            return ioa_detail['ioa']362    return ''363def get_secondary_ioa(primary_ioa):364    """365    Gets the Secondary IPR IOA in the given Primary IPR IOA366    :param primary_ioa: Primary IPR IOA (sg1, sg22, ...)367    :return: secondary IOA368    """369    details = ioa_details()370    serial = ''371    for ioa_detail in details:372        if primary_ioa == ioa_detail['ioa']:373            serial = ioa_detail['r_serial']374    if not serial:375        return ''376    for ioa_detail in details:377        if serial == ioa_detail['serial']:378            return ioa_detail['ioa']379    return ''380def pci_info(pci_addrs, pci_type='', pci_blocklist='', type_blocklist=''):381    """382    Get all the information for given PCI addresses (comma separated).383    :param pci_addrs: PCI addresses384    :return: list of dictionaries of PCI information385    """386    if not pci_addrs:387        return []388    pci_addrs = pci_addrs.split(',')389    pci_addrs = [pci_addr.split('.')[0] for pci_addr in pci_addrs]390    pci_addrs = list(set(pci_addrs))391    if pci_blocklist:392        pci_blocklist = pci_blocklist.split(',')393        pci_blocklist = [pci_addr.split('.')[0] for pci_addr in pci_blocklist]394        pci_addrs = list(set(pci_addrs) - set(pci_blocklist))395    pci_addrs.sort()396    pci_list = []397    if pci_type:398        pci_type = list(set(pci_type.split(',')))399    else:400        pci_type = []401    if type_blocklist:402        type_blocklist = type_blocklist.split(',')403    for pci_addr in pci_addrs:404        pci_dic = {}405        root_disks = get_root_disks()406        pci_dic['functions'] = get_pci_fun_list(pci_addr)407        pci_dic['pci_root'] = pci_addr408        pci_dic['adapter_description'] = get_pci_name(pci_dic['functions'][0])409        pci_dic['adapter_id'] = get_pci_id(pci_dic['functions'][0])410        pci_dic['adapter_type'] = get_pci_type(pci_dic['functions'][0])411        pci_dic['driver'] = get_driver(pci_dic['functions'][0])412        pci_dic['slot'] = get_slot_from_sysfs(pci_dic['functions'][0])413        if pci_dic['adapter_type'] in type_blocklist:414            continue415        elif "All" not in pci_type and pci_dic['adapter_type'] not in pci_type:416            continue417        pci_dic['interfaces'] = []418        pci_dic['class'] = get_pci_class_name(pci_dic['functions'][0])419        for fun in pci_dic['functions']:420            pci_dic['interfaces'].extend(get_interfaces_in_pci_address(fun, pci_dic['class']))421        pci_dic['firmware'] = get_firmware(pci_dic['functions'][0])422        pci_dic['disks'] = []423        for interface in pci_dic['interfaces']:424            pci_dic['disks'].extend(get_disks_in_interface(interface))425        pci_dic['disks'] = list(set(pci_dic['disks']))426        pci_dic['mpath_wwids'] = []427        pci_dic['mpath_disks'] = []428        if pci_dic['class'] == 'scsi_host':429            pci_dic['mpath_wwids'] = get_multipath_wwids(pci_dic['disks'])430            pci_dic['mpath_disks'] = get_multipath_disks(pci_dic['mpath_wwids'])431        pci_dic['infiniband_interfaces'] = []432        if pci_dic['adapter_type'] == 'infiniband':433            for fun in pci_dic['functions']:434                pci_dic['infiniband_interfaces'].extend(get_interfaces_in_pci_address(fun, 'infiniband'))435        if pci_dic['adapter_type'] == 'raid':436            for fun in pci_dic['functions']:437                pci_dic['primary_ioa'] = get_primary_ioa(fun)438                pci_dic['secondary_ioa'] = get_secondary_ioa(pci_dic['primary_ioa'])439        pci_dic['is_root_disk'] = False440        for disk in pci_dic['disks']:441            for root_disk in root_disks:442                if root_disk in disk:443                    pci_dic['is_root_disk'] = True444                    break445        pci_list.append(pci_dic)446    return pci_list447def all_pci_info(pci_type='', pci_blocklist='', type_blocklist=''):448    """...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
