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 SSH
24 from resources.libraries.python.ssh import exec_cmd, exec_cmd_no_error
25 from resources.libraries.python.DMM.DMMConstants import DMMConstants as con
26 from resources.libraries.python.topology import Topology
28 class SingleCliSer(object):
29 """Test DMM with single client-server topology."""
32 def set_dmm_interface_address(dut_node, ifname, ip_addr, ip4_prefix):
34 Flush ip, set ip, set interface up.
36 :param dut_node: Node to set the interface address on.
37 :param ifname: Interface name.
38 :param ip_addr: IP address to configure.
39 :param ip4_prefix: Prefix length.
45 cmd = 'sudo ip -4 addr flush dev {}'.format(ifname)
46 exec_cmd_no_error(dut_node, cmd)
47 cmd = 'sudo ip addr add {}/{} dev {}'\
48 .format(ip_addr, ip4_prefix, ifname)
49 exec_cmd_no_error(dut_node, cmd)
50 cmd = 'sudo ip link set {0} up'.format(ifname)
51 exec_cmd_no_error(dut_node, cmd)
54 def setup_dmm_dut(dut1_node, dut2_node, dut1_if_name, dut2_if_name,
55 script_name, dut1_ip, dut2_ip, prefix_len):
57 Setup DMM on DUT nodes.
59 :param dut1_node: Node to setup DMM on.
60 :param dut2_node: Node to setup DMM on.
61 :param dut1_if_name: DUT1 to DUT2 interface name.
62 :param dut2_if_name: DUT2 to DUT1 interface name.
63 :param script_name: Name of the script to run.
64 :param dut1_ip: IP address to configure on DUT1.
65 :param dut2_ip: IP address to configure on DUT2.
66 :param prefix_len: Prefix length.
69 :type dut1_if_name: str
70 :type dut2_if_name: str
71 :type script_name: str
76 SingleCliSer.set_dmm_interface_address(dut1_node, dut1_if_name,
78 SingleCliSer.set_dmm_interface_address(dut2_node, dut2_if_name,
80 cmd = 'cd {0}/{1} && ./{2} setup 0 {3} {4} {5}'\
81 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name,
82 dut1_if_name, dut1_ip, dut2_ip)
83 exec_cmd(dut1_node, cmd)
85 cmd = 'cd {0}/{1} && ./{2} setup 1 {3} {4} {5}'\
86 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name,
87 dut2_if_name, dut1_ip, dut2_ip)
88 exec_cmd(dut2_node, cmd)
91 def execute_test(dut1_node, dut2_node, dut1_if_name, dut2_if_name,
92 script_name, dut1_ip, dut2_ip):
94 Run the given test case.
96 :param dut1_node: Node to run an app with DMM on.
97 :param dut2_node: Node to run an app with DMM on.
98 :param dut1_if_name: DUT1 to DUT2 interface name.
99 :param dut2_if_name: DUT2 to DUT1 interface name.
100 :param script_name: Name of the script to run.
101 :param dut1_ip: DUT1 IP address.
102 :param dut2_ip: DUT2 IP address.
103 :type dut1_node: dict
104 :type dut2_node: dict
105 :type dut1_if_name: str
106 :type dut2_if_name: str
107 :type script_name: str
111 cmd = 'cd {0}/{1} && ./{2} run 0 {3} {4} {5} ' \
112 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name,
113 dut1_if_name, dut1_ip, dut2_ip)
114 cmd += '2>&1 | tee log_{0}.txt &'.format(script_name)
115 exec_cmd(dut1_node, cmd)
118 cmd = 'cd {0}/{1} && ./{2} run 1 {3} {4} {5} ' \
119 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name,
120 dut2_if_name, dut1_ip, dut2_ip)
121 cmd += '2>&1 | tee log_{0}.txt'.format(script_name)
122 exec_cmd(dut2_node, cmd)
125 def verify_test_result(dut1_node, dut2_node, script_name):
127 Verify the test and return result.
129 :param dut1_node: Node to verify test result on.
130 :param dut2_node: Node to verify test result on.
131 :param script_name: Name of the script to run.
132 :type dut1_node: dict
133 :type dut2_node: dict
134 :type script_name: str
135 :returns: test result PASS/FAIL.
138 cmd = 'cd {0}/{1} && ./{2} verify 0' \
139 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name)
140 (_, stdout_ser, _) = exec_cmd(dut1_node, cmd)
142 cmd = 'cd {0}/{1} && ./{2} verify 1' \
143 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name)
144 (_, stdout_cli, _) = exec_cmd(dut2_node, cmd)
146 if stdout_ser.find('DMM_CSIT_TEST_PASSED') != -1 \
147 and stdout_cli.find('DMM_CSIT_TEST_PASSED') != -1:
153 def print_dmm_log(dut1_node, dut2_node, script_name):
157 :param dut1_node: Node to print DMM logs of.
158 :param dut2_node: Node to print DMM logs of.
159 :param script_name: Name of the script to run.
160 :type dut1_node: dict
161 :type dut2_node: dict
162 :type script_name: str
164 cmd = 'cd {0}/{1} && ./{2} log 0'\
165 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name)
166 exec_cmd(dut1_node, cmd)
168 cmd = 'cd {0}/{1} && ./{2} log 1'\
169 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name)
170 exec_cmd(dut2_node, cmd)
171 cmd = 'mv /var/log/nStack/running.log /var/log/nStack/{0}_ser.log'\
173 exec_cmd(dut1_node, cmd, sudo=True)
174 cmd = 'mv /var/log/nStack/running.log /var/log/nStack/{0}_cli.log'\
176 exec_cmd(dut2_node, cmd, sudo=True)
179 def cleanup_dmm_dut(dut1_node, dut2_node, script_name):
181 Cleanup DMM DUT node.
183 :param dut1_node: DMM node to be cleaned up.
184 :param dut2_node: DMM node to be cleaned up.
185 :param script_name: Name of the script to run.
186 :type dut1_node: dict
187 :type dut2_node: dict
188 :type script_name: str
190 cmd = 'cd {0}/{1} && ./{2} cleanup 0'\
191 .format(con.REMOTE_FW_DIR, con.DMM_RUN_SCRIPTS, script_name)
192 exec_cmd(dut1_node, cmd)
193 exec_cmd(dut2_node, cmd)
197 def run_dmm_func_test_cases(dut1_node, dut2_node, dut1_if_name,
198 dut2_if_name, dut1_ip, dut2_ip, prefix_len):
200 Execute all the functional test cases and return result.
202 :param dut1_node: Node to run an app with DMM on.
203 :param dut2_node: Node to run an app with DMM on.
204 :param dut1_if_name: DUT1 to DUT2 interface name.
205 :param dut2_if_name: DUT2 to DUT1 interface name.
206 :param dut1_ip: IP address to configure on DUT1.
207 :param dut2_ip: IP address to configure on DUT2.
208 :param prefix_len: Prefix length.
209 :type dut1_node: dict
210 :type dut2_node: dict
211 :type dut1_if_name: str
212 :type dut2_if_name: str
215 :type prefix_len: int
216 :returns: Total testcase count, Passed testcase count.
217 :rtype: tuple(int, int)
222 path = '{0}/*'.format(con.DMM_RUN_SCRIPTS)
223 files = [os.path.basename(x) for x in glob.glob(path)]
224 print "list of files : {0}".format(files)
227 print("file name : {}").format(name)
229 SingleCliSer.setup_dmm_dut(dut1_node, dut2_node, dut1_if_name,
230 dut2_if_name, name, dut1_ip, dut2_ip,
232 SingleCliSer.execute_test(dut1_node, dut2_node, dut1_if_name,
233 dut2_if_name, name, dut1_ip, dut2_ip)
234 result = SingleCliSer.verify_test_result(dut1_node, dut2_node,
238 elif result == "FAIL":
241 SingleCliSer.print_dmm_log(dut1_node, dut2_node, name)
242 SingleCliSer.cleanup_dmm_dut(dut1_node, dut2_node, name)
243 print("TOTAL :{} PASSED : {} FAILED: {}").format\
244 (total, passed, failed)
249 def dmm_get_interface_name(dut_node, dut_interface):
251 Get the interface name.
253 :param dut_node: Node to get the interface name on.
254 :param dut_interface: Interface key.
256 :type dut_interface: str
257 :returns: Interface name.
260 mac = Topology.get_interface_mac(dut_node, dut_interface)
261 cmd = 'ifconfig -a | grep {0}'.format(mac)
262 (stdout, _) = exec_cmd_no_error(dut_node, cmd)
263 interface_name = stdout.split(' ', 1)[0]
264 return interface_name
267 def get_logs_from_node(dut_node):
269 Get logs from node to the test executor machine.
271 :param dut_node: Node to artifact the logs of.
275 ssh.connect(dut_node)
276 ssh.scp(".", '/var/log/nStack/*.log',
277 get=True, timeout=60, wildcard=True)
279 (ret, _, _) = exec_cmd(dut_node, 'ls -l /var/log/app*.log')
281 ssh.scp(".", '/var/log/app*.log',
282 get=True, timeout=60, wildcard=True)
284 exec_cmd(dut_node, 'rm -rf /var/log/nStack/*.log', sudo=True)
285 exec_cmd(dut_node, 'rm -rf /var/log/app*.log', sudo=True)
288 def archive_dmm_logs(dut1_node, dut2_node):
290 Get logs from both DUT's to the test executor machine.
292 :param dut1_node: DUT1 node.
293 :param dut2_node: DUT2 node.
294 :type dut1_node: dict
295 :type dut2_node: dict
297 SingleCliSer.get_logs_from_node(dut1_node)
298 SingleCliSer.get_logs_from_node(dut2_node)