Skip to content

Commit 1108d15

Browse files
committed
Adding initial cpuinfo parser support.
Signed-off-by: Rob Dobson <rob.dobson@citrix.com>
1 parent 426379a commit 1108d15

2 files changed

Lines changed: 144 additions & 0 deletions

File tree

hwinfo/host/cpuinfo.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""Module for parsing the output of /proc/cpuinfo"""
2+
3+
from hwinfo.util import CommandParser
4+
5+
REGEX_TEMPLATE = r'%s([\ \t])+\:\ (?P<%s>.*)'
6+
7+
class CPUInfoParser(CommandParser):
8+
9+
10+
ITEM_REGEXS = [
11+
REGEX_TEMPLATE % ('processor', 'processor'),
12+
REGEX_TEMPLATE % ('vendor_id', 'vendor_id'),
13+
REGEX_TEMPLATE % (r'cpu\ family', 'cpu_family'),
14+
REGEX_TEMPLATE % ('model', 'model'),
15+
REGEX_TEMPLATE % (r'model\ name', 'model_name'),
16+
REGEX_TEMPLATE % ('stepping', 'stepping'),
17+
REGEX_TEMPLATE % ('microcode', 'microcode'),
18+
REGEX_TEMPLATE % (r'cpu\ MHz', 'cpu_mhz'),
19+
REGEX_TEMPLATE % (r'cache\ size', 'cache_size'),
20+
REGEX_TEMPLATE % (r'fpu', 'fpu'),
21+
REGEX_TEMPLATE % (r'fpu_exception', 'fpu_exception'),
22+
REGEX_TEMPLATE % (r'cpuid\ level', 'cpuid_level'),
23+
REGEX_TEMPLATE % (r'wp', 'wp'),
24+
REGEX_TEMPLATE % (r'flags', 'flags'),
25+
REGEX_TEMPLATE % (r'bogomips', 'bogomips'),
26+
REGEX_TEMPLATE % (r'clflush\ size', 'clflush_size'),
27+
REGEX_TEMPLATE % (r'cache_alignment', 'cache_alignment'),
28+
REGEX_TEMPLATE % (r'address\ sizes', 'address_sizes'),
29+
REGEX_TEMPLATE % (r'power\ management', 'power_management'),
30+
]

hwinfo/host/tests/test_cpuinfo.py

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
"""Module for unittesting dmidecode methods"""
2+
3+
import unittest
4+
from hwinfo.host.cpuinfo import CPUInfoParser
5+
6+
DATA_DIR = 'hwinfo/host/tests/data'
7+
8+
class CPUInfoParserTests(unittest.TestCase):
9+
10+
DATA = """
11+
processor : 0
12+
vendor_id : GenuineIntel
13+
cpu family : 6
14+
model : 30
15+
model name : Intel(R) Xeon(R) CPU X3430 @ 2.40GHz
16+
stepping : 5
17+
microcode : 0x3
18+
cpu MHz : 2394.052
19+
cache size : 8192 KB
20+
fpu : yes
21+
fpu_exception : yes
22+
cpuid level : 11
23+
wp : yes
24+
flags : fpu de tsc msr pae mce cx8 apic sep mca cmov pat clflush acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good nopl nonstop_tsc pni monitor vmx est ssse3 cx16 sse4_1 sse4_2 popcnt hypervisor lahf_lm dtherm tpr_shadow vnmi flexpriority ept vpid
25+
bogomips : 4788.10
26+
clflush size : 64
27+
cache_alignment : 64
28+
address sizes : 36 bits physical, 48 bits virtual
29+
power management:
30+
"""
31+
32+
DATA_REC = {
33+
'processor': '0',
34+
'vendor_id': 'GenuineIntel',
35+
'cpu_family': '6',
36+
'model': '30',
37+
'model_name': 'Intel(R) Xeon(R) CPU X3430 @ 2.40GHz',
38+
'stepping': '5',
39+
'microcode': '0x3',
40+
'cpu_mhz': '2394.052',
41+
'cache_size': '8192 KB',
42+
'fpu': 'yes',
43+
'fpu_exception': 'yes',
44+
'cpuid_level': '11',
45+
'wp': 'yes',
46+
'flags': 'fpu de tsc msr pae mce cx8 apic sep mca cmov pat clflush acpi mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good nopl nonstop_tsc pni monitor vmx est ssse3 cx16 sse4_1 sse4_2 popcnt hypervisor lahf_lm dtherm tpr_shadow vnmi flexpriority ept vpid',
47+
'bogomips': '4788.10',
48+
'clflush_size': '64',
49+
'cache_alignment': '64',
50+
'address_sizes': '36 bits physical, 48 bits virtual',
51+
'power_management': '',
52+
}
53+
54+
55+
def setUp(self):
56+
self.parser = CPUInfoParser(self.DATA.strip())
57+
58+
def _assert_equal(self, key):
59+
rec = self.parser.parse()
60+
return self.assertEqual(rec[key], self.DATA_REC[key])
61+
62+
def test_cpuinfo_processor(self):
63+
return self._assert_equal('processor')
64+
65+
def test_vendor_id(self):
66+
return self._assert_equal('vendor_id')
67+
68+
def test_cpu_family(self):
69+
return self._assert_equal('cpu_family')
70+
71+
def test_model(self):
72+
return self._assert_equal('model')
73+
74+
def test_model_name(self):
75+
return self._assert_equal('model_name')
76+
77+
def test_stepping(self):
78+
return self._assert_equal('stepping')
79+
80+
def test_microcode(self):
81+
return self._assert_equal('microcode')
82+
83+
def test_cpu_mhz(self):
84+
return self._assert_equal('cpu_mhz')
85+
86+
def test_cache_size(self):
87+
return self._assert_equal('cache_size')
88+
89+
def test_fpu(self):
90+
return self._assert_equal('fpu')
91+
92+
def test_fpu_exception(self):
93+
return self._assert_equal('fpu_exception')
94+
95+
def test_cpuid_level(self):
96+
return self._assert_equal('cpuid_level')
97+
98+
def test_wp(self):
99+
return self._assert_equal('wp')
100+
101+
def test_flags(self):
102+
return self._assert_equal('flags')
103+
104+
def test_bogomips(self):
105+
return self._assert_equal('bogomips')
106+
107+
def test_clflush_size(self):
108+
return self._assert_equal('clflush_size')
109+
110+
def test_cache_alignment(self):
111+
return self._assert_equal('cache_alignment')
112+
113+
def test_address_sizes(self):
114+
return self._assert_equal('address_sizes')

0 commit comments

Comments
 (0)