dts--framework(一)

本文深入剖析了DPDK测试框架(DTS)的架构与核心组件,包括定义类、方法及测试套件执行流程。详细介绍了从配置解析到测试执行的全过程,涵盖了Crb、Dut等关键类的功能与实现细节,以及测试案例的创建与执行机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dts 大体框架

framework
    定义类
    定义方法
tests
    framework调用所需要的函数

./dpdk/usertools/cpu_layout.py    
/sys/devices/system/cpu
环境内核:0    1    2    3    4    5    6    7
ffff:1111    1111    1111    1111
ff3e:1111 1111    0011    1110

dts.py

    01.dts_parse_param(config, section):
    02.dts_parse_config(config, section):
    03.dts_parse_commands(commands):
    04.dts_run_commands(crb, dts_commands):
    05.get_project_obj(project_name, super_class, crbInst, serializer, dut_id):
    06.dts_log_testsuite(duts, tester, suite_obj, log_handler, test_classname):
    07.dts_log_execution(duts, tester, log_handler):
    08.dts_crbs_init(crbInsts, skip_setup, read_cache, project, base_dir, serializer, virttype):
    09.dts_crbs_exit(duts, tester):
    10.dts_run_prerequisties(duts, tester, pkgName, patch, dts_commands, serializer):
    11.dts_run_target(duts, tester, targets, test_suites):
    12.dts_run_suite(duts, tester, test_suites, target):
    13.run_all(config_file, pkgName, git, patch, skip_setup, '''Main process of DTS, it will run all test suites in the config file.'''
                read_cache, project, suite_dir, test_cases,
                base_dir, output_dir, verbose, virttype, debug,
                debugcase, re_run, commands):
    14.show_speedup_options_messages(read_cache, skip_setup):
    15.save_all_results():
    16.quit_execution(duts, tester):

Main.py

"""
A test framework for testing DPDK.
"""
01.def git_build_package(gitLabel, pkgName, depot="dep"):
dts.run_all(args.config_file, args.snapshot, args.git,                #args = parser.parse_args()
            args.patch, args.skip_setup, args.read_cache,
            args.project, args.suite_dir, args.test_cases,
            args.dir, args.output, args.verbose,args.virttype,
            args.debug, args.debugcase, args.re_run, args.commands)

Crb.py

class Crb(object):
    01.send_expect(self, cmds, expected, timeout=TIMEOUT,alt_session=False, verify=False):
    02.create_session(self, name=""):
    03.destroy_session(self, session=None):
    04.reconnect_session(self, alt_session=False):
    05.send_command(self, cmds, timeout=TIMEOUT, alt_session=False):
    06.get_session_output(self, timeout=TIMEOUT):
    07.set_test_types(self, func_tests, perf_tests):
    08.get_total_huge_pages(self):
    09.mount_huge_pages(self):
    10.strip_hugepage_path(self):
    11.set_huge_pages(self, huge_pages, numa=-1):
    12.set_speedup_options(self, read_cache, skip_setup):
    13.set_directory(self, base_dir):
    14.admin_ports(self, port, status):
    15.admin_ports_freebsd(self, port, status):
    16.admin_ports_linux(self, eth, status):
    17.pci_devices_information(self):
    18.pci_devices_information_uncached(self):
    19.pci_devices_information_uncached_linux(self):
    20.pci_devices_information_uncached_freebsd(self):
    21.get_pci_dev_driver(self, domain_id, bus_id, devfun_id):
    22.get_pci_dev_driver_linux(self, domain_id, bus_id, devfun_id):
    23.get_pci_dev_driver_freebsd(self, domain_id, bus_id, devfun_id):
    24.get_pci_dev_id(self, domain_id, bus_id, devfun_id):
    25.get_pci_dev_id_linux(self, domain_id, bus_id, devfun_id):
    26.get_device_numa(self, domain_id, bus_id, devfun_id):
    27.get_device_numa_linux(self, domain_id, bus_id, devfun_id):
    28.get_ipv6_addr(self, intf):
    29.get_ipv6_addr_linux(self, intf):
    30.get_ipv6_addr_freebsd(self, intf):
    31.disable_ipv6(self, intf):
    32.enable_ipv6(self, intf):
    33.create_file(self, contents, fileName):
    34.kill_all(self, alt_session=True):
    35.close(self):
    36.get_os_type(self):
    37.check_os_type(self):
    38.init_core_list(self):
    39.init_core_list_uncached(self):
    40.init_core_list_uncached_freebsd(self):
    41.init_core_list_uncached_linux(self):
    42.get_all_cores(self):
    43.remove_hyper_core(self, core_list, key=None):
    44.init_reserved_core(self):
    45.remove_reserved_cores(self, core_list, args):
    46.get_reserved_core(self, config, socket):
    47.get_core_list(self, config, socket=-1):
    48.get_lcore_id(self, config):
    49.get_port_info(self, pci):
    50.get_port_pci(self, port_id):
    51.enable_promisc(self, intf):

