1f87f03cb915998e9faab5e3c25f94a861538f2b
[csit.git] / resources / libraries / python / DUTSetup.py
1 # Copyright (c) 2016 Cisco and/or its affiliates.
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:
5 #
6 #     http://www.apache.org/licenses/LICENSE-2.0
7 #
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.
13
14 """DUT setup library."""
15
16 from robot.api import logger
17
18 from resources.libraries.python.topology import NodeType
19 from resources.libraries.python.ssh import SSH
20 from resources.libraries.python.constants import Constants
21 from resources.libraries.python.VatExecutor import VatExecutor
22
23
24 class DUTSetup(object):
25     """Contains methods for setting up DUTs."""
26     @staticmethod
27     def start_vpp_service_on_all_duts(nodes):
28         """Start up the VPP service on all nodes."""
29         ssh = SSH()
30         for node in nodes.values():
31             if node['type'] == NodeType.DUT:
32                 ssh.connect(node)
33                 (ret_code, stdout, stderr) = \
34                     ssh.exec_command_sudo('service vpp restart', timeout=120)
35                 if int(ret_code) != 0:
36                     logger.debug('stdout: {0}'.format(stdout))
37                     logger.debug('stderr: {0}'.format(stderr))
38                     raise Exception('DUT {0} failed to start VPP service'.
39                                     format(node['host']))
40
41     @staticmethod
42     def vpp_show_version_verbose(node):
43         """Run "show version verbose" CLI command.
44
45         :param node: Node to run command on.
46         :type node: dict
47         """
48         vat = VatExecutor()
49         vat.execute_script("show_version_verbose.vat", node, json_out=False)
50
51     @staticmethod
52     def vpp_api_trace_save(node):
53         """Run "api trace save" CLI command.
54
55         :param node: Node to run command on.
56         :type node: dict
57         """
58         vat = VatExecutor()
59         vat.execute_script("api_trace_save.vat", node, json_out=False)
60
61     @staticmethod
62     def vpp_api_trace_dump(node):
63         """Run "api trace custom-dump" CLI command.
64
65         :param node: Node to run command on.
66         :type node: dict
67         """
68         vat = VatExecutor()
69         vat.execute_script("api_trace_dump.vat", node, json_out=False)
70
71     @staticmethod
72     def setup_all_duts(nodes):
73         """Prepare all DUTs in given topology for test execution."""
74         for node in nodes.values():
75             if node['type'] == NodeType.DUT:
76                 DUTSetup.setup_dut(node)
77
78     @staticmethod
79     def setup_dut(node):
80         """Run script over SSH to setup the DUT node.
81
82         :param node: DUT node to set up.
83         :type node: dict
84
85         :raises Exception: If the DUT setup fails.
86         """
87         ssh = SSH()
88         ssh.connect(node)
89
90         (ret_code, stdout, stderr) = \
91             ssh.exec_command('sudo -Sn bash {0}/{1}/dut_setup.sh'.
92                              format(Constants.REMOTE_FW_DIR,
93                                     Constants.RESOURCES_LIB_SH), timeout=120)
94         logger.trace(stdout)
95         logger.trace(stderr)
96         if int(ret_code) != 0:
97             logger.debug('DUT {0} setup script failed: "{1}"'.
98                          format(node['host'], stdout + stderr))
99             raise Exception('DUT test setup script failed at node {}'.
100                             format(node['host']))
101
102     @staticmethod
103     def get_vpp_pid(node):
104         """Get PID of running VPP process.
105
106         :param node: DUT node.
107         :type node: dict
108         :return: PID
109         :rtype: int
110         :raises RuntimeError if it is not possible to get the PID.
111         """
112
113         ssh = SSH()
114         ssh.connect(node)
115         ret_code, stdout, stderr = ssh.exec_command('pidof vpp')
116
117         logger.trace(stdout)
118         logger.trace(stderr)
119
120         if int(ret_code) != 0:
121             logger.debug('Not possible to get PID of VPP process on node: '
122                          '{0}\n {1}'.format(node['host'], stdout + stderr))
123             raise RuntimeError('Not possible to get PID of VPP process on node:'
124                                ' {}'.format(node['host']))
125
126         if len(stdout.splitlines()) != 1:
127             raise RuntimeError("More then one VPP PID found on node {0}".
128                                format(node['host']))
129         return int(stdout)
130
131     @staticmethod
132     def get_vpp_pids(nodes):
133         """Get PID of running VPP process on all DUTs.
134
135         :param nodes: DUT nodes.
136         :type nodes: dict
137         :return: PIDs
138         :rtype: dict
139         """
140
141         pids = dict()
142         for node in nodes.values():
143             if node['type'] == NodeType.DUT:
144                 pids[node['host']] = DUTSetup.get_vpp_pid(node)
145         return pids

©2016 FD.io a Linux Foundation Collaborative Project. All Rights Reserved.
Linux Foundation is a registered trademark of The Linux Foundation. Linux is a registered trademark of Linus Torvalds.
Please see our privacy policy and terms of use.