summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad Bishop <bradleyb@us.ibm.com>2016-04-01 14:51:14 -0400
committerBrad Bishop <bradleyb@us.ibm.com>2016-04-15 08:59:40 -0400
commit71527b4a664db6fc9b736a87e5a3543ae070ad3d (patch)
tree5fca0a13c7efff24b3fa37001b0d241230d4496f
parent412d620f7ddc039ea950a97452feb2730fb07a88 (diff)
downloadphosphor-rest-server-71527b4a664db6fc9b736a87e5a3543ae070ad3d.tar.gz
phosphor-rest-server-71527b4a664db6fc9b736a87e5a3543ae070ad3d.zip
Moved functions to pyobmc library
The functions here for enumerating a tree of objects have utility elsewhere and were added to pyobmc so removing the duplicated code.
-rw-r--r--obmc-rest95
1 files changed, 6 insertions, 89 deletions
diff --git a/obmc-rest b/obmc-rest
index 0bc67ef..3a36406 100644
--- a/obmc-rest
+++ b/obmc-rest
@@ -190,68 +190,9 @@ class ListHandler(RouteHandler):
request.route_data['map'] = self.find(path)
def do_get(self, path='/'):
- objs = {}
- mapper_data = request.route_data['map']
- 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.mapper.get_ancestors(path)
-
- # finally check the root for one too
- try:
- ancestors.update({path: self.mapper.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.setdefault(path, {}).setdefault(
- owner,
- self.app.instance_handler.get_properties_on_bus(
- path, owner, interfaces))
-
- objs = {}
- for path, owners in results.iteritems():
- for owner, properties in owners.iteritems():
- objs.setdefault(path, {}).update(properties)
-
- return objs
+ return {x: y for x, y in self.mapper.enumerate_subtree(
+ path,
+ mapper_data=request.route_data['map']).dataitems()}
class MethodHandler(RouteHandler):
@@ -434,33 +375,9 @@ class InstanceHandler(RouteHandler):
request.route_data['map'] = self.find(path, callback)
def do_get(self, path):
- properties = {}
- for item in request.route_data['map'][path].iteritems():
- properties.update(self.get_properties_on_bus(
- path, *item))
-
- return properties
-
- @staticmethod
- def get_properties_on_iface(properties_iface, iface):
- properties = InstanceHandler.try_properties_interface(
- properties_iface.GetAll, iface)
- if properties is None:
- return {}
- return properties
-
- def get_properties_on_bus(self, path, bus, interfaces):
- 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 self.intf_match(i):
- continue
- properties.update(self.get_properties_on_iface(
- properties_iface, i))
-
- return properties
+ return self.mapper.enumerate_object(
+ path,
+ mapper_data=request.route_data['map'])
def do_put(self, path):
# make sure all properties exist in the request
OpenPOWER on IntegriCloud