Dut.py

"""
A connection to the CRB under test.
This class sends commands to the CRB and validates the responses. It is
implemented using either ssh for linuxapp or the terminal server for
baremetal.
All operations are in fact delegated to an instance of either CRBLinuxApp
or CRBBareMetal.
"""
    00.__init__(self, crb, serializer, dut_id)
    01.init_host_session(self, vm_name)
    02.new_session(self, suite="")
    03.close_session(self, session)
    04.set_nic_type(self, nic_type)
    05.set_toolchain(self, target)
    06.mount_procfs(self)
    07.ount_procfs_linux(self)
    08.mount_procfs_freebsd(self)
    09.get_ip_address(self)
    10.get_password(self)
    11.get_username(self)
    12.dut_prerequisites(self)
    13.restore_interfaces(self)
    14.restore_interfaces_freebsd(self)
    15.stop_ports(self)
    16.restore_interfaces_linux(self)
    17.setup_memory(self, hugepages=-1)
    18.setup_memory_linux(self, hugepages=-1)
    19.setup_memory_freebsd(self, hugepages=-1)
    20.taskset(self, core)
    21.is_ssh_session_port(self, pci_bus)
    22.get_dpdk_bind_script(self)
    23.bind_interfaces_linux(self, driver='igb_uio', nics_to_bind=None)
    24.unbind_interfaces_linux(self, nics_to_bind=None)
    25.get_ports(self, nic_type='any', perf=None, socket=None)
    26.get_ports_performance(self, nic_type='any', perf=None, socket=None,
                                  force_same_socket=True,
                                  force_different_nic=True)
    27.get_peer_pci(self, port_num)
    28.get_mac_address(self, port_num)
    29.get_ipv6_address(self, port_num)
    30.get_numa_id(self, port_num)
    31.lcore_table_print(self, horizontal=False)
    32.get_memory_channels(self)
    33.check_ports_available(self, pci_bus, pci_id)
    34.rescan_ports(self)
    35.rescan_ports_uncached(self)
    36.rescan_ports_uncached_linux(self)
    37.rescan_ports_uncached_freebsd(self)
    38.load_serializer_ports(self)
    39.save_serializer_ports(self)
    40.scan_ports(self)
    41.scan_ports_cached(self)
    42.scan_ports_cached_linux(self)
    43.scan_ports_uncached(self)
    44.scan_ports_uncached_linux(self)
    45.scan_ports_uncached_freebsd(self)
    46.setup_virtenv(self, virttype)
    47.generate_sriov_vfs_by_port(self, port_id, vf_num, driver='default')
    48.destroy_sriov_vfs_by_port(self, port_id)
    49.destroy_all_sriov_vfs(self)
    50.destroy_all_sriov_vfs(self)
    51.get_vm_core_list(self)
    52.load_portconf(self)
    53.map_available_ports(self)
    54.map_available_ports_uncached(self)
    55.disable_tester_ipv6(self)
    56.enable_tester_ipv6
    57.check_port_occupied
    58.get_maximal_vnc_num(self)
    59.close(self)
    60.virt_exit(self)
    61.crb_exit(self)

test_cases.py

