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)