Prechádzať zdrojové kódy

Fix windows osmount trying to set drive letter while disks are offline.

Cristian Matiut 7 mesiacov pred
rodič
commit
abb4c38dab

+ 4 - 1
coriolis/osmorphing/osmount/windows.py

@@ -195,6 +195,7 @@ class WindowsMountTools(base.BaseOSMountTools):
         self._bring_disks_online(disk_nums=disk_nums)
 
     def _set_volumes_drive_letter(self):
+        disk_nums = []
         partitions = self._conn.exec_ps_command(
             'Get-Partition | Where-Object { $_.Type -eq "Basic" -and '
             '$_.NoDefaultDriveLetter -eq $True } | Select-Object -Property '
@@ -214,16 +215,18 @@ class WindowsMountTools(base.BaseOSMountTools):
                     self._conn.exec_ps_command(
                         f'Set-Partition -NoDefaultDriveLetter $False '
                         f'-DiskNumber {disk_num} -PartitionNumber {part_num}')
+                    disk_nums.append(disk_num)
                 except exception.CoriolisException:
                     LOG.warning(
                         f"Failed setting default drive letter on partition "
                         f"number '{part_num}' of disk number '{disk_num}'. "
                         f"Error was: {utils.get_exception_details()}")
+            self._rebring_disks_online(disk_nums=disk_nums)
 
     def mount_os(self):
         self._set_basic_disks_rw_mode()
-        self._set_volumes_drive_letter()
         self._bring_disks_online()
+        self._set_volumes_drive_letter()
         fs_roots = utils.retry_on_error(sleep_seconds=5)(self._get_fs_roots)(
             fail_if_empty=True)
         system_drive = self._get_system_drive()

+ 6 - 2
coriolis/tests/osmorphing/osmount/test_windows.py

@@ -272,7 +272,8 @@ class WindowsMountToolsTestCase(test_base.CoriolisBaseTestCase):
         bring_disks_offline_mock.assert_called()
         bring_disks_online_mock.assert_called()
 
-    def test__set_volumes_drive_letter(self):
+    @mock.patch.object(windows.WindowsMountTools, '_rebring_disks_online')
+    def test__set_volumes_drive_letter(self, rebring_disks_mock):
         self.tools._conn.exec_ps_command.return_value = GET_PARTITION_OUTPUT
         result = self.tools._set_volumes_drive_letter()
         self.assertIsNone(result)
@@ -289,13 +290,16 @@ class WindowsMountToolsTestCase(test_base.CoriolisBaseTestCase):
                 'Set-Partition -NoDefaultDriveLetter $False -DiskNumber 3 '
                 '-PartitionNumber 4'),
         ])
+        rebring_disks_mock.assert_called_once_with(disk_nums=['2', '3'])
 
-    def test__set_volumes_drive_letter_exception(self):
+    @mock.patch.object(windows.WindowsMountTools, '_rebring_disks_online')
+    def test__set_volumes_drive_letter_exception(self, rebring_disks_mock):
         self.tools._conn.exec_ps_command.side_effect = [
             GET_PARTITION_OUTPUT, None, exception.CoriolisException]
         with self.assertLogs(
                 'coriolis.osmorphing.osmount.windows', logging.WARNING):
             self.tools._set_volumes_drive_letter()
+        rebring_disks_mock.assert_called_once_with(disk_nums=['2'])
 
     @mock.patch.object(windows.WindowsMountTools, '_get_system_drive')
     @mock.patch.object(windows.WindowsMountTools, '_get_fs_roots')