"""
A base class for creating DTF test cases.
"""
test_cases.py
    01.def __init__(self, duts, tester, target, suitename)
    02.def init_log(self)
    03._check_and_reconnect(self, crb=None)
    04.set_up_all(self)
    05.set_up(self)
    06.tear_down(self)
    07.tear_down_all(self)
    08.verify(self, passed, description)
    09._get_nic_driver(self, nic_name)
    10.set_check_inst(self, check=None)
    11.rst_report(self, *args, **kwargs)
    12.result_table_create(self, header)
    13.result_table_add(self, row)
    14.result_table_print(self)
    15.result_table_getrows(self)
    16._get_functional_cases(self)
    17._get_performance_cases(self)
    18._has_it_been_requested(self, test_case, test_name_regex)
    19.set_requested_cases(self, case_list)
    20._get_test_cases(self, test_name_regex)
    21.execute_setup_all(self)
    22._execute_test_case(self, case_obj)
    23.execute_test_cases(self)
    24.execute_test_case(self, case_obj)
    25.get_result(self)
    26.get_case_cfg(self)
    27.get_suite_cfg(self)
    28.execute_tear_downall(self)
    29.enable_history(self, history)
    30.dump_history(self)
    31.wirespeed(self, nic, frame_size, num_ports)

CheckCase.py

"""
    Class for check test case running criteria. All information will be loaded
    from conf/test_case_*list.json. Current two files are maintained. One is
    for check whether test case should skip, another one is for check whether
    current environment support test case execution.
"""
CheckCase.py
filter_json_file = './conf/test_case_checklist.json'
support_json_file = './conf/test_case_supportlist.json'
    00.__init__(self)
    01.check_dut(self, dut)
    02._check_os(self, os_type)
    03._check_nic(self, nic_type)
    04._check_target(self, target)
    05._check_host_driver(self, drivers)
    06.case_skip(self, case_name)
    07.case_support(self, case_name)
    
    
settings.py
"""
FOLDERS
    'Framework': 'framework',
    'Testscripts': 'tests',
    'Configuration': 'conf',
    'Depends': 'dep',
    'Output': 'output',
    'NicDriver': 'nics',
    
Nics and its identifiers supported by the framework.
    'kawela': '8086:10e8',
    'kawela_2': '8086:10c9',
    'kawela_4': '8086:1526',
    'bartonhills': '8086:150e',
    'powerville': '8086:1521',
    'powerville_vf': '8086:1520',
    
DRIVERS
    'kawela': 'igb',
    'kawela_2': 'igb',
    'kawela_4': 'igb',
    'bartonhills': 'igb',
    'powerville': 'igb',
    'powerville_vf': 'igbvf',
    
List used to translate scapy packets into Ixia TCL commands.
SCAPY2IXIA 
    'Ether',
    'Dot1Q',
    'IP',
    
Helpful header sizes.
HEADER_SIZE 
    'eth': 18,
    'ip': 20,
    'ipv6': 40,
    
dpdk send protocol packet size.
PROTOCOL_PACKET_SIZE = {
    'lldp': [110, 100],
}
Default session timeout.
TIMEOUT = 15

Global macro for dts.
IXIA = "ixia"

The log name seperater.
LOG_NAME_SEP = '.'

Section name for suite level configuration
SUITE_SECTION_NAME = "suite"

DTS global environment variable
DTS_ENV_PAT = r"DTS_*"
PERF_SETTING = "DTS_PERF_ONLY"

DTS global error table
DTS_ERR_TBL = {
    "GENERIC_ERR": 1,
    "DPDK_BUILD_ERR" : 2,
    "DUT_SETUP_ERR" : 3,

    00.get_nic_name(type)
    01.get_nic_driver(pci_id)
    02.get_netdev(crb, pci)
    03.get_host_ip(address)
    04.save_global_setting(key, value)
    05.load_global_setting(key)
    06.report_error(error)
    07.exit_error()
    08.accepted_nic(pci_id)

utils.py

"""
    Create thread lock dictionary based on DUTs number
"""
utils.py
    01.create_parallel_locks(num_duts)
    02.parallel_lock(num=1)
    03.RED(text)
    04.BLUE(text)
    05.GREEN(text)
    06.pprint(some_dict, serialzer=None)
    07.regexp(s, to_match, allString=False)
    08.get_obj_funcs(obj, func_name_regex)
    09.remove_old_rsa_key(crb, ip)
    10.human_read_number(num)
    11.get_subclasses(module, clazz)
    12.copy_instance_attr(from_inst, to_inst)
    13.create_mask(indexes)
    14.convert_int2ip(value, ip_type)
    15.convert_ip2int(ip_str, ip_type)
    16.get_backtrace_object(file_name, obj_name)

转载于:https://www.cnblogs.com/eilinge/p/9799265.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值