4264c055b6ea308a11b01b3d12230ace990f7855
[vswitchperf.git] / tools / report / report.py
1 # Copyright 2015-2016 Intel Corporation.
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #   http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 """
16 vSwitch Characterization Report Generation.
17
18 Generate reports in format defined by X.
19 """
20
21 import sys
22 import os
23 import jinja2
24 import logging
25
26 from core.results.results_constants import ResultsConstants
27 from conf import settings as S
28 from tools import systeminfo
29
30 _TEMPLATE_FILE = 'report.jinja'
31 _ROOT_DIR = os.path.normpath(os.path.dirname(os.path.realpath(__file__)))
32
33
34 def _get_env(result):
35     """
36     Get system configuration.
37
38     :returns: Return a dictionary of the test environment.
39               The following is an example return value:
40                {'kernel': '3.10.0-229.4.2.el7.x86_64',
41                 'os': 'OS Version',
42                 'cpu': ' CPU 2.30GHz',
43                 'platform': '[2 sockets]',
44                 'nic': 'NIC'}
45
46     """
47
48     env = {
49         'os': systeminfo.get_os(),
50         'kernel': systeminfo.get_kernel(),
51         'nic': systeminfo.get_nic(),
52         'cpu': systeminfo.get_cpu(),
53         'cpu_cores': systeminfo.get_cpu_cores(),
54         'memory' : systeminfo.get_memory(),
55         'platform': systeminfo.get_platform(),
56         'vsperf': systeminfo.get_version('vswitchperf'),
57         'traffic_gen': systeminfo.get_version(S.getValue('TRAFFICGEN')),
58         'vswitch': systeminfo.get_version(S.getValue('VSWITCH')),
59         'dpdk': systeminfo.get_version('dpdk'),
60     }
61
62     if result[ResultsConstants.DEPLOYMENT].count('v'):
63         env.update({'vnf': systeminfo.get_version(S.getValue('VNF')),
64                     'guest_image': S.getValue('GUEST_IMAGE'),
65                     'loopback_app': list(map(systeminfo.get_version, S.getValue('GUEST_LOOPBACK'))),
66                    })
67
68     return env
69
70
71 def generate(input_file, tc_results, tc_stats):
72     """Generate actual report.
73
74     Generate a Markdown-formatted file using results of tests and some
75     parsed system info.
76
77     :param input_file: Path to CSV results file
78
79     :returns: Path to generated report
80     """
81     output_file = '.'.join([os.path.splitext(input_file)[0], 'md'])
82
83     template_loader = jinja2.FileSystemLoader(searchpath=_ROOT_DIR)
84     template_env = jinja2.Environment(loader=template_loader)
85     template = template_env.get_template(_TEMPLATE_FILE)
86
87     tests = []
88     try:
89         for result in tc_results:
90             test_config = {}
91             for tc_conf in S.getValue('PERFORMANCE_TESTS'):
92                 if tc_conf['Name'] == result[ResultsConstants.ID]:
93                     test_config = tc_conf
94                     break
95
96             # pass test results, env details and configuration to template
97             tests.append({
98                 'ID': result[ResultsConstants.ID].upper(),
99                 'id': result[ResultsConstants.ID],
100                 'deployment': result[ResultsConstants.DEPLOYMENT],
101                 'conf': test_config,
102                 'result': result,
103                 'env': _get_env(result),
104                 'stats': tc_stats
105             })
106
107             # remove id and deployment from results before rendering
108             # but after _get_env() is called; tests dict has its shallow copy
109             del result[ResultsConstants.ID]
110             del result[ResultsConstants.DEPLOYMENT]
111
112         template_vars = {
113             'tests': tests,
114         }
115
116         output_text = template.render(template_vars) #pylint: disable=no-member
117         with open(output_file, 'w') as file_:
118             file_.write(output_text)
119             logging.info('Test report written to "%s"', output_file)
120
121     except KeyError:
122         logging.info("Report: Ignoring file (Wrongly defined columns): %s",
123                      (input_file))
124         raise
125     return output_file
126
127
128 if __name__ == '__main__':
129     S.load_from_dir('conf')
130     OUT = generate(sys.argv[1], '', '')
131     print('Test report written to "%s"...' % OUT)