From fcbedca0d847c27fdeab59cda9c6659d8640b6dd Mon Sep 17 00:00:00 2001 From: Brad Bishop Date: Tue, 25 Jul 2017 19:59:46 -0400 Subject: presence: Add parser support for any of Add support for the anyof yaml keyword. Change-Id: Ib28ca8ef9959cec29cb2d15a0bf758668375895f Signed-off-by: Brad Bishop --- presence/example/example.yaml | 17 +++++++++++++++++ presence/pfpgen.py | 23 +++++++++++++++++++++-- presence/templates/anyof.mako.hpp | 7 +++++++ presence/templates/generated.mako.hpp | 1 + 4 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 presence/templates/anyof.mako.hpp (limited to 'presence') diff --git a/presence/example/example.yaml b/presence/example/example.yaml index aea0139..140e1ec 100644 --- a/presence/example/example.yaml +++ b/presence/example/example.yaml @@ -64,3 +64,20 @@ rpolicy: type: fallback +- name: Example Fan3 + description: > + 'Example fan with anyof redundancy policy. + + The anyof algorithm reports true if any redundancy set + component sensors report true.' + path: /system/chassis/motherboard/fan3 + methods: + - type: gpio + key: 125 + physpath: /sys/devices/foo/bar + - type: tach + sensors: + - fan3 + rpolicy: + type: anyof + diff --git a/presence/pfpgen.py b/presence/pfpgen.py index 1e22ac7..00ba900 100755 --- a/presence/pfpgen.py +++ b/presence/pfpgen.py @@ -194,8 +194,26 @@ class Rpolicy(ConfigEntry): self.fan = get_index(objs, 'fan', self.fan) +class AnyOf(Rpolicy, Renderer): + '''Default policy handler (policy:type:anyof).''' + + def __init__(self, *a, **kw): + kw['name'] = 'anyof-{}'.format(kw['fan']) + super(AnyOf, self).__init__(**kw) + + def setup(self, objs): + super(AnyOf, self).setup(objs) + + def construct(self, loader, indent): + return self.render( + loader, + 'anyof.mako.hpp', + f=self, + indent=indent) + + class Fallback(Rpolicy, Renderer): - '''Default policy handler (policy:type:fallback).''' + '''Fallback policy handler (policy:type:fallback).''' def __init__(self, *a, **kw): kw['name'] = 'fallback-{}'.format(kw['fan']) @@ -230,7 +248,7 @@ class Fan(ConfigEntry): factory = Everything.classmap(self.rpolicy['type']) rpolicy = factory(**self.rpolicy) else: - rpolicy = Fallback(fan=self.name) + rpolicy = AnyOf(fan=self.name) for m in self.methods: m['policy'] = rpolicy.name @@ -252,6 +270,7 @@ class Everything(Renderer): handler methods.''' class_map = { + 'anyof': AnyOf, 'fan': Fan, 'fallback': Fallback, 'gpio': Gpio, diff --git a/presence/templates/anyof.mako.hpp b/presence/templates/anyof.mako.hpp new file mode 100644 index 0000000..cc0ca09 --- /dev/null +++ b/presence/templates/anyof.mako.hpp @@ -0,0 +1,7 @@ +std::make_unique( +${indent(1)}ConfigFans::get()[${f.fan}], +${indent(1)}std::vector>{ +% for s in f.sensors: +${indent(2)}*ConfigSensors::get()[${s}], +% endfor +${indent(1)}})\ diff --git a/presence/templates/generated.mako.hpp b/presence/templates/generated.mako.hpp index 3afd29f..6ba18dc 100644 --- a/presence/templates/generated.mako.hpp +++ b/presence/templates/generated.mako.hpp @@ -5,6 +5,7 @@ #include #include #include +#include "anyof.hpp" #include "fallback.hpp" #include "fan.hpp" #include "gpio.hpp" -- cgit v1.2.1