Currently there is no dedicated functional test tool in Lustre test suites for LNet testing. Lustre Unit Test Framework (LUTF) fills that gap to provide a means for testing existing LNet features as well as new features that would be added in future. It facilitates an easy way of adding new test cases/scripts to test any new LNet feature.
This High Level Design Document describes the current LUTF design, code base, infrastructure requirements for its setup and the new features that can be added on top of the current design.
Document Link |
---|
LNet Unit Test Infrastructure (LUTF) Requirements |
This document is made up of the following sections:
The LUTF is designed with a Master-Agent approach to test LNet. The Master and Agent LUTF instance uses a telnet python module to communicate with each other and more than one Agent can communicate with single Master instance at the same time. The Master instance controls the execution of the python test scripts to test LNet on Agent instances. It collects the results of all the tests run on Agents and write them to a YAML file. It also controls the synchronization mechanism between test-scripts running on different Agents.
The below diagram shows how LUTF interacts with LNet
Figure 1: System Level Diagram
The LUTF shall be integrated with the Lustre tests under lustre/tests/lutf
. The LUTF will be built and packaged with the standard
sh ./autogen.sh ./configure --with-linux=<kernel path> make # optionally make rpms # optionally make install |
The make system will build the following items:
lutf
binaryliblutf_agent.so
- shared library to communicate with the LUTF backend.clutf_agen.py
and clutf_agent.so
: glue code that allows python to call functions in liblutf_agent.so_lnetconfig.so
and lnetconfig.py
- glue code to allow python test scripts to utilize the DLC interface.The build process will check if python 2.7.5
and SWIG 2.0
or higher is installed before building. If these requirements are not met the LUTF is not built
If the LUTF is built it will be packaged in the lustre-tests
rpm and installed in /usr/lib64/lustre/tests/lutf
.
Each node which will run the LUTF will need to have the following installed
yum install ncurses-devel
yum install readline-devel
https://www.python.org/download/releases/2.7.5/
./configure --prefix=<> --enable-shared # it is recommended to install in standard system path
make; make install
python2.7 setup.py install
python2.7 setup.py install
The LUTF will also require that passwordless ssh is setup for all the nodes which run the LUTF.
The LUTF will provide a deployment script, lutf_deploy.py,
which will download and install all the necessary elements defined above. If everything is successful it will start the LUTF given the LUTF YAML configuration file, described later.
A similar script to auster will be provided by the LUTF, lutf_engage.py
. The purpose of the script is to manage which nodes the LUTF will be deployed on. Only the AT has knowledge of the nodes available; therefore the script will perform the following steps;
lutf_engage.py
script. The second option will be assumed in this HLD.lutf_deploy.py
script for each of the nodes provided. It will pass the Master YAML LUTF Configuration file to the master node that the agent configuration file to the agent nodes.paramiko
. The API is described below.This configuration file describes the information the master needs in order to start
config: type: master mport: <master port> base_path: <base path to the LUTF directory - optional. if not present default to /usr/lib64/lustre/tests> extra_py: <extra python paths> |
This configuration file describes the information the agent needs in order to start
config: type: agent maddress: <master address - optional> mport: <master port> dport: <agent daemon port> base_path: <base path to the LUTF directory> extra_py: <extra python paths> |
This configuration file describes the list of tests to run
config: type: tests tests: - 0: <test set name> 1: <test set name> 2: <test set name> .... N: <test set name> |
This YAML result file describes the results of the tests that were requested to run
TestGroup: test_group: review-ldiskfs testhost: trevis-13vm5 submission: Mon May 8 15:54:41 UTC 2017 user_name: root autotest_result_group_id: 5e11dc5b-7dd7-48a1-b4a3-74a333acd912 test_sequence: 1 test_index: 10 session_group_id: cfeff6b3-60fc-438a-88ef-68e65a08694f enforcing: true triggering_build_number: 45090 triggering_job_name: lustre-reviews total_enforcing_sessions: 5 code_review: type: Gerrit url: review.whamcloud.com project: fs/lustre-release branch: multi-rail identifiers: - id: 3fbd25eb0fe90e4f34e36bad006c73d756ef8499 issue_tracker: type: Jira url: jira.hpdd.intel.com identifiers: - id: LU-9119 Tests: - name: dlc description: lutf dlc submission: Mon May 8 15:54:43 UTC 2017 report_version: 2 result_path: lustre-release/lustre/tests/lutf/python/tests/ SubTests: - name: test_01 status: PASS duration: 2 return_code: 0 error: - name: test_02 status: PASS duration: 2 return_code: 0 error: duration: 5 status: PASS - name: multi-rail description: lutf multi-rail submission: Mon May 8 15:59:43 UTC 2017 report_version: 2 result_path: lustre-release/lustre/tests/lutf/python/tests/ SubTests: - name: test_01 status: PASS duration: 2 return_code: 0 error: - name: test_02 status: PASS duration: 2 return_code: 0 error: duration: 5 status: PASS |
A sample Config file used by Auster |
---|
Sample LUTF Config file |
---|
#!/bin/bash #Key Exports export master_HOST=onyx-15vm1 export agent1_HOST=onyx-16vm1 export agent2_HOST=onyx-17vm1 export agent3_HOST=onyx-18vm1 export AGENTCOUNT=3
VERBOSE=true
# ports for LUTF Telnet connection export MASTER_PORT=8494 export AGENT_PORT=8094
# script and result paths script_DIR=$LUSTRE/tests/lutf/python/test/dlc/ output_DIR=$LUSTRE/tests/lutf/python/tests/
|
A sample result YAML file from Auster |
---|
results.yml |
Sample LUTF result YAML file |
---|
TestGroup: test_group: review-ldiskfs testhost: trevis-13vm5 submission: Mon May 8 15:54:41 UTC 2017 user_name: root autotest_result_group_id: 5e11dc5b-7dd7-48a1-b4a3-74a333acd912 test_sequence: 1 test_index: 10 session_group_id: cfeff6b3-60fc-438a-88ef-68e65a08694f enforcing: true triggering_build_number: 45090 triggering_job_name: lustre-reviews total_enforcing_sessions: 5 code_review: type: Gerrit url: review.whamcloud.com project: fs/lustre-release branch: multi-rail identifiers: - id: 3fbd25eb0fe90e4f34e36bad006c73d756ef8499 issue_tracker: type: Jira url: jira.hpdd.intel.com identifiers: - id: LU-9119 Tests: - name: dlc description: lutf dlc submission: Mon May 8 15:54:43 UTC 2017 report_version: 2 result_path: lustre-release/lustre/tests/lutf/python/tests/ SubTests: - name: test_01 status: PASS duration: 2 return_code: 0 error: - name: test_02 status: PASS duration: 2 return_code: 0 error: duration: 5 status: PASS - name: multi-rail description: lutf multi-rail submission: Mon May 8 15:59:43 UTC 2017 report_version: 2 result_path: lustre-release/lustre/tests/lutf/python/tests/ SubTests: - name: test_01 status: PASS duration: 2 return_code: 0 error: - name: test_02 status: PASS duration: 2 return_code: 0 error: duration: 5 status: PASS |
The LUTF test scripts will need to be implemented in a generic way. Which means that each test scripts which requires the use of interfaces, will need to discover the interfaces available to it on the node. If there are sufficient number of interfaces of the correct type, then the test can continue otherwise the test will be skipped and reported as such in the final result.
This allows for the setup of TCP connection (TCP sockets) to connect the Master and Agent nodes (lutf.c). LUTF can be run on a node in either Master mode or an Agent mode.
Master mode:
Spawns a listener thread (lutf_listener_main) to listen to Agent connections (lutf.c).
Agent mode:
There is an auto-test script for each of the bundle of test-scripts related to one feature.
The result file for each individual test script is also placed in lutfTMP directory on Agent node.