summaryrefslogtreecommitdiffstats
path: root/rteval/sysinfo/memory.py
blob: 2c31d659395290b8b2d88c9bfd4d73c687f58904 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# -*- coding: utf-8 -*-
#
#   Copyright 2009 - 2013   Clark Williams <williams@redhat.com>
#   Copyright 2012 - 2013   David Sommerseth <davids@redhat.com>
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License along
#   with this program; if not, write to the Free Software Foundation, Inc.,
#   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
#   For the avoidance of doubt the "preferred form" of this code is one which
#   is in an open unpatent encumbered format. Where cryptographic key signing
#   forms part of the process of creating an executable the information
#   including keys needed to generate an equivalently functional executable
#   are deemed to be part of the source code.
#

import libxml2
from glob import glob

class MemoryInfo(object):
    numa_nodes = None

    def __init__(self):
        pass


    def mem_get_numa_nodes(self):
        if self.numa_nodes is None:
            self.numa_nodes = len(glob('/sys/devices/system/node/node*'))
        return self.numa_nodes


    def mem_get_size(self):
        '''find out how much memory is installed'''
        f = open('/proc/meminfo')
        rawsize = 0
        for l in f:
            if l.startswith('MemTotal:'):
                parts = l.split()
                if parts[2].lower() != 'kb':
                    raise RuntimeError, "Units changed from kB! (%s)" % parts[2]
                rawsize = int(parts[1])
                f.close()
                break
        if rawsize == 0:
            raise RuntimeError, "can't find memtotal in /proc/meminfo!"

        # Get a more readable result
        # Note that this depends on  /proc/meminfo starting in Kb
        units = ('KB', 'MB','GB','TB')
        size = rawsize
        for unit in units:
            if size < (1024*1024):
                break
            size = float(size) / 1024
        return (size, unit)


    def MakeReport(self):
        rep_n = libxml2.newNode("Memory")

        numa_n = libxml2.newNode("numa_nodes")
        numa_n.addContent(str(self.mem_get_numa_nodes()))
        rep_n.addChild(numa_n)

        memsize = self.mem_get_size()
        mem_n = libxml2.newNode("memory_size")
        mem_n.addContent("%.3f" % memsize[0])
        mem_n.newProp("unit", memsize[1])
        rep_n.addChild(mem_n)

        return rep_n



def unit_test(rootdir):
    import sys
    try:
        mi = MemoryInfo()
        print "Numa nodes: %i" % mi.mem_get_numa_nodes()
        print "Memory: %i %s" % mi.mem_get_size()
    except Exception, e:
        import traceback
        traceback.print_exc(file=sys.stdout)
        print "** EXCEPTION %s", str(e)
        return 1

if __name__ == '__main__':
    unit_test(None)