diff options
author | John Snow <jsnow@redhat.com> | 2019-05-28 14:38:57 -0400 |
---|---|---|
committer | Max Reitz <mreitz@redhat.com> | 2019-06-14 14:16:57 +0200 |
commit | 9e8dfad045211fbb8f4184285747907517550f23 (patch) | |
tree | 0d5a7e5e1d908fe039be427b59d3d069a5579771 /python | |
parent | ba7704f2228f16ed61b9903801e28e17666c7e38 (diff) |
event_match: always match on None value
Before, event_match didn't always recurse if the event value was not a
dictionary, and would instead check for equality immediately.
By delaying equality checking to post-recursion, we can allow leaf
values like "5" to match "None" and take advantage of the generic
None-returns-True clause.
This makes the matching a little more obviously consistent at the
expense of being able to check for explicit None values, which is
probably not that important given what this function is used for.
Signed-off-by: John Snow <jsnow@redhat.com>
Message-id: 20190528183857.26167-1-jsnow@redhat.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
Diffstat (limited to 'python')
-rw-r--r-- | python/qemu/__init__.py | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/python/qemu/__init__.py b/python/qemu/__init__.py index 98ed8a2e28..dbaf8a5311 100644 --- a/python/qemu/__init__.py +++ b/python/qemu/__init__.py @@ -409,27 +409,31 @@ class QEMUMachine(object): The match criteria takes the form of a matching subdict. The event is checked to be a superset of the subdict, recursively, with matching - values whenever those values are not None. + values whenever the subdict values are not None. + + This has a limitation that you cannot explicitly check for None values. Examples, with the subdict queries on the left: - None matches any object. - {"foo": None} matches {"foo": {"bar": 1}} - - {"foo": {"baz": None}} does not match {"foo": {"bar": 1}} - - {"foo": {"baz": 2}} matches {"foo": {"bar": 1, "baz": 2}} + - {"foo": None} matches {"foo": 5} + - {"foo": {"abc": None}} does not match {"foo": {"bar": 1}} + - {"foo": {"rab": 2}} matches {"foo": {"bar": 1, "rab": 2}} """ if match is None: return True - for key in match: - if key in event: - if isinstance(event[key], dict): + try: + for key in match: + if key in event: if not QEMUMachine.event_match(event[key], match[key]): return False - elif event[key] != match[key]: + else: return False - else: - return False - return True + return True + except TypeError: + # either match or event wasn't iterable (not a dict) + return match == event def event_wait(self, name, timeout=60.0, match=None): """ |