diff options
| author | Brad Bishop <bradleyb@us.ibm.com> | 2016-04-01 14:44:12 -0400 |
|---|---|---|
| committer | Brad Bishop <bradleyb@us.ibm.com> | 2016-04-29 13:04:11 -0400 |
| commit | f6c2a94f044de8f00793eeb154a8033715269244 (patch) | |
| tree | e98902551b4f6e828f385b957bdf93751de46c76 | |
| parent | e2b65e9023efdb648c404a3291ab51a4b2be368f (diff) | |
| download | pyphosphor-f6c2a94f044de8f00793eeb154a8033715269244.tar.gz pyphosphor-f6c2a94f044de8f00793eeb154a8033715269244.zip | |
Move common code from REST server
Moving a bunch of code with common utility out of the rest server.
No new functionality provided.
| -rw-r--r-- | obmc/mapper.py | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/obmc/mapper.py b/obmc/mapper.py index 3f9df5d..68ffb63 100644 --- a/obmc/mapper.py +++ b/obmc/mapper.py @@ -15,6 +15,9 @@ # permissions and limitations under the License. import dbus +import obmc.dbuslib.enums +import obmc.utils.misc +import obmc.utils.pathtree MAPPER_NAME = 'org.openbmc.objectmapper' MAPPER_IFACE = MAPPER_NAME + '.ObjectMapper' @@ -41,3 +44,120 @@ class Mapper: def get_ancestors(self, path): return self.iface.GetAncestors(path) + + @staticmethod + def __try_properties_interface(f, *a): + try: + return f(*a) + except dbus.exceptions.DBusException, e: + if obmc.dbuslib.enums.DBUS_UNKNOWN_INTERFACE in \ + e.get_dbus_message(): + # interface doesn't have any properties + return None + if obmc.dbuslib.enums.DBUS_UNKNOWN_METHOD == e.get_dbus_name(): + # properties interface not implemented at all + return None + raise + + @staticmethod + def __get_properties_on_iface(properties_iface, iface): + properties = Mapper.__try_properties_interface( + properties_iface.GetAll, iface) + if properties is None: + return {} + return properties + + def __get_properties_on_bus(self, path, bus, interfaces, match): + properties = {} + obj = self.bus.get_object(bus, path, introspect=False) + properties_iface = dbus.Interface( + obj, dbus_interface=dbus.PROPERTIES_IFACE) + for i in interfaces: + if not match(i): + continue + properties.update(self.__get_properties_on_iface( + properties_iface, i)) + + return properties + + def enumerate_object( + self, path, + match=obmc.utils.misc.org_dot_openbmc_match, + mapper_data=None): + if mapper_data is None: + mapper_data = {path: self.get_object(path)} + + obj = {} + + for owner, interfaces in mapper_data[path].iteritems(): + obj.update( + self.__get_properties_on_bus( + path, owner, interfaces, match)) + + return obj + + def enumerate_subtree( + self, path='/', + match=obmc.utils.misc.org_dot_openbmc_match, + mapper_data=None): + if mapper_data is None: + mapper_data = self.get_subtree(path) + managers = {} + owners = [] + + # look for objectmanager implementations as they result + # in fewer dbus calls + for path, bus_data in mapper_data.iteritems(): + for owner, interfaces in bus_data.iteritems(): + owners.append(owner) + if dbus.BUS_DAEMON_IFACE + '.ObjectManager' in interfaces: + managers[owner] = path + + # also look in the parent objects + ancestors = self.get_ancestors(path) + + # finally check the root for one too + try: + ancestors.update({path: self.get_object(path)}) + except dbus.exceptions.DBusException, e: + if e.get_dbus_name() != obmc.mapper.MAPPER_NOT_FOUND: + raise + + for path, bus_data in ancestors.iteritems(): + for owner, interfaces in bus_data.iteritems(): + if dbus.BUS_DAEMON_IFACE + '.ObjectManager' in interfaces: + managers[owner] = path + + # make all the manager gmo (get managed objects) calls + results = {} + for owner, path in managers.iteritems(): + if owner not in owners: + continue + obj = self.bus.get_object(owner, path, introspect=False) + iface = dbus.Interface( + obj, dbus.BUS_DAEMON_IFACE + '.ObjectManager') + + # flatten (remove interface names) gmo results + for path, interfaces in iface.GetManagedObjects().iteritems(): + if path not in mapper_data.iterkeys(): + continue + properties = {} + for iface, props in interfaces.iteritems(): + properties.update(props) + results.setdefault(path, {}).setdefault(owner, properties) + + # make dbus calls for any remaining objects + for path, bus_data in mapper_data.iteritems(): + for owner, interfaces in bus_data.iteritems(): + if results.setdefault(path, {}).setdefault(owner, {}): + continue + results[path][owner].update( + self.__get_properties_on_bus( + path, owner, interfaces, match)) + + objs = obmc.utils.pathtree.PathTree() + for path, owners in results.iteritems(): + for owner, properties in owners.iteritems(): + objs.setdefault(path, {}).update(properties) + + return objs |

