[PATCH phosphor-objmgr 2/2] Run phosphor-mapper through pep8

Joel Stanley joel at jms.id.au
Fri Feb 5 16:13:42 AEDT 2016


On Fri, Feb 5, 2016 at 7:50 AM, OpenBMC Patches
<openbmc-patches at stwcx.xyz> wrote:
> From: Brad Bishop <bradleyb at us.ibm.com>
>
> This is all whitespace adjustments flagged by pep8.

Reviewed-by: Joel Stanley <joel at jms.id.au>

> ---
>  OpenBMCMapper.py | 613 ++++++++++++++++++++++++++++---------------------------
>  phosphor-mapper  | 335 +++++++++++++++---------------
>  setup.cfg        |   2 +-
>  3 files changed, 486 insertions(+), 464 deletions(-)
>
> diff --git a/OpenBMCMapper.py b/OpenBMCMapper.py
> index 2ed65f7..518e703 100644
> --- a/OpenBMCMapper.py
> +++ b/OpenBMCMapper.py
> @@ -25,331 +25,340 @@ MAPPER_PATH = '/org/openbmc/objectmapper/objectmapper'
>  ENUMERATE_IFACE = 'org.openbmc.Object.Enumerate'
>  MAPPER_NOT_FOUND = 'org.openbmc.objectmapper.Error.NotFound'
>
> +
>  class Path:
> -       def __init__(self, path):
> -               self.parts = filter(bool, path.split('/'))
> +    def __init__(self, path):
> +        self.parts = filter(bool, path.split('/'))
> +
> +    def rel(self, first=None, last=None):
> +        # relative
> +        return self.get('', first, last)
>
> -       def rel(self, first = None, last = None):
> -               # relative
> -               return self.get('', first, last)
> +    def fq(self, first=None, last=None):
> +        # fully qualified
> +        return self.get('/', first, last)
>
> -       def fq(self, first = None, last = None):
> -               # fully qualified
> -               return self.get('/', first, last)
> +    def depth(self):
> +        return len(self.parts)
>
> -       def depth(self):
> -               return len(self.parts)
> +    def get(self, prefix='/', first=None, last=None):
> +        if not first:
> +            first = 0
> +        if not last:
> +            last = self.depth()
> +        return prefix + '/'.join(self.parts[first:last])
>
> -       def get(self, prefix = '/', first = None, last = None):
> -               if not first:
> -                       first = 0
> -               if not last:
> -                       last = self.depth()
> -               return prefix + '/'.join(self.parts[first:last])
>
>  def org_dot_openbmc_match(name):
> -       return 'org.openbmc' in name
> +    return 'org.openbmc' in name
> +
>
>  class ListMatch(object):
> -       def __init__(self, l):
> -               self.l = l
> +    def __init__(self, l):
> +        self.l = l
> +
> +    def __call__(self, match):
> +        return match in self.l
>
> -       def __call__(self, match):
> -               return match in self.l
>
>  class IntrospectionNodeParser:
> -       def __init__(self, data, tag_match = bool, intf_match = bool):
> -               self.data = data
> -               self.cache = {}
> -               self.tag_match = tag_match
> -               self.intf_match = intf_match
> -
> -       def parse_args(self):
> -               return [ x.attrib for x in self.data.findall('arg') ]
> -
> -       def parse_children(self):
> -               return [ x.attrib['name'] for x in self.data.findall('node') ]
> -
> -       def parse_method_or_signal(self):
> -               name = self.data.attrib['name']
> -               return name, self.parse_args()
> -
> -       def parse_interface(self):
> -               iface = {}
> -               iface['method'] = {}
> -               iface['signal'] = {}
> -
> -               for node in self.data:
> -                       if node.tag not in ['method', 'signal']:
> -                               continue
> -                       if not self.tag_match(node.tag):
> -                               continue
> -                       p = IntrospectionNodeParser(
> -                                       node, self.tag_match, self.intf_match)
> -                       n, element = p.parse_method_or_signal()
> -                       iface[node.tag][n] = element
> -
> -               return iface
> -
> -       def parse_node(self):
> -               if self.cache:
> -                       return self.cache
> -
> -               self.cache['interfaces'] = {}
> -               self.cache['children'] = []
> -
> -               for node in self.data:
> -                       if node.tag == 'interface':
> -                               p = IntrospectionNodeParser(
> -                                               node, self.tag_match, self.intf_match)
> -                               name = p.data.attrib['name']
> -                               if not self.intf_match(name):
> -                                       continue
> -                               self.cache['interfaces'][name] = p.parse_interface()
> -                       elif node.tag == 'node':
> -                               self.cache['children'] = self.parse_children()
> -
> -               return self.cache
> -
> -       def get_interfaces(self):
> -               return self.parse_node()['interfaces']
> -
> -       def get_children(self):
> -               return self.parse_node()['children']
> -
> -       def recursive_binding(self):
> -               return any('/' in s for s in self.get_children())
> +    def __init__(self, data, tag_match=bool, intf_match=bool):
> +        self.data = data
> +        self.cache = {}
> +        self.tag_match = tag_match
> +        self.intf_match = intf_match
> +
> +    def parse_args(self):
> +        return [x.attrib for x in self.data.findall('arg')]
> +
> +    def parse_children(self):
> +        return [x.attrib['name'] for x in self.data.findall('node')]
> +
> +    def parse_method_or_signal(self):
> +        name = self.data.attrib['name']
> +        return name, self.parse_args()
> +
> +    def parse_interface(self):
> +        iface = {}
> +        iface['method'] = {}
> +        iface['signal'] = {}
> +
> +        for node in self.data:
> +            if node.tag not in ['method', 'signal']:
> +                continue
> +            if not self.tag_match(node.tag):
> +                continue
> +            p = IntrospectionNodeParser(
> +                node, self.tag_match, self.intf_match)
> +            n, element = p.parse_method_or_signal()
> +            iface[node.tag][n] = element
> +
> +        return iface
> +
> +    def parse_node(self):
> +        if self.cache:
> +            return self.cache
> +
> +        self.cache['interfaces'] = {}
> +        self.cache['children'] = []
> +
> +        for node in self.data:
> +            if node.tag == 'interface':
> +                p = IntrospectionNodeParser(
> +                    node, self.tag_match, self.intf_match)
> +                name = p.data.attrib['name']
> +                if not self.intf_match(name):
> +                    continue
> +                self.cache['interfaces'][name] = p.parse_interface()
> +            elif node.tag == 'node':
> +                self.cache['children'] = self.parse_children()
> +
> +        return self.cache
> +
> +    def get_interfaces(self):
> +        return self.parse_node()['interfaces']
> +
> +    def get_children(self):
> +        return self.parse_node()['children']
> +
> +    def recursive_binding(self):
> +        return any('/' in s for s in self.get_children())
> +
>
>  class IntrospectionParser:
> -       def __init__(self, name, bus, tag_match = bool, intf_match = bool):
> -               self.name = name
> -               self.bus = bus
> -               self.tag_match = tag_match
> -               self.intf_match = intf_match
> -
> -       def _introspect(self, path):
> -               try:
> -                       obj = self.bus.get_object(self.name, path, introspect = False)
> -                       iface = dbus.Interface(obj, dbus.INTROSPECTABLE_IFACE)
> -                       data = iface.Introspect()
> -               except dbus.DBusException:
> -                       return None
> -
> -               return IntrospectionNodeParser(
> -                               ElementTree.fromstring(data),
> -                               self.tag_match,
> -                               self.intf_match)
> -
> -       def _discover_flat(self, path, parser):
> -               items = {}
> -               interfaces = parser.get_interfaces().keys()
> -               if interfaces:
> -                       items[path] = {}
> -                       items[path]['interfaces'] = interfaces
> -
> -               return items
> -
> -       def introspect(self, path = '/', parser = None):
> -               items = {}
> -               if not parser:
> -                       parser = self._introspect(path)
> -               if not parser:
> -                       return {}
> -               items.update(self._discover_flat(path, parser))
> -
> -               if path != '/':
> -                       path += '/'
> -
> -               if parser.recursive_binding():
> -                       callback = self._discover_flat
> -               else:
> -                       callback = self.introspect
> -
> -               for k in parser.get_children():
> -                       parser = self._introspect(path + k)
> -                       if not parser:
> -                               continue
> -                       items.update(callback(path + k, parser))
> -
> -               return items
> +    def __init__(self, name, bus, tag_match=bool, intf_match=bool):
> +        self.name = name
> +        self.bus = bus
> +        self.tag_match = tag_match
> +        self.intf_match = intf_match
> +
> +    def _introspect(self, path):
> +        try:
> +            obj = self.bus.get_object(self.name, path, introspect=False)
> +            iface = dbus.Interface(obj, dbus.INTROSPECTABLE_IFACE)
> +            data = iface.Introspect()
> +        except dbus.DBusException:
> +            return None
> +
> +        return IntrospectionNodeParser(
> +            ElementTree.fromstring(data),
> +            self.tag_match,
> +            self.intf_match)
> +
> +    def _discover_flat(self, path, parser):
> +        items = {}
> +        interfaces = parser.get_interfaces().keys()
> +        if interfaces:
> +            items[path] = {}
> +            items[path]['interfaces'] = interfaces
> +
> +        return items
> +
> +    def introspect(self, path='/', parser=None):
> +        items = {}
> +        if not parser:
> +            parser = self._introspect(path)
> +        if not parser:
> +            return {}
> +        items.update(self._discover_flat(path, parser))
> +
> +        if path != '/':
> +            path += '/'
> +
> +        if parser.recursive_binding():
> +            callback = self._discover_flat
> +        else:
> +            callback = self.introspect
> +
> +        for k in parser.get_children():
> +            parser = self._introspect(path + k)
> +            if not parser:
> +                continue
> +            items.update(callback(path + k, parser))
> +
> +        return items
> +
>
>  class PathTreeItemIterator(object):
> -       def __init__(self, path_tree, subtree, depth):
> -               self.path_tree = path_tree
> -               self.path = []
> -               self.itlist = []
> -               self.subtree = ['/'] + filter(bool, subtree.split('/'))
> -               self.depth = depth
> -               d = path_tree.root
> -               for k in self.subtree:
> -                       try:
> -                               d = d[k]['children']
> -                       except KeyError:
> -                               raise KeyError(subtree)
> -               self.it = d.iteritems()
> -
> -       def __iter__(self):
> -               return self
> -
> -       def __next__(self):
> -               return super(PathTreeItemIterator, self).next()
> -
> -       def next(self):
> -               key, value = self._next()
> -               path = self.subtree[0] + '/'.join(self.subtree[1:] + self.path)
> -               return path, value.get('data')
> -
> -       def _next(self):
> -               try:
> -                       while True:
> -                               x = self.it.next()
> -                               depth_exceeded = len(self.path) +1 > self.depth
> -                               if self.depth and depth_exceeded:
> -                                       continue
> -                               self.itlist.append(self.it)
> -                               self.path.append(x[0])
> -                               self.it = x[1]['children'].iteritems()
> -                               break;
> -
> -               except StopIteration:
> -                       if not self.itlist:
> -                               raise StopIteration
> -
> -                       self.it = self.itlist.pop()
> -                       self.path.pop()
> -                       x = self._next()
> -
> -               return x
> +    def __init__(self, path_tree, subtree, depth):
> +        self.path_tree = path_tree
> +        self.path = []
> +        self.itlist = []
> +        self.subtree = ['/'] + filter(bool, subtree.split('/'))
> +        self.depth = depth
> +        d = path_tree.root
> +        for k in self.subtree:
> +            try:
> +                d = d[k]['children']
> +            except KeyError:
> +                raise KeyError(subtree)
> +        self.it = d.iteritems()
> +
> +    def __iter__(self):
> +        return self
> +
> +    def __next__(self):
> +        return super(PathTreeItemIterator, self).next()
> +
> +    def next(self):
> +        key, value = self._next()
> +        path = self.subtree[0] + '/'.join(self.subtree[1:] + self.path)
> +        return path, value.get('data')
> +
> +    def _next(self):
> +        try:
> +            while True:
> +                x = self.it.next()
> +                depth_exceeded = len(self.path) + 1 > self.depth
> +                if self.depth and depth_exceeded:
> +                    continue
> +                self.itlist.append(self.it)
> +                self.path.append(x[0])
> +                self.it = x[1]['children'].iteritems()
> +                break
> +
> +        except StopIteration:
> +            if not self.itlist:
> +                raise StopIteration
> +
> +            self.it = self.itlist.pop()
> +            self.path.pop()
> +            x = self._next()
> +
> +        return x
> +
>
>  class PathTreeKeyIterator(PathTreeItemIterator):
> -       def __init__(self, path_tree, subtree, depth):
> -               super(PathTreeKeyIterator, self).__init__(path_tree, subtree, depth)
> +    def __init__(self, path_tree, subtree, depth):
> +        super(PathTreeKeyIterator, self).__init__(path_tree, subtree, depth)
> +
> +    def next(self):
> +        return super(PathTreeKeyIterator, self).next()[0]
>
> -       def next(self):
> -               return super(PathTreeKeyIterator, self).next()[0]
>
>  class PathTree:
> -       def __init__(self):
> -               self.root = {}
> -
> -       def _try_delete_parent(self, elements):
> -               if len(elements) == 1:
> -                       return False
> -
> -               kids = 'children'
> -               elements.pop()
> -               d = self.root
> -               for k in elements[:-1]:
> -                       d = d[k][kids]
> -
> -               if 'data' not in d[elements[-1]] and not d[elements[-1]][kids]:
> -                       del d[elements[-1]]
> -                       self._try_delete_parent(elements)
> -
> -       def _get_node(self, key):
> -               kids = 'children'
> -               elements = ['/'] + filter(bool, key.split('/'))
> -               d = self.root
> -               for k in elements[:-1]:
> -                       try:
> -                               d = d[k][kids]
> -                       except KeyError:
> -                               raise KeyError(key)
> -
> -               return d[elements[-1]]
> -
> -       def __iter__(self):
> -               return self
> -
> -       def __missing__(self, key):
> -               for x in self.iterkeys():
> -                       if key == x:
> -                               return False
> -               return True
> -
> -       def __delitem__(self, key):
> -               kids = 'children'
> -               elements = ['/'] + filter(bool, key.split('/'))
> -               d = self.root
> -               for k in elements[:-1]:
> -                       try:
> -                               d = d[k][kids]
> -                       except KeyError:
> -                               raise KeyError(key)
> -
> -               del d[elements[-1]]
> -               self._try_delete_parent(elements)
> -
> -       def __setitem__(self, key, value):
> -               kids = 'children'
> -               elements = ['/'] + filter(bool, key.split('/'))
> -               d = self.root
> -               for k in elements[:-1]:
> -                       d = d.setdefault(k, {kids: {}})[kids]
> -
> -               children = d.setdefault(elements[-1], {kids: {}})[kids]
> -               d[elements[-1]].update({kids: children, 'data': value})
> -
> -       def __getitem__(self, key):
> -               return self._get_node(key).get('data')
> -
> -       def setdefault(self, key, default):
> -               if not self.get(key):
> -                       self.__setitem__(key, default)
> -
> -               return self.__getitem__(key)
> -
> -       def get(self, key, default = None):
> -               try:
> -                       x = self.__getitem__(key)
> -               except KeyError:
> -                       x = default
> -
> -               return x
> -
> -       def get_children(self, key):
> -               return [ x for x in self._get_node(key)['children'].iterkeys() ]
> -
> -       def demote(self, key):
> -               n = self._get_node(key)
> -               if 'data' in n:
> -                       del n['data']
> -
> -       def keys(self, subtree = '/', depth = None):
> -               return [ x for x in self.iterkeys(subtree, depth) ]
> -
> -       def values(self, subtree = '/', depth = None):
> -               return [ x[1] for x in self.iteritems(subtree, depth) ]
> -
> -       def items(self, subtree = '/', depth = None):
> -               return [ x for x in self.iteritems(subtree, depth) ]
> -
> -       def dataitems(self, subtree = '/', depth = None):
> -               return [ x for x in self.iteritems(subtree, depth) \
> -                               if x[1] is not None ]
> -
> -       def iterkeys(self, subtree = '/', depth = None):
> -               if not self.root:
> -                       return {}.iterkeys()
> -               return PathTreeKeyIterator(self, subtree, depth)
> -
> -       def iteritems(self, subtree = '/', depth = None):
> -               if not self.root:
> -                       return {}.iteritems()
> -               return PathTreeItemIterator(self, subtree, depth)
> +    def __init__(self):
> +        self.root = {}
> +
> +    def _try_delete_parent(self, elements):
> +        if len(elements) == 1:
> +            return False
> +
> +        kids = 'children'
> +        elements.pop()
> +        d = self.root
> +        for k in elements[:-1]:
> +            d = d[k][kids]
> +
> +        if 'data' not in d[elements[-1]] and not d[elements[-1]][kids]:
> +            del d[elements[-1]]
> +            self._try_delete_parent(elements)
> +
> +    def _get_node(self, key):
> +        kids = 'children'
> +        elements = ['/'] + filter(bool, key.split('/'))
> +        d = self.root
> +        for k in elements[:-1]:
> +            try:
> +                d = d[k][kids]
> +            except KeyError:
> +                raise KeyError(key)
> +
> +        return d[elements[-1]]
> +
> +    def __iter__(self):
> +        return self
> +
> +    def __missing__(self, key):
> +        for x in self.iterkeys():
> +            if key == x:
> +                return False
> +        return True
> +
> +    def __delitem__(self, key):
> +        kids = 'children'
> +        elements = ['/'] + filter(bool, key.split('/'))
> +        d = self.root
> +        for k in elements[:-1]:
> +            try:
> +                d = d[k][kids]
> +            except KeyError:
> +                raise KeyError(key)
> +
> +        del d[elements[-1]]
> +        self._try_delete_parent(elements)
> +
> +    def __setitem__(self, key, value):
> +        kids = 'children'
> +        elements = ['/'] + filter(bool, key.split('/'))
> +        d = self.root
> +        for k in elements[:-1]:
> +            d = d.setdefault(k, {kids: {}})[kids]
> +
> +        children = d.setdefault(elements[-1], {kids: {}})[kids]
> +        d[elements[-1]].update({kids: children, 'data': value})
> +
> +    def __getitem__(self, key):
> +        return self._get_node(key).get('data')
> +
> +    def setdefault(self, key, default):
> +        if not self.get(key):
> +            self.__setitem__(key, default)
> +
> +        return self.__getitem__(key)
> +
> +    def get(self, key, default=None):
> +        try:
> +            x = self.__getitem__(key)
> +        except KeyError:
> +            x = default
> +
> +        return x
> +
> +    def get_children(self, key):
> +        return [x for x in self._get_node(key)['children'].iterkeys()]
> +
> +    def demote(self, key):
> +        n = self._get_node(key)
> +        if 'data' in n:
> +            del n['data']
> +
> +    def keys(self, subtree='/', depth=None):
> +        return [x for x in self.iterkeys(subtree, depth)]
> +
> +    def values(self, subtree='/', depth=None):
> +        return [x[1] for x in self.iteritems(subtree, depth)]
> +
> +    def items(self, subtree='/', depth=None):
> +        return [x for x in self.iteritems(subtree, depth)]
> +
> +    def dataitems(self, subtree='/', depth=None):
> +        return [x for x in self.iteritems(subtree, depth)
> +                if x[1] is not None]
> +
> +    def iterkeys(self, subtree='/', depth=None):
> +        if not self.root:
> +            return {}.iterkeys()
> +        return PathTreeKeyIterator(self, subtree, depth)
> +
> +    def iteritems(self, subtree='/', depth=None):
> +        if not self.root:
> +            return {}.iteritems()
> +        return PathTreeItemIterator(self, subtree, depth)
> +
>
>  class Mapper:
> -       def __init__(self, bus):
> -               self.bus = bus
> -               obj = bus.get_object(MAPPER_NAME, MAPPER_PATH, introspect = False)
> -               self.iface = dbus.Interface(
> -                               obj, dbus_interface = MAPPER_IFACE)
> +    def __init__(self, bus):
> +        self.bus = bus
> +        obj = bus.get_object(MAPPER_NAME, MAPPER_PATH, introspect=False)
> +        self.iface = dbus.Interface(
> +            obj, dbus_interface=MAPPER_IFACE)
>
> -       def get_object(self, path):
> -               return self.iface.GetObject(path)
> +    def get_object(self, path):
> +        return self.iface.GetObject(path)
>
> -       def get_subtree_paths(self, path = '/', depth = 0):
> -               return self.iface.GetSubTreePaths(path, depth)
> +    def get_subtree_paths(self, path='/', depth=0):
> +        return self.iface.GetSubTreePaths(path, depth)
>
> -       def get_subtree(self, path = '/', depth = 0):
> -               return self.iface.GetSubTree(path, depth)
> +    def get_subtree(self, path='/', depth=0):
> +        return self.iface.GetSubTree(path, depth)
> diff --git a/phosphor-mapper b/phosphor-mapper
> index da4ae63..255897f 100644
> --- a/phosphor-mapper
> +++ b/phosphor-mapper
> @@ -24,175 +24,188 @@ import gobject
>  from OpenBMCMapper import IntrospectionParser, PathTree
>  import OpenBMCMapper
>
> +
>  class MapperNotFoundException(dbus.exceptions.DBusException):
> -       _dbus_error_name = OpenBMCMapper.MAPPER_NOT_FOUND
> -       def __init__(self, path):
> -               super(MapperNotFoundException, self).__init__(
> -                               "path or object not found: %s" %(path))
> +    _dbus_error_name = OpenBMCMapper.MAPPER_NOT_FOUND
> +
> +    def __init__(self, path):
> +        super(MapperNotFoundException, self).__init__(
> +            "path or object not found: %s" % (path))
> +
>
>  class ObjectMapper(dbus.service.Object):
> -       def __init__(self, bus, path,
> -                       name_match = OpenBMCMapper.org_dot_openbmc_match,
> -                       intf_match = OpenBMCMapper.org_dot_openbmc_match):
> -               super(ObjectMapper, self).__init__(bus.dbus, path)
> -               self.cache = PathTree()
> -               self.bus = bus
> -               self.name_match = name_match
> -               self.intf_match = intf_match
> -               self.tag_match = OpenBMCMapper.ListMatch(['children', 'interface'])
> -               self.service = None
> -
> -               gobject.idle_add(self.discover)
> -               self.bus.dbus.add_signal_receiver(self.bus_handler,
> -                       dbus_interface = dbus.BUS_DAEMON_IFACE,
> -                       signal_name = 'NameOwnerChanged')
> -               self.bus.dbus.add_signal_receiver(self.interfaces_added_handler,
> -                       dbus_interface = dbus.BUS_DAEMON_IFACE + '.ObjectManager',
> -                       signal_name = 'InterfacesAdded',
> -                       sender_keyword = 'sender')
> -               self.bus.dbus.add_signal_receiver(self.interfaces_removed_handler,
> -                       dbus_interface = dbus.BUS_DAEMON_IFACE + '.ObjectManager',
> -                       signal_name = 'InterfacesRemoved',
> -                       sender_keyword = 'sender')
> -
> -       def bus_match(self, name):
> -               if name == OpenBMCMapper.MAPPER_NAME:
> -                       return False
> -               return self.name_match(name)
> -
> -       def discovery_pending(self):
> -               return not bool(self.service)
> -
> -       def interfaces_added_handler(self, path, iprops, **kw):
> -               name = self.bus.get_owned_name(self.bus_match, kw['sender'])
> -               if self.discovery_pending() or \
> -                               not self.bus_match(name):
> -                       return
> -
> -               matches = [ x for x in iprops.iterkeys() if self.intf_match(x) ]
> -               self.add_interfaces(path, kw['sender'], matches)
> -
> -       def interfaces_removed_handler(self, path, interfaces, **kw):
> -               name = self.bus.get_owned_name(self.bus_match, kw['sender'])
> -               if self.discovery_pending() or \
> -                               not self.bus_match(name):
> -                       return
> -               item = self.cache[path]
> -               sender = kw['sender']
> -               for x in interfaces:
> -                       if self.intf_match(x):
> -                               try:
> -                                       item[sender].remove(x)
> -                               except ValueError:
> -                                       pass
> -
> -               # remove the owner if there aren't any interfaces left
> -               if not item[sender]:
> -                       del item[sender]
> -
> -               # update if interfaces remain
> -               if item:
> -                       self.cache[path] = item
> -               # mark for removal if no interfaces remain
> -               elif self.cache.get_children(path):
> -                       self.cache.demote(path)
> -               # delete the entire path if everything is gone
> -               else:
> -                       del self.cache[path]
> -
> -       def process_new_owner(self, name):
> -               # unique name
> -               return self.discover([ IntrospectionParser(name,
> -                       self.bus.dbus, self.tag_match, self.intf_match) ])
> -
> -       def process_old_owner(self, name):
> -               for x,y in self.cache.dataitems():
> -                       if name not in y:
> -                               continue
> -                       del y[name]
> -                       if y:
> -                               self.cache[x] = y
> -                       elif self.cache.get_children(x):
> -                               self.cache.demote(x)
> -                       else:
> -                               del self.cache[x]
> -
> -       def bus_handler(self, service, old, new):
> -               if self.discovery_pending() or \
> -                               not self.bus_match(service):
> -                       return
> -
> -               if new:
> -                       self.process_new_owner(new)
> -               if old:
> -                       self.process_old_owner(old)
> -
> -       def add_interfaces(self, path, owner, interfaces):
> -               d = self.cache.setdefault(path, {})
> -               d = d.setdefault(owner, [])
> -               self.cache[path][owner] = list(set(d + interfaces))
> -
> -       def add_items(self, owner, bus_items):
> -               for x,y in bus_items.iteritems():
> -                       self.add_interfaces(x, owner, y['interfaces'])
> -
> -       def discover(self, owners = None):
> -               if not owners:
> -                       owners = [ IntrospectionParser(x, self.bus.dbus,
> -                               self.tag_match, self.intf_match) \
> -                                               for x in self.bus.get_owner_names(self.bus_match) ]
> -               for o in owners:
> -                       self.add_items(o.name, o.introspect())
> -
> -               if self.discovery_pending():
> -                       print "ObjectMapper discovery complete..."
> -                       self.service = dbus.service.BusName(
> -                                       OpenBMCMapper.MAPPER_NAME, self.bus.dbus)
> -
> -       @dbus.service.method(OpenBMCMapper.MAPPER_IFACE, 's', 'a{sas}')
> -       def GetObject(self, path):
> -               o = self.cache.get(path)
> -               if not o:
> -                       raise MapperNotFoundException(path)
> -               return o
> -
> -       @dbus.service.method(OpenBMCMapper.MAPPER_IFACE, 'si', 'as')
> -       def GetSubTreePaths(self, path, depth):
> -               try:
> -                       return self.cache.iterkeys(path, depth)
> -               except KeyError:
> -                       raise MapperNotFoundException(path)
> -
> -       @dbus.service.method(OpenBMCMapper.MAPPER_IFACE, 'si', 'a{sa{sas}}')
> -       def GetSubTree(self, path, depth):
> -               try:
> -                       return { x:y for x, y in self.cache.dataitems(path, depth) }
> -               except KeyError:
> -                       raise MapperNotFoundException(path)
> +    def __init__(self, bus, path,
> +                 name_match=OpenBMCMapper.org_dot_openbmc_match,
> +                 intf_match=OpenBMCMapper.org_dot_openbmc_match):
> +        super(ObjectMapper, self).__init__(bus.dbus, path)
> +        self.cache = PathTree()
> +        self.bus = bus
> +        self.name_match = name_match
> +        self.intf_match = intf_match
> +        self.tag_match = OpenBMCMapper.ListMatch(['children', 'interface'])
> +        self.service = None
> +
> +        gobject.idle_add(self.discover)
> +        self.bus.dbus.add_signal_receiver(
> +            self.bus_handler,
> +            dbus_interface=
> +            dbus.BUS_DAEMON_IFACE,
> +            signal_name='NameOwnerChanged')
> +        self.bus.dbus.add_signal_receiver(
> +            self.interfaces_added_handler,
> +            dbus_interface=
> +            dbus.BUS_DAEMON_IFACE + '.ObjectManager',
> +            signal_name='InterfacesAdded',
> +            sender_keyword='sender')
> +        self.bus.dbus.add_signal_receiver(
> +            self.interfaces_removed_handler,
> +            dbus_interface=dbus.BUS_DAEMON_IFACE + '.ObjectManager',
> +            signal_name='InterfacesRemoved',
> +            sender_keyword='sender')
> +
> +    def bus_match(self, name):
> +        if name == OpenBMCMapper.MAPPER_NAME:
> +            return False
> +        return self.name_match(name)
> +
> +    def discovery_pending(self):
> +        return not bool(self.service)
> +
> +    def interfaces_added_handler(self, path, iprops, **kw):
> +        name = self.bus.get_owned_name(self.bus_match, kw['sender'])
> +        if self.discovery_pending() or \
> +                not self.bus_match(name):
> +            return
> +
> +        matches = [x for x in iprops.iterkeys() if self.intf_match(x)]
> +        self.add_interfaces(path, kw['sender'], matches)
> +
> +    def interfaces_removed_handler(self, path, interfaces, **kw):
> +        name = self.bus.get_owned_name(self.bus_match, kw['sender'])
> +        if self.discovery_pending() or \
> +                not self.bus_match(name):
> +            return
> +        item = self.cache[path]
> +        sender = kw['sender']
> +        for x in interfaces:
> +            if self.intf_match(x):
> +                try:
> +                    item[sender].remove(x)
> +                except ValueError:
> +                    pass
> +
> +        # remove the owner if there aren't any interfaces left
> +        if not item[sender]:
> +            del item[sender]
> +
> +        # update if interfaces remain
> +        if item:
> +            self.cache[path] = item
> +        # mark for removal if no interfaces remain
> +        elif self.cache.get_children(path):
> +            self.cache.demote(path)
> +        # delete the entire path if everything is gone
> +        else:
> +            del self.cache[path]
> +
> +    def process_new_owner(self, name):
> +        # unique name
> +        return self.discover([IntrospectionParser(name,
> +                             self.bus.dbus,
> +                             self.tag_match,
> +                             self.intf_match)])
> +
> +    def process_old_owner(self, name):
> +        for x, y in self.cache.dataitems():
> +            if name not in y:
> +                continue
> +            del y[name]
> +            if y:
> +                self.cache[x] = y
> +            elif self.cache.get_children(x):
> +                self.cache.demote(x)
> +            else:
> +                del self.cache[x]
> +
> +    def bus_handler(self, service, old, new):
> +        if self.discovery_pending() or \
> +                not self.bus_match(service):
> +            return
> +
> +        if new:
> +            self.process_new_owner(new)
> +        if old:
> +            self.process_old_owner(old)
> +
> +    def add_interfaces(self, path, owner, interfaces):
> +        d = self.cache.setdefault(path, {})
> +        d = d.setdefault(owner, [])
> +        self.cache[path][owner] = list(set(d + interfaces))
> +
> +    def add_items(self, owner, bus_items):
> +        for x, y in bus_items.iteritems():
> +            self.add_interfaces(x, owner, y['interfaces'])
> +
> +    def discover(self, owners=None):
> +        if not owners:
> +            owners = [IntrospectionParser(x, self.bus.dbus,
> +                                          self.tag_match,
> +                                          self.intf_match)
> +                      for x in self.bus.get_owner_names(self.bus_match)]
> +        for o in owners:
> +            self.add_items(o.name, o.introspect())
> +
> +        if self.discovery_pending():
> +            print "ObjectMapper discovery complete..."
> +            self.service = dbus.service.BusName(
> +                OpenBMCMapper.MAPPER_NAME, self.bus.dbus)
> +
> +    @dbus.service.method(OpenBMCMapper.MAPPER_IFACE, 's', 'a{sas}')
> +    def GetObject(self, path):
> +        o = self.cache.get(path)
> +        if not o:
> +            raise MapperNotFoundException(path)
> +        return o
> +
> +    @dbus.service.method(OpenBMCMapper.MAPPER_IFACE, 'si', 'as')
> +    def GetSubTreePaths(self, path, depth):
> +        try:
> +            return self.cache.iterkeys(path, depth)
> +        except KeyError:
> +            raise MapperNotFoundException(path)
> +
> +    @dbus.service.method(OpenBMCMapper.MAPPER_IFACE, 'si', 'a{sa{sas}}')
> +    def GetSubTree(self, path, depth):
> +        try:
> +            return {x: y for x, y in self.cache.dataitems(path, depth)}
> +        except KeyError:
> +            raise MapperNotFoundException(path)
> +
>
>  class BusWrapper:
> -       def __init__(self, bus):
> -               self.dbus = bus
> +    def __init__(self, bus):
> +        self.dbus = bus
>
> -       def get_owned_name(self, match, bus):
> -               for x in self.get_service_names(match):
> -                       if self.dbus.get_name_owner(x) == bus:
> -                               return x
> +    def get_owned_name(self, match, bus):
> +        for x in self.get_service_names(match):
> +            if self.dbus.get_name_owner(x) == bus:
> +                return x
>
> -       def get_service_names(self, match):
> -               # these are well known names
> -               return [ x for x in self.dbus.list_names() \
> -                               if match(x) ]
> +    def get_service_names(self, match):
> +        # these are well known names
> +        return [x for x in self.dbus.list_names()
> +                if match(x)]
>
> -       def get_owner_names(self, match):
> -               # these are unique connection names
> -               return list( set( [ self.dbus.get_name_owner(x) \
> -                               for x in self.get_service_names(match) ] ) )
> +    def get_owner_names(self, match):
> +        # these are unique connection names
> +        return list(set(
> +            [self.dbus.get_name_owner(x)
> +                for x in self.get_service_names(match)]))
>
>  if __name__ == '__main__':
> -       dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
> -       bus = dbus.SystemBus()
> -       o = ObjectMapper(BusWrapper(bus), OpenBMCMapper.MAPPER_PATH)
> -       loop = gobject.MainLoop()
> +    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
> +    bus = dbus.SystemBus()
> +    o = ObjectMapper(BusWrapper(bus), OpenBMCMapper.MAPPER_PATH)
> +    loop = gobject.MainLoop()
>
> -       loop.run()
> +    loop.run()
> diff --git a/setup.cfg b/setup.cfg
> index ed3bf6e..483ca76 100644
> --- a/setup.cfg
> +++ b/setup.cfg
> @@ -1,2 +1,2 @@
>  [install]
> -install_scripts=/usr/sbin
> +install_scripts = /usr/sbin
> --
> 2.6.4
>
>
> _______________________________________________
> openbmc mailing list
> openbmc at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/openbmc


More information about the openbmc mailing list