report: add rst template for results reporting
[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_FILES = ['report.jinja', 'report_rst.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         'nics': 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_files = [('.'.join([os.path.splitext(input_file)[0], 'md'])),
82                     ('.'.join([os.path.splitext(input_file)[0], 'rst']))]
83     template_loader = jinja2.FileSystemLoader(searchpath=_ROOT_DIR)
84     template_env = jinja2.Environment(loader=template_loader)
85
86     tests = []
87     try:
88         for result in tc_results:
89             test_config = {}
90             for tc_conf in S.getValue('PERFORMANCE_TESTS'):
91                 if tc_conf['Name'] == result[ResultsConstants.ID]:
92                     test_config = tc_conf
93                     break
94
95             # pass test results, env details and configuration to template
96             tests.append({
97                 'ID': result[ResultsConstants.ID].upper(),
98                 'id': result[ResultsConstants.ID],
99                 'deployment': result[ResultsConstants.DEPLOYMENT],
100                 'conf': test_config,
101                 'result': result,
102                 'env': _get_env(result),
103                 'stats': tc_stats
104             })
105
106             # remove id and deployment from results before rendering
107             # but after _get_env() is called; tests dict has its shallow copy
108             del result[ResultsConstants.ID]
109             del result[ResultsConstants.DEPLOYMENT]
110
111         template_vars = {
112             'tests': tests,
113         }
114         i = 0
115         for output_file in output_files:
116             template = template_env.get_template(_TEMPLATE_FILES[i])
117             output_text = template.render(template_vars) #pylint: disable=no-member
118             with open(output_file, 'w') as file_:
119                 file_.write(output_text)
120                 logging.info('Test report written to "%s"', output_file)
121             i += 1
122
123     except KeyError:
124         logging.info("Report: Ignoring file (Wrongly defined columns): %s",
125                      (input_file))
126         raise
127     return output_files
128
129
130 if __name__ == '__main__':
131     S.load_from_dir('conf')
132     OUT = generate(sys.argv[1], '', '')
133     print('Test report written to "%s"...' % OUT)