JIRA: BOTTLENECKS-29
[bottlenecks.git] / vstf / 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     def __init__(self):
19         pass
20
21     def process_vnstat(self, data):
22         buf = data.splitlines()
23         buf = buf[9:]
24         buf = ' '.join(buf)
25         m = {}
26         digits = re.compile(r"\d{1,}\.?\d*")
27         units = re.compile(r"(?:gib|mib|kib|kbit/s|gbit/s|mbit/s|p/s)", re.IGNORECASE | re.MULTILINE)
28         units_arr = units.findall(buf)
29         LOG.debug(units_arr)
30         digits_arr = digits.findall(buf)
31
32         for i in range(len(digits_arr)):
33             digits_arr[i] = round(float(digits_arr[i]), 2)
34
35         LOG.info("-------------digit_arr------------------")
36         LOG.info(digits_arr)
37         LOG.info(units_arr)
38         LOG.info("-----------------------------------------")
39         m['rxpck'], m['txpck'] = digits_arr[8], digits_arr[9]
40         m['time'] = digits_arr[-1]
41         digits_arr = digits_arr[:8] + digits_arr[10:-1]
42         index = 0
43         for unit in units_arr:
44             unit = unit.lower()
45             if unit == 'gib':
46                 digits_arr[index] *= 1024
47             elif unit == 'kib':
48                 digits_arr[index] /= 1024
49             elif unit == 'gbit/s':
50                 digits_arr[index] *= 1000
51             elif unit == 'kbit/s':
52                 digits_arr[index] /= 1000
53             else:
54                 pass
55             index += 1
56
57         for i in range(len(digits_arr)):
58             digits_arr[i] = round(digits_arr[i], 2)
59
60         m['rxmB'], m['txmB'] = digits_arr[0:2]
61         m['rxmB_max/s'], m['txmB_max/s'] = digits_arr[2:4]
62         m['rxmB/s'], m['txmB/s'] = digits_arr[4:6]
63         m['rxmB_min/s'], m['txmB_min/s'] = digits_arr[6:8]
64         m['rxpck_max/s'], m['txpck_max/s'] = digits_arr[8:10]
65         m['rxpck/s'], m['txpck/s'] = digits_arr[10:12]
66         m['rxpck_min/s'], m['txpck_min/s'] = digits_arr[12:14]
67         LOG.info("---------------vnstat data start-------------")
68         LOG.info(m)
69         LOG.info("---------------vnstat data end---------------")
70         return m
71
72     def process_sar_cpu(self, raw):
73         lines = raw.splitlines()
74         # print lines
75         head = lines[2].split()[3:]
76         average = lines[-1].split()[2:]
77         data = {}
78         for h, d in zip(head, average):
79             data[h.strip('%')] = float(d)
80         return data
81
82     def process_qperf(self, raw):
83         buf = raw.splitlines()
84         data = buf[1].strip().split()
85         key = data[0]
86         value = float(data[2])
87         unit = data[3]
88         return {key: value, 'unit': unit}
89
90     @classmethod
91     def process(cls, raw):
92         self = cls()
93         tool, data_type, data = raw['tool'], raw['type'], raw['raw_data']
94         m = {}
95         if tool == 'vnstat' and data_type == 'nic':
96             m = self.process_vnstat(data)
97         if tool == 'sar' and data_type == 'cpu':
98             m = self.process_sar_cpu(data)
99             if raw.has_key('cpu_num'):
100                 m['cpu_num'] = raw['cpu_num']
101             if raw.has_key('cpu_mhz'):
102                 m['cpu_mhz'] = raw['cpu_mhz']
103         if tool == 'qperf':
104             m = self.process_qperf(data)
105         return m
106
107
108 if __name__ == '__main__':
109     logging.basicConfig(level=logging.DEBUG)
110     p = RawDataProcess()
111     cmd = "vnstat -i eth0 -l"
112     child = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
113     import time
114     import os
115     from signal import SIGINT
116
117     time.sleep(20)
118     os.kill(child.pid, SIGINT)
119     data = child.stdout.read()
120     print data
121     print p.process_vnstat(data)
122
123     cmd = "sar -u 2"
124     child = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
125     import time
126     import os
127     from signal import SIGINT
128
129     time.sleep(20)
130     os.kill(child.pid, SIGINT)
131     data = child.stdout.read()
132     print data
133     print p.process_sar_cpu(data)