summaryrefslogtreecommitdiffstats
path: root/pimgen.py
diff options
context:
space:
mode:
authorMatthew Barth <msbarth@us.ibm.com>2018-10-05 15:29:26 -0500
committerMatthew Barth <msbarth@us.ibm.com>2018-10-23 09:23:08 -0500
commit979eb591652fba30f86ec5b7f5c5f73c06651c70 (patch)
tree1663bd80d408bcce23b16596bd11fe7170a66484 /pimgen.py
parentf094d4428ecad7c2c349287fb811e5d6568644a9 (diff)
downloadphosphor-inventory-manager-979eb591652fba30f86ec5b7f5c5f73c06651c70.tar.gz
phosphor-inventory-manager-979eb591652fba30f86ec5b7f5c5f73c06651c70.zip
Generate functor to read a property
Given the dbus member class for an interface and property hosted by inventory manager, generate the getProperty functor for retrieving that property from inventory. This ability is only supported when using the `PropertyIs` functor to compare a property within inventory to a given value before triggering an action. Example yaml: filters: - name: propertyIs service: xyz.openbmc_project.Inventory.Manager path: /system/chassis interface: xyz.openbmc_project.Inventory.Decorator.CoolingType property: WaterCooled value: value: true type: boolean dbusMember: "sdbusplus::xyz::openbmc_project::Inventory::\ Decorator::server::CoolingType" Generates: make_filter(functor::propertyIs( "/system/chassis", "xyz.openbmc_project.Inventory.Decorator.CoolingType", "WaterCooled", true, "xyz.openbmc_project.Inventory.Manager", make_get_property<> ( functor::getProperty<sdbusplus::xyz::openbmc_project:: Inventory::Decorator::server::CoolingType> ( "/system/chassis", "xyz.openbmc_project.Inventory.Decorator.CoolingType", &sdbusplus::xyz::openbmc_project::Inventory:: Decorator::server::CoolingType::getPropertyByName, "WaterCooled" ) ) )) Tested: Code generated as expected with service name given Code generated as expected without service name given Resolves: openbmc/phosphor-inventory-manager#1 Change-Id: I5600854a1b0b9ce3e1511d3bcd9a452d6b1107ba Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
Diffstat (limited to 'pimgen.py')
-rwxr-xr-xpimgen.py52
1 files changed, 50 insertions, 2 deletions
diff --git a/pimgen.py b/pimgen.py
index de5419d..7c9ee53 100755
--- a/pimgen.py
+++ b/pimgen.py
@@ -26,6 +26,10 @@ from sdbusplus.namedelement import NamedElement
from sdbusplus.renderer import Renderer
+# Global busname for use within classes where necessary
+busname = "xyz.openbmc_project.Inventory.Manager"
+
+
def cppTypeName(yaml_type):
''' Convert yaml types to cpp types.'''
return sdbusplus.property.Property(type=yaml_type).cppTypeName
@@ -269,6 +273,14 @@ class PathCondition(MethodCall):
super(PathCondition, self).__init__(**kw)
+class GetProperty(MethodCall):
+ '''Convenience type for getting inventory properties'''
+
+ def __init__(self, **kw):
+ kw['name'] = 'make_get_property'
+ super(GetProperty, self).__init__(**kw)
+
+
class CreateObjects(MethodCall):
'''Assemble a createObjects functor.'''
@@ -388,8 +400,10 @@ class PropertyIs(MethodCall):
path = TrivialArgument(value=path, type='string')
args.append(path)
- args.append(TrivialArgument(value=kw.pop('interface'), type='string'))
- args.append(TrivialArgument(value=kw.pop('property'), type='string'))
+ iface = TrivialArgument(value=kw.pop('interface'), type='string')
+ args.append(iface)
+ prop = TrivialArgument(value=kw.pop('property'), type='string')
+ args.append(prop)
args.append(TrivialArgument(
decorators=[
Literal(kw['value'].get('type', None))], **kw.pop('value')))
@@ -398,6 +412,34 @@ class PropertyIs(MethodCall):
if service:
args.append(TrivialArgument(value=service, type='string'))
+ dbusMember = kw.pop('dbusMember', None)
+ if dbusMember:
+ # Inventory manager's service name is required
+ if not service or service != busname:
+ args.append(TrivialArgument(value=busname, type='string'))
+
+ gpArgs = []
+ gpArgs.append(path)
+ gpArgs.append(iface)
+ # Prepend '&' and append 'getPropertyByName' function on dbusMember
+ gpArgs.append(TrivialArgument(
+ value='&'+dbusMember+'::getPropertyByName'))
+ gpArgs.append(prop)
+ fArg = MethodCall(
+ name='getProperty',
+ namespace=['functor'],
+ templates=[Template(
+ name=dbusMember,
+ namespace=[])],
+ args=gpArgs)
+
+ # Append getProperty functor
+ args.append(GetProperty(
+ templates=[Template(
+ name=dbusMember+'::PropertiesVariant',
+ namespace=[])],
+ args=[fArg]))
+
kw['args'] = args
kw['namespace'] = ['functor']
super(PropertyIs, self).__init__(**kw)
@@ -505,6 +547,8 @@ class Everything(Renderer):
os.path.join(args.inputdir, 'extra_interfaces.d'))
interface_composite.update(extra_interface_composite)
interface_composite = InterfaceComposite(interface_composite)
+ # Update busname if configured differenly than the default
+ busname = args.busname
return Everything(
*events,
@@ -613,6 +657,10 @@ if __name__ == '__main__':
default=os.path.join(script_dir, 'example'),
help='Location of files to process.')
parser.add_argument(
+ '-b', '--bus-name', dest='busname',
+ default='xyz.openbmc_project.Inventory.Manager',
+ help='Inventory manager busname.')
+ parser.add_argument(
'command', metavar='COMMAND', type=str,
choices=valid_commands.keys(),
help='%s.' % " | ".join(valid_commands.keys()))
OpenPOWER on IntegriCloud