diff options
author | Brad Bishop <bradleyb@fuzziesquirrel.com> | 2017-05-23 18:01:54 -0400 |
---|---|---|
committer | Brad Bishop <bradleyb@fuzziesquirrel.com> | 2017-06-04 22:40:30 -0400 |
commit | e73b2c35a375af51b6c7341e9a98f9571f76b266 (patch) | |
tree | bc9ac0dd9ce556068df973919200c1b6d063da75 /src/pdmgen.py | |
parent | b604480a43a25d0645b944fb16c1268d36782d36 (diff) | |
download | phosphor-dbus-monitor-e73b2c35a375af51b6c7341e9a98f9571f76b266.tar.gz phosphor-dbus-monitor-e73b2c35a375af51b6c7341e9a98f9571f76b266.zip |
Add property and property group support
Add support for defining groups of DBus properties. Groups are
a list of property/interface/metadata tuples. Metadata can be used to
give a property context when required.
Change-Id: I5fc27f4d815b53332a2ddea2d270fde8e355dcbc
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
Diffstat (limited to 'src/pdmgen.py')
-rwxr-xr-x | src/pdmgen.py | 93 |
1 files changed, 93 insertions, 0 deletions
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__': |