-
Notifications
You must be signed in to change notification settings - Fork 0
/
domain.py
60 lines (49 loc) · 1.67 KB
/
domain.py
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
from antlr4 import *
from flask import request
import parsing.cpuinfo as cpuinfo
import parsing.meminfo as meminfo
from model import Domain
from parsing.CPUinfoLexer import CPUinfoLexer
from parsing.CPUinfoParser import CPUinfoParser
from parsing.MeminfoLexer import MeminfoLexer
from parsing.MeminfoParser import MeminfoParser
def _parse_file(data, parser_cls, lexer_cls, evaluator_cls):
# Parse file
file = InputStream(data)
lexer = lexer_cls(file)
stream = CommonTokenStream(lexer)
parser = parser_cls(stream)
tree = parser.compileUnit()
# Evaluate content
evaluator = evaluator_cls()
return evaluator.visit(tree)
def register(domain):
ip_addr = request.remote_addr
nodes = len(domain)
cpus = 0
total_memory = 0
total_bandwidth = 0
total_mflops = 0
for node in domain:
# Parse cpuinfo file
processors = _parse_file(node['cpuinfo'], CPUinfoParser, CPUinfoLexer, cpuinfo.Evaluator)
# Parse meminfo file
memory_stats = _parse_file(node['meminfo'], MeminfoParser, MeminfoLexer, meminfo.Evaluator)
# Update domain global information
cpus += len(processors)
total_memory += int(memory_stats['MemTotal'].split()[0])
total_bandwidth += float(node.get('mpi_bandwidth'))
total_mflops += float(node.get('mflops')) * cpus
try:
domain = Domain.get(ip=ip_addr)
except Domain.DoesNotExist:
domain = Domain(ip=ip_addr)
domain.nodes = nodes
domain.cpus = cpus
domain.mflops = total_mflops
domain.mpi_bandwidth = total_bandwidth / nodes
domain.memory = total_memory
domain.save()
return {
"id": domain.get_id()
}