diff options
-rw-r--r-- | src/example/example.yaml | 18 | ||||
-rwxr-xr-x | src/pdmgen.py | 93 | ||||
-rw-r--r-- | src/templates/generated.mako.hpp | 32 |
3 files changed, 143 insertions, 0 deletions
diff --git a/src/example/example.yaml b/src/example/example.yaml index 87c9790..3d60396 100644 --- a/src/example/example.yaml +++ b/src/example/example.yaml @@ -26,3 +26,21 @@ path: /xyz/openbmc_project/testing/inst3 - meta: path path: /xyz/openbmc_project/testing/inst4 + +- name: example property group + description: > + 'Like path groups, a property group is a named collection + of DBus property names and associated metadata. + + Properties in a group must all have the same DBus type signature + and must be explicitly declared.' + class: group + group: property + type: uint32 + members: + - interface: xyz.openbmc_project.Sensor.Value + meta: property + property: ValueA + - interface: xyz.openbmc_project.Sensor.Value + meta: property + property: ValueB diff --git a/src/pdmgen.py b/src/pdmgen.py index fcda960..61546eb 100755 --- a/src/pdmgen.py +++ b/src/pdmgen.py @@ -22,6 +22,7 @@ import mako.lookup from argparse import ArgumentParser from sdbusplus.renderer import Renderer from sdbusplus.namedelement import NamedElement +import sdbusplus.property class InvalidConfigError(BaseException): @@ -159,6 +160,54 @@ class Path(ConfigEntry): super(Path, self).setup(objs) +class Property(ConfigEntry): + '''Property/interface/metadata association.''' + + def __init__(self, *a, **kw): + super(Property, self).__init__(**kw) + + def factory(self, objs): + '''Create interface, property name and metadata elements.''' + + args = { + 'class': 'interface', + 'interface': 'element', + 'name': self.name['interface'] + } + add_unique(ConfigEntry( + configfile=self.configfile, **args), objs) + + args = { + 'class': 'propertyname', + 'propertyname': 'element', + 'name': self.name['property'] + } + add_unique(ConfigEntry( + configfile=self.configfile, **args), objs) + + args = { + 'class': 'meta', + 'meta': 'element', + 'name': self.name['meta'] + } + add_unique(ConfigEntry( + configfile=self.configfile, **args), objs) + + super(Property, self).factory(objs) + + def setup(self, objs): + '''Resolve interface, property and metadata to indicies.''' + + self.interface = get_index( + objs, 'interface', self.name['interface']) + self.prop = get_index( + objs, 'propertyname', self.name['property']) + self.meta = get_index( + objs, 'meta', self.name['meta']) + + super(Property, self).setup(objs) + + class Group(ConfigEntry): '''Pop the members keyword for groups.''' @@ -215,6 +264,36 @@ class GroupOfPaths(ImplicitGroup): super(GroupOfPaths, self).setup(objs) +class GroupOfProperties(ImplicitGroup): + '''Property group config file directive.''' + + def __init__(self, *a, **kw): + self.datatype = sdbusplus.property.Property( + name=kw.get('name'), + type=kw.pop('type')).cppTypeName + + super(GroupOfProperties, self).__init__(**kw) + + def setup(self, objs): + '''Resolve group members.''' + + def map_member(x): + iface = get_index( + objs, 'interface', x['interface']) + prop = get_index( + objs, 'propertyname', x['property']) + meta = get_index( + objs, 'meta', x['meta']) + + return (iface, prop, meta) + + self.members = map( + map_member, + self.members) + + super(GroupOfProperties, self).setup(objs) + + class Everything(Renderer): '''Parse/render entry point.''' @@ -230,6 +309,12 @@ class Everything(Renderer): 'pathgroup': { 'path': GroupOfPaths, }, + 'propertygroup': { + 'property': GroupOfProperties, + }, + 'property': { + 'element': Property, + }, } if cls not in class_map: @@ -312,6 +397,10 @@ class Everything(Renderer): self.paths = kw.pop('pathname', []) self.meta = kw.pop('meta', []) self.pathgroups = kw.pop('pathgroup', []) + self.interfaces = kw.pop('interface', []) + self.properties = kw.pop('property', []) + self.propertynames = kw.pop('propertyname', []) + self.propertygroups = kw.pop('propertygroup', []) super(Everything, self).__init__(**kw) @@ -323,9 +412,13 @@ class Everything(Renderer): loader, args.template, meta=self.meta, + properties=self.properties, + propertynames=self.propertynames, + interfaces=self.interfaces, paths=self.paths, pathmeta=self.pathmeta, pathgroups=self.pathgroups, + propertygroups=self.propertygroups, indent=Indent())) if __name__ == '__main__': diff --git a/src/templates/generated.mako.hpp b/src/templates/generated.mako.hpp index 856975f..7c6e527 100644 --- a/src/templates/generated.mako.hpp +++ b/src/templates/generated.mako.hpp @@ -45,6 +45,38 @@ struct ConfigPaths return paths; } }; + +struct ConfigInterfaces +{ + using Interfaces = std::array<std::string, ${len(interfaces)}>; + + static auto& get() + { + static const Interfaces interfaces = + { +% for i in interfaces: + "${i.name}"s, +% endfor + }; + return interfaces; + } +}; + +struct ConfigProperties +{ + using Properties = std::array<std::string, ${len(propertynames)}>; + + static auto& get() + { + static const Properties properties = + { +% for p in propertynames: + "${p.name}"s, +% endfor + }; + return properties; + } +}; } // namespace monitoring } // namespace dbus } // namespace phosphor |