blob: 1590484a264d8a79d1edc589c861bac300b804da [file] [log] [blame]
Matt Spinler85be2e72017-04-28 15:16:48 -05001#!/usr/bin/env python
2
3import os
4import sys
5import yaml
6from argparse import ArgumentParser
7from mako.template import Template
8
9"""
10This script generates the data structures for the
11phosphor-fan-monitor application.
12
13A future improvement is to get the fan inventory names
14from a separate file, so just that file could be generated
15from the MRW.
16"""
17
18
19tmpl = '''/* This is a generated file. */
20#include "fan_defs.hpp"
21#include "types.hpp"
Matt Spinler35108a72017-09-28 13:02:32 -050022#include "groups.hpp"
Matt Spinler85be2e72017-04-28 15:16:48 -050023
24using namespace phosphor::fan::monitor;
Matt Spinler35108a72017-09-28 13:02:32 -050025using namespace phosphor::fan::trust;
Matt Spinler85be2e72017-04-28 15:16:48 -050026
27const std::vector<FanDefinition> fanDefinitions
28{
Matt Spinler35108a72017-09-28 13:02:32 -050029%for fan_data in data.get('fans', {}):
Matt Spinler85be2e72017-04-28 15:16:48 -050030 FanDefinition{"${fan_data['inventory']}",
31 ${fan_data['allowed_out_of_range_time']},
32 ${fan_data['deviation']},
33 ${fan_data['num_sensors_nonfunc_for_fan_nonfunc']},
34 std::vector<SensorDefinition>{
35 %for sensor in fan_data['sensors']:
36 <%
37 #has_target is a bool, and we need a true instead of True
38 has_target = str(sensor['has_target']).lower()
39 %> \
40 SensorDefinition{"${sensor['name']}", ${has_target}},
41 %endfor
42 },
43 },
44%endfor
45};
Matt Spinler35108a72017-09-28 13:02:32 -050046
47##Function to generate the group creation lambda.
48##If a group were to ever need a different constructor,
49##it could be handled here.
50<%def name="get_lambda_contents(group)">
51 std::vector<std::string> names{
52 %for sensor in group['sensors']:
53 "${sensor['name']}",
54 %endfor
55 };
56 return std::make_unique<${group['class']}>(names);
57</%def>
58const std::vector<CreateGroupFunction> trustGroups
59{
60%for group in data.get('sensor_trust_groups', {}):
61 {
62 []()
63 {\
64${get_lambda_contents(group)}\
65 }
66 },
67%endfor
68};
Matt Spinler85be2e72017-04-28 15:16:48 -050069'''
70
71
72if __name__ == '__main__':
73 parser = ArgumentParser(
74 description="Phosphor fan monitor definition parser")
75
76 parser.add_argument('-m', '--monitor_yaml', dest='monitor_yaml',
77 default="example/monitor.yaml",
78 help='fan monitor definitional yaml')
79 parser.add_argument('-o', '--output_dir', dest='output_dir',
80 default=".",
81 help='output directory')
82 args = parser.parse_args()
83
84 if not args.monitor_yaml:
85 parser.print_usage()
86 sys.exit(-1)
87
88 with open(args.monitor_yaml, 'r') as monitor_input:
89 monitor_data = yaml.safe_load(monitor_input) or {}
90
91 #Do some minor input validation
Matt Spinler35108a72017-09-28 13:02:32 -050092 for fan in monitor_data.get('fans', {}):
Matt Spinler85be2e72017-04-28 15:16:48 -050093 if ((fan['deviation'] < 0) or (fan['deviation'] > 100)):
94 sys.exit("Invalid deviation value " + str(fan['deviation']))
95
96 output_file = os.path.join(args.output_dir, "fan_monitor_defs.cpp")
97 with open(output_file, 'w') as output:
98 output.write(Template(tmpl).render(data=monitor_data))