Skip to content

Sysrepo subscription with filter not working as expected #89

@rbu9fe

Description

@rbu9fe

I'm registering a module change subscription with the flag enabled=True and the initial callback doesn't always provide the change information that is expected.

Assuming that the sysrepo operational datastore has this contents

{
  "ietf-interfaces:interfaces": {
    "interface": [
      {
        "name": "eno0",
        "type": "iana-if-type:ethernetCsmacd",
        "enabled": "true"
      }
    ]
  }
}

then this code reproduces the issue:

import sysrepo

xpaths = (
    "/ietf-interfaces:interfaces/interface[name='eno0']/name",  # OK
    "/ietf-interfaces:interfaces/interface[name='eno0']/type",  # OK
    "/ietf-interfaces:interfaces/interface[name='eno0']/enabled",  # OK
    "/ietf-interfaces:interfaces/interface[type='iana-if-type:ethernetCsmacd']/name",  # ERROR
    "/ietf-interfaces:interfaces/interface[type='iana-if-type:ethernetCsmacd']/type",  # OK
    "/ietf-interfaces:interfaces/interface[type='iana-if-type:ethernetCsmacd']/enabled",  # ERROR
    "/ietf-interfaces:interfaces/interface[enabled='true']/name",  # ERROR
    "/ietf-interfaces:interfaces/interface[enabled='true']/type",  # ERROR
    "/ietf-interfaces:interfaces/interface[enabled='true']/enabled",  # OK
)

connection = sysrepo.SysrepoConnection()
for xpath in xpaths:
    global n_changes
    session = connection .start_session("operational")

    session.subscribe_module_change(
        "ietf-interfaces",
        xpath,
        change_cb,
        passive=True,
        done_only=True,
        enabled=True,
    )

    print(f"{xpath}: {n_changes != 0}")

It expects that each subscription is executed during subscription already (due to the enabled=True flag) and prints the number of changes the callback found. Some work and some don't - see the # OK' and '# ERROR' comments behind the xpaths. Looks like it works only when filtering the list key (i.e. name`) or when the filtered element is part of the result anyway, but not when I filter the list items for property A but query property B.

This works fine when using the libyang API directly, so I assume it has something to do with how the changes are collected as the filter string itself is passed as-is to the C API.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions