From f996674c36fe1a109853d88113e27b44a7a5cf45 Mon Sep 17 00:00:00 2001 From: melanie witt Date: Wed, 10 Aug 2022 23:22:47 +0000 Subject: [PATCH] Fix exception catch when volume mount fails When we call nova.privsep.fs.mount(), we are catching ProcessExecutionError() (an instance of a class) and that is not allowed in python3. This changes the except statement to catch ProcessExecutionError (class) instead. Closes-Bug: #1984736 Change-Id: I24a269f9809063f864a4f0443d6724dfa8703d9d --- .../unit/virt/libvirt/volume/test_mount.py | 26 +++++++++++++++++++ nova/virt/libvirt/volume/mount.py | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/nova/tests/unit/virt/libvirt/volume/test_mount.py b/nova/tests/unit/virt/libvirt/volume/test_mount.py index 8ecb117f05..a27505052f 100644 --- a/nova/tests/unit/virt/libvirt/volume/test_mount.py +++ b/nova/tests/unit/virt/libvirt/volume/test_mount.py @@ -580,6 +580,32 @@ class HostMountStateTestCase(test.NoDBTestCase): mock_log.assert_called() + @mock.patch.object(mount.LOG, 'exception') + def test_mount_failure(self, mock_log_exc): + m = self._get_clean_hostmountstate() + err = processutils.ProcessExecutionError + self.mock_mount.side_effect = err + + # Mount vol_a + self.assertRaises(err, self._sentinel_mount, m, mock.sentinel.vol_a) + + # Verify the mountpoint got removed after the failure + self.assertEqual({}, m.mountpoints) + + # Now try a scenario where the mount failed because the volume was + # already mounted + self.mock_ismount.side_effect = [False, True] + + # Mount vol_a + self._sentinel_mount(m, mock.sentinel.vol_a) + + # Verify the mountpoint is present despite the error + self.assertEqual(1, len(m.mountpoints)) + self.assertIn(mock.sentinel.mountpoint, m.mountpoints) + + # Verify we logged an exception + mock_log_exc.assert_called() + class MountManagerTestCase(test.NoDBTestCase): class FakeHostMountState(object): diff --git a/nova/virt/libvirt/volume/mount.py b/nova/virt/libvirt/volume/mount.py index d85ac8aa48..01338497b6 100644 --- a/nova/virt/libvirt/volume/mount.py +++ b/nova/virt/libvirt/volume/mount.py @@ -306,7 +306,7 @@ class _HostMountState(object): try: nova.privsep.fs.mount(fstype, export, mountpoint, options) - except processutils.ProcessExecutionError(): + except processutils.ProcessExecutionError: # Check to see if mountpoint is mounted despite the error # eg it was already mounted if os.path.ismount(mountpoint):