1 # Copyright (c) 2018 Huawei Technologies Co.,Ltd.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
6 # http://www.apache.org/licenses/LICENSE-2.0
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
16 This module exists to provide single client-server test for DMM
23 from resources.libraries.python.ssh import exec_cmd, exec_cmd_no_error
24 from resources.libraries.python.DMM.DMMConstants import DMMConstants as con
25 from resources.libraries.python.topology import Topology
27 class SingleCliSer(object):
28 """Test DMM with single client-server topology."""
31 def set_dmm_interface_address(dut_node, ifname, ip_addr, ip4_prefix):
33 Flush ip, set ip, set interface up.
35 :param dut_node: Node to set the interface address on.
36 :param ifname: Interface name.
37 :param ip_addr: IP address to configure.
38 :param ip4_prefix: Prefix length.
44 cmd = 'sudo ip -4 addr flush dev {}'.format(ifname)
45 exec_cmd_no_error(dut_node, cmd)
46 cmd = 'sudo ip addr add {}/{} dev {}'\
47 .format(ip_addr, ip4_prefix, ifname)
48 exec_cmd_no_error(dut_node, cmd)
49 cmd = 'sudo ip link set {0} up'.format(ifname)
50 exec_cmd_no_error(dut_node, cmd)
53 def setup_dmm_dut(dut1_node, dut2_node, dut1_if_name, dut2_if_name,
54 script_name, dut1_ip, dut2_ip, prefix_len):
56 Setup DMM on DUT nodes.
58 :param dut1_node: Node to setup DMM on.
59 :param dut2_node: Node to setup DMM on.
60 :param dut1_if_name: DUT1 to DUT2 interface name.
61 :param dut2_if_name: DUT2 to DUT1 interface name.
62 :param script_name: Name of the script to run.
63 :param dut1_ip: IP address to configure on DUT1.
64 :param dut2_ip: IP address to configure on DUT2.
65 :param prefix_len: Prefix length.
68 :type dut1_if_name: str
69 :type dut2_if_name: str
70 :type script_name: str
75 SingleCliSer.set_dmm_interface_address(dut1_node, dut1_if_name,
77 SingleCliSer.set_dmm_interface_address(dut2_node, dut2_if_name,
79 cmd = 'cd {0}/{1} && ./{2} setup 0 {3} {4} {5}'\
80 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name,
81 dut1_if_name, dut1_ip, dut2_ip)
82 exec_cmd(dut1_node, cmd)
84 cmd = 'cd {0}/{1} && ./{2} setup 1 {3} {4} {5}'\
85 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name,
86 dut2_if_name, dut1_ip, dut2_ip)
87 exec_cmd(dut2_node, cmd)
90 def execute_test(dut1_node, dut2_node, dut1_if_name, dut2_if_name,
91 script_name, dut1_ip, dut2_ip):
93 Run the given test case.
95 :param dut1_node: Node to run an app with DMM on.
96 :param dut2_node: Node to run an app with DMM on.
97 :param dut1_if_name: DUT1 to DUT2 interface name.
98 :param dut2_if_name: DUT2 to DUT1 interface name.
99 :param script_name: Name of the script to run.
100 :param dut1_ip: DUT1 IP address.
101 :param dut2_ip: DUT2 IP address.
102 :type dut1_node: dict
103 :type dut2_node: dict
104 :type dut1_if_name: str
105 :type dut2_if_name: str
106 :type script_name: str
110 cmd = 'cd {0}/{1} && ./{2} run 0 {3} {4} {5} ' \
111 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name,
112 dut1_if_name, dut1_ip, dut2_ip)
113 cmd += '2>&1 | tee log_{0}.txt &'.format(script_name)
114 exec_cmd(dut1_node, cmd)
117 cmd = 'cd {0}/{1} && ./{2} run 1 {3} {4} {5} ' \
118 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name,
119 dut2_if_name, dut1_ip, dut2_ip)
120 cmd += '2>&1 | tee log_{0}.txt'.format(script_name)
121 exec_cmd(dut2_node, cmd)
124 def verify_test_result(dut1_node, dut2_node, script_name):
126 Verify the test and return result.
128 :param dut1_node: Node to verify test result on.
129 :param dut2_node: Node to verify test result on.
130 :param script_name: Name of the script to run.
131 :type dut1_node: dict
132 :type dut2_node: dict
133 :type script_name: str
134 :returns: test result PASS/FAIL.
137 cmd = 'cd {0}/{1} && ./{2} verify 0' \
138 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name)
139 (_, stdout_ser, _) = exec_cmd(dut1_node, cmd)
141 cmd = 'cd {0}/{1} && ./{2} verify 1' \
142 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name)
143 (_, stdout_cli, _) = exec_cmd(dut2_node, cmd)
145 if stdout_ser.find('DMM_CSIT_TEST_PASSED') != -1 \
146 and stdout_cli.find('DMM_CSIT_TEST_PASSED') != -1:
152 def print_dmm_log(dut1_node, dut2_node, script_name):
156 :param dut1_node: Node to print DMM logs of.
157 :param dut2_node: Node to print DMM logs of.
158 :param script_name: Name of the script to run.
159 :type dut1_node: dict
160 :type dut2_node: dict
161 :type script_name: str
163 cmd = 'cd {0}/{1} && ./{2} log 0'\
164 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name)
165 exec_cmd(dut1_node, cmd)
167 cmd = 'cd {0}/{1} && ./{2} log 1'\
168 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name)
169 exec_cmd(dut2_node, cmd)
172 def cleanup_dmm_dut(dut1_node, dut2_node, script_name):
174 Cleanup DMM DUT node.
176 :param dut1_node: DMM node to be cleaned up.
177 :param dut2_node: DMM node to be cleaned up.
178 :param script_name: Name of the script to run.
179 :type dut1_node: dict
180 :type dut2_node: dict
181 :type script_name: str
183 cmd = 'cd {0}/{1} && ./{2} cleanup 0'\
184 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name)
185 exec_cmd(dut1_node, cmd)
186 exec_cmd(dut2_node, cmd)
190 def run_dmm_func_test_cases(dut1_node, dut2_node, dut1_if_name,
191 dut2_if_name, dut1_ip, dut2_ip, prefix_len):
193 Execute all the functional test cases and return result.
195 :param dut1_node: Node to run an app with DMM on.
196 :param dut2_node: Node to run an app with DMM on.
197 :param dut1_if_name: DUT1 to DUT2 interface name.
198 :param dut2_if_name: DUT2 to DUT1 interface name.
199 :param dut1_ip: IP address to configure on DUT1.
200 :param dut2_ip: IP address to configure on DUT2.
201 :param prefix_len: Prefix length.
202 :type dut1_node: dict
203 :type dut2_node: dict
204 :type dut1_if_name: str
205 :type dut2_if_name: str
208 :type prefix_len: int
209 :returns: Total testcase count, Passed testcase count.
210 :rtype: tuple(int, int)
215 path = '{0}/*'.format(con.DMM_RUN_SCRIPTS)
216 files = [os.path.basename(x) for x in glob.glob(path)]
217 print "list of files : {0}".format(files)
220 print("file name : {}").format(name)
222 SingleCliSer.setup_dmm_dut(dut1_node, dut2_node, dut1_if_name,
223 dut2_if_name, name, dut1_ip, dut2_ip,
225 SingleCliSer.execute_test(dut1_node, dut2_node, dut1_if_name,
226 dut2_if_name, name, dut1_ip, dut2_ip)
227 result = SingleCliSer.verify_test_result(dut1_node, dut2_node,
231 elif result == "FAIL":
234 SingleCliSer.print_dmm_log(dut1_node, dut2_node, name)
235 SingleCliSer.cleanup_dmm_dut(dut1_node, dut2_node, name)
236 print("TOTAL :{} PASSED : {} FAILED: {}").format\
237 (total, passed, failed)
242 def dmm_get_interface_name(dut_node, dut_interface):
244 Get the interface name.
246 :param dut_node: Node to get the interface name on.
247 :param dut_interface: Interface key.
249 :type dut_interface: str
250 :returns: Interface name.
253 mac = Topology.get_interface_mac(dut_node, dut_interface)
254 cmd = 'ifconfig -a | grep {0}'.format(mac)
255 (stdout, _) = exec_cmd_no_error(dut_node, cmd)
256 interface_name = stdout.split(' ', 1)[0]
257 return interface_name