diff --git a/nova/tests/virt/disk/vfs/fakeguestfs.py b/nova/tests/virt/disk/vfs/fakeguestfs.py index 0bcfd41c4c3f..5e5efa7a14fc 100644 --- a/nova/tests/virt/disk/vfs/fakeguestfs.py +++ b/nova/tests/virt/disk/vfs/fakeguestfs.py @@ -13,6 +13,12 @@ # under the License. +EVENT_APPLIANCE = 0x1 +EVENT_LIBRARY = 0x2 +EVENT_WARNING = 0x3 +EVENT_TRACE = 0x4 + + class GuestFS(object): SUPPORT_CLOSE_ON_EXIT = True SUPPORT_RETURN_DICT = True @@ -33,6 +39,9 @@ class GuestFS(object): self.auginit = False self.root_mounted = False self.backend_settings = None + self.trace_enabled = False + self.verbose_enabled = False + self.event_callback = None def launch(self): self.running = True @@ -168,3 +177,12 @@ class GuestFS(object): elif cfgpath == "/files/etc/group/admins/gid": return 600 raise RuntimeError("Unknown path %s", cfgpath) + + def set_trace(self, enabled): + self.trace_enabled = enabled + + def set_verbose(self, enabled): + self.verbose_enabled = enabled + + def set_event_callback(self, func, events): + self.event_callback = (func, events) diff --git a/nova/tests/virt/disk/vfs/test_guestfs.py b/nova/tests/virt/disk/vfs/test_guestfs.py index 66f8206b8de1..cf954e9a35e0 100644 --- a/nova/tests/virt/disk/vfs/test_guestfs.py +++ b/nova/tests/virt/disk/vfs/test_guestfs.py @@ -247,3 +247,18 @@ class VirtDiskVFSGuestFSTest(test.NoDBTestCase): vfs.setup() self.assertNotIn('python_return_dict', vfs.handle.kwargs) vfs.teardown() + + def test_setup_debug_disable(self): + vfs = vfsimpl.VFSGuestFS(imgfile="/dummy.qcow2", imgfmt="qcow2") + vfs.setup() + self.assertFalse(vfs.handle.trace_enabled) + self.assertFalse(vfs.handle.verbose_enabled) + self.assertIsNone(vfs.handle.event_callback) + + def test_setup_debug_enabled(self): + self.flags(debug=True, group='guestfs') + vfs = vfsimpl.VFSGuestFS(imgfile="/dummy.qcow2", imgfmt="qcow2") + vfs.setup() + self.assertTrue(vfs.handle.trace_enabled) + self.assertTrue(vfs.handle.verbose_enabled) + self.assertIsNotNone(vfs.handle.event_callback) diff --git a/nova/virt/disk/vfs/guestfs.py b/nova/virt/disk/vfs/guestfs.py index 216b1610b9d6..9bbf69910b91 100644 --- a/nova/virt/disk/vfs/guestfs.py +++ b/nova/virt/disk/vfs/guestfs.py @@ -13,6 +13,7 @@ # under the License. from eventlet import tpool +from oslo.config import cfg from oslo.utils import importutils import six @@ -28,6 +29,15 @@ LOG = logging.getLogger(__name__) guestfs = None forceTCG = False +guestfs_opts = [ + cfg.BoolOpt('debug', + default=False, + help='Enable guestfs debug') +] + +CONF = cfg.CONF +CONF.register_opts(guestfs_opts, group='guestfs') + def force_tcg(force=True): """Prevent libguestfs trying to use KVM acceleration @@ -72,6 +82,27 @@ class VFSGuestFS(vfs.VFS): return self + def configure_debug(self): + """Configures guestfs to be verbose.""" + if not self.handle: + LOG.warning(_LW("Please consider to execute setup before trying " + "to configure debug log message.")) + else: + def log_callback(ev, eh, buf, array): + if ev == guestfs.EVENT_APPLIANCE: + buf = buf.rstrip() + LOG.debug("event=%(event)s eh=%(eh)d buf='%(buf)s' " + "array=%(array)s", { + "event": guestfs.event_to_string(ev), + "eh": eh, "buf": buf, "array": array}) + + events = (guestfs.EVENT_APPLIANCE | guestfs.EVENT_LIBRARY + | guestfs.EVENT_WARNING | guestfs.EVENT_TRACE) + + self.handle.set_trace(True) # just traces libguestfs API calls + self.handle.set_verbose(True) + self.handle.set_event_callback(log_callback, events) + def setup_os(self): if self.partition == -1: self.setup_os_inspect() @@ -149,6 +180,9 @@ class VFSGuestFS(vfs.VFS): else: raise + if CONF.guestfs.debug: + self.configure_debug() + try: if forceTCG: self.handle.set_backend_settings("force_tcg")