| #!/usr/bin/env python |
| |
| """ |
| This script parses the given fan presence definition yaml file and generates |
| a header file based on the defined methods for determining when a fan is |
| present. |
| """ |
| |
| import os |
| import sys |
| import yaml |
| from argparse import ArgumentParser |
| from mako.template import Template |
| |
| tmpl = '''/* This is a generated file. */ |
| #include "fan_detect_defs.hpp" |
| |
| const std::map<std::string, std::set<phosphor::fan::Properties>> |
| fanDetectMap = { |
| %for methods in presence: |
| %for method in methods: |
| <% m = method.lower() %> \ |
| {"${m}", { |
| %for fan in methods[method]: |
| std::make_tuple("${fan['Inventory']}", |
| "${fan['PrettyName']}", |
| std::vector<std::string>{ |
| %for s in fan['Sensors']: |
| "${s}", |
| %endfor |
| }), |
| %endfor |
| %endfor |
| }}, |
| %endfor |
| }; |
| ''' |
| |
| |
| if __name__ == '__main__': |
| parser = ArgumentParser() |
| # Input yaml containing how each fan's presence detection should be done |
| parser.add_argument("-y", "--yaml", dest="pres_yaml", |
| default= |
| "example/fan-detect.yaml", |
| help= |
| "Input fan presences definition yaml file to parse") |
| args = parser.parse_args(sys.argv[1:]) |
| |
| # Verify given yaml file exists |
| yaml_file = os.path.abspath(args.pres_yaml) |
| if not os.path.isfile(yaml_file): |
| print "Unable to find input yaml file " + yaml_file |
| exit(1) |
| |
| with open(yaml_file, 'r') as yaml_input: |
| presence_data = yaml.safe_load(yaml_input) or {} |
| |
| sys.stdout.write(Template(tmpl).render(presence=presence_data)) |