summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLee Yarwood <lyarwood@redhat.com>2020-10-27 08:44:59 +0000
committerLee Yarwood <lyarwood@redhat.com>2020-11-03 20:19:51 +0000
commitcd83da5501e3dc83f9a12c5799c388e06cf8c7f2 (patch)
tree8889a4a7bebd82b1c318371d3bc48638cac93cb4
parent5016a36d25de30c78dce3f3a9a247335de286039 (diff)
downloadnova-cd83da5501e3dc83f9a12c5799c388e06cf8c7f2.tar.gz
libvirt: Only ask tpool.Proxy to autowrap vir* classes
I668643c836d46a25df46d4c99a973af5e50a39db attempted to fix service wide pauses by providing a more complete list of classes to tpool.Proxy. While this excluded libvirtError it can include internal libvirt-python classes pointed to by private globals that have been introduced with the use of type checking within the module. Any attempt to wrap these internal classes will result in the failure seen in bug #1901383. As a result this change simply ignores any class found during inspection that doesn't start with the `vir` string, used by libvirt to denote public methods and classes. Closes-Bug: #1901383 Co-Authored-By: Daniel Berrange <berrange@redhat.com> Change-Id: I568b0c4fd6069b9118ff116532f14abb46cc42ab (cherry picked from commit 0d2ca53bb86b8e4a3c44855cb5ef57f223462543) (cherry picked from commit 048a3337a8c98ec8fc138083376430ffb9027f67) (cherry picked from commit 36cb57d97be07a5560bef4c090f8cab47992c042)
-rw-r--r--nova/tests/unit/virt/libvirt/fakelibvirt.py10
-rw-r--r--nova/tests/unit/virt/libvirt/test_host.py3
-rw-r--r--nova/virt/libvirt/host.py8
3 files changed, 16 insertions, 5 deletions
diff --git a/nova/tests/unit/virt/libvirt/fakelibvirt.py b/nova/tests/unit/virt/libvirt/fakelibvirt.py
index d10a44c738..b52b671f52 100644
--- a/nova/tests/unit/virt/libvirt/fakelibvirt.py
+++ b/nova/tests/unit/virt/libvirt/fakelibvirt.py
@@ -1656,6 +1656,16 @@ virSecret = Secret
virNWFilter = NWFilter
+# A private libvirt-python class and global only provided here for testing to
+# ensure it's not returned by libvirt.host.Host.get_libvirt_proxy_classes.
+class FakeHandler(object):
+ def __init__(self):
+ pass
+
+
+_EventAddHandleFunc = FakeHandler
+
+
class FakeLibvirtFixture(fixtures.Fixture):
"""Performs global setup/stubbing for all libvirt tests.
"""
diff --git a/nova/tests/unit/virt/libvirt/test_host.py b/nova/tests/unit/virt/libvirt/test_host.py
index c9411d6eb7..4c4b1d45c8 100644
--- a/nova/tests/unit/virt/libvirt/test_host.py
+++ b/nova/tests/unit/virt/libvirt/test_host.py
@@ -1322,8 +1322,9 @@ class LibvirtTpoolProxyTestCase(test.NoDBTestCase):
self.assertIn(fakelibvirt.virSecret, proxy_classes)
self.assertIn(fakelibvirt.virNWFilter, proxy_classes)
- # Assert that we filtered out libvirtError
+ # Assert that we filtered out libvirtError and any private classes
self.assertNotIn(fakelibvirt.libvirtError, proxy_classes)
+ self.assertNotIn(fakelibvirt._EventAddHandleFunc, proxy_classes)
def test_tpool_get_connection(self):
# Test that Host.get_connection() returns a tpool.Proxy
diff --git a/nova/virt/libvirt/host.py b/nova/virt/libvirt/host.py
index 603ab9925f..d8078dd387 100644
--- a/nova/virt/libvirt/host.py
+++ b/nova/virt/libvirt/host.py
@@ -124,15 +124,15 @@ class Host(object):
@staticmethod
def _get_libvirt_proxy_classes(libvirt_module):
"""Return a tuple for tpool.Proxy's autowrap argument containing all
- classes defined by the libvirt module except libvirtError.
+ public vir* classes defined by the libvirt module.
"""
# Get a list of (name, class) tuples of libvirt classes
classes = inspect.getmembers(libvirt_module, inspect.isclass)
- # Return a list of just the classes, filtering out libvirtError because
- # we don't need to proxy that
- return tuple([cls[1] for cls in classes if cls[0] != 'libvirtError'])
+ # Return a list of just the vir* classes, filtering out libvirtError
+ # and any private globals pointing at private internal classes.
+ return tuple([cls[1] for cls in classes if cls[0].startswith("vir")])
def _wrap_libvirt_proxy(self, obj):
"""Return an object wrapped in a tpool.Proxy using autowrap appropriate