Merge "Change PTL informatin in INFO"
[bottlenecks.git] / testsuites / vstf / vstf_scripts / vstf / controller / sw_perf / raw_data.py
1 ##############################################################################
2 # Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9
10 import subprocess
11 import re
12 import logging
13
14 LOG = logging.getLogger(__name__)
15
16
17 class RawDataProcess(object):
18
19     def __init__(self):
20         pass
21
22     def process_vnstat(self, data):
23         buf = data.splitlines()
24         buf = buf[9:]
25         buf = ' '.join(buf)
26         m = {}
27         digits = re.compile(r"\d{1,}\.?\d*")
28         units = re.compile(
29             r"(?:gib|mib|kib|kbit/s|gbit/s|mbit/s|p/s)",
30             re.IGNORECASE | re.MULTILINE)
31         units_arr = units.findall(buf)
32         LOG.debug(units_arr)
33         digits_arr = digits.findall(buf)
34
35         for i in range(len(digits_arr)):
36             digits_arr[i] = round(float(digits_arr[i]), 2)
37
38         LOG.info("-------------digit_arr------------------")
39         LOG.info(digits_arr)
40         LOG.info(units_arr)
41         LOG.info("-----------------------------------------")
42         m['rxpck'], m['txpck'] = digits_arr[8], digits_arr[9]
43         m['time'] = digits_arr[-1]
44         digits_arr = digits_arr[:8] + digits_arr[10:-1]
45         index = 0
46         for unit in units_arr:
47             unit = unit.lower()
48             if unit == 'gib':
49                 digits_arr[index] *= 1024
50             elif unit == 'kib':
51                 digits_arr[index] /= 1024
52             elif unit == 'gbit/s':
53                 digits_arr[index] *= 1000
54             elif unit == 'kbit/s':
55                 digits_arr[index] /= 1000
56             else:
57                 pass
58             index += 1
59
60         for i in range(len(digits_arr)):
61             digits_arr[i] = round(digits_arr[i], 2)
62
63         m['rxmB'], m['txmB'] = digits_arr[0:2]
64         m['rxmB_max/s'], m['txmB_max/s'] = digits_arr[2:4]
65         m['rxmB/s'], m['txmB/s'] = digits_arr[4:6]
66         m['rxmB_min/s'], m['txmB_min/s'] = digits_arr[6:8]
67         m['rxpck_max/s'], m['txpck_max/s'] = digits_arr[8:10]
68         m['rxpck/s'], m['txpck/s'] = digits_arr[10:12]
69         m['rxpck_min/s'], m['txpck_min/s'] = digits_arr[12:14]
70         LOG.info("---------------vnstat data start-------------")
71         LOG.info(m)
72         LOG.info("---------------vnstat data end---------------")
73         return m
74
75     def process_sar_cpu(self, raw):
76         lines = raw.splitlines()
77         # print lines
78         head = lines[2].split()[3:]
79         average = lines[-1].split()[2:]
80         data = {}
81         for h, d in zip(head, average):
82             data[h.strip('%')] = float(d)
83         return data
84
85     def process_qperf(self, raw):
86         buf = raw.splitlines()
87         data = buf[1].strip().split()
88         key = data[0]
89         value = float(data[2])
90         unit = data[3]
91         return {key: value, 'unit': unit}
92
93     @classmethod
94     def process(cls, raw):
95         self = cls()
96         tool, data_type, data = raw['tool'], raw['type'], raw['raw_data']
97         m = {}
98         if tool == 'vnstat' and data_type == 'nic':
99             m = self.process_vnstat(data)
100         if tool == 'sar' and data_type == 'cpu':
101             m = self.process_sar_cpu(data)
102             if 'cpu_num' in raw:
103                 m['cpu_num'] = raw['cpu_num']
104             if 'cpu_mhz' in raw:
105                 m['cpu_mhz'] = raw['cpu_mhz']
106         if tool == 'qperf':
107             m = self.process_qperf(data)
108         return m
109
110
111 if __name__ == '__main__':
112     logging.basicConfig(level=logging.DEBUG)
113     p = RawDataProcess()
114     cmd = "vnstat -i eth0 -l"
115     child = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
116     import time
117     import os
118     from signal import SIGINT
119
120     time.sleep(20)
121     os.kill(child.pid, SIGINT)
122     data = child.stdout.read()
123     print data
124     print p.process_vnstat(data)
125
126     cmd = "sar -u 2"
127     child = subprocess.Popen(
128         cmd.split(),
129         stdout=subprocess.PIPE,
130         stderr=subprocess.PIPE)
131     import time
132     import os
133     from signal import SIGINT
134
135     time.sleep(20)
136     os.kill(child.pid, SIGINT)
137     data = child.stdout.read()
138     print data
139     print p.process_sar_cpu(